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.
- package/dist/_virtual/_rolldown/runtime.js +10 -11
- package/dist/chart.js +12 -46
- package/dist/code-editor.js +16 -43
- package/dist/components/Badge/index.js +11 -13
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js +62 -86
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Card/index.d.ts +87 -0
- package/dist/components/Card/index.js +178 -44
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js +25 -25
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js +57 -63
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/ChoicePicker/index.d.ts +44 -0
- package/dist/components/ChoicePicker/index.js +81 -0
- package/dist/components/ChoicePicker/index.js.map +1 -0
- package/dist/components/Column/index.d.ts +28 -0
- package/dist/components/Column/index.js +30 -0
- package/dist/components/Column/index.js.map +1 -0
- package/dist/components/DateTimeInput/index.d.ts +44 -0
- package/dist/components/DateTimeInput/index.js +48 -0
- package/dist/components/DateTimeInput/index.js.map +1 -0
- package/dist/components/Demo/index.js +107 -107
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Divider/index.d.ts +20 -0
- package/dist/components/Divider/index.js +30 -0
- package/dist/components/Divider/index.js.map +1 -0
- package/dist/components/EmptyState/index.d.ts +4 -1
- package/dist/components/EmptyState/index.js +24 -24
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js +134 -136
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js +159 -163
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js +126 -127
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js +62 -62
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/FloatWindow/index.d.ts +28 -0
- package/dist/components/GridLayout/index.d.ts +42 -0
- package/dist/components/Icon/index.d.ts +24 -0
- package/dist/components/Icon/index.js +26 -0
- package/dist/components/Icon/index.js.map +1 -0
- package/dist/components/Image/index.d.ts +33 -0
- package/dist/components/Image/index.js +44 -0
- package/dist/components/Image/index.js.map +1 -0
- package/dist/components/Input/index.js +196 -197
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js +62 -73
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/Layout/index.js +134 -139
- package/dist/components/Layout/index.js.map +1 -1
- package/dist/components/List/index.js +45 -43
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js +106 -103
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/codeThemes.js +24 -33
- package/dist/components/Markdown/codeThemes.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js +203 -208
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/parseCodeBlockMeta.js +22 -22
- package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js +46 -46
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js +35 -36
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js +41 -42
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Modal/index.d.ts +7 -3
- package/dist/components/Modal/index.js +82 -70
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/MultipleChoice/index.d.ts +44 -0
- package/dist/components/MultipleChoice/index.js +52 -0
- package/dist/components/MultipleChoice/index.js.map +1 -0
- package/dist/components/Notification/index.d.ts +17 -0
- package/dist/components/Page/index.d.ts +58 -0
- package/dist/components/Page/index.js +43 -0
- package/dist/components/Page/index.js.map +1 -0
- package/dist/components/PageHeader/index.js +28 -28
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.js +8 -9
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Row/index.d.ts +28 -0
- package/dist/components/Row/index.js +30 -0
- package/dist/components/Row/index.js.map +1 -0
- package/dist/components/Select/index.js +251 -257
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js +56 -59
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/Slider/index.d.ts +39 -0
- package/dist/components/Slider/index.js +52 -0
- package/dist/components/Slider/index.js.map +1 -0
- package/dist/components/StatCard/index.d.ts +31 -1
- package/dist/components/StatCard/index.js +189 -58
- package/dist/components/StatCard/index.js.map +1 -1
- package/dist/components/Switch/index.d.ts +34 -0
- package/dist/components/Switch/index.js +55 -0
- package/dist/components/Switch/index.js.map +1 -0
- package/dist/components/Tab/index.d.ts +40 -0
- package/dist/components/Table/index.js +109 -103
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.d.ts +19 -5
- package/dist/components/Tabs/index.js +30 -21
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Text/index.d.ts +43 -0
- package/dist/components/Text/index.js +55 -0
- package/dist/components/Text/index.js.map +1 -0
- package/dist/components/Tooltip/index.d.ts +23 -0
- package/dist/components/Tooltip/index.js +34 -0
- package/dist/components/Tooltip/index.js.map +1 -0
- package/dist/components/Tree/Tree.js +205 -205
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js +86 -87
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js +250 -250
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/ArticleControl/buildHeadingTree.js +31 -32
- package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
- package/dist/components/pro/ArticleControl/useArticleToc.js +100 -102
- package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
- package/dist/components/pro/Calendar/Calendar.d.ts +10 -0
- package/dist/components/pro/Calendar/hooks/useCalendarDrag.d.ts +47 -0
- package/dist/components/pro/Calendar/hooks/useCalendarState.d.ts +56 -0
- package/dist/components/pro/Calendar/index.d.ts +7 -0
- package/dist/components/pro/Calendar/types.d.ts +151 -0
- package/dist/components/pro/Calendar/utils.d.ts +94 -0
- package/dist/components/pro/Chat/Chat.d.ts +6 -0
- package/dist/components/pro/Chat/index.d.ts +2 -0
- package/dist/components/pro/Chat/types.d.ts +84 -0
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js +287 -320
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +167 -221
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/markdownExtensions.js +594 -613
- package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/contextMenu.js +54 -55
- package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/index.js +152 -160
- package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/index.js +7 -15
- package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/javascript.js +11 -48
- package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/python.js +4 -40
- package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/snippets.js +118 -147
- package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js +153 -153
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +180 -190
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js +130 -137
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js +228 -242
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js +208 -248
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js +513 -483
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/CodeEditor/types.d.ts +1 -1
- package/dist/components/pro/CodeEditor/utils.js +171 -175
- package/dist/components/pro/CodeEditor/utils.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js +305 -305
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js +299 -314
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js +203 -204
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js +142 -141
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js +42 -42
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js +84 -84
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js +58 -58
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js +93 -94
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js +78 -78
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js +77 -77
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js +40 -40
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/extension.js +5 -5
- package/dist/components/pro/DataTable/extension.js.map +1 -1
- package/dist/components/pro/DataTable/pivotEngine.js +84 -92
- package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js +93 -93
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js +30 -30
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js +45 -62
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.js +37 -48
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/useColumnDragReorder.js +68 -68
- package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
- package/dist/components/pro/DataTable/utils.js +156 -168
- package/dist/components/pro/DataTable/utils.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js +180 -180
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js +78 -78
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js +202 -205
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js +190 -190
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js +100 -100
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js +209 -209
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js +199 -199
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js +920 -946
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js +1626 -1663
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/archify/build.js +85 -94
- package/dist/components/pro/Flow/archify/build.js.map +1 -1
- package/dist/components/pro/Flow/archify/convert.js +512 -519
- package/dist/components/pro/Flow/archify/convert.js.map +1 -1
- package/dist/components/pro/Flow/archify/palette.js +87 -104
- package/dist/components/pro/Flow/archify/palette.js.map +1 -1
- package/dist/components/pro/Flow/archify/presets.js +34 -37
- package/dist/components/pro/Flow/archify/presets.js.map +1 -1
- package/dist/components/pro/Flow/archify/spec.js +7 -7
- package/dist/components/pro/Flow/archify/spec.js.map +1 -1
- package/dist/components/pro/Flow/canvas/AlignmentGuides.js +25 -25
- package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/canvas/GridRenderer.js +54 -55
- package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js +54 -58
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/PixiApp.js +105 -102
- package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
- package/dist/components/pro/Flow/canvas/SelectionOverlay.js +38 -38
- package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
- package/dist/components/pro/Flow/canvas/ViewportContainer.js +117 -117
- package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
- package/dist/components/pro/Flow/constants.js +266 -278
- package/dist/components/pro/Flow/constants.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowAIContext.js +27 -28
- package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowContext.js +60 -61
- package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js +115 -117
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js +135 -138
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgeMarkers.js +11 -14
- package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgePaths.js +351 -367
- package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useAlignmentGuides.js +49 -52
- package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js +154 -154
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useCompactMode.js +17 -17
- package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js +40 -40
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDraggablePanel.js +51 -51
- package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js +157 -157
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js +190 -201
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js +32 -38
- package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js +172 -182
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js +57 -57
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js +229 -238
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js +102 -102
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePdfExport.js +55 -56
- package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.js +55 -57
- package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useResizablePanel.js +31 -31
- package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useSelection.js +69 -69
- package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useUndoRedo.js +27 -27
- package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useViewport.js +28 -28
- package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js +63 -63
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/GeometricLineTool.js +80 -80
- package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js +88 -88
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/lines/lineSmoothing.js +32 -34
- package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js +236 -222
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js +236 -246
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js +63 -63
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js +111 -113
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeHandles.js +74 -80
- package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js +303 -314
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeText.js +25 -29
- package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
- package/dist/components/pro/Flow/nodes/aiClient.js +124 -137
- package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
- package/dist/components/pro/Flow/nodes/animAnchors.js +42 -49
- package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js +246 -267
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/nodeUtils.js +23 -28
- package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js +556 -591
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIconTexture.js +37 -39
- package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIcons.js +684 -689
- package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js +464 -491
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js +41 -41
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js +37 -37
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js +428 -432
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js +61 -62
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js +114 -114
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js +347 -391
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js +1792 -1798
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js +242 -244
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js +137 -138
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js +46 -46
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js +557 -567
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.d.ts +0 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js +508 -557
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.js +26 -26
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/components/pro/Flow/utils/dashedLine.js +113 -117
- package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
- package/dist/components/pro/Flow/utils/gradient.js +55 -55
- package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
- package/dist/components/pro/Flow/utils/pdfExport.js +50 -89
- package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
- package/dist/components/pro/Flow/utils/themeColor.js +185 -195
- package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
- package/dist/components/pro/Gantt/Gantt.d.ts +7 -0
- package/dist/components/pro/Gantt/hooks/useGanttDrag.d.ts +31 -0
- package/dist/components/pro/Gantt/hooks/useGanttState.d.ts +58 -0
- package/dist/components/pro/Gantt/index.d.ts +6 -0
- package/dist/components/pro/Gantt/types.d.ts +478 -0
- package/dist/components/pro/Gantt/utils.d.ts +124 -0
- package/dist/components/pro/Resizable/Resizable.d.ts +30 -0
- package/dist/components/pro/Resizable/index.d.ts +2 -0
- package/dist/components/pro/RichTextEditor/AIRewrite.js +323 -334
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js +314 -316
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js +97 -97
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js +88 -88
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js +240 -240
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js +234 -234
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js +251 -252
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js +267 -271
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js +214 -214
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js +44 -75
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js +261 -261
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js +172 -526
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js +112 -114
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js +194 -194
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js +970 -973
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js +11 -12
- package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js +310 -344
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CommentMark.js +38 -39
- package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js +620 -625
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FontSize.js +25 -25
- package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js +167 -176
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/components/pro/RichTextEditor/types.js +75 -75
- package/dist/components/pro/RichTextEditor/types.js.map +1 -1
- package/dist/contexts/AppContext.d.ts +1 -1
- package/dist/contexts/AppContext.js +216 -221
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/data-table.js +15 -41
- package/dist/data-table.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/flow.js +27 -83
- package/dist/hooks/useClickOutside.js +18 -18
- package/dist/hooks/useClickOutside.js.map +1 -1
- package/dist/hooks/useContainerElement.js +9 -9
- package/dist/hooks/useContainerElement.js.map +1 -1
- package/dist/hooks/useControllableState.js +33 -35
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useCopyToClipboard.js +16 -16
- package/dist/hooks/useCopyToClipboard.js.map +1 -1
- package/dist/hooks/useDebounce.js +14 -14
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useDraggable.js +50 -50
- package/dist/hooks/useDraggable.js.map +1 -1
- package/dist/hooks/useTableColumns.js +39 -42
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.js +67 -68
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +8 -0
- package/dist/index.d.ts +29 -1
- package/dist/index.js +106 -236
- package/dist/layouts/MainLayout.js +56 -56
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js +214 -214
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js +184 -165
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js +25 -25
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js +39 -39
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js +120 -120
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js +27 -27
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js +26 -26
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/lite.js +9 -24
- package/dist/markdown.js +4 -9
- package/dist/pages/components/Calendar/index.d.ts +3 -0
- package/dist/pages/components/Calendar/index.en.d.ts +3 -0
- package/dist/pages/components/Calendar/index.zh.d.ts +3 -0
- package/dist/pages/components/Chat/index.d.ts +3 -0
- package/dist/pages/components/Chat/index.en.d.ts +3 -0
- package/dist/pages/components/Chat/index.zh.d.ts +3 -0
- package/dist/pages/components/FloatWindow/index.d.ts +3 -0
- package/dist/pages/components/FloatWindow/index.en.d.ts +3 -0
- package/dist/pages/components/FloatWindow/index.zh.d.ts +3 -0
- package/dist/pages/components/Gantt/index.d.ts +3 -0
- package/dist/pages/components/Gantt/index.en.d.ts +3 -0
- package/dist/pages/components/Gantt/index.zh.d.ts +3 -0
- package/dist/pages/components/GridLayout/index.d.ts +3 -0
- package/dist/pages/components/GridLayout/index.en.d.ts +3 -0
- package/dist/pages/components/GridLayout/index.zh.d.ts +3 -0
- package/dist/pages/components/Notification/index.d.ts +3 -0
- package/dist/pages/components/Notification/index.en.d.ts +3 -0
- package/dist/pages/components/Notification/index.zh.d.ts +3 -0
- package/dist/pages/components/Resizable/index.d.ts +3 -0
- package/dist/pages/components/Resizable/index.en.d.ts +3 -0
- package/dist/pages/components/Resizable/index.zh.d.ts +3 -0
- package/dist/pages/components/Tab/index.d.ts +3 -0
- package/dist/pages/components/Tab/index.en.d.ts +3 -0
- package/dist/pages/components/Tab/index.zh.d.ts +3 -0
- package/dist/styles/themeStyles.js +87 -86
- package/dist/styles/themeStyles.js.map +1 -1
- package/dist/utils/cn.d.ts +13 -0
- package/dist/utils/cn.js +16 -0
- package/dist/utils/cn.js.map +1 -0
- package/dist/utils/i18n.js +690 -602
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js +94 -94
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/rehype-code-meta.js +14 -14
- package/dist/utils/rehype-code-meta.js.map +1 -1
- package/dist/utils/remark-code-meta.js +9 -9
- package/dist/utils/remark-code-meta.js.map +1 -1
- package/dist/utils/routerBuilder.js +59 -58
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/selection.js +28 -29
- package/dist/utils/selection.js.map +1 -1
- package/dist/utils/themes.js +275 -255
- package/dist/utils/themes.js.map +1 -1
- package/package.json +23 -10
|
@@ -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":";AAyBA,SAAgB,EAAS,GAA0B;CACjD,IAAM,IAAM,EAAK,QAAQ,WAAW,EAAE,GAChC,IAAY,EAAgB,CAAG,GAC/B,IAAmB,CAAC,GACtB,IAAQ,IACR,IAAgB,CAAC,GACjB,IAAW;CAEf,KAAK,IAAI,IAAI,GAAG,IAAI,EAAI,QAAQ,KAAK;EACnC,IAAM,IAAK,EAAI;EACf,IAAI,GAAU;GACZ,AAAI,MAAO,OACL,EAAI,IAAI,OAAO,QACjB,KAAS,MACT,OAEA,IAAW,KAGb,KAAS;GAEX;EACF;EACA,AAAI,MAAO,OACT,IAAW,KACF,MAAO,KAChB,EAAI,KAAK,CAAK,GACd,IAAQ,MACC,MAAO,QAChB,EAAI,KAAK,CAAK,GACd,EAAK,KAAK,CAAG,GACb,IAAQ,IACR,IAAM,CAAC,KACE,MAAO,SAGhB,KAAS;CAEb;CAOA,QALI,EAAM,SAAS,KAAK,EAAI,SAAS,OACnC,EAAI,KAAK,CAAK,GACd,EAAK,KAAK,CAAG,IAGR,EAAK,QAAQ,MAAQ,EAAE,WAAW,KAAK,EAAE,EAAE,CAAC,KAAK,MAAM,EAAG;AACnE;AAEA,SAAS,EAAgB,GAAqB;CAC5C,IAAM,IAAY,EAAI,MAAM,SAAS,CAAC,CAAC,CAAC,MAAM,IACxC,KAAU,EAAU,MAAM,IAAI,KAAK,CAAC,EAAA,CAAG,QACvC,KAAS,EAAU,MAAM,IAAI,KAAK,CAAC,EAAA,CAAG,QACtC,KAAQ,EAAU,MAAM,KAAK,KAAK,CAAC,EAAA,CAAG;CAG5C,OAFI,IAAO,KAAU,IAAO,IAAc,MACtC,IAAQ,IAAe,MACpB;AACT;AAGA,SAAgB,EAAM,GAA2B,GAA8C;CAC7F,IAAM,KAAO,MAAe;EAC1B,IAAM,IAAI,KAAK,OAAO,KAAK,OAAO,CAAC;EACnC,OAAO,WAAW,KAAK,CAAC,IAAI,IAAI,EAAE,QAAQ,MAAM,MAAI,EAAE,KAAK;CAC7D,GACM,IAAS,EAAQ,KAAK,MAAM,EAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAC3D,IAAO,EACV,KAAK,MAAM,EAAQ,KAAK,MAAM,EAAI,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CACvD,KAAK,IAAI;CACZ,OAAO,IAAO,GAAG,EAAO,IAAI,MAAS;AACvC;AASA,eAAsB,EAAU,GAA0C;CACxE,IAAM,EAAE,cAAW,iBAAc,MAAM,OAAO,WACxC,IAAQ,EAAU,IAAI,WAAW,CAAM,CAAC,GAExC,IAAS,IAAI,UAAU,GACvB,KAAW,MAAkC;EACjD,IAAM,IAAQ,EAAM;EAEpB,OADK,IACE,EAAO,gBAAgB,EAAU,CAAK,GAAG,iBAAiB,IAD9C;CAErB,GAGM,IAA0B,CAAC,GAC3B,IAAM,EAAQ,sBAAsB;CAC1C,IAAI,GACF,KAAK,IAAM,KAAM,MAAM,KAAK,EAAI,qBAAqB,IAAI,CAAC,GAAG;EAE3D,IAAM,IAAK,MAAM,KAAK,EAAG,qBAAqB,GAAG,CAAC;EAClD,EAAc,KAAK,EAAG,KAAK,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;CAChE;CAKF,IAAM,IAAW,EADC,EAAsB,GAAO,CACtB,CAAS;CAClC,IAAI,CAAC,GAAU,MAAU,MAAM,gBAAgB;CAE/C,IAAM,IAAU,MAAM,KAAK,EAAS,qBAAqB,KAAK,CAAC,GACzD,IAAqB,CAAC;CAC5B,KAAK,IAAM,KAAS,GAAS;EAC3B,IAAM,IAAQ,MAAM,KAAK,EAAM,qBAAqB,GAAG,CAAC,GAClD,IAAmB,CAAC;EAC1B,KAAK,IAAM,KAAK,GAAO;GAErB,IAAM,IAAS,EADH,EAAE,aAAa,GAAG,KAAK,EACA,GAC7B,IAAO,EAAE,aAAa,GAAG,GAC3B,IAAQ;GACZ,IAAI,MAAS,KAAK;IAChB,IAAM,IAAM,OAAO,EAAE,qBAAqB,GAAG,CAAC,CAAC,EAAE,EAAE,eAAe,EAAE;IACpE,IAAQ,OAAO,SAAS,CAAG,IAAI,EAAc,MAAQ,KAAK;GAC5D,OAAO,AAGL,IAHS,MAAS,cACV,EAAE,qBAAqB,GAAG,CAAC,CAAC,EAAE,EAAE,eAAe,KAE/C,EAAE,qBAAqB,GAAG,CAAC,CAAC,EAAE,EAAE,eAAe;GAEzD,AAAI,KAAU,MAAG,EAAO,KAAU;EACpC;EAEA,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,AAAI,EAAO,OAAY,EAAO,KAAK;EAC3E,EAAO,KAAK,CAAM;CACpB;CACA,OAAO,EAAO,QAAQ,MAAM,EAAE,MAAM,MAAS,EAAK,KAAK,MAAM,EAAE,CAAC;AAClE;AAEA,SAAS,EACP,GACA,GACQ;CAER,IAAM,IAAW,EAAQ,iBAAiB,GACpC,IAAO,EAAQ,4BAA4B;CACjD,IAAI,KAAY,GAAM;EACpB,IAAM,IAAQ,EAAS,qBAAqB,OAAO,CAAC,CAAC,IAC/C,IAAM,GAAO,aAAa,MAAM,KAAK,GAAO,eAChD,uEACA,IACF;EACA,IAAI,GACG;QAAA,IAAM,KAAO,MAAM,KAAK,EAAK,qBAAqB,cAAc,CAAC,GACpE,IAAI,EAAI,aAAa,IAAI,MAAM,GAG7B,OAAO,OAFQ,EAAI,aAAa,QAAQ,KAAK,GAAA,CACzB,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,SAAS,EAC3C;EAAA;CAIrB;CAIA,OAHI,EAAM,8BAAoC,6BAEhC,OAAO,KAAK,CAAK,CAAC,CAAC,MAAM,MAAM,4BAA4B,KAAK,CAAC,CACxE,KAAS;AAClB;AAGA,SAAS,EAAiB,GAAqB;CAC7C,IAAM,IAAU,EAAI,MAAM,UAAU,CAAC,GAAG;CACxC,IAAI,CAAC,GAAS,OAAO;CACrB,IAAI,IAAM;CACV,KAAK,IAAM,KAAM,EAAQ,YAAY,GACnC,IAAM,IAAM,MAAM,EAAG,WAAW,CAAC,IAAI;CAEvC,OAAO,IAAM;AACf;AAKA,SAAS,EAAM,GAAe,GAA2B;CACvD,IAAI,IAAO,EAAM,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,QAAQ,uBAAuB,EAAE;CAC9E,AAAW,MAAO;CAClB,IAAI,IAAM,GACN,IAAI;CACR,OAAO,EAAK,IAAI,CAAG,IAAG,IAAM,GAAG,EAAK,GAAG;CAEvC,OADA,EAAK,IAAI,CAAG,GACL;AACT;AAEA,IAAM,IAAU;AAGhB,SAAgB,EAAgB,GAAuC;CACrE,IAAM,IAAW,EAAQ,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,MAAM,CAAC;CAQ9D,OAPI,EAAS,WAAW,IAAU,WACnB,EAAS,OAAO,MAAM,6BAA6B,KAAK,CAAC,CACpE,IAAe,YACL,EAAS,OAAO,MAAM,oBAAoB,KAAK,EAAE,QAAQ,MAAM,EAAE,CAAC,CAC5E,IAAc,WACH,EAAS,OAAO,MAAM,EAAQ,KAAK,CAAC,CAC/C,IAAe,SACZ;AACT;AAGA,SAAgB,EAAY,GAAa,GAAmC;CAC1E,IAAM,KAAK,KAAO,GAAA,CAAI,KAAK;CAC3B,IAAI,MAAM,IAAI,OAAO,MAAS,WAAW,OAAO;CAChD,QAAQ,GAAR;EACE,KAAK,UAAU;GACb,IAAM,IAAU,EAAE,QAAQ,MAAM,EAAE,CAAC,CAAC,QAAQ,MAAM,EAAE,GAC9C,IAAI,OAAO,CAAO;GACxB,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;EAClC;EACA,KAAK,WACH,OAAO,kBAAkB,KAAK,CAAC;EAGjC,SACE,OAAO;CACX;AACF;AAMA,SAAgB,EAAc,GAAiC;CAC7D,IAAI,EAAO,WAAW,GAAG,OAAO;EAAE,SAAS,CAAC;EAAG,MAAM,CAAC;CAAE;CACxD,IAAM,CAAC,GAAQ,GAAG,KAAY,GACxB,oBAAO,IAAI,IAAY,GACvB,IAAW,KAAK,IAAI,EAAO,QAAQ,GAAG,EAAS,KAAK,MAAM,EAAE,MAAM,GAAG,CAAC,GAEtE,IAA4B,CAAC;CACnC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAU,KAAK;EACjC,IAAM,KAAS,EAAO,MAAM,IAAI,IAAI,IAAA,CAAK,KAAK,KAAK,IAAI,IAAI,KACrD,IAAU,EAAS,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,EAAE;EAC3D,EAAQ,KAAK;GAAE,KAAK,EAAM,GAAO,CAAI;GAAG;GAAO,MAAM,EAAgB,CAAO;EAAE,CAAC;CACjF;CAUA,OAAO;EAAE;EAAS,MARL,EAAS,KAAK,MAAM;GAC/B,IAAM,IAAkC,CAAC;GAIzC,OAHA,EAAQ,SAAS,GAAK,MAAM;IAC1B,EAAO,EAAI,OAAO,EAAY,EAAE,MAAM,IAAI,EAAI,IAAI;GACpD,CAAC,GACM;EACT,CAEkB;CAAK;AACzB;AAGA,eAAsB,EAAc,GAAkC;CACpE,IAAM,IAAO,EAAK,KAAK,YAAY;CAOnC,OANI,EAAK,SAAS,OAAO,KAAK,EAAK,SAAS,OAAO,IAE1C,EAAc,MAAM,EAAU,MADhB,EAAK,YAAY,CACK,CAAC,IAIvC,EAAc,EAAS,MADX,EAAK,KAAK,CACK,CAAC;AACrC;AAKA,IAAa,IAAqB;CAChC;CAAW;CAAW;CAAW;CAAW;CAC5C;CAAW;CAAW;CAAW;CAAW;AAC9C;AAGA,SAAgB,EAAS,GAA2B,GAAqB;CACvE,OAAO,EAAQ,MAAM,MAAM,EAAE,QAAQ,CAAG,CAAC,EAAE,SAAS;AACtD;AAGA,SAAgB,EAAe,GAA+C;CAC5E,QAAQ,EAAQ,MAAM,MAAM,EAAE,SAAS,QAAQ,KAAK,EAAQ,GAAA,EAAK;AACnE;AAGA,SAAgB,EAAc,GAAqC;CACjE,OAAO,EAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG;AACpE;AAMA,SAAgB,EACd,GACA,GACgB;CAChB,IAAM,IAAI,EAAe,EAAO,OAAO,GACjC,IAAO,EAAc,EAAO,OAAO;CACzC,OAAO;EACL,SAAS,EAAO;EAChB,MAAM,EAAO;EACb,MAAM;EACN;EACA,OAAO;GACL,MAAM;GACN,QAAQ;GACR,SAAS,EAAK,MAAM,GAAG,CAAC;EAC1B;EACA,OAAO;GACL,SAAS;GACT,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC;GACtB,WAAW,CAAC;GACZ,QAAQ,EAAK,KAAK,CAAC;IAAE,OAAO,EAAK;IAAI,OAAO;GAAM,CAAC,IAAI,CAAC;EAC1D;CACF;AACF;AAOA,SAAgB,EAAa,GAAwB,GAA8B;CACjF,IAAM,IAAS,EAAS,CAAI;CAC5B,IAAI,EAAO,WAAW,GACpB,OAAO;EAAE,GAAG;EAAQ,SAAS,CAAC;EAAG,MAAM,CAAC;EAAG,OAAO,EAAE,MAAM,MAAM;EAAG,OAAO;GAAE,SAAS;GAAO,WAAW,CAAC;GAAG,WAAW,CAAC;GAAG,QAAQ,CAAC;EAAE;CAAE;CAEzI,IAAM,CAAC,GAAQ,GAAG,KAAY,GACxB,IAAW,KAAK,IAAI,EAAO,QAAQ,GAAG,EAAS,KAAK,MAAM,EAAE,MAAM,GAAG,CAAC,GACtE,oBAAO,IAAI,IAAY,GACvB,IAAU,IAAI,IAAI,EAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,GAClE,IAAQ,IAAI,IAAI,EAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,GAErD,IAA4B,CAAC;CACnC,KAAK,IAAI,IAAI,GAAG,IAAI,GAAU,KAAK;EACjC,IAAM,KAAS,EAAO,MAAM,IAAI,IAAI,IAAA,CAAK,KAAK,KAAK,IAAI,IAAI,KACrD,IAAW,EAAQ,IAAI,CAAK,KAAK,EAAM,IAAI,CAAK;EACtD,IAAI,GAEF,AADA,EAAK,IAAI,EAAS,GAAG,GACrB,EAAQ,KAAK;GAAE,GAAG;GAAU;EAAM,CAAC;OAC9B;GACL,IAAM,IAAU,EAAS,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,EAAE;GAC3D,EAAQ,KAAK;IAAE,KAAK,EAAM,GAAO,CAAI;IAAG;IAAO,MAAM,EAAgB,CAAO;GAAE,CAAC;EACjF;CACF;CAEA,IAAM,IAAO,EAAS,KAAK,MAAM;EAC/B,IAAM,IAAkC,CAAC;EAIzC,OAHA,EAAQ,SAAS,GAAK,MAAM;GAC1B,EAAO,EAAI,OAAO,EAAY,EAAE,MAAM,IAAI,EAAI,IAAI;EACpD,CAAC,GACM;CACT,CAAC,GAEK,IAAO,IAAI,IAAI,EAAQ,KAAK,MAAM,EAAE,GAAG,CAAC,GAExC,IAAQ,EAAO,QACjB;EACE,GAAG,EAAO;EACV,QAAQ,EAAO,MAAM,UAAU,EAAK,IAAI,EAAO,MAAM,MAAM,IACvD,EAAO,MAAM,SACb,EAAe,CAAO;EAC1B,UAAU,EAAO,MAAM,WAAW,CAAC,EAAA,CAAG,QAAQ,MAAM,EAAK,IAAI,CAAC,CAAC;EAC/D,cAAc,EAAO,MAAM,eACvB,OAAO,YAAY,OAAO,QAAQ,EAAO,MAAM,YAAY,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAK,IAAI,CAAC,CAAC,CAAC,IACzF,KAAA;CACN,IACA,EAAO,OAEL,IAAQ,EAAO,QACjB;EACE,GAAG,EAAO;EACV,WAAW,EAAO,MAAM,UAAU,QAAQ,MAAM,EAAK,IAAI,CAAC,CAAC;EAC3D,WAAW,EAAO,MAAM,UAAU,QAAQ,MAAM,EAAK,IAAI,CAAC,CAAC;EAC3D,QAAQ,EAAO,MAAM,OAAO,QAAQ,MAAM,EAAK,IAAI,EAAE,KAAK,CAAC;CAC7D,IACA,EAAO;CAEX,OAAO;EAAE,GAAG;EAAQ;EAAS;EAAM;EAAO;CAAM;AAClD;AAGA,SAAgB,IAAwC;CAUtD,OAAO,EAAsB;EAAE,SAAA,CAR7B;GAAE,KAAK;GAAY,OAAO;GAAM,MAAM;EAAS,GAC/C;GAAE,KAAK;GAAS,OAAO;GAAM,MAAM;EAAS,CAOf;EAAS,MAAA;GAJtC;IAAE,UAAU;IAAK,OAAO;GAAG;GAC3B;IAAE,UAAU;IAAK,OAAO;GAAG;GAC3B;IAAE,UAAU;IAAK,OAAO;GAAG;EAEW;CAAK,CAAC;AAChD"}
|
|
@@ -1,36 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
function t(e) {
|
|
6
|
+
return {
|
|
7
|
+
sx: e.flipX ? -1 : 1,
|
|
8
|
+
sy: e.flipY ? -1 : 1
|
|
9
|
+
};
|
|
9
10
|
}
|
|
10
|
-
var
|
|
11
|
-
function
|
|
12
|
-
|
|
11
|
+
var n = 0;
|
|
12
|
+
function r(e = "flow") {
|
|
13
|
+
return `${e}_${Date.now().toString(36)}_${(++n).toString(36)}`;
|
|
13
14
|
}
|
|
14
|
-
function
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
19
|
-
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
28
|
-
|
|
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;
|
|
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"}
|