dishui 0.0.65 → 0.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +10 -11
  2. package/dist/chart.js +12 -46
  3. package/dist/code-editor.js +16 -43
  4. package/dist/components/Badge/index.js +10 -15
  5. package/dist/components/Badge/index.js.map +1 -1
  6. package/dist/components/Button/index.js +62 -89
  7. package/dist/components/Button/index.js.map +1 -1
  8. package/dist/components/Card/index.d.ts +76 -0
  9. package/dist/components/Card/index.js +178 -69
  10. package/dist/components/Card/index.js.map +1 -1
  11. package/dist/components/Chart/Chart.js +25 -25
  12. package/dist/components/Chart/Chart.js.map +1 -1
  13. package/dist/components/Checkbox/index.js +57 -65
  14. package/dist/components/Checkbox/index.js.map +1 -1
  15. package/dist/components/ChoicePicker/index.d.ts +44 -0
  16. package/dist/components/ChoicePicker/index.js +81 -0
  17. package/dist/components/ChoicePicker/index.js.map +1 -0
  18. package/dist/components/Column/index.d.ts +28 -0
  19. package/dist/components/Column/index.js +30 -0
  20. package/dist/components/Column/index.js.map +1 -0
  21. package/dist/components/DateTimeInput/index.d.ts +44 -0
  22. package/dist/components/DateTimeInput/index.js +48 -0
  23. package/dist/components/DateTimeInput/index.js.map +1 -0
  24. package/dist/components/Demo/index.js +107 -107
  25. package/dist/components/Demo/index.js.map +1 -1
  26. package/dist/components/Divider/index.d.ts +20 -0
  27. package/dist/components/Divider/index.js +30 -0
  28. package/dist/components/Divider/index.js.map +1 -0
  29. package/dist/components/EmptyState/index.js +24 -24
  30. package/dist/components/EmptyState/index.js.map +1 -1
  31. package/dist/components/FileUploader/DropZone.js +134 -136
  32. package/dist/components/FileUploader/DropZone.js.map +1 -1
  33. package/dist/components/FileUploader/FileItem.js +159 -163
  34. package/dist/components/FileUploader/FileItem.js.map +1 -1
  35. package/dist/components/FileUploader/FileUploader.js +126 -127
  36. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  37. package/dist/components/FileUploader/UploadQueue.js +62 -62
  38. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  39. package/dist/components/FloatWindow/index.d.ts +28 -0
  40. package/dist/components/GridLayout/index.d.ts +42 -0
  41. package/dist/components/Icon/index.d.ts +24 -0
  42. package/dist/components/Icon/index.js +26 -0
  43. package/dist/components/Icon/index.js.map +1 -0
  44. package/dist/components/Image/index.d.ts +33 -0
  45. package/dist/components/Image/index.js +44 -0
  46. package/dist/components/Image/index.js.map +1 -0
  47. package/dist/components/Input/index.js +196 -197
  48. package/dist/components/Input/index.js.map +1 -1
  49. package/dist/components/Label/index.js +62 -74
  50. package/dist/components/Label/index.js.map +1 -1
  51. package/dist/components/Layout/index.js +134 -139
  52. package/dist/components/Layout/index.js.map +1 -1
  53. package/dist/components/List/index.js +45 -58
  54. package/dist/components/List/index.js.map +1 -1
  55. package/dist/components/Markdown/Markdown.js +106 -107
  56. package/dist/components/Markdown/Markdown.js.map +1 -1
  57. package/dist/components/Markdown/codeThemes.js +24 -33
  58. package/dist/components/Markdown/codeThemes.js.map +1 -1
  59. package/dist/components/Markdown/markdownComponents.js +203 -208
  60. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  61. package/dist/components/Markdown/parseCodeBlockMeta.js +22 -22
  62. package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
  63. package/dist/components/Markdown/useMarkdownSource.js +46 -46
  64. package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
  65. package/dist/components/Markdown/useMarkmapRenderer.js +35 -36
  66. package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
  67. package/dist/components/Markdown/useMermaidRenderer.js +41 -42
  68. package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
  69. package/dist/components/Modal/index.js +82 -82
  70. package/dist/components/Modal/index.js.map +1 -1
  71. package/dist/components/MultipleChoice/index.d.ts +44 -0
  72. package/dist/components/MultipleChoice/index.js +52 -0
  73. package/dist/components/MultipleChoice/index.js.map +1 -0
  74. package/dist/components/Notification/index.d.ts +17 -0
  75. package/dist/components/Page/index.js +40 -71
  76. package/dist/components/Page/index.js.map +1 -1
  77. package/dist/components/PageHeader/index.js +28 -28
  78. package/dist/components/PageHeader/index.js.map +1 -1
  79. package/dist/components/ProtectedRoute/index.js +8 -9
  80. package/dist/components/ProtectedRoute/index.js.map +1 -1
  81. package/dist/components/Row/index.d.ts +28 -0
  82. package/dist/components/Row/index.js +30 -0
  83. package/dist/components/Row/index.js.map +1 -0
  84. package/dist/components/Select/index.js +251 -254
  85. package/dist/components/Select/index.js.map +1 -1
  86. package/dist/components/SidebarToggleButton/index.js +56 -59
  87. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  88. package/dist/components/Slider/index.d.ts +39 -0
  89. package/dist/components/Slider/index.js +52 -0
  90. package/dist/components/Slider/index.js.map +1 -0
  91. package/dist/components/StatCard/index.d.ts +29 -1
  92. package/dist/components/StatCard/index.js +189 -86
  93. package/dist/components/StatCard/index.js.map +1 -1
  94. package/dist/components/Switch/index.d.ts +34 -0
  95. package/dist/components/Switch/index.js +55 -0
  96. package/dist/components/Switch/index.js.map +1 -0
  97. package/dist/components/Tab/index.d.ts +40 -0
  98. package/dist/components/Table/index.js +109 -121
  99. package/dist/components/Table/index.js.map +1 -1
  100. package/dist/components/Tabs/index.js +28 -38
  101. package/dist/components/Tabs/index.js.map +1 -1
  102. package/dist/components/Text/index.d.ts +43 -0
  103. package/dist/components/Text/index.js +55 -0
  104. package/dist/components/Text/index.js.map +1 -0
  105. package/dist/components/Tooltip/index.d.ts +23 -0
  106. package/dist/components/Tooltip/index.js +34 -0
  107. package/dist/components/Tooltip/index.js.map +1 -0
  108. package/dist/components/Tree/Tree.js +205 -205
  109. package/dist/components/Tree/Tree.js.map +1 -1
  110. package/dist/components/pro/ArticleContextMenu/index.js +86 -87
  111. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  112. package/dist/components/pro/ArticleControl/ArticleControl2.js +250 -250
  113. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  114. package/dist/components/pro/ArticleControl/buildHeadingTree.js +31 -32
  115. package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
  116. package/dist/components/pro/ArticleControl/useArticleToc.js +100 -102
  117. package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
  118. package/dist/components/pro/Calendar/Calendar.d.ts +10 -0
  119. package/dist/components/pro/Calendar/hooks/useCalendarDrag.d.ts +47 -0
  120. package/dist/components/pro/Calendar/hooks/useCalendarState.d.ts +56 -0
  121. package/dist/components/pro/Calendar/index.d.ts +7 -0
  122. package/dist/components/pro/Calendar/types.d.ts +151 -0
  123. package/dist/components/pro/Calendar/utils.d.ts +94 -0
  124. package/dist/components/pro/Chat/Chat.d.ts +6 -0
  125. package/dist/components/pro/Chat/index.d.ts +2 -0
  126. package/dist/components/pro/Chat/types.d.ts +84 -0
  127. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +287 -327
  128. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  129. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +167 -224
  130. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  131. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js +594 -613
  132. package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
  133. package/dist/components/pro/CodeEditor/extensions/contextMenu.js +54 -55
  134. package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
  135. package/dist/components/pro/CodeEditor/extensions/index.js +152 -160
  136. package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
  137. package/dist/components/pro/CodeEditor/langs/index.js +7 -15
  138. package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
  139. package/dist/components/pro/CodeEditor/langs/javascript.js +11 -48
  140. package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
  141. package/dist/components/pro/CodeEditor/langs/python.js +4 -40
  142. package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
  143. package/dist/components/pro/CodeEditor/langs/snippets.js +118 -147
  144. package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
  145. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js +153 -153
  146. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  147. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +180 -190
  148. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  149. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js +130 -137
  150. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  151. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js +228 -242
  152. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  153. package/dist/components/pro/CodeEditor/panels/VariablePanel.js +208 -248
  154. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  155. package/dist/components/pro/CodeEditor/themes.js +513 -483
  156. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  157. package/dist/components/pro/CodeEditor/types.d.ts +1 -1
  158. package/dist/components/pro/CodeEditor/utils.js +171 -175
  159. package/dist/components/pro/CodeEditor/utils.js.map +1 -1
  160. package/dist/components/pro/DataTable/DataTable.js +305 -306
  161. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  162. package/dist/components/pro/DataTable/Filters.js +299 -314
  163. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  164. package/dist/components/pro/DataTable/PivotPanel.js +203 -204
  165. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  166. package/dist/components/pro/DataTable/PivotView.js +142 -144
  167. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  168. package/dist/components/pro/DataTable/components/BulkActions.js +42 -42
  169. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  170. package/dist/components/pro/DataTable/components/ColumnSelector.js +84 -84
  171. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  172. package/dist/components/pro/DataTable/components/FilterBar.js +58 -58
  173. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  174. package/dist/components/pro/DataTable/components/TableBody.js +93 -94
  175. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  176. package/dist/components/pro/DataTable/components/TableHeader.js +78 -78
  177. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  178. package/dist/components/pro/DataTable/components/TablePagination.js +77 -77
  179. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  180. package/dist/components/pro/DataTable/components/TableToolbar.js +40 -40
  181. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  182. package/dist/components/pro/DataTable/extension.js +5 -5
  183. package/dist/components/pro/DataTable/extension.js.map +1 -1
  184. package/dist/components/pro/DataTable/pivotEngine.js +84 -92
  185. package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
  186. package/dist/components/pro/DataTable/pivotExtension.js +93 -93
  187. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  188. package/dist/components/pro/DataTable/rowDetailExtension.js +30 -30
  189. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  190. package/dist/components/pro/DataTable/tanstack-table.js +45 -62
  191. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  192. package/dist/components/pro/DataTable/treeDataUtils.js +37 -48
  193. package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
  194. package/dist/components/pro/DataTable/useColumnDragReorder.js +68 -68
  195. package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
  196. package/dist/components/pro/DataTable/utils.js +156 -168
  197. package/dist/components/pro/DataTable/utils.js.map +1 -1
  198. package/dist/components/pro/FileExplorer/Breadcrumb.js +180 -180
  199. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  200. package/dist/components/pro/FileExplorer/CreateDialog.js +78 -78
  201. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  202. package/dist/components/pro/FileExplorer/FileExplorer.js +202 -205
  203. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  204. package/dist/components/pro/FileExplorer/FileIcon.js +189 -189
  205. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  206. package/dist/components/pro/FileExplorer/GridView.js +100 -100
  207. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  208. package/dist/components/pro/FileExplorer/ListView.js +209 -209
  209. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  210. package/dist/components/pro/FileExplorer/Toolbar.js +199 -199
  211. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  212. package/dist/components/pro/Flow/Flow.js +920 -948
  213. package/dist/components/pro/Flow/Flow.js.map +1 -1
  214. package/dist/components/pro/Flow/FlowCanvas.js +1626 -1662
  215. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  216. package/dist/components/pro/Flow/archify/build.js +85 -94
  217. package/dist/components/pro/Flow/archify/build.js.map +1 -1
  218. package/dist/components/pro/Flow/archify/convert.js +512 -519
  219. package/dist/components/pro/Flow/archify/convert.js.map +1 -1
  220. package/dist/components/pro/Flow/archify/palette.js +87 -104
  221. package/dist/components/pro/Flow/archify/palette.js.map +1 -1
  222. package/dist/components/pro/Flow/archify/presets.js +34 -37
  223. package/dist/components/pro/Flow/archify/presets.js.map +1 -1
  224. package/dist/components/pro/Flow/archify/spec.js +7 -7
  225. package/dist/components/pro/Flow/archify/spec.js.map +1 -1
  226. package/dist/components/pro/Flow/canvas/AlignmentGuides.js +25 -25
  227. package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
  228. package/dist/components/pro/Flow/canvas/GridRenderer.js +54 -55
  229. package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
  230. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +54 -58
  231. package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
  232. package/dist/components/pro/Flow/canvas/PixiApp.js +105 -102
  233. package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
  234. package/dist/components/pro/Flow/canvas/SelectionOverlay.js +38 -38
  235. package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
  236. package/dist/components/pro/Flow/canvas/ViewportContainer.js +117 -117
  237. package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
  238. package/dist/components/pro/Flow/constants.js +266 -278
  239. package/dist/components/pro/Flow/constants.js.map +1 -1
  240. package/dist/components/pro/Flow/context/FlowAIContext.js +27 -28
  241. package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
  242. package/dist/components/pro/Flow/context/FlowContext.js +60 -61
  243. package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
  244. package/dist/components/pro/Flow/context/FlowUIContext.js +115 -117
  245. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  246. package/dist/components/pro/Flow/edges/EdgeRenderer.js +135 -138
  247. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  248. package/dist/components/pro/Flow/edges/edgeMarkers.js +11 -14
  249. package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
  250. package/dist/components/pro/Flow/edges/edgePaths.js +351 -367
  251. package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
  252. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js +49 -52
  253. package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
  254. package/dist/components/pro/Flow/hooks/useClipboard.js +154 -154
  255. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  256. package/dist/components/pro/Flow/hooks/useCompactMode.js +17 -17
  257. package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
  258. package/dist/components/pro/Flow/hooks/useDeleteSelection.js +40 -40
  259. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  260. package/dist/components/pro/Flow/hooks/useDraggablePanel.js +51 -51
  261. package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
  262. package/dist/components/pro/Flow/hooks/useEdgeMutations.js +157 -157
  263. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  264. package/dist/components/pro/Flow/hooks/useFlowImportExport.js +190 -201
  265. package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
  266. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js +32 -38
  267. package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
  268. package/dist/components/pro/Flow/hooks/useLayoutActions.js +172 -180
  269. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  270. package/dist/components/pro/Flow/hooks/useLineMutations.js +57 -57
  271. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  272. package/dist/components/pro/Flow/hooks/useMindMap.js +229 -238
  273. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  274. package/dist/components/pro/Flow/hooks/useNodeMutations.js +102 -102
  275. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  276. package/dist/components/pro/Flow/hooks/usePdfExport.js +55 -56
  277. package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
  278. package/dist/components/pro/Flow/hooks/usePixiApp.js +55 -57
  279. package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
  280. package/dist/components/pro/Flow/hooks/useResizablePanel.js +31 -31
  281. package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
  282. package/dist/components/pro/Flow/hooks/useSelection.js +69 -69
  283. package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
  284. package/dist/components/pro/Flow/hooks/useUndoRedo.js +27 -27
  285. package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
  286. package/dist/components/pro/Flow/hooks/useViewport.js +28 -28
  287. package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
  288. package/dist/components/pro/Flow/lines/FreehandTool.js +63 -63
  289. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  290. package/dist/components/pro/Flow/lines/GeometricLineTool.js +80 -80
  291. package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
  292. package/dist/components/pro/Flow/lines/LineRenderer.js +88 -88
  293. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  294. package/dist/components/pro/Flow/lines/lineSmoothing.js +32 -34
  295. package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
  296. package/dist/components/pro/Flow/nodes/DataNodeView.js +236 -242
  297. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  298. package/dist/components/pro/Flow/nodes/MediaContent.js +236 -246
  299. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  300. package/dist/components/pro/Flow/nodes/MediaOverlay.js +63 -63
  301. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  302. package/dist/components/pro/Flow/nodes/Model3DView.js +111 -113
  303. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  304. package/dist/components/pro/Flow/nodes/NodeHandles.js +74 -80
  305. package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
  306. package/dist/components/pro/Flow/nodes/NodeRenderer.js +303 -314
  307. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  308. package/dist/components/pro/Flow/nodes/NodeText.js +25 -29
  309. package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
  310. package/dist/components/pro/Flow/nodes/aiClient.js +124 -137
  311. package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
  312. package/dist/components/pro/Flow/nodes/animAnchors.js +42 -49
  313. package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
  314. package/dist/components/pro/Flow/nodes/dataUtils.js +246 -267
  315. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  316. package/dist/components/pro/Flow/nodes/nodeUtils.js +23 -28
  317. package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
  318. package/dist/components/pro/Flow/nodes/shapes.js +556 -589
  319. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  320. package/dist/components/pro/Flow/nodes/svgIconTexture.js +37 -39
  321. package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
  322. package/dist/components/pro/Flow/nodes/svgIcons.js +684 -689
  323. package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
  324. package/dist/components/pro/Flow/panels/AIPanel.js +464 -491
  325. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  326. package/dist/components/pro/Flow/panels/Breadcrumb.js +41 -41
  327. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  328. package/dist/components/pro/Flow/panels/ContextMenu.js +37 -37
  329. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  330. package/dist/components/pro/Flow/panels/DataInspectorSection.js +428 -432
  331. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  332. package/dist/components/pro/Flow/panels/ExpandableTextarea.js +61 -62
  333. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  334. package/dist/components/pro/Flow/panels/FlowPanelGroup.js +114 -114
  335. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  336. package/dist/components/pro/Flow/panels/FlowToolbar.js +347 -391
  337. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  338. package/dist/components/pro/Flow/panels/InspectorPanel.js +1792 -1798
  339. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  340. package/dist/components/pro/Flow/panels/OutlinePanel.js +242 -248
  341. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  342. package/dist/components/pro/Flow/panels/PresentationMode.js +137 -140
  343. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  344. package/dist/components/pro/Flow/panels/ProjectTitle.js +46 -46
  345. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  346. package/dist/components/pro/Flow/panels/ShapePalette.js +557 -572
  347. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  348. package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +0 -1
  349. package/dist/components/pro/Flow/panels/toolbarIcons.js +508 -557
  350. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  351. package/dist/components/pro/Flow/types.js +26 -26
  352. package/dist/components/pro/Flow/types.js.map +1 -1
  353. package/dist/components/pro/Flow/utils/dashedLine.js +113 -117
  354. package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
  355. package/dist/components/pro/Flow/utils/gradient.js +55 -55
  356. package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
  357. package/dist/components/pro/Flow/utils/pdfExport.js +50 -89
  358. package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
  359. package/dist/components/pro/Flow/utils/themeColor.js +185 -195
  360. package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
  361. package/dist/components/pro/Gantt/Gantt.d.ts +7 -0
  362. package/dist/components/pro/Gantt/hooks/useGanttDrag.d.ts +31 -0
  363. package/dist/components/pro/Gantt/hooks/useGanttState.d.ts +58 -0
  364. package/dist/components/pro/Gantt/index.d.ts +6 -0
  365. package/dist/components/pro/Gantt/types.d.ts +478 -0
  366. package/dist/components/pro/Gantt/utils.d.ts +124 -0
  367. package/dist/components/pro/Resizable/Resizable.d.ts +30 -0
  368. package/dist/components/pro/Resizable/index.d.ts +2 -0
  369. package/dist/components/pro/RichTextEditor/AIRewrite.js +323 -334
  370. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  371. package/dist/components/pro/RichTextEditor/BlockHandle.js +314 -316
  372. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  373. package/dist/components/pro/RichTextEditor/BubbleToolbar.js +97 -97
  374. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  375. package/dist/components/pro/RichTextEditor/CommentDialog.js +88 -88
  376. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  377. package/dist/components/pro/RichTextEditor/CommentPanel.js +240 -240
  378. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  379. package/dist/components/pro/RichTextEditor/CommentPopover.js +234 -234
  380. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  381. package/dist/components/pro/RichTextEditor/ContextMenu.js +251 -252
  382. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  383. package/dist/components/pro/RichTextEditor/RichTextEditor.js +267 -271
  384. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  385. package/dist/components/pro/RichTextEditor/SlashMenu.js +214 -214
  386. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  387. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -75
  388. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  389. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +261 -261
  390. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  391. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +172 -526
  392. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  393. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js +112 -114
  394. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  395. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +194 -194
  396. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  397. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +970 -973
  398. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  399. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +11 -12
  400. package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
  401. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +310 -344
  402. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  403. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js +38 -39
  404. package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
  405. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +620 -625
  406. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  407. package/dist/components/pro/RichTextEditor/extensions/FontSize.js +25 -25
  408. package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
  409. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +167 -176
  410. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  411. package/dist/components/pro/RichTextEditor/types.js +75 -75
  412. package/dist/components/pro/RichTextEditor/types.js.map +1 -1
  413. package/dist/contexts/AppContext.d.ts +1 -1
  414. package/dist/contexts/AppContext.js +216 -221
  415. package/dist/contexts/AppContext.js.map +1 -1
  416. package/dist/data-table.js +15 -41
  417. package/dist/data-table.js.map +1 -1
  418. package/dist/dishui.css +1 -1
  419. package/dist/flow.js +27 -83
  420. package/dist/hooks/useClickOutside.js +18 -18
  421. package/dist/hooks/useClickOutside.js.map +1 -1
  422. package/dist/hooks/useContainerElement.js +9 -9
  423. package/dist/hooks/useContainerElement.js.map +1 -1
  424. package/dist/hooks/useControllableState.js +33 -35
  425. package/dist/hooks/useControllableState.js.map +1 -1
  426. package/dist/hooks/useCopyToClipboard.js +16 -16
  427. package/dist/hooks/useCopyToClipboard.js.map +1 -1
  428. package/dist/hooks/useDebounce.js +14 -14
  429. package/dist/hooks/useDebounce.js.map +1 -1
  430. package/dist/hooks/useDraggable.js +50 -50
  431. package/dist/hooks/useDraggable.js.map +1 -1
  432. package/dist/hooks/useTableColumns.js +39 -41
  433. package/dist/hooks/useTableColumns.js.map +1 -1
  434. package/dist/hooks/useTableData.js +67 -68
  435. package/dist/hooks/useTableData.js.map +1 -1
  436. package/dist/index-nostyled.d.ts +8 -0
  437. package/dist/index.d.ts +27 -1
  438. package/dist/index.js +105 -241
  439. package/dist/layouts/MainLayout.js +56 -56
  440. package/dist/layouts/MainLayout.js.map +1 -1
  441. package/dist/layouts/Navbar.js +214 -214
  442. package/dist/layouts/Navbar.js.map +1 -1
  443. package/dist/layouts/Sidebar.js +184 -186
  444. package/dist/layouts/Sidebar.js.map +1 -1
  445. package/dist/layouts/headbar/Headbar.js +25 -25
  446. package/dist/layouts/headbar/Headbar.js.map +1 -1
  447. package/dist/layouts/headbar/HeadbarLangSwitcher.js +39 -39
  448. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  449. package/dist/layouts/headbar/HeadbarSearch.js +120 -120
  450. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  451. package/dist/layouts/headbar/HeadbarThemeSwitcher.js +27 -27
  452. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  453. package/dist/layouts/headbar/HeadbarTitle.js +26 -26
  454. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  455. package/dist/lite.js +9 -24
  456. package/dist/markdown.js +4 -9
  457. package/dist/pages/components/Calendar/index.d.ts +3 -0
  458. package/dist/pages/components/Calendar/index.en.d.ts +3 -0
  459. package/dist/pages/components/Calendar/index.zh.d.ts +3 -0
  460. package/dist/pages/components/Chat/index.d.ts +3 -0
  461. package/dist/pages/components/Chat/index.en.d.ts +3 -0
  462. package/dist/pages/components/Chat/index.zh.d.ts +3 -0
  463. package/dist/pages/components/FloatWindow/index.d.ts +3 -0
  464. package/dist/pages/components/FloatWindow/index.en.d.ts +3 -0
  465. package/dist/pages/components/FloatWindow/index.zh.d.ts +3 -0
  466. package/dist/pages/components/Gantt/index.d.ts +3 -0
  467. package/dist/pages/components/Gantt/index.en.d.ts +3 -0
  468. package/dist/pages/components/Gantt/index.zh.d.ts +3 -0
  469. package/dist/pages/components/GridLayout/index.d.ts +3 -0
  470. package/dist/pages/components/GridLayout/index.en.d.ts +3 -0
  471. package/dist/pages/components/GridLayout/index.zh.d.ts +3 -0
  472. package/dist/pages/components/Notification/index.d.ts +3 -0
  473. package/dist/pages/components/Notification/index.en.d.ts +3 -0
  474. package/dist/pages/components/Notification/index.zh.d.ts +3 -0
  475. package/dist/pages/components/Resizable/index.d.ts +3 -0
  476. package/dist/pages/components/Resizable/index.en.d.ts +3 -0
  477. package/dist/pages/components/Resizable/index.zh.d.ts +3 -0
  478. package/dist/pages/components/Tab/index.d.ts +3 -0
  479. package/dist/pages/components/Tab/index.en.d.ts +3 -0
  480. package/dist/pages/components/Tab/index.zh.d.ts +3 -0
  481. package/dist/styles/themeStyles.js +87 -86
  482. package/dist/styles/themeStyles.js.map +1 -1
  483. package/dist/utils/cn.d.ts +13 -0
  484. package/dist/utils/cn.js +16 -0
  485. package/dist/utils/cn.js.map +1 -0
  486. package/dist/utils/i18n.js +690 -602
  487. package/dist/utils/i18n.js.map +1 -1
  488. package/dist/utils/menu.js +94 -94
  489. package/dist/utils/menu.js.map +1 -1
  490. package/dist/utils/rehype-code-meta.js +14 -14
  491. package/dist/utils/rehype-code-meta.js.map +1 -1
  492. package/dist/utils/remark-code-meta.js +9 -9
  493. package/dist/utils/remark-code-meta.js.map +1 -1
  494. package/dist/utils/routerBuilder.js +59 -60
  495. package/dist/utils/routerBuilder.js.map +1 -1
  496. package/dist/utils/selection.js +28 -29
  497. package/dist/utils/selection.js.map +1 -1
  498. package/dist/utils/themes.js +275 -255
  499. package/dist/utils/themes.js.map +1 -1
  500. package/package.json +19 -6
@@ -1 +1 @@
1
- {"version":3,"file":"dataUtils.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/dataUtils.ts"],"sourcesContent":["// Data-node helpers: CSV/XLSX parsing, column type inference, and building\n// TanStack Charts definitions from parsed rows. Kept dependency-light so the\n// base `dishui/flow` bundle stays small — `fflate` (already a transitive dep of\n// markmap) is the only heavy import and only loads when an .xlsx is opened.\n\nimport type {\n FlowDataColumn,\n FlowDataColumnType,\n FlowDataConfig,\n FlowDataChartConfig,\n} from '../types';\n\n/** Result of parsing a raw table into columns + row records. */\nexport interface ParsedTable {\n columns: FlowDataColumn[];\n rows: Array<Record<string, unknown>>;\n}\n\n// ── CSV parsing ────────────────────────────────────────────────────────────\n\n/**\n * Parse CSV text into a matrix of string cells. Handles quoted fields,\n * escaped quotes (\"\"), and embedded newlines/commas. Auto-detects `,` or `;`\n * as the delimiter from the first non-empty line.\n */\nexport function parseCsv(text: string): string[][] {\n const src = text.replace(/^\\uFEFF/, ''); // strip BOM\n const delimiter = detectDelimiter(src);\n const rows: string[][] = [];\n let field = '';\n let row: string[] = [];\n let inQuotes = false;\n\n for (let i = 0; i < src.length; i++) {\n const ch = src[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (src[i + 1] === '\"') {\n field += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n field += ch;\n }\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n } else if (ch === delimiter) {\n row.push(field);\n field = '';\n } else if (ch === '\\n') {\n row.push(field);\n rows.push(row);\n field = '';\n row = [];\n } else if (ch === '\\r') {\n // ignore; handled by the following \\n (or end of input)\n } else {\n field += ch;\n }\n }\n // flush trailing field/row\n if (field.length > 0 || row.length > 0) {\n row.push(field);\n rows.push(row);\n }\n // drop fully-empty trailing rows\n return rows.filter((r) => !(r.length === 1 && r[0].trim() === ''));\n}\n\nfunction detectDelimiter(src: string): string {\n const firstLine = src.split(/\\r?\\n/, 1)[0] ?? '';\n const commas = (firstLine.match(/,/g) ?? []).length;\n const semis = (firstLine.match(/;/g) ?? []).length;\n const tabs = (firstLine.match(/\\t/g) ?? []).length;\n if (tabs > commas && tabs > semis) return '\\t';\n if (semis > commas) return ';';\n return ',';\n}\n\n/** Serialize columns + rows back to CSV text (for round-tripping/exports). */\nexport function toCsv(columns: FlowDataColumn[], rows: Array<Record<string, unknown>>): string {\n const esc = (v: unknown) => {\n const s = v == null ? '' : String(v);\n return /[\",\\n\\r]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const header = columns.map((c) => esc(c.label ?? c.key)).join(',');\n const body = rows\n .map((r) => columns.map((c) => esc(r[c.key])).join(','))\n .join('\\n');\n return body ? `${header}\\n${body}` : header;\n}\n\n// ── XLSX parsing ─────────────────────────────────────────────────────────────\n\n/**\n * Parse the first worksheet of an XLSX workbook (an OOXML zip) into a string\n * matrix. Uses `fflate` to unzip and DOMParser to read the sheet XML + shared\n * strings. Loaded dynamically so it never enters the base bundle.\n */\nexport async function parseXlsx(buffer: ArrayBuffer): Promise<string[][]> {\n const { unzipSync, strFromU8 } = await import('fflate');\n const files = unzipSync(new Uint8Array(buffer));\n\n const parser = new DOMParser();\n const readXml = (path: string): Document | null => {\n const entry = files[path];\n if (!entry) return null;\n return parser.parseFromString(strFromU8(entry), 'application/xml');\n };\n\n // Shared strings table (cells of type \"s\" reference these by index).\n const sharedStrings: string[] = [];\n const sst = readXml('xl/sharedStrings.xml');\n if (sst) {\n for (const si of Array.from(sst.getElementsByTagName('si'))) {\n // Concatenate all <t> runs within the string item.\n const ts = Array.from(si.getElementsByTagName('t'));\n sharedStrings.push(ts.map((t) => t.textContent ?? '').join(''));\n }\n }\n\n // Resolve the first sheet's target from the workbook relationships.\n const sheetPath = resolveFirstSheetPath(files, readXml);\n const sheetDoc = readXml(sheetPath);\n if (!sheetDoc) throw new Error('无法读取 Excel 工作表');\n\n const rowsEls = Array.from(sheetDoc.getElementsByTagName('row'));\n const matrix: string[][] = [];\n for (const rowEl of rowsEls) {\n const cells = Array.from(rowEl.getElementsByTagName('c'));\n const rowArr: string[] = [];\n for (const c of cells) {\n const ref = c.getAttribute('r') ?? '';\n const colIdx = columnRefToIndex(ref);\n const type = c.getAttribute('t');\n let value = '';\n if (type === 's') {\n const idx = Number(c.getElementsByTagName('v')[0]?.textContent ?? '');\n value = Number.isFinite(idx) ? sharedStrings[idx] ?? '' : '';\n } else if (type === 'inlineStr') {\n value = c.getElementsByTagName('t')[0]?.textContent ?? '';\n } else {\n value = c.getElementsByTagName('v')[0]?.textContent ?? '';\n }\n if (colIdx >= 0) rowArr[colIdx] = value;\n }\n // normalize holes to empty strings\n for (let i = 0; i < rowArr.length; i++) if (rowArr[i] == null) rowArr[i] = '';\n matrix.push(rowArr);\n }\n return matrix.filter((r) => r.some((cell) => cell.trim() !== ''));\n}\n\nfunction resolveFirstSheetPath(\n files: Record<string, Uint8Array>,\n readXml: (path: string) => Document | null,\n): string {\n // Prefer following workbook.xml → rels; fall back to the conventional path.\n const workbook = readXml('xl/workbook.xml');\n const rels = readXml('xl/_rels/workbook.xml.rels');\n if (workbook && rels) {\n const sheet = workbook.getElementsByTagName('sheet')[0];\n const rid = sheet?.getAttribute('r:id') ?? sheet?.getAttributeNS(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n 'id',\n );\n if (rid) {\n for (const rel of Array.from(rels.getElementsByTagName('Relationship'))) {\n if (rel.getAttribute('Id') === rid) {\n const target = rel.getAttribute('Target') ?? '';\n const norm = target.replace(/^\\//, '').replace(/^xl\\//, '');\n return `xl/${norm}`;\n }\n }\n }\n }\n if (files['xl/worksheets/sheet1.xml']) return 'xl/worksheets/sheet1.xml';\n // last resort: first worksheet entry found\n const first = Object.keys(files).find((p) => /^xl\\/worksheets\\/.*\\.xml$/.test(p));\n return first ?? 'xl/worksheets/sheet1.xml';\n}\n\n/** Convert an A1-style cell ref (e.g. \"C5\") to a zero-based column index. */\nfunction columnRefToIndex(ref: string): number {\n const letters = ref.match(/^[A-Z]+/i)?.[0];\n if (!letters) return -1;\n let idx = 0;\n for (const ch of letters.toUpperCase()) {\n idx = idx * 26 + (ch.charCodeAt(0) - 64);\n }\n return idx - 1;\n}\n\n// ── Matrix → table (columns + typed rows) ────────────────────────────────────\n\n/** Slugify a header label into a safe object key, deduping collisions. */\nfunction toKey(label: string, used: Set<string>): string {\n let base = label.trim().replace(/\\s+/g, '_').replace(/[^\\w\\u4e00-\\u9fa5]/g, '');\n if (!base) base = 'col';\n let key = base;\n let n = 1;\n while (used.has(key)) key = `${base}_${n++}`;\n used.add(key);\n return key;\n}\n\nconst DATE_RE = /^\\d{4}[-/]\\d{1,2}[-/]\\d{1,2}([ T]\\d{1,2}:\\d{2}(:\\d{2})?)?$/;\n\n/** Infer a column type from a sample of raw string cell values. */\nexport function inferColumnType(samples: string[]): FlowDataColumnType {\n const nonEmpty = samples.map((s) => s?.trim()).filter((s) => s);\n if (nonEmpty.length === 0) return 'string';\n const isBool = nonEmpty.every((s) => /^(true|false|yes|no|是|否)$/i.test(s));\n if (isBool) return 'boolean';\n const isNum = nonEmpty.every((s) => /^-?\\d+(\\.\\d+)?%?$/.test(s.replace(/,/g, '')));\n if (isNum) return 'number';\n const isDate = nonEmpty.every((s) => DATE_RE.test(s));\n if (isDate) return 'date';\n return 'string';\n}\n\n/** Coerce a raw string cell to a typed value based on the column type. */\nexport function coerceValue(raw: string, type: FlowDataColumnType): unknown {\n const s = (raw ?? '').trim();\n if (s === '') return type === 'number' ? null : '';\n switch (type) {\n case 'number': {\n const cleaned = s.replace(/,/g, '').replace(/%$/, '');\n const n = Number(cleaned);\n return Number.isFinite(n) ? n : null;\n }\n case 'boolean':\n return /^(true|yes|是)$/i.test(s);\n case 'date':\n case 'string':\n default:\n return s;\n }\n}\n\n/**\n * Build a typed table from a raw string matrix. The first row is treated as the\n * header. Column types are inferred from the data rows.\n */\nexport function matrixToTable(matrix: string[][]): ParsedTable {\n if (matrix.length === 0) return { columns: [], rows: [] };\n const [header, ...dataRows] = matrix;\n const used = new Set<string>();\n const colCount = Math.max(header.length, ...dataRows.map((r) => r.length), 0);\n\n const columns: FlowDataColumn[] = [];\n for (let c = 0; c < colCount; c++) {\n const label = (header[c] ?? `列${c + 1}`).trim() || `列${c + 1}`;\n const samples = dataRows.slice(0, 50).map((r) => r[c] ?? '');\n columns.push({ key: toKey(label, used), label, type: inferColumnType(samples) });\n }\n\n const rows = dataRows.map((r) => {\n const record: Record<string, unknown> = {};\n columns.forEach((col, c) => {\n record[col.key] = coerceValue(r[c] ?? '', col.type);\n });\n return record;\n });\n\n return { columns, rows };\n}\n\n/** Parse a File (csv or xlsx) into a typed table. */\nexport async function parseDataFile(file: File): Promise<ParsedTable> {\n const name = file.name.toLowerCase();\n if (name.endsWith('.xlsx') || name.endsWith('.xlsm')) {\n const buffer = await file.arrayBuffer();\n return matrixToTable(await parseXlsx(buffer));\n }\n // treat everything else as delimited text (csv/tsv/txt)\n const text = await file.text();\n return matrixToTable(parseCsv(text));\n}\n\n// ── Config helpers ───────────────────────────────────────────────────────────\n\n/** Default palette for chart series, mirroring the demo examples. */\nexport const DATA_CHART_PALETTE = [\n '#6366f1', '#10b981', '#f59e0b', '#f43f5e', '#06b6d4',\n '#8b5cf6', '#84cc16', '#ec4899', '#0ea5e9', '#f97316',\n];\n\n/** Column key → display label lookup. */\nexport function labelFor(columns: FlowDataColumn[], key: string): string {\n return columns.find((c) => c.key === key)?.label ?? key;\n}\n\n/** First non-numeric column key (a sensible default X/category field). */\nexport function firstDimension(columns: FlowDataColumn[]): string | undefined {\n return (columns.find((c) => c.type !== 'number') ?? columns[0])?.key;\n}\n\n/** All numeric column keys (candidate measures/series). */\nexport function numericFields(columns: FlowDataColumn[]): string[] {\n return columns.filter((c) => c.type === 'number').map((c) => c.key);\n}\n\n/**\n * Produce a sensible default `FlowDataConfig` for a freshly parsed table:\n * table view, first numeric field charted against the first dimension.\n */\nexport function makeDefaultDataConfig(\n parsed: ParsedTable,\n sourceName?: string,\n): FlowDataConfig {\n const x = firstDimension(parsed.columns);\n const nums = numericFields(parsed.columns);\n return {\n columns: parsed.columns,\n rows: parsed.rows,\n view: 'table',\n sourceName,\n chart: {\n type: 'bar',\n xField: x,\n yFields: nums.slice(0, 1),\n },\n pivot: {\n enabled: false,\n rowFields: x ? [x] : [],\n colFields: [],\n values: nums[0] ? [{ field: nums[0], aggFn: 'sum' }] : [],\n },\n };\n}\n\n/**\n * Re-parse CSV text into an existing config, preserving column keys and types\n * for headers that match an existing column (by label or key). New headers get\n * fresh inferred columns; chart/pivot references to removed fields are pruned.\n */\nexport function applyCsvText(config: FlowDataConfig, text: string): FlowDataConfig {\n const matrix = parseCsv(text);\n if (matrix.length === 0) {\n return { ...config, columns: [], rows: [], chart: { type: 'bar' }, pivot: { enabled: false, rowFields: [], colFields: [], values: [] } };\n }\n const [header, ...dataRows] = matrix;\n const colCount = Math.max(header.length, ...dataRows.map((r) => r.length), 0);\n const used = new Set<string>();\n const byLabel = new Map(config.columns.map((c) => [c.label ?? c.key, c]));\n const byKey = new Map(config.columns.map((c) => [c.key, c]));\n\n const columns: FlowDataColumn[] = [];\n for (let c = 0; c < colCount; c++) {\n const label = (header[c] ?? `列${c + 1}`).trim() || `列${c + 1}`;\n const existing = byLabel.get(label) ?? byKey.get(label);\n if (existing) {\n used.add(existing.key);\n columns.push({ ...existing, label });\n } else {\n const samples = dataRows.slice(0, 50).map((r) => r[c] ?? '');\n columns.push({ key: toKey(label, used), label, type: inferColumnType(samples) });\n }\n }\n\n const rows = dataRows.map((r) => {\n const record: Record<string, unknown> = {};\n columns.forEach((col, c) => {\n record[col.key] = coerceValue(r[c] ?? '', col.type);\n });\n return record;\n });\n\n const keys = new Set(columns.map((c) => c.key));\n\n const chart = config.chart\n ? {\n ...config.chart,\n xField: config.chart.xField && keys.has(config.chart.xField)\n ? config.chart.xField\n : firstDimension(columns),\n yFields: (config.chart.yFields ?? []).filter((f) => keys.has(f)),\n seriesColors: config.chart.seriesColors\n ? Object.fromEntries(Object.entries(config.chart.seriesColors).filter(([f]) => keys.has(f)))\n : undefined,\n }\n : config.chart;\n\n const pivot = config.pivot\n ? {\n ...config.pivot,\n rowFields: config.pivot.rowFields.filter((f) => keys.has(f)),\n colFields: config.pivot.colFields.filter((f) => keys.has(f)),\n values: config.pivot.values.filter((v) => keys.has(v.field)),\n }\n : config.pivot;\n\n return { ...config, columns, rows, chart, pivot };\n}\n\n/** A small starter table used when creating an empty Data node from the palette. */\nexport function makeStarterDataConfig(): FlowDataConfig {\n const columns: FlowDataColumn[] = [\n { key: 'category', label: '类别', type: 'string' },\n { key: 'value', label: '数值', type: 'number' },\n ];\n const rows = [\n { category: 'A', value: 30 },\n { category: 'B', value: 45 },\n { category: 'C', value: 28 },\n ];\n return makeDefaultDataConfig({ columns, rows });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dataUtils.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/dataUtils.ts"],"sourcesContent":["// Data-node helpers: CSV/XLSX parsing, column type inference, and building\n// TanStack Charts definitions from parsed rows. Kept dependency-light so the\n// base `dishui/flow` bundle stays small — `fflate` (already a transitive dep of\n// markmap) is the only heavy import and only loads when an .xlsx is opened.\n\nimport type {\n FlowDataColumn,\n FlowDataColumnType,\n FlowDataConfig,\n FlowDataChartConfig,\n} from '../types';\n\n/** Result of parsing a raw table into columns + row records. */\nexport interface ParsedTable {\n columns: FlowDataColumn[];\n rows: Array<Record<string, unknown>>;\n}\n\n// ── CSV parsing ────────────────────────────────────────────────────────────\n\n/**\n * Parse CSV text into a matrix of string cells. Handles quoted fields,\n * escaped quotes (\"\"), and embedded newlines/commas. Auto-detects `,` or `;`\n * as the delimiter from the first non-empty line.\n */\nexport function parseCsv(text: string): string[][] {\n const src = text.replace(/^\\uFEFF/, ''); // strip BOM\n const delimiter = detectDelimiter(src);\n const rows: string[][] = [];\n let field = '';\n let row: string[] = [];\n let inQuotes = false;\n\n for (let i = 0; i < src.length; i++) {\n const ch = src[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (src[i + 1] === '\"') {\n field += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n field += ch;\n }\n continue;\n }\n if (ch === '\"') {\n inQuotes = true;\n } else if (ch === delimiter) {\n row.push(field);\n field = '';\n } else if (ch === '\\n') {\n row.push(field);\n rows.push(row);\n field = '';\n row = [];\n } else if (ch === '\\r') {\n // ignore; handled by the following \\n (or end of input)\n } else {\n field += ch;\n }\n }\n // flush trailing field/row\n if (field.length > 0 || row.length > 0) {\n row.push(field);\n rows.push(row);\n }\n // drop fully-empty trailing rows\n return rows.filter((r) => !(r.length === 1 && r[0].trim() === ''));\n}\n\nfunction detectDelimiter(src: string): string {\n const firstLine = src.split(/\\r?\\n/, 1)[0] ?? '';\n const commas = (firstLine.match(/,/g) ?? []).length;\n const semis = (firstLine.match(/;/g) ?? []).length;\n const tabs = (firstLine.match(/\\t/g) ?? []).length;\n if (tabs > commas && tabs > semis) return '\\t';\n if (semis > commas) return ';';\n return ',';\n}\n\n/** Serialize columns + rows back to CSV text (for round-tripping/exports). */\nexport function toCsv(columns: FlowDataColumn[], rows: Array<Record<string, unknown>>): string {\n const esc = (v: unknown) => {\n const s = v == null ? '' : String(v);\n return /[\",\\n\\r]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\n };\n const header = columns.map((c) => esc(c.label ?? c.key)).join(',');\n const body = rows\n .map((r) => columns.map((c) => esc(r[c.key])).join(','))\n .join('\\n');\n return body ? `${header}\\n${body}` : header;\n}\n\n// ── XLSX parsing ─────────────────────────────────────────────────────────────\n\n/**\n * Parse the first worksheet of an XLSX workbook (an OOXML zip) into a string\n * matrix. Uses `fflate` to unzip and DOMParser to read the sheet XML + shared\n * strings. Loaded dynamically so it never enters the base bundle.\n */\nexport async function parseXlsx(buffer: ArrayBuffer): Promise<string[][]> {\n const { unzipSync, strFromU8 } = await import('fflate');\n const files = unzipSync(new Uint8Array(buffer));\n\n const parser = new DOMParser();\n const readXml = (path: string): Document | null => {\n const entry = files[path];\n if (!entry) return null;\n return parser.parseFromString(strFromU8(entry), 'application/xml');\n };\n\n // Shared strings table (cells of type \"s\" reference these by index).\n const sharedStrings: string[] = [];\n const sst = readXml('xl/sharedStrings.xml');\n if (sst) {\n for (const si of Array.from(sst.getElementsByTagName('si'))) {\n // Concatenate all <t> runs within the string item.\n const ts = Array.from(si.getElementsByTagName('t'));\n sharedStrings.push(ts.map((t) => t.textContent ?? '').join(''));\n }\n }\n\n // Resolve the first sheet's target from the workbook relationships.\n const sheetPath = resolveFirstSheetPath(files, readXml);\n const sheetDoc = readXml(sheetPath);\n if (!sheetDoc) throw new Error('无法读取 Excel 工作表');\n\n const rowsEls = Array.from(sheetDoc.getElementsByTagName('row'));\n const matrix: string[][] = [];\n for (const rowEl of rowsEls) {\n const cells = Array.from(rowEl.getElementsByTagName('c'));\n const rowArr: string[] = [];\n for (const c of cells) {\n const ref = c.getAttribute('r') ?? '';\n const colIdx = columnRefToIndex(ref);\n const type = c.getAttribute('t');\n let value = '';\n if (type === 's') {\n const idx = Number(c.getElementsByTagName('v')[0]?.textContent ?? '');\n value = Number.isFinite(idx) ? sharedStrings[idx] ?? '' : '';\n } else if (type === 'inlineStr') {\n value = c.getElementsByTagName('t')[0]?.textContent ?? '';\n } else {\n value = c.getElementsByTagName('v')[0]?.textContent ?? '';\n }\n if (colIdx >= 0) rowArr[colIdx] = value;\n }\n // normalize holes to empty strings\n for (let i = 0; i < rowArr.length; i++) if (rowArr[i] == null) rowArr[i] = '';\n matrix.push(rowArr);\n }\n return matrix.filter((r) => r.some((cell) => cell.trim() !== ''));\n}\n\nfunction resolveFirstSheetPath(\n files: Record<string, Uint8Array>,\n readXml: (path: string) => Document | null,\n): string {\n // Prefer following workbook.xml → rels; fall back to the conventional path.\n const workbook = readXml('xl/workbook.xml');\n const rels = readXml('xl/_rels/workbook.xml.rels');\n if (workbook && rels) {\n const sheet = workbook.getElementsByTagName('sheet')[0];\n const rid = sheet?.getAttribute('r:id') ?? sheet?.getAttributeNS(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n 'id',\n );\n if (rid) {\n for (const rel of Array.from(rels.getElementsByTagName('Relationship'))) {\n if (rel.getAttribute('Id') === rid) {\n const target = rel.getAttribute('Target') ?? '';\n const norm = target.replace(/^\\//, '').replace(/^xl\\//, '');\n return `xl/${norm}`;\n }\n }\n }\n }\n if (files['xl/worksheets/sheet1.xml']) return 'xl/worksheets/sheet1.xml';\n // last resort: first worksheet entry found\n const first = Object.keys(files).find((p) => /^xl\\/worksheets\\/.*\\.xml$/.test(p));\n return first ?? 'xl/worksheets/sheet1.xml';\n}\n\n/** Convert an A1-style cell ref (e.g. \"C5\") to a zero-based column index. */\nfunction columnRefToIndex(ref: string): number {\n const letters = ref.match(/^[A-Z]+/i)?.[0];\n if (!letters) return -1;\n let idx = 0;\n for (const ch of letters.toUpperCase()) {\n idx = idx * 26 + (ch.charCodeAt(0) - 64);\n }\n return idx - 1;\n}\n\n// ── Matrix → table (columns + typed rows) ────────────────────────────────────\n\n/** Slugify a header label into a safe object key, deduping collisions. */\nfunction toKey(label: string, used: Set<string>): string {\n let base = label.trim().replace(/\\s+/g, '_').replace(/[^\\w\\u4e00-\\u9fa5]/g, '');\n if (!base) base = 'col';\n let key = base;\n let n = 1;\n while (used.has(key)) key = `${base}_${n++}`;\n used.add(key);\n return key;\n}\n\nconst DATE_RE = /^\\d{4}[-/]\\d{1,2}[-/]\\d{1,2}([ T]\\d{1,2}:\\d{2}(:\\d{2})?)?$/;\n\n/** Infer a column type from a sample of raw string cell values. */\nexport function inferColumnType(samples: string[]): FlowDataColumnType {\n const nonEmpty = samples.map((s) => s?.trim()).filter((s) => s);\n if (nonEmpty.length === 0) return 'string';\n const isBool = nonEmpty.every((s) => /^(true|false|yes|no|是|否)$/i.test(s));\n if (isBool) return 'boolean';\n const isNum = nonEmpty.every((s) => /^-?\\d+(\\.\\d+)?%?$/.test(s.replace(/,/g, '')));\n if (isNum) return 'number';\n const isDate = nonEmpty.every((s) => DATE_RE.test(s));\n if (isDate) return 'date';\n return 'string';\n}\n\n/** Coerce a raw string cell to a typed value based on the column type. */\nexport function coerceValue(raw: string, type: FlowDataColumnType): unknown {\n const s = (raw ?? '').trim();\n if (s === '') return type === 'number' ? null : '';\n switch (type) {\n case 'number': {\n const cleaned = s.replace(/,/g, '').replace(/%$/, '');\n const n = Number(cleaned);\n return Number.isFinite(n) ? n : null;\n }\n case 'boolean':\n return /^(true|yes|是)$/i.test(s);\n case 'date':\n case 'string':\n default:\n return s;\n }\n}\n\n/**\n * Build a typed table from a raw string matrix. The first row is treated as the\n * header. Column types are inferred from the data rows.\n */\nexport function matrixToTable(matrix: string[][]): ParsedTable {\n if (matrix.length === 0) return { columns: [], rows: [] };\n const [header, ...dataRows] = matrix;\n const used = new Set<string>();\n const colCount = Math.max(header.length, ...dataRows.map((r) => r.length), 0);\n\n const columns: FlowDataColumn[] = [];\n for (let c = 0; c < colCount; c++) {\n const label = (header[c] ?? `列${c + 1}`).trim() || `列${c + 1}`;\n const samples = dataRows.slice(0, 50).map((r) => r[c] ?? '');\n columns.push({ key: toKey(label, used), label, type: inferColumnType(samples) });\n }\n\n const rows = dataRows.map((r) => {\n const record: Record<string, unknown> = {};\n columns.forEach((col, c) => {\n record[col.key] = coerceValue(r[c] ?? '', col.type);\n });\n return record;\n });\n\n return { columns, rows };\n}\n\n/** Parse a File (csv or xlsx) into a typed table. */\nexport async function parseDataFile(file: File): Promise<ParsedTable> {\n const name = file.name.toLowerCase();\n if (name.endsWith('.xlsx') || name.endsWith('.xlsm')) {\n const buffer = await file.arrayBuffer();\n return matrixToTable(await parseXlsx(buffer));\n }\n // treat everything else as delimited text (csv/tsv/txt)\n const text = await file.text();\n return matrixToTable(parseCsv(text));\n}\n\n// ── Config helpers ───────────────────────────────────────────────────────────\n\n/** Default palette for chart series, mirroring the demo examples. */\nexport const DATA_CHART_PALETTE = [\n '#6366f1', '#10b981', '#f59e0b', '#f43f5e', '#06b6d4',\n '#8b5cf6', '#84cc16', '#ec4899', '#0ea5e9', '#f97316',\n];\n\n/** Column key → display label lookup. */\nexport function labelFor(columns: FlowDataColumn[], key: string): string {\n return columns.find((c) => c.key === key)?.label ?? key;\n}\n\n/** First non-numeric column key (a sensible default X/category field). */\nexport function firstDimension(columns: FlowDataColumn[]): string | undefined {\n return (columns.find((c) => c.type !== 'number') ?? columns[0])?.key;\n}\n\n/** All numeric column keys (candidate measures/series). */\nexport function numericFields(columns: FlowDataColumn[]): string[] {\n return columns.filter((c) => c.type === 'number').map((c) => c.key);\n}\n\n/**\n * Produce a sensible default `FlowDataConfig` for a freshly parsed table:\n * table view, first numeric field charted against the first dimension.\n */\nexport function makeDefaultDataConfig(\n parsed: ParsedTable,\n sourceName?: string,\n): FlowDataConfig {\n const x = firstDimension(parsed.columns);\n const nums = numericFields(parsed.columns);\n return {\n columns: parsed.columns,\n rows: parsed.rows,\n view: 'table',\n sourceName,\n chart: {\n type: 'bar',\n xField: x,\n yFields: nums.slice(0, 1),\n },\n pivot: {\n enabled: false,\n rowFields: x ? [x] : [],\n colFields: [],\n values: nums[0] ? [{ field: nums[0], aggFn: 'sum' }] : [],\n },\n };\n}\n\n/**\n * Re-parse CSV text into an existing config, preserving column keys and types\n * for headers that match an existing column (by label or key). New headers get\n * fresh inferred columns; chart/pivot references to removed fields are pruned.\n */\nexport function applyCsvText(config: FlowDataConfig, text: string): FlowDataConfig {\n const matrix = parseCsv(text);\n if (matrix.length === 0) {\n return { ...config, columns: [], rows: [], chart: { type: 'bar' }, pivot: { enabled: false, rowFields: [], colFields: [], values: [] } };\n }\n const [header, ...dataRows] = matrix;\n const colCount = Math.max(header.length, ...dataRows.map((r) => r.length), 0);\n const used = new Set<string>();\n const byLabel = new Map(config.columns.map((c) => [c.label ?? c.key, c]));\n const byKey = new Map(config.columns.map((c) => [c.key, c]));\n\n const columns: FlowDataColumn[] = [];\n for (let c = 0; c < colCount; c++) {\n const label = (header[c] ?? `列${c + 1}`).trim() || `列${c + 1}`;\n const existing = byLabel.get(label) ?? byKey.get(label);\n if (existing) {\n used.add(existing.key);\n columns.push({ ...existing, label });\n } else {\n const samples = dataRows.slice(0, 50).map((r) => r[c] ?? '');\n columns.push({ key: toKey(label, used), label, type: inferColumnType(samples) });\n }\n }\n\n const rows = dataRows.map((r) => {\n const record: Record<string, unknown> = {};\n columns.forEach((col, c) => {\n record[col.key] = coerceValue(r[c] ?? '', col.type);\n });\n return record;\n });\n\n const keys = new Set(columns.map((c) => c.key));\n\n const chart = config.chart\n ? {\n ...config.chart,\n xField: config.chart.xField && keys.has(config.chart.xField)\n ? config.chart.xField\n : firstDimension(columns),\n yFields: (config.chart.yFields ?? []).filter((f) => keys.has(f)),\n seriesColors: config.chart.seriesColors\n ? Object.fromEntries(Object.entries(config.chart.seriesColors).filter(([f]) => keys.has(f)))\n : undefined,\n }\n : config.chart;\n\n const pivot = config.pivot\n ? {\n ...config.pivot,\n rowFields: config.pivot.rowFields.filter((f) => keys.has(f)),\n colFields: config.pivot.colFields.filter((f) => keys.has(f)),\n values: config.pivot.values.filter((v) => keys.has(v.field)),\n }\n : config.pivot;\n\n return { ...config, columns, rows, chart, pivot };\n}\n\n/** A small starter table used when creating an empty Data node from the palette. */\nexport function makeStarterDataConfig(): FlowDataConfig {\n const columns: FlowDataColumn[] = [\n { key: 'category', label: '类别', type: 'string' },\n { key: 'value', label: '数值', type: 'number' },\n ];\n const rows = [\n { category: 'A', value: 30 },\n { category: 'B', value: 45 },\n { category: 'C', value: 28 },\n ];\n return makeDefaultDataConfig({ columns, rows });\n}\n"],"mappings":"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"}
@@ -1,36 +1,31 @@
1
- function g(t) {
2
- return (t.rotation ?? 0) * Math.PI / 180;
1
+ //#region src/components/pro/Flow/nodes/nodeUtils.ts
2
+ function e(e) {
3
+ return (e.rotation ?? 0) * Math.PI / 180;
3
4
  }
4
- function l(t) {
5
- return {
6
- sx: t.flipX ? -1 : 1,
7
- sy: t.flipY ? -1 : 1
8
- };
5
+ function t(e) {
6
+ return {
7
+ sx: e.flipX ? -1 : 1,
8
+ sy: e.flipY ? -1 : 1
9
+ };
9
10
  }
10
- var s = 0;
11
- function M(t = "flow") {
12
- return `${t}_${Date.now().toString(36)}_${(++s).toString(36)}`;
11
+ var n = 0;
12
+ function r(e = "flow") {
13
+ return `${e}_${Date.now().toString(36)}_${(++n).toString(36)}`;
13
14
  }
14
- function S(t, r, o, n = 0) {
15
- const { x: i, y: e } = o.position;
16
- return t >= i - n && t <= i + o.width + n && r >= e - n && r <= e + o.height + n;
15
+ function i(e, t, n, r = 0) {
16
+ let { x: i, y: a } = n.position;
17
+ return e >= i - r && e <= i + n.width + r && t >= a - r && t <= a + n.height + r;
17
18
  }
18
- function m(t, r, o, n, i, e, u, c) {
19
- return t < i + u && t + o > i && r < e + c && r + n > e;
19
+ function a(e, t, n, r, i, a, o, s) {
20
+ return e < i + o && e + n > i && t < a + s && t + r > a;
20
21
  }
21
- function w(t, r, o, n, i, e) {
22
- const u = i - o, c = e - n, f = u * u + c * c;
23
- if (f === 0) return Math.hypot(t - o, r - n);
24
- const h = Math.max(0, Math.min(1, ((t - o) * u + (r - n) * c) / f));
25
- return Math.hypot(t - (o + h * u), r - (n + h * c));
22
+ function o(e, t, n, r, i, a) {
23
+ let o = i - n, s = a - r, c = o * o + s * s;
24
+ if (c === 0) return Math.hypot(e - n, t - r);
25
+ let l = Math.max(0, Math.min(1, ((e - n) * o + (t - r) * s) / c));
26
+ return Math.hypot(e - (n + l * o), t - (r + l * s));
26
27
  }
27
- export {
28
- w as distToSegment,
29
- M as generateId,
30
- l as getFlipScale,
31
- g as getRotationRad,
32
- S as isPointInNode,
33
- m as rectsOverlap
34
- };
28
+ //#endregion
29
+ export { o as distToSegment, r as generateId, t as getFlipScale, e as getRotationRad, i as isPointInNode, a as rectsOverlap };
35
30
 
36
31
  //# sourceMappingURL=nodeUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nodeUtils.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/nodeUtils.ts"],"sourcesContent":["import type { FlowNodeData, FlowNode } from '../types';\n\n/** Get CSS-parseable color number from hex string */\nexport function colorToNumber(hex: string): number {\n if (!hex || hex === 'transparent') return 0x000000;\n const clean = hex.replace('#', '');\n return parseInt(clean, 16) || 0x000000;\n}\n\n/** Compute rotation transform in radians */\nexport function getRotationRad(data: FlowNodeData): number {\n return ((data.rotation ?? 0) * Math.PI) / 180;\n}\n\n/** Compute scale for flip */\nexport function getFlipScale(data: FlowNodeData): { sx: number; sy: number } {\n return {\n sx: data.flipX ? -1 : 1,\n sy: data.flipY ? -1 : 1,\n };\n}\n\n/** Generate a unique ID */\nlet _counter = 0;\nexport function generateId(prefix = 'flow'): string {\n return `${prefix}_${Date.now().toString(36)}_${(++_counter).toString(36)}`;\n}\n\n/** Check if a point is within a node's bounding box (optionally padded) */\nexport function isPointInNode(\n px: number,\n py: number,\n node: FlowNode,\n pad = 0,\n): boolean {\n const { x, y } = node.position;\n return px >= x - pad && px <= x + node.width + pad && py >= y - pad && py <= y + node.height + pad;\n}\n\n/** Check if two axis-aligned rects overlap */\nexport function rectsOverlap(\n ax: number, ay: number, aw: number, ah: number,\n bx: number, by: number, bw: number, bh: number,\n): boolean {\n return ax < bx + bw && ax + aw > bx && ay < by + bh && ay + ah > by;\n}\n\n/** Shortest distance from point (px,py) to line segment (ax,ay)-(bx,by) */\nexport function distToSegment(\n px: number, py: number,\n ax: number, ay: number,\n bx: number, by: number,\n): number {\n const dx = bx - ax, dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - ax, py - ay);\n const t = Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / lenSq));\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));\n}\n"],"mappings":"AAUA,SAAgB,EAAe,GAA4B;AACzD,UAAS,EAAK,YAAY,KAAK,KAAK,KAAM;AAC5C;AAGA,SAAgB,EAAa,GAAgD;AAC3E,SAAO;AAAA,IACL,IAAI,EAAK,QAAQ,KAAK;AAAA,IACtB,IAAI,EAAK,QAAQ,KAAK;AAAA,EACxB;AACF;AAGA,IAAI,IAAW;AACf,SAAgB,EAAW,IAAS,QAAgB;AAClD,SAAO,GAAG,CAAA,IAAU,KAAK,IAAI,EAAE,SAAS,EAAE,CAAA,KAAM,EAAE,GAAU,SAAS,EAAE,CAAA;AACzE;AAGA,SAAgB,EACd,GACA,GACA,GACA,IAAM,GACG;AACT,QAAM,EAAE,GAAA,GAAG,GAAA,EAAA,IAAM,EAAK;AACtB,SAAO,KAAM,IAAI,KAAO,KAAM,IAAI,EAAK,QAAQ,KAAO,KAAM,IAAI,KAAO,KAAM,IAAI,EAAK,SAAS;AACjG;AAGA,SAAgB,EACd,GAAY,GAAY,GAAY,GACpC,GAAY,GAAY,GAAY,GAC3B;AACT,SAAO,IAAK,IAAK,KAAM,IAAK,IAAK,KAAM,IAAK,IAAK,KAAM,IAAK,IAAK;AACnE;AAGA,SAAgB,EACd,GAAY,GACZ,GAAY,GACZ,GAAY,GACJ;AACR,QAAM,IAAK,IAAK,GAAI,IAAK,IAAK,GACxB,IAAQ,IAAK,IAAK,IAAK;AAC7B,MAAI,MAAU,EAAG,QAAO,KAAK,MAAM,IAAK,GAAI,IAAK,CAAE;AACnD,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAK,KAAM,KAAM,IAAK,KAAM,KAAM,CAAK,CAAC;AAC5E,SAAO,KAAK,MAAM,KAAM,IAAK,IAAI,IAAK,KAAM,IAAK,IAAI,EAAG;AAC1D"}
1
+ {"version":3,"file":"nodeUtils.js","names":[],"sources":["../../../../../src/components/pro/Flow/nodes/nodeUtils.ts"],"sourcesContent":["import type { FlowNodeData, FlowNode } from '../types';\n\n/** Get CSS-parseable color number from hex string */\nexport function colorToNumber(hex: string): number {\n if (!hex || hex === 'transparent') return 0x000000;\n const clean = hex.replace('#', '');\n return parseInt(clean, 16) || 0x000000;\n}\n\n/** Compute rotation transform in radians */\nexport function getRotationRad(data: FlowNodeData): number {\n return ((data.rotation ?? 0) * Math.PI) / 180;\n}\n\n/** Compute scale for flip */\nexport function getFlipScale(data: FlowNodeData): { sx: number; sy: number } {\n return {\n sx: data.flipX ? -1 : 1,\n sy: data.flipY ? -1 : 1,\n };\n}\n\n/** Generate a unique ID */\nlet _counter = 0;\nexport function generateId(prefix = 'flow'): string {\n return `${prefix}_${Date.now().toString(36)}_${(++_counter).toString(36)}`;\n}\n\n/** Check if a point is within a node's bounding box (optionally padded) */\nexport function isPointInNode(\n px: number,\n py: number,\n node: FlowNode,\n pad = 0,\n): boolean {\n const { x, y } = node.position;\n return px >= x - pad && px <= x + node.width + pad && py >= y - pad && py <= y + node.height + pad;\n}\n\n/** Check if two axis-aligned rects overlap */\nexport function rectsOverlap(\n ax: number, ay: number, aw: number, ah: number,\n bx: number, by: number, bw: number, bh: number,\n): boolean {\n return ax < bx + bw && ax + aw > bx && ay < by + bh && ay + ah > by;\n}\n\n/** Shortest distance from point (px,py) to line segment (ax,ay)-(bx,by) */\nexport function distToSegment(\n px: number, py: number,\n ax: number, ay: number,\n bx: number, by: number,\n): number {\n const dx = bx - ax, dy = by - ay;\n const lenSq = dx * dx + dy * dy;\n if (lenSq === 0) return Math.hypot(px - ax, py - ay);\n const t = Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / lenSq));\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));\n}\n"],"mappings":";AAUA,SAAgB,EAAe,GAA4B;CACzD,QAAS,EAAK,YAAY,KAAK,KAAK,KAAM;AAC5C;AAGA,SAAgB,EAAa,GAAgD;CAC3E,OAAO;EACL,IAAI,EAAK,QAAQ,KAAK;EACtB,IAAI,EAAK,QAAQ,KAAK;CACxB;AACF;AAGA,IAAI,IAAW;AACf,SAAgB,EAAW,IAAS,QAAgB;CAClD,OAAO,GAAG,EAAO,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAAA,CAAU,SAAS,EAAE;AACzE;AAGA,SAAgB,EACd,GACA,GACA,GACA,IAAM,GACG;CACT,IAAM,EAAE,MAAG,SAAM,EAAK;CACtB,OAAO,KAAM,IAAI,KAAO,KAAM,IAAI,EAAK,QAAQ,KAAO,KAAM,IAAI,KAAO,KAAM,IAAI,EAAK,SAAS;AACjG;AAGA,SAAgB,EACd,GAAY,GAAY,GAAY,GACpC,GAAY,GAAY,GAAY,GAC3B;CACT,OAAO,IAAK,IAAK,KAAM,IAAK,IAAK,KAAM,IAAK,IAAK,KAAM,IAAK,IAAK;AACnE;AAGA,SAAgB,EACd,GAAY,GACZ,GAAY,GACZ,GAAY,GACJ;CACR,IAAM,IAAK,IAAK,GAAI,IAAK,IAAK,GACxB,IAAQ,IAAK,IAAK,IAAK;CAC7B,IAAI,MAAU,GAAG,OAAO,KAAK,MAAM,IAAK,GAAI,IAAK,CAAE;CACnD,IAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAK,KAAM,KAAM,IAAK,KAAM,KAAM,CAAK,CAAC;CAC5E,OAAO,KAAK,MAAM,KAAM,IAAK,IAAI,IAAK,KAAM,IAAK,IAAI,EAAG;AAC1D"}