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":"AIPanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/AIPanel.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport Button from '../../../Button';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Label from '../../../Label';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowAI } from '../context/FlowAIContext';\nimport { completeAIChatStream } from '../nodes/aiClient';\nimport { ROOT_CANVAS_ID, DEFAULT_NODE_DATA, DEFAULT_EDGE_DATA } from '../constants';\nimport type { FlowAIConfig, FlowDocument } from '../types';\n\n/**\n * System prompt that constrains the model to emit a FlowDocument JSON so the\n * result can be parsed and loaded directly onto the canvas.\n */\nconst SYSTEM_PROMPT = `You are a diagramming assistant for a flowchart editor. Convert the user's request (a description, or an uploaded diagram image to reproduce) into a flow document.\n\nReply with ONE fenced \\`\\`\\`json code block and nothing else. The JSON must match:\n{\n \"canvases\": {\n \"root\": {\n \"nodes\": [\n { \"id\": \"n1\", \"type\": \"shapeRoundRect\", \"position\": {\"x\": 80, \"y\": 80}, \"width\": 160, \"height\": 64,\n \"data\": { \"label\": \"Start\" } }\n ],\n \"edges\": [\n { \"id\": \"e1\", \"source\": \"n1\", \"target\": \"n2\", \"type\": \"smoothstep\",\n \"data\": { \"labelText\": \"yes\" } }\n ],\n \"lines\": []\n }\n },\n \"stack\": [\"root\"]\n}\n\nRules:\n- Node \"type\" is one of: shapeRect, shapeRoundRect, shapeEllipse, shapeDiamond, shapeParallelogram, shapeDocument, shapeHexagon. Use shapeDiamond for decisions, shapeRoundRect for processes, shapeEllipse for start/end.\n- Give every node a unique \"id\". Every edge \"source\"/\"target\" must reference an existing node id.\n- Lay nodes out on a readable grid (top-to-bottom or left-to-right), spacing ~180px, no overlaps. Widths ~140-180, heights ~56-72 (diamonds ~120x100).\n- Put a short \"label\" on each node. Optional edge label goes in data.labelText.\n- Do NOT include colors; the editor themes them automatically.\n- Output ONLY the JSON code block.`;\n\n/** Extract and parse the first JSON object from an AI reply. */\nfunction parseFlowJson(text: string): FlowDocument | null {\n let raw = text.trim();\n const fence = /```(?:json)?\\s*([\\s\\S]*?)```/i.exec(raw);\n if (fence) raw = fence[1].trim();\n else {\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n if (start >= 0 && end > start) raw = raw.slice(start, end + 1);\n }\n try {\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || !parsed.canvases) return null;\n return parsed as FlowDocument;\n } catch {\n return null;\n }\n}\n\n/** Normalize an AI-produced document: fill defaults, ensure a root canvas. */\nfunction normalizeAIDocument(doc: FlowDocument): FlowDocument {\n const canvases = doc.canvases ?? {};\n const rootKey = doc.stack?.[doc.stack.length - 1] ?? ROOT_CANVAS_ID;\n const canvas = canvases[rootKey] ?? canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n const nodes = (canvas.nodes ?? []).map((n: any, i: number) => ({\n id: n.id ?? `n${i + 1}`,\n type: n.type ?? 'shapeRoundRect',\n position: { x: Number(n.position?.x ?? 80), y: Number(n.position?.y ?? 80 + i * 120) },\n width: Number(n.width ?? 160),\n height: Number(n.height ?? 64),\n zIndex: n.zIndex ?? i,\n data: { ...DEFAULT_NODE_DATA, ...(n.data ?? {}), label: n.data?.label ?? n.label ?? 'Node' },\n }));\n const nodeById = new Map<string, any>(nodes.map((n) => [n.id, n]));\n const edges = (canvas.edges ?? []).map((e: any, i: number) => ({\n id: e.id ?? `e${i + 1}`,\n source: e.source,\n target: e.target,\n type: e.type ?? 'smoothstep',\n data: { ...DEFAULT_EDGE_DATA, ...(e.data ?? {}) },\n })).filter((e: any) => e.source && e.target)\n .map((e: any) => pinEdgeToSideMidpoints(e, nodeById));\n return {\n canvases: { [ROOT_CANVAS_ID]: { nodes, edges, lines: [] } },\n stack: [ROOT_CANVAS_ID],\n };\n}\n\n/**\n * Pin an AI-generated edge to the midpoint handles of the facing node sides\n * (`r_0.5` / `l_0.5` / `t_0.5` / `b_0.5`) so connections attach at the center\n * of each side instead of sliding along the side toward the other node.\n */\nfunction pinEdgeToSideMidpoints(edge: any, nodeById: Map<string, any>): any {\n const s = nodeById.get(edge.source);\n const t = nodeById.get(edge.target);\n if (!s || !t || s === t) return edge;\n const dx = (t.position.x + t.width / 2) - (s.position.x + s.width / 2);\n const dy = (t.position.y + t.height / 2) - (s.position.y + s.height / 2);\n if (Math.abs(dx) >= Math.abs(dy)) {\n const forward = dx >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'r_0.5' : 'l_0.5',\n targetHandle: forward ? 'l_0.5' : 'r_0.5',\n };\n }\n const forward = dy >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'b_0.5' : 't_0.5',\n targetHandle: forward ? 't_0.5' : 'b_0.5',\n };\n}\n\nconst PROTOCOL_OPTIONS = [\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic' },\n];\n\n/** Char count at which the simulated progress bar saturates (99%). */\nconst PROGRESS_FULL_CHARS = 20000;\n\nexport function AIPanelContent() {\n const { setDoc } = useFlowContext();\n const { aiConfig, setAIConfig, showAIConfig } = useFlowAI();\n\n const [prompt, setPrompt] = useState('');\n const [imageDataUrl, setImageDataUrl] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n const [streamOpen, setStreamOpen] = useState(false);\n const [finished, setFinished] = useState(false);\n const [pendingDoc, setPendingDoc] = useState<FlowDocument | null>(null);\n const [displayLen, setDisplayLen] = useState(0);\n const abortRef = useRef<AbortController | null>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const streamBodyRef = useRef<HTMLPreElement>(null);\n const streamTailRef = useRef<HTMLPreElement>(null);\n /** Full text received from the model so far (grows on every SSE delta). */\n const targetRef = useRef('');\n\n const updateConfig = useCallback((patch: Partial<FlowAIConfig>) => {\n setAIConfig({ ...aiConfig, ...patch });\n }, [aiConfig, setAIConfig]);\n\n const onPickImage = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n // Accept an image pasted from the clipboard (Ctrl/Cmd+V) anywhere in the panel\n // or into the textarea. Falls through to normal text paste otherwise.\n const onPaste = useCallback((e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n for (const item of items) {\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile();\n if (file) {\n e.preventDefault();\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n return;\n }\n }\n }\n }, []);\n\n // Progressive reveal: SSE deltas land in `targetRef` (often several chunks\n // per network read, which React would batch into a single paint), and this\n // timer types the text out with an exponential catch-up so the panel always\n // shows the reply growing character-by-character.\n useEffect(() => {\n const timer = window.setInterval(() => {\n setDisplayLen((len) => {\n const target = targetRef.current.length;\n if (len >= target) return len;\n return len + Math.max(8, Math.ceil((target - len) / 8));\n });\n }, 40);\n return () => window.clearInterval(timer);\n }, []);\n\n const streamText = targetRef.current.slice(0, displayLen);\n\n // Keep the streaming output pinned to the latest chunk while visible.\n useEffect(() => {\n const el = streamBodyRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n const tail = streamTailRef.current;\n if (tail) tail.scrollTop = tail.scrollHeight;\n }, [streamText, streamOpen]);\n\n const generate = useCallback(async () => {\n if (busy) return;\n if (!aiConfig.gateway || !aiConfig.model) {\n setError('请先配置 AI 接口地址与模型');\n return;\n }\n if (!prompt.trim() && !imageDataUrl) {\n setError('请输入需求描述,或上传一张流程图');\n return;\n }\n setError(null);\n setStatus('正在生成…');\n targetRef.current = '';\n setDisplayLen(0);\n setFinished(false);\n setPendingDoc(null);\n setBusy(true);\n const ac = new AbortController();\n abortRef.current = ac;\n try {\n const text = await completeAIChatStream(\n aiConfig,\n prompt.trim() || '请根据这张图片复刻出对应的流程图。',\n {\n imageDataUrl: imageDataUrl ?? undefined,\n systemPrompt: SYSTEM_PROMPT,\n signal: ac.signal,\n onDelta: (accumulated) => { targetRef.current = accumulated; },\n },\n );\n setFinished(true);\n const parsed = parseFlowJson(text);\n if (!parsed) {\n setError('AI 返回内容无法解析为流程图,请重试或调整描述');\n setStatus(null);\n return;\n }\n setPendingDoc(normalizeAIDocument(parsed));\n setStatus(null);\n } catch (err: any) {\n if (err?.name !== 'AbortError') setError(err?.message ?? '生成失败');\n setStatus(null);\n } finally {\n setBusy(false);\n abortRef.current = null;\n }\n }, [busy, aiConfig, prompt, imageDataUrl]);\n\n const cancel = useCallback(() => abortRef.current?.abort(), []);\n\n /** Merge the generated canvas into the current canvas, remapping ids. */\n const applyInsert = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n const cur = prev.canvases[canvasId] ?? { nodes: [], edges: [], lines: [] };\n const used = new Set([\n ...cur.nodes.map((n) => n.id),\n ...cur.edges.map((e) => e.id),\n ...cur.lines.map((l) => l.id),\n ]);\n const fresh = (id: string) => {\n let next = id;\n let i = 1;\n while (used.has(next)) next = `${id}_${i++}`;\n used.add(next);\n return next;\n };\n const idMap = new Map<string, string>();\n const nodes = gen.nodes.map((n) => {\n const id = fresh(n.id);\n idMap.set(n.id, id);\n return { ...n, id };\n });\n const edges = gen.edges.map((e) => ({\n ...e,\n id: fresh(e.id),\n source: idMap.get(e.source) ?? e.source,\n target: idMap.get(e.target) ?? e.target,\n }));\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: [...cur.nodes, ...nodes], edges: [...cur.edges, ...edges], lines: cur.lines },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已插入流程图');\n }, [pendingDoc, setDoc]);\n\n /** Clear the current canvas, then place the generated content onto it. */\n const applyReplace = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: gen.nodes, edges: gen.edges, lines: [] },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已替换画布');\n }, [pendingDoc, setDoc]);\n\n const charCount = streamText.length;\n const fullyRevealed = charCount >= targetRef.current.length;\n const progress = finished && fullyRevealed\n ? 100\n : Math.min(99, Math.floor((charCount / PROGRESS_FULL_CHARS) * 99));\n\n return (\n <div className=\"flow-ai-panel\" onPaste={onPaste}>\n {showAIConfig && (\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">模型配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={PROTOCOL_OPTIONS}\n value={aiConfig.protocol}\n onChange={(v) => updateConfig({ protocol: v as FlowAIConfig['protocol'] })}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={aiConfig.gateway}\n placeholder=\"https://api.moonshot.cn/v1\"\n onChange={(e) => updateConfig({ gateway: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={aiConfig.model}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateConfig({ model: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={aiConfig.apiKey ?? ''}\n placeholder=\"sk-…\"\n onChange={(e) => updateConfig({ apiKey: e.target.value })}\n />\n </div>\n </div>\n )}\n\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">生成流程图</div>\n <textarea\n className=\"flow-ai-textarea\"\n value={prompt}\n placeholder=\"描述你想要的流程,例如:用户注册流程,包含邮箱校验、发送验证码、创建账号等步骤(可直接粘贴图片)\"\n onChange={(e) => setPrompt(e.target.value)}\n onPaste={onPaste}\n onPointerDown={(e) => e.stopPropagation()}\n />\n\n <div className=\"flow-ai-image-row\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={onPickImage}\n />\n {imageDataUrl ? (\n <div className=\"flow-ai-image-preview\">\n <img src={imageDataUrl} alt=\"参考图\" />\n <button\n type=\"button\"\n className=\"flow-ai-image-remove\"\n title=\"移除图片\"\n onClick={() => setImageDataUrl(null)}\n >×</button>\n </div>\n ) : (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => fileRef.current?.click()}>\n 上传流程图图片\n </Button>\n )}\n <span className=\"flow-ai-hint\">或粘贴图片 (Ctrl/⌘+V)</span>\n </div>\n\n <div className=\"flow-ai-actions\">\n {busy ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={cancel}>停止</Button>\n ) : (\n <Button size=\"xs\" variant=\"primary\" onClick={generate}>生成流程图</Button>\n )}\n </div>\n\n {(busy || streamText) && (\n <div className=\"flow-ai-stream\">\n <div className=\"flow-ai-progress\">\n <div className=\"flow-ai-progress-track\">\n <div className=\"flow-ai-progress-bar\" style={{ width: `${progress}%` }} />\n </div>\n <span className=\"flow-ai-progress-label\">{progress}%</span>\n </div>\n <button\n type=\"button\"\n className=\"flow-ai-stream-header\"\n onClick={() => setStreamOpen((open) => !open)}\n >\n <span className={`flow-ai-stream-chevron${streamOpen ? ' flow-ai-stream-chevron--open' : ''}`}>▸</span>\n <span>返回内容</span>\n <span className=\"flow-ai-stream-count\">{charCount.toLocaleString()} 字符</span>\n </button>\n {streamOpen ? (\n <pre ref={streamBodyRef} className=\"flow-ai-stream-body\">{streamText || '等待返回…'}</pre>\n ) : (\n streamText && <pre ref={streamTailRef} className=\"flow-ai-stream-tail\">{streamText}</pre>\n )}\n </div>\n )}\n\n {status && !error && <div className=\"flow-ai-status\">{status}</div>}\n {error && <div className=\"flow-media-error\">{error}</div>}\n </div>\n\n {pendingDoc && (\n <div className=\"flow-ai-dialog-overlay\" onClick={() => setPendingDoc(null)}>\n <div\n className=\"flow-ai-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"流程图已生成\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flow-ai-dialog-title\">流程图已生成</div>\n <div className=\"flow-ai-dialog-desc\">\n 插入:将生成内容追加到当前画布;替换:清空当前画布后再插入。\n </div>\n <div className=\"flow-ai-dialog-actions\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setPendingDoc(null)}>取消</Button>\n <Button size=\"xs\" variant=\"neutral\" outline onClick={applyInsert}>插入</Button>\n <Button size=\"xs\" variant=\"primary\" onClick={applyReplace}>替换</Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AIPanel.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/AIPanel.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport Button from '../../../Button';\nimport Input from '../../../Input';\nimport Select from '../../../Select';\nimport Label from '../../../Label';\nimport { useFlowContext } from '../context/FlowContext';\nimport { useFlowAI } from '../context/FlowAIContext';\nimport { completeAIChatStream } from '../nodes/aiClient';\nimport { ROOT_CANVAS_ID, DEFAULT_NODE_DATA, DEFAULT_EDGE_DATA } from '../constants';\nimport type { FlowAIConfig, FlowDocument } from '../types';\n\n/**\n * System prompt that constrains the model to emit a FlowDocument JSON so the\n * result can be parsed and loaded directly onto the canvas.\n */\nconst SYSTEM_PROMPT = `You are a diagramming assistant for a flowchart editor. Convert the user's request (a description, or an uploaded diagram image to reproduce) into a flow document.\n\nReply with ONE fenced \\`\\`\\`json code block and nothing else. The JSON must match:\n{\n \"canvases\": {\n \"root\": {\n \"nodes\": [\n { \"id\": \"n1\", \"type\": \"shapeRoundRect\", \"position\": {\"x\": 80, \"y\": 80}, \"width\": 160, \"height\": 64,\n \"data\": { \"label\": \"Start\" } }\n ],\n \"edges\": [\n { \"id\": \"e1\", \"source\": \"n1\", \"target\": \"n2\", \"type\": \"smoothstep\",\n \"data\": { \"labelText\": \"yes\" } }\n ],\n \"lines\": []\n }\n },\n \"stack\": [\"root\"]\n}\n\nRules:\n- Node \"type\" is one of: shapeRect, shapeRoundRect, shapeEllipse, shapeDiamond, shapeParallelogram, shapeDocument, shapeHexagon. Use shapeDiamond for decisions, shapeRoundRect for processes, shapeEllipse for start/end.\n- Give every node a unique \"id\". Every edge \"source\"/\"target\" must reference an existing node id.\n- Lay nodes out on a readable grid (top-to-bottom or left-to-right), spacing ~180px, no overlaps. Widths ~140-180, heights ~56-72 (diamonds ~120x100).\n- Put a short \"label\" on each node. Optional edge label goes in data.labelText.\n- Do NOT include colors; the editor themes them automatically.\n- Output ONLY the JSON code block.`;\n\n/** Extract and parse the first JSON object from an AI reply. */\nfunction parseFlowJson(text: string): FlowDocument | null {\n let raw = text.trim();\n const fence = /```(?:json)?\\s*([\\s\\S]*?)```/i.exec(raw);\n if (fence) raw = fence[1].trim();\n else {\n const start = raw.indexOf('{');\n const end = raw.lastIndexOf('}');\n if (start >= 0 && end > start) raw = raw.slice(start, end + 1);\n }\n try {\n const parsed = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || !parsed.canvases) return null;\n return parsed as FlowDocument;\n } catch {\n return null;\n }\n}\n\n/** Normalize an AI-produced document: fill defaults, ensure a root canvas. */\nfunction normalizeAIDocument(doc: FlowDocument): FlowDocument {\n const canvases = doc.canvases ?? {};\n const rootKey = doc.stack?.[doc.stack.length - 1] ?? ROOT_CANVAS_ID;\n const canvas = canvases[rootKey] ?? canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n const nodes = (canvas.nodes ?? []).map((n: any, i: number) => ({\n id: n.id ?? `n${i + 1}`,\n type: n.type ?? 'shapeRoundRect',\n position: { x: Number(n.position?.x ?? 80), y: Number(n.position?.y ?? 80 + i * 120) },\n width: Number(n.width ?? 160),\n height: Number(n.height ?? 64),\n zIndex: n.zIndex ?? i,\n data: { ...DEFAULT_NODE_DATA, ...n.data, label: n.data?.label ?? n.label ?? 'Node' },\n }));\n const nodeById = new Map<string, any>(nodes.map((n) => [n.id, n]));\n const edges = (canvas.edges ?? []).map((e: any, i: number) => ({\n id: e.id ?? `e${i + 1}`,\n source: e.source,\n target: e.target,\n type: e.type ?? 'smoothstep',\n data: { ...DEFAULT_EDGE_DATA, ...e.data },\n })).filter((e: any) => e.source && e.target)\n .map((e: any) => pinEdgeToSideMidpoints(e, nodeById));\n return {\n canvases: { [ROOT_CANVAS_ID]: { nodes, edges, lines: [] } },\n stack: [ROOT_CANVAS_ID],\n };\n}\n\n/**\n * Pin an AI-generated edge to the midpoint handles of the facing node sides\n * (`r_0.5` / `l_0.5` / `t_0.5` / `b_0.5`) so connections attach at the center\n * of each side instead of sliding along the side toward the other node.\n */\nfunction pinEdgeToSideMidpoints(edge: any, nodeById: Map<string, any>): any {\n const s = nodeById.get(edge.source);\n const t = nodeById.get(edge.target);\n if (!s || !t || s === t) return edge;\n const dx = (t.position.x + t.width / 2) - (s.position.x + s.width / 2);\n const dy = (t.position.y + t.height / 2) - (s.position.y + s.height / 2);\n if (Math.abs(dx) >= Math.abs(dy)) {\n const forward = dx >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'r_0.5' : 'l_0.5',\n targetHandle: forward ? 'l_0.5' : 'r_0.5',\n };\n }\n const forward = dy >= 0;\n return {\n ...edge,\n sourceHandle: forward ? 'b_0.5' : 't_0.5',\n targetHandle: forward ? 't_0.5' : 'b_0.5',\n };\n}\n\nconst PROTOCOL_OPTIONS = [\n { value: 'openai', label: 'OpenAI 兼容' },\n { value: 'anthropic', label: 'Anthropic' },\n];\n\n/** Char count at which the simulated progress bar saturates (99%). */\nconst PROGRESS_FULL_CHARS = 20000;\n\nexport function AIPanelContent() {\n const { setDoc } = useFlowContext();\n const { aiConfig, setAIConfig, showAIConfig } = useFlowAI();\n\n const [prompt, setPrompt] = useState('');\n const [imageDataUrl, setImageDataUrl] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [status, setStatus] = useState<string | null>(null);\n const [streamOpen, setStreamOpen] = useState(false);\n const [finished, setFinished] = useState(false);\n const [pendingDoc, setPendingDoc] = useState<FlowDocument | null>(null);\n const [displayLen, setDisplayLen] = useState(0);\n const abortRef = useRef<AbortController | null>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const streamBodyRef = useRef<HTMLPreElement>(null);\n const streamTailRef = useRef<HTMLPreElement>(null);\n /** Full text received from the model so far (grows on every SSE delta). */\n const targetRef = useRef('');\n\n const updateConfig = useCallback((patch: Partial<FlowAIConfig>) => {\n setAIConfig({ ...aiConfig, ...patch });\n }, [aiConfig, setAIConfig]);\n\n const onPickImage = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = '';\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n // Accept an image pasted from the clipboard (Ctrl/Cmd+V) anywhere in the panel\n // or into the textarea. Falls through to normal text paste otherwise.\n const onPaste = useCallback((e: React.ClipboardEvent) => {\n const items = e.clipboardData?.items;\n if (!items) return;\n for (const item of items) {\n if (item.type.startsWith('image/')) {\n const file = item.getAsFile();\n if (file) {\n e.preventDefault();\n const reader = new FileReader();\n reader.onload = () => setImageDataUrl(reader.result as string);\n reader.readAsDataURL(file);\n return;\n }\n }\n }\n }, []);\n\n // Progressive reveal: SSE deltas land in `targetRef` (often several chunks\n // per network read, which React would batch into a single paint), and this\n // timer types the text out with an exponential catch-up so the panel always\n // shows the reply growing character-by-character.\n useEffect(() => {\n const timer = window.setInterval(() => {\n setDisplayLen((len) => {\n const target = targetRef.current.length;\n if (len >= target) return len;\n return len + Math.max(8, Math.ceil((target - len) / 8));\n });\n }, 40);\n return () => window.clearInterval(timer);\n }, []);\n\n const streamText = targetRef.current.slice(0, displayLen);\n\n // Keep the streaming output pinned to the latest chunk while visible.\n useEffect(() => {\n const el = streamBodyRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n const tail = streamTailRef.current;\n if (tail) tail.scrollTop = tail.scrollHeight;\n }, [streamText, streamOpen]);\n\n const generate = useCallback(async () => {\n if (busy) return;\n if (!aiConfig.gateway || !aiConfig.model) {\n setError('请先配置 AI 接口地址与模型');\n return;\n }\n if (!prompt.trim() && !imageDataUrl) {\n setError('请输入需求描述,或上传一张流程图');\n return;\n }\n setError(null);\n setStatus('正在生成…');\n targetRef.current = '';\n setDisplayLen(0);\n setFinished(false);\n setPendingDoc(null);\n setBusy(true);\n const ac = new AbortController();\n abortRef.current = ac;\n try {\n const text = await completeAIChatStream(\n aiConfig,\n prompt.trim() || '请根据这张图片复刻出对应的流程图。',\n {\n imageDataUrl: imageDataUrl ?? undefined,\n systemPrompt: SYSTEM_PROMPT,\n signal: ac.signal,\n onDelta: (accumulated) => { targetRef.current = accumulated; },\n },\n );\n setFinished(true);\n const parsed = parseFlowJson(text);\n if (!parsed) {\n setError('AI 返回内容无法解析为流程图,请重试或调整描述');\n setStatus(null);\n return;\n }\n setPendingDoc(normalizeAIDocument(parsed));\n setStatus(null);\n } catch (err: any) {\n if (err?.name !== 'AbortError') setError(err?.message ?? '生成失败');\n setStatus(null);\n } finally {\n setBusy(false);\n abortRef.current = null;\n }\n }, [busy, aiConfig, prompt, imageDataUrl]);\n\n const cancel = useCallback(() => abortRef.current?.abort(), []);\n\n /** Merge the generated canvas into the current canvas, remapping ids. */\n const applyInsert = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n const cur = prev.canvases[canvasId] ?? { nodes: [], edges: [], lines: [] };\n const used = new Set([\n ...cur.nodes.map((n) => n.id),\n ...cur.edges.map((e) => e.id),\n ...cur.lines.map((l) => l.id),\n ]);\n const fresh = (id: string) => {\n let next = id;\n let i = 1;\n while (used.has(next)) next = `${id}_${i++}`;\n used.add(next);\n return next;\n };\n const idMap = new Map<string, string>();\n const nodes = gen.nodes.map((n) => {\n const id = fresh(n.id);\n idMap.set(n.id, id);\n return { ...n, id };\n });\n const edges = gen.edges.map((e) => ({\n ...e,\n id: fresh(e.id),\n source: idMap.get(e.source) ?? e.source,\n target: idMap.get(e.target) ?? e.target,\n }));\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: [...cur.nodes, ...nodes], edges: [...cur.edges, ...edges], lines: cur.lines },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已插入流程图');\n }, [pendingDoc, setDoc]);\n\n /** Clear the current canvas, then place the generated content onto it. */\n const applyReplace = useCallback(() => {\n if (!pendingDoc) return;\n const gen = pendingDoc.canvases[ROOT_CANVAS_ID] ?? { nodes: [], edges: [], lines: [] };\n setDoc((prev) => {\n const canvasId = prev.stack[prev.stack.length - 1] ?? ROOT_CANVAS_ID;\n return {\n ...prev,\n canvases: {\n ...prev.canvases,\n [canvasId]: { nodes: gen.nodes, edges: gen.edges, lines: [] },\n },\n };\n });\n setPendingDoc(null);\n setStatus('已替换画布');\n }, [pendingDoc, setDoc]);\n\n const charCount = streamText.length;\n const fullyRevealed = charCount >= targetRef.current.length;\n const progress = finished && fullyRevealed\n ? 100\n : Math.min(99, Math.floor((charCount / PROGRESS_FULL_CHARS) * 99));\n\n return (\n <div className=\"flow-ai-panel\" onPaste={onPaste}>\n {showAIConfig && (\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">模型配置</div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">协议</Label>\n <Select\n options={PROTOCOL_OPTIONS}\n value={aiConfig.protocol}\n onChange={(v) => updateConfig({ protocol: v as FlowAIConfig['protocol'] })}\n style={{ fontSize: 12 }}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">接口地址</Label>\n <Input\n size=\"xs\"\n value={aiConfig.gateway}\n placeholder=\"https://api.moonshot.cn/v1\"\n onChange={(e) => updateConfig({ gateway: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">模型</Label>\n <Input\n size=\"xs\"\n value={aiConfig.model}\n placeholder=\"gpt-4o-mini\"\n onChange={(e) => updateConfig({ model: e.target.value })}\n />\n </div>\n <div className=\"flow-inspector-row\">\n <Label size=\"xs\" className=\"flow-inspector-label\">API Key</Label>\n <Input\n size=\"xs\"\n type=\"password\"\n value={aiConfig.apiKey ?? ''}\n placeholder=\"sk-…\"\n onChange={(e) => updateConfig({ apiKey: e.target.value })}\n />\n </div>\n </div>\n )}\n\n <div className=\"flow-ai-section\">\n <div className=\"flow-ai-section-title\">生成流程图</div>\n <textarea\n className=\"flow-ai-textarea\"\n value={prompt}\n placeholder=\"描述你想要的流程,例如:用户注册流程,包含邮箱校验、发送验证码、创建账号等步骤(可直接粘贴图片)\"\n onChange={(e) => setPrompt(e.target.value)}\n onPaste={onPaste}\n onPointerDown={(e) => e.stopPropagation()}\n />\n\n <div className=\"flow-ai-image-row\">\n <input\n ref={fileRef}\n type=\"file\"\n accept=\"image/*\"\n style={{ display: 'none' }}\n onChange={onPickImage}\n />\n {imageDataUrl ? (\n <div className=\"flow-ai-image-preview\">\n <img src={imageDataUrl} alt=\"参考图\" />\n <button\n type=\"button\"\n className=\"flow-ai-image-remove\"\n title=\"移除图片\"\n onClick={() => setImageDataUrl(null)}\n >×</button>\n </div>\n ) : (\n <Button size=\"xs\" variant=\"ghost\" onClick={() => fileRef.current?.click()}>\n 上传流程图图片\n </Button>\n )}\n <span className=\"flow-ai-hint\">或粘贴图片 (Ctrl/⌘+V)</span>\n </div>\n\n <div className=\"flow-ai-actions\">\n {busy ? (\n <Button size=\"xs\" variant=\"ghost\" onClick={cancel}>停止</Button>\n ) : (\n <Button size=\"xs\" variant=\"primary\" onClick={generate}>生成流程图</Button>\n )}\n </div>\n\n {(busy || streamText) && (\n <div className=\"flow-ai-stream\">\n <div className=\"flow-ai-progress\">\n <div className=\"flow-ai-progress-track\">\n <div className=\"flow-ai-progress-bar\" style={{ width: `${progress}%` }} />\n </div>\n <span className=\"flow-ai-progress-label\">{progress}%</span>\n </div>\n <button\n type=\"button\"\n className=\"flow-ai-stream-header\"\n onClick={() => setStreamOpen((open) => !open)}\n >\n <span className={`flow-ai-stream-chevron${streamOpen ? ' flow-ai-stream-chevron--open' : ''}`}>▸</span>\n <span>返回内容</span>\n <span className=\"flow-ai-stream-count\">{charCount.toLocaleString()} 字符</span>\n </button>\n {streamOpen ? (\n <pre ref={streamBodyRef} className=\"flow-ai-stream-body\">{streamText || '等待返回…'}</pre>\n ) : (\n streamText && <pre ref={streamTailRef} className=\"flow-ai-stream-tail\">{streamText}</pre>\n )}\n </div>\n )}\n\n {status && !error && <div className=\"flow-ai-status\">{status}</div>}\n {error && <div className=\"flow-media-error\">{error}</div>}\n </div>\n\n {pendingDoc && (\n <div className=\"flow-ai-dialog-overlay\" onClick={() => setPendingDoc(null)}>\n <div\n className=\"flow-ai-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"流程图已生成\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flow-ai-dialog-title\">流程图已生成</div>\n <div className=\"flow-ai-dialog-desc\">\n 插入:将生成内容追加到当前画布;替换:清空当前画布后再插入。\n </div>\n <div className=\"flow-ai-dialog-actions\">\n <Button size=\"xs\" variant=\"ghost\" onClick={() => setPendingDoc(null)}>取消</Button>\n <Button size=\"xs\" variant=\"neutral\" outline onClick={applyInsert}>插入</Button>\n <Button size=\"xs\" variant=\"primary\" onClick={applyReplace}>替换</Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e from "../../../Button/index.js";
|
|
2
2
|
import "../constants.js";
|
|
3
|
-
import { useFlowContext as
|
|
4
|
-
import
|
|
5
|
-
import { jsx as
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
import { useFlowContext as t } from "../context/FlowContext.js";
|
|
4
|
+
import n from "react";
|
|
5
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/pro/Flow/panels/Breadcrumb.tsx
|
|
7
|
+
function a(e, t) {
|
|
8
|
+
if (t === "root") return "Root";
|
|
9
|
+
for (let [, n] of Object.entries(e.canvases)) for (let e of n.nodes) if (e.data.childCanvasId === t) return e.data.label || e.type;
|
|
10
|
+
return t;
|
|
10
11
|
}
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
12
|
+
function o() {
|
|
13
|
+
let { doc: o, setDoc: s, setSelection: c } = t(), { stack: l } = o;
|
|
14
|
+
if (l.length <= 1) return null;
|
|
15
|
+
let u = (e) => {
|
|
16
|
+
e !== l.length - 1 && (s((t) => ({
|
|
17
|
+
...t,
|
|
18
|
+
stack: t.stack.slice(0, e + 1)
|
|
19
|
+
})), c({
|
|
20
|
+
nodeIds: /* @__PURE__ */ new Set(),
|
|
21
|
+
edgeIds: /* @__PURE__ */ new Set(),
|
|
22
|
+
lineIds: /* @__PURE__ */ new Set()
|
|
23
|
+
}));
|
|
24
|
+
};
|
|
25
|
+
return /* @__PURE__ */ r("div", {
|
|
26
|
+
className: "flow-breadcrumb",
|
|
27
|
+
children: l.map((t, s) => {
|
|
28
|
+
let c = a(o, t), d = s === l.length - 1;
|
|
29
|
+
return /* @__PURE__ */ i(n.Fragment, { children: [s > 0 && /* @__PURE__ */ r("span", {
|
|
30
|
+
className: "flow-breadcrumb-sep",
|
|
31
|
+
children: "›"
|
|
32
|
+
}), /* @__PURE__ */ r(e, {
|
|
33
|
+
variant: "ghost",
|
|
34
|
+
size: "xs",
|
|
35
|
+
className: `flow-breadcrumb-item ${d ? "flow-breadcrumb-item--active" : ""}`,
|
|
36
|
+
onClick: () => u(s),
|
|
37
|
+
disabled: d,
|
|
38
|
+
children: c
|
|
39
|
+
})] }, t);
|
|
40
|
+
})
|
|
41
|
+
});
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
};
|
|
43
|
+
//#endregion
|
|
44
|
+
export { o as default };
|
|
45
45
|
|
|
46
46
|
//# sourceMappingURL=Breadcrumb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Breadcrumb.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/Breadcrumb.tsx"],"sourcesContent":["import React from 'react';\nimport Button from '../../../Button';\nimport { useFlowContext } from '../context/FlowContext';\nimport { ROOT_CANVAS_ID } from '../constants';\n\nfunction findNodeLabel(doc: ReturnType<typeof useFlowContext>['doc'], canvasId: string): string {\n if (canvasId === ROOT_CANVAS_ID) return 'Root';\n for (const [, canvas] of Object.entries(doc.canvases)) {\n for (const node of canvas.nodes) {\n if (node.data.childCanvasId === canvasId) {\n return node.data.label || node.type;\n }\n }\n }\n return canvasId;\n}\n\nexport default function Breadcrumb() {\n const { doc, setDoc, setSelection } = useFlowContext();\n const { stack } = doc;\n\n if (stack.length <= 1) return null;\n\n const handleClick = (index: number) => {\n if (index === stack.length - 1) return;\n setDoc(prev => ({\n ...prev,\n stack: prev.stack.slice(0, index + 1),\n }));\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n };\n\n return (\n <div className=\"flow-breadcrumb\">\n {stack.map((canvasId, i) => {\n const label = findNodeLabel(doc, canvasId);\n const isLast = i === stack.length - 1;\n return (\n <React.Fragment key={canvasId}>\n {i > 0 && <span className=\"flow-breadcrumb-sep\">›</span>}\n <Button\n variant=\"ghost\"\n size=\"xs\"\n className={`flow-breadcrumb-item ${isLast ? 'flow-breadcrumb-item--active' : ''}`}\n onClick={() => handleClick(i)}\n disabled={isLast}\n >\n {label}\n </Button>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Breadcrumb.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/Breadcrumb.tsx"],"sourcesContent":["import React from 'react';\nimport Button from '../../../Button';\nimport { useFlowContext } from '../context/FlowContext';\nimport { ROOT_CANVAS_ID } from '../constants';\n\nfunction findNodeLabel(doc: ReturnType<typeof useFlowContext>['doc'], canvasId: string): string {\n if (canvasId === ROOT_CANVAS_ID) return 'Root';\n for (const [, canvas] of Object.entries(doc.canvases)) {\n for (const node of canvas.nodes) {\n if (node.data.childCanvasId === canvasId) {\n return node.data.label || node.type;\n }\n }\n }\n return canvasId;\n}\n\nexport default function Breadcrumb() {\n const { doc, setDoc, setSelection } = useFlowContext();\n const { stack } = doc;\n\n if (stack.length <= 1) return null;\n\n const handleClick = (index: number) => {\n if (index === stack.length - 1) return;\n setDoc(prev => ({\n ...prev,\n stack: prev.stack.slice(0, index + 1),\n }));\n setSelection({ nodeIds: new Set(), edgeIds: new Set(), lineIds: new Set() });\n };\n\n return (\n <div className=\"flow-breadcrumb\">\n {stack.map((canvasId, i) => {\n const label = findNodeLabel(doc, canvasId);\n const isLast = i === stack.length - 1;\n return (\n <React.Fragment key={canvasId}>\n {i > 0 && <span className=\"flow-breadcrumb-sep\">›</span>}\n <Button\n variant=\"ghost\"\n size=\"xs\"\n className={`flow-breadcrumb-item ${isLast ? 'flow-breadcrumb-item--active' : ''}`}\n onClick={() => handleClick(i)}\n disabled={isLast}\n >\n {label}\n </Button>\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,SAAS,EAAc,GAA+C,GAA0B;CAC9F,IAAI,MAAA,QAA6B,OAAO;CACxC,KAAK,IAAM,GAAG,MAAW,OAAO,QAAQ,EAAI,QAAQ,GAClD,KAAK,IAAM,KAAQ,EAAO,OACxB,IAAI,EAAK,KAAK,kBAAkB,GAC9B,OAAO,EAAK,KAAK,SAAS,EAAK;CAIrC,OAAO;AACT;AAEA,SAAwB,IAAa;CACnC,IAAM,EAAE,QAAK,WAAQ,oBAAiB,EAAe,GAC/C,EAAE,aAAU;CAElB,IAAI,EAAM,UAAU,GAAG,OAAO;CAE9B,IAAM,KAAe,MAAkB;EACjC,MAAU,EAAM,SAAS,MAC7B,GAAO,OAAS;GACd,GAAG;GACH,OAAO,EAAK,MAAM,MAAM,GAAG,IAAQ,CAAC;EACtC,EAAE,GACF,EAAa;GAAE,yBAAS,IAAI,IAAI;GAAG,yBAAS,IAAI,IAAI;GAAG,yBAAS,IAAI,IAAI;EAAE,CAAC;CAC7E;CAEA,OACE,kBAAC,OAAD;EAAK,WAAU;EACZ,UAAA,EAAM,KAAK,GAAU,MAAM;GAC1B,IAAM,IAAQ,EAAc,GAAK,CAAQ,GACnC,IAAS,MAAM,EAAM,SAAS;GACpC,OACE,kBAAC,EAAM,UAAP,EAAA,UAAA,CACG,IAAI,KAAK,kBAAC,QAAD;IAAM,WAAU;IAAsB,UAAA;GAAO,CAAA,GACvD,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,WAAW,wBAAwB,IAAS,iCAAiC;IAC7E,eAAe,EAAY,CAAC;IAC5B,UAAU;IAET,UAAA;GACK,CAAA,CACM,EAAA,GAXK,CAWL;EAEpB,CAAC;CACE,CAAA;AAET"}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import { useEffect as
|
|
2
|
-
import { jsx as
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
1
|
+
import { useEffect as e, useRef as t } from "react";
|
|
2
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
|
+
//#region src/components/pro/Flow/panels/ContextMenu.tsx
|
|
4
|
+
function i({ x: i, y: a, items: o, onClose: s }) {
|
|
5
|
+
let c = t(null);
|
|
6
|
+
return e(() => {
|
|
7
|
+
let e = (e) => {
|
|
8
|
+
c.current && !c.current.contains(e.target) && s();
|
|
9
|
+
};
|
|
10
|
+
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
11
|
+
}, [s]), e(() => {
|
|
12
|
+
let e = (e) => {
|
|
13
|
+
e.key === "Escape" && s();
|
|
14
|
+
};
|
|
15
|
+
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
16
|
+
}, [s]), /* @__PURE__ */ n("div", {
|
|
17
|
+
ref: c,
|
|
18
|
+
className: "flow-context-menu",
|
|
19
|
+
style: {
|
|
20
|
+
left: i,
|
|
21
|
+
top: a
|
|
22
|
+
},
|
|
23
|
+
children: o.map((e, t) => e.label === "---" ? /* @__PURE__ */ n("div", { className: "flow-context-menu-separator" }, t) : /* @__PURE__ */ r("div", {
|
|
24
|
+
className: "flow-context-menu-item",
|
|
25
|
+
style: {
|
|
26
|
+
opacity: e.disabled ? .4 : 1,
|
|
27
|
+
pointerEvents: e.disabled ? "none" : void 0,
|
|
28
|
+
color: e.danger ? "oklch(var(--er))" : void 0
|
|
29
|
+
},
|
|
30
|
+
onClick: () => {
|
|
31
|
+
e.action(), s();
|
|
32
|
+
},
|
|
33
|
+
children: [e.icon && /* @__PURE__ */ n("span", { children: e.icon }), /* @__PURE__ */ n("span", { children: e.label })]
|
|
34
|
+
}, t))
|
|
35
|
+
});
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
};
|
|
37
|
+
//#endregion
|
|
38
|
+
export { i as default };
|
|
39
39
|
|
|
40
40
|
//# sourceMappingURL=ContextMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ContextMenu.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nexport interface ContextMenuItem {\n label: string;\n icon?: string;\n action: () => void;\n danger?: boolean;\n disabled?: boolean;\n}\n\nexport interface ContextMenuProps {\n x: number;\n y: number;\n items: ContextMenuItem[];\n onClose: () => void;\n}\n\nexport default function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [onClose]);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [onClose]);\n\n return (\n <div ref={ref} className=\"flow-context-menu\" style={{ left: x, top: y }}>\n {items.map((item, i) => {\n if (item.label === '---') {\n return <div key={i} className=\"flow-context-menu-separator\" />;\n }\n return (\n <div\n key={i}\n className=\"flow-context-menu-item\"\n style={{\n opacity: item.disabled ? 0.4 : 1,\n pointerEvents: item.disabled ? 'none' : undefined,\n color: item.danger ? 'oklch(var(--er))' : undefined,\n }}\n onClick={() => { item.action(); onClose(); }}\n >\n {item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ContextMenu.js","names":[],"sources":["../../../../../src/components/pro/Flow/panels/ContextMenu.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nexport interface ContextMenuItem {\n label: string;\n icon?: string;\n action: () => void;\n danger?: boolean;\n disabled?: boolean;\n}\n\nexport interface ContextMenuProps {\n x: number;\n y: number;\n items: ContextMenuItem[];\n onClose: () => void;\n}\n\nexport default function ContextMenu({ x, y, items, onClose }: ContextMenuProps) {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [onClose]);\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [onClose]);\n\n return (\n <div ref={ref} className=\"flow-context-menu\" style={{ left: x, top: y }}>\n {items.map((item, i) => {\n if (item.label === '---') {\n return <div key={i} className=\"flow-context-menu-separator\" />;\n }\n return (\n <div\n key={i}\n className=\"flow-context-menu-item\"\n style={{\n opacity: item.disabled ? 0.4 : 1,\n pointerEvents: item.disabled ? 'none' : undefined,\n color: item.danger ? 'oklch(var(--er))' : undefined,\n }}\n onClick={() => { item.action(); onClose(); }}\n >\n {item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;AAiBA,SAAwB,EAAY,EAAE,MAAG,MAAG,UAAO,cAA6B;CAC9E,IAAM,IAAM,EAAuB,IAAI;CAoBvC,OAlBA,QAAgB;EACd,IAAM,KAAW,MAAkB;GACjC,AAAI,EAAI,WAAW,CAAC,EAAI,QAAQ,SAAS,EAAE,MAAc,KACvD,EAAQ;EAEZ;EAEA,OADA,SAAS,iBAAiB,aAAa,CAAO,SACjC,SAAS,oBAAoB,aAAa,CAAO;CAChE,GAAG,CAAC,CAAO,CAAC,GAEZ,QAAgB;EACd,IAAM,KAAW,MAAqB;GACpC,AAAI,EAAE,QAAQ,YAAU,EAAQ;EAClC;EAEA,OADA,SAAS,iBAAiB,WAAW,CAAO,SAC/B,SAAS,oBAAoB,WAAW,CAAO;CAC9D,GAAG,CAAC,CAAO,CAAC,GAGV,kBAAC,OAAD;EAAU;EAAK,WAAU;EAAoB,OAAO;GAAE,MAAM;GAAG,KAAK;EAAE;EACnE,UAAA,EAAM,KAAK,GAAM,MACZ,EAAK,UAAU,QACV,kBAAC,OAAD,EAAa,WAAU,8BAA+B,GAA5C,CAA4C,IAG7D,kBAAC,OAAD;GAEE,WAAU;GACV,OAAO;IACL,SAAS,EAAK,WAAW,KAAM;IAC/B,eAAe,EAAK,WAAW,SAAS,KAAA;IACxC,OAAO,EAAK,SAAS,qBAAqB,KAAA;GAC5C;GACA,eAAe;IAAiB,AAAf,EAAK,OAAO,GAAG,EAAQ;GAAG;GAR7C,UAAA,CAUG,EAAK,QAAQ,kBAAC,QAAD,EAAA,UAAO,EAAK,KAAW,CAAA,GACrC,kBAAC,QAAD,EAAA,UAAO,EAAK,MAAY,CAAA,CACrB;EAXE,GAAA,CAWF,CAER;CACE,CAAA;AAET"}
|