dishui 0.0.65 → 0.0.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +10 -11
- package/dist/chart.js +12 -46
- package/dist/code-editor.js +16 -43
- package/dist/components/Accordion/index.d.ts +39 -0
- package/dist/components/Accordion/index.js +70 -0
- package/dist/components/Accordion/index.js.map +1 -0
- package/dist/components/Avatar/index.d.ts +48 -0
- package/dist/components/Avatar/index.js +71 -0
- package/dist/components/Avatar/index.js.map +1 -0
- package/dist/components/Badge/index.js +10 -15
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js +62 -89
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Card/index.d.ts +142 -0
- package/dist/components/Card/index.js +368 -69
- 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 -65
- 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.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 +26 -0
- package/dist/components/Icon/index.js +27 -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 -74
- 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 -58
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js +106 -107
- 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.js +82 -82
- 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 +1 -1
- package/dist/components/Page/index.js +40 -71
- package/dist/components/Page/index.js.map +1 -1
- 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 -254
- 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/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 -121
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.js +28 -38
- 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 -327
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +167 -224
- 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 -306
- 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 -144
- 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 +189 -189
- 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 -948
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js +1626 -1662
- 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 -180
- 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 -242
- 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 -589
- 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 -248
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js +137 -140
- 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 -572
- 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 -41
- 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 +31 -3
- package/dist/index.js +106 -241
- 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 -186
- 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 +700 -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 -60
- 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 +19 -6
- package/dist/components/StatCard/index.d.ts +0 -24
- package/dist/components/StatCard/index.js +0 -90
- package/dist/components/StatCard/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/CodeEditor.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { EditorView, keymap, lineNumbers, highlightActiveLine, highlightActiveLineGutter, drawSelection } from '@codemirror/view';\nimport { EditorState, Extension, Compartment } from '@codemirror/state';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { syntaxHighlighting, defaultHighlightStyle, foldGutter, indentOnInput, bracketMatching } from '@codemirror/language';\nimport { completionKeymap, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { lintKeymap } from '@codemirror/lint';\nimport { searchKeymap } from '@codemirror/search';\nimport { javascript } from '@codemirror/lang-javascript';\nimport { python } from '@codemirror/lang-python';\nimport { html } from '@codemirror/lang-html';\nimport { css } from '@codemirror/lang-css';\nimport { json } from '@codemirror/lang-json';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { jumpToDefinition, smartAutocompletion, bracketMatchingStyle, lineHighlightStyle, jumpTargetHighlight } from '../extensions';\nimport { createThemeExtension, createHighlightExtension } from '../themes';\nimport { collectVariables, generateOutline } from '../utils';\nimport { defaultContextMenu } from '../extensions/contextMenu';\n\n// 导出类型\nexport type {\n CodeEditorProps,\n CodeEditorHandle,\n LanguageType,\n EditorTheme,\n ContextMenuItem,\n VariableInfo,\n OutlineItem,\n AutocompletionConfig,\n JumpToDefinitionConfig,\n CodeSnippet,\n HistoryEntry,\n} from '../types';\n\nimport type { CodeEditorProps, CodeEditorHandle, AutocompletionConfig, JumpToDefinitionConfig, HistoryEntry } from '../types';\n\n// ============= 语言扩展映射 =============\n\nconst getLanguageExtension = (language: string): Extension => {\n const langMap: Record<string, () => Extension> = {\n javascript: () => javascript({ jsx: false }),\n jsx: () => javascript({ jsx: true }),\n typescript: () => javascript({ jsx: false, typescript: true }),\n tsx: () => javascript({ jsx: true, typescript: true }),\n python,\n html,\n css,\n json,\n markdown,\n };\n\n return langMap[language]?.() || javascript();\n};\n\n// ============= CodeEditor 组件 =============\n\nconst CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(({\n value = '',\n onChange,\n language = 'javascript',\n theme = 'light',\n readOnly = false,\n lineNumbers: showLineNumbers = true,\n highlightActiveLine: shouldHighlightActiveLine = true,\n autocompletion = true,\n jumpToDefinition: jumpToDefinitionConfig = true,\n contextMenu,\n onVariablesCollected,\n onOutlineGenerated,\n enableHistory = false,\n historyLimit = 50,\n historySaveInterval = 3, // 默认 3 * 10s = 30s\n onHistoryChange,\n className = '',\n height = '400px',\n minHeight,\n maxHeight,\n placeholder,\n extensions: customExtensions = [],\n}, ref) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const [contextMenuState, setContextMenuState] = useState<{\n visible: boolean;\n x: number;\n y: number;\n }>({ visible: false, x: 0, y: 0 });\n\n // 历史记录状态\n const [codeHistory, setCodeHistory] = useState<HistoryEntry[]>([]);\n const [currentHistoryIndex, setCurrentHistoryIndex] = useState<number>(-1);\n const lastSaveTime = useRef<number>(0);\n const isRestoringHistory = useRef<boolean>(false);\n const isExternalUpdate = useRef<boolean>(false); // 标记是否是外部更新\n const pendingContent = useRef<string>('');\n const hasChanges = useRef<boolean>(false);\n const lastSavedContent = useRef<string>(''); // 记录上次保存的内容\n\n // 配置隔间,用于动态更新\n const languageCompartment = useRef(new Compartment());\n const themeCompartment = useRef(new Compartment());\n const highlightCompartment = useRef(new Compartment());\n const readOnlyCompartment = useRef(new Compartment());\n\n // 使用 ref 存储 language,确保 updateListener 能访问到最新值\n const languageRef = useRef(language);\n\n // 更新 languageRef\n useEffect(() => {\n languageRef.current = language;\n }, [language]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n if (viewRef.current) {\n try {\n const lineInfo = viewRef.current.state.doc.line(line);\n viewRef.current.dispatch({\n selection: { anchor: lineInfo.from, head: lineInfo.to },\n scrollIntoView: true,\n });\n viewRef.current.focus();\n } catch (error) {\n console.error('Failed to jump to line:', error);\n }\n }\n }, []);\n\n // 添加历史记录\n const addToHistory = useCallback((content: string, description?: string) => {\n // 如果是外部更新或正在恢复历史,不添加记录\n if (!enableHistory || isRestoringHistory.current || isExternalUpdate.current) {\n return;\n }\n\n const now = Date.now();\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n const timeSinceLastSave = now - lastSaveTime.current;\n const timeCheckPassed = timeSinceLastSave >= intervalMs;\n\n // 按配置的间隔记录\n if (!timeCheckPassed) {\n // 时间未到,标记有变更,但不立即保存\n hasChanges.current = true;\n pendingContent.current = content;\n return;\n }\n\n // 时间检查已通过,现在检查内容是否真的发生变化\n if (content === lastSavedContent.current && !description) {\n // 内容没有变化,不保存\n hasChanges.current = false;\n return;\n }\n\n // 时间检查通过 + 内容有变化 → 保存!\n lastSaveTime.current = now;\n hasChanges.current = false;\n lastSavedContent.current = content; // 记录本次保存的内容\n\n setCodeHistory((prevHistory) => {\n // 如果当前不在最新位置,删除后面的历史\n const newHistory = currentHistoryIndex >= 0\n ? prevHistory.slice(0, currentHistoryIndex + 1)\n : prevHistory;\n\n const newEntry: HistoryEntry = {\n id: `${now}-${Math.random()}`,\n timestamp: new Date(now),\n content,\n description,\n };\n\n const updatedHistory = [...newHistory, newEntry];\n\n // 限制历史记录数量\n if (updatedHistory.length > historyLimit) {\n updatedHistory.shift();\n }\n\n const newIndex = updatedHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(updatedHistory, newIndex);\n }\n }, 0);\n\n return updatedHistory;\n });\n }, [enableHistory, historyLimit, historySaveInterval, currentHistoryIndex, onHistoryChange]);\n\n // 恢复历史记录\n const restoreHistory = useCallback((index: number) => {\n if (index < 0 || index >= codeHistory.length) return;\n\n isRestoringHistory.current = true;\n const entry = codeHistory[index];\n\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: entry.content,\n },\n });\n }\n\n // 清除当前版本之后的所有版本\n const newHistory = codeHistory.slice(0, index + 1);\n setCodeHistory(newHistory);\n\n // 回滚的版本成为最新版本\n const newIndex = newHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(newHistory, newIndex);\n }\n }, 0);\n\n // 触发 onChange\n if (onChange) {\n onChange(entry.content);\n }\n\n // 延迟重置标志,确保不会立即添加到历史\n setTimeout(() => {\n isRestoringHistory.current = false;\n }, 100);\n }, [codeHistory, onChange, onHistoryChange]);\n\n // 暴露历史记录相关方法\n useImperativeHandle(ref, () => ({\n jumpToLine,\n getView: () => viewRef.current,\n getValue: () => viewRef.current?.state.doc.toString() || '',\n setValue: (newValue: string) => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: newValue,\n },\n });\n }\n },\n focus: () => viewRef.current?.focus(),\n getHistory: () => codeHistory,\n restoreHistory,\n clearHistory: () => {\n setCodeHistory([]);\n setCurrentHistoryIndex(-1);\n // 重置所有历史记录相关的内部状态\n lastSaveTime.current = 0;\n hasChanges.current = false;\n pendingContent.current = '';\n lastSavedContent.current = '';\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange([], -1);\n }\n }, 0);\n },\n } as any), [jumpToLine, codeHistory, restoreHistory, onHistoryChange]);\n\n // 定时保存待处理的历史记录\n useEffect(() => {\n if (!enableHistory) return;\n\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n\n const interval = setInterval(() => {\n if (hasChanges.current && pendingContent.current) {\n addToHistory(pendingContent.current);\n }\n }, intervalMs);\n\n return () => clearInterval(interval);\n }, [enableHistory, historySaveInterval, addToHistory]);\n\n // 初始化编辑器\n useEffect(() => {\n if (!editorRef.current) return;\n\n const updateListener = EditorView.updateListener.of((update) => {\n if (update.docChanged && onChange) {\n const newContent = update.state.doc.toString();\n onChange(newContent);\n\n // 添加到历史记录\n // 注意:只有在用户实际输入时才添加,外部更新不添加\n if (enableHistory && !isExternalUpdate.current) {\n addToHistory(newContent);\n }\n\n // 如果是外部更新触发的变更,重置标志\n if (isExternalUpdate.current) {\n isExternalUpdate.current = false;\n }\n }\n\n if (update.docChanged && onVariablesCollected) {\n const code = update.state.doc.toString();\n // 使用 languageRef.current 获取最新的 language 值\n const variables = collectVariables(code, languageRef.current);\n onVariablesCollected(variables);\n }\n\n if (update.docChanged && onOutlineGenerated) {\n const code = update.state.doc.toString();\n // 使用 languageRef.current 获取最新的 language 值\n const outline = generateOutline(code, languageRef.current);\n onOutlineGenerated(outline);\n }\n });\n\n const baseExtensions: Extension[] = [\n history(),\n drawSelection(),\n bracketMatching(),\n closeBrackets(),\n indentOnInput(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n languageCompartment.current.of(getLanguageExtension(language)),\n themeCompartment.current.of(createThemeExtension(theme)),\n highlightCompartment.current.of(createHighlightExtension(theme)),\n readOnlyCompartment.current.of(EditorState.readOnly.of(readOnly)),\n updateListener,\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...searchKeymap,\n ...historyKeymap,\n ...completionKeymap,\n ...lintKeymap,\n indentWithTab,\n ]),\n bracketMatchingStyle,\n lineHighlightStyle,\n jumpTargetHighlight,\n ];\n\n // 可选扩展\n if (showLineNumbers) {\n baseExtensions.push(lineNumbers(), foldGutter(), highlightActiveLineGutter());\n }\n\n if (shouldHighlightActiveLine) {\n baseExtensions.push(highlightActiveLine());\n }\n\n // 自动补全\n if (autocompletion) {\n const config: AutocompletionConfig = typeof autocompletion === 'object' ? autocompletion : {};\n baseExtensions.push(smartAutocompletion(language, config));\n }\n\n // 跳转到定义\n if (jumpToDefinitionConfig) {\n const config: JumpToDefinitionConfig = typeof jumpToDefinitionConfig === 'object'\n ? jumpToDefinitionConfig\n : {};\n baseExtensions.push(jumpToDefinition(jumpToLine, config));\n }\n\n // 占位符\n if (placeholder) {\n baseExtensions.push(\n EditorView.contentAttributes.of({ 'data-placeholder': placeholder })\n );\n }\n\n // 自定义扩展\n if (customExtensions.length > 0) {\n baseExtensions.push(...customExtensions);\n }\n\n const startState = EditorState.create({\n doc: value,\n extensions: baseExtensions,\n });\n\n const view = new EditorView({\n state: startState,\n parent: editorRef.current,\n });\n\n viewRef.current = view;\n\n // 延迟初始收集变量和大纲(避免在渲染期间更新父组件)\n setTimeout(() => {\n if (onVariablesCollected) {\n const variables = collectVariables(value, language);\n onVariablesCollected(variables);\n }\n\n if (onOutlineGenerated) {\n const outline = generateOutline(value, language);\n onOutlineGenerated(outline);\n }\n }, 0);\n\n // 添加初始内容到历史记录\n if (enableHistory && value) {\n addToHistory(value, 'Initial content');\n }\n\n return () => {\n view.destroy();\n };\n }, []); // 只在挂载时初始化\n\n // 更新值\n useEffect(() => {\n if (viewRef.current && value !== viewRef.current.state.doc.toString()) {\n isExternalUpdate.current = true; // 标记为外部更新\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: value,\n },\n });\n // 注意:标志会在 updateListener 中被立即重置,不需要 setTimeout\n }\n }, [value]);\n\n // 更新语言\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: languageCompartment.current.reconfigure(getLanguageExtension(language)),\n });\n\n const code = viewRef.current.state.doc.toString();\n\n // 延迟执行回调,避免在渲染期间更新父组件\n setTimeout(() => {\n if (onVariablesCollected) {\n const variables = collectVariables(code, language);\n onVariablesCollected(variables);\n }\n if (onOutlineGenerated) {\n const outline = generateOutline(code, language);\n onOutlineGenerated(outline);\n }\n }, 0);\n }\n }, [language, onVariablesCollected, onOutlineGenerated]);\n\n // 更新主题\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: [\n themeCompartment.current.reconfigure(createThemeExtension(theme)),\n highlightCompartment.current.reconfigure(createHighlightExtension(theme)),\n ],\n });\n }\n }, [theme]);\n\n // 更新只读状态\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: readOnlyCompartment.current.reconfigure(EditorState.readOnly.of(readOnly)),\n });\n }\n }, [readOnly]);\n\n // 处理右键菜单\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setContextMenuState({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n });\n }, []);\n\n const closeContextMenu = useCallback(() => {\n setContextMenuState({ visible: false, x: 0, y: 0 });\n }, []);\n\n const handleMenuItemClick = useCallback(\n (item: any) => {\n if (viewRef.current && !item.disabled) {\n item.action(viewRef.current);\n }\n closeContextMenu();\n },\n [closeContextMenu]\n );\n\n // 点击其他地方关闭菜单\n useEffect(() => {\n if (contextMenuState.visible) {\n const handleClick = () => closeContextMenu();\n document.addEventListener('click', handleClick);\n return () => document.removeEventListener('click', handleClick);\n }\n }, [contextMenuState.visible, closeContextMenu]);\n\n const editorStyles: React.CSSProperties = {\n height,\n minHeight,\n maxHeight,\n overflow: 'auto',\n };\n\n const menuItems = contextMenu || defaultContextMenu;\n\n return (\n <div className={`code-editor-wrapper ${className}`}>\n <div\n ref={editorRef}\n onContextMenu={handleContextMenu}\n style={editorStyles}\n className=\"code-editor\"\n />\n\n {/* 上下文菜单 */}\n {contextMenuState.visible && (\n <div\n className=\"context-menu\"\n style={{\n position: 'fixed',\n top: contextMenuState.y,\n left: contextMenuState.x,\n zIndex: 1000,\n }}\n >\n <ul className=\"menu bg-base-200 rounded-box shadow-lg\">\n {menuItems.map((item, index) => {\n if (item.separator) {\n return <li key={index} className=\"menu-separator\" />;\n }\n return (\n <li key={index}>\n <a\n onClick={() => handleMenuItemClick(item)}\n className={item.disabled ? 'disabled' : ''}\n >\n {item.label}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n\n <style>{`\n .code-editor-wrapper {\n position: relative;\n border: 1px solid var(--fallback-bc, oklch(var(--bc) / 0.2));\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .code-editor .cm-editor {\n height: 100%;\n }\n\n .code-editor .cm-scroller {\n overflow: auto;\n font-family: 'Fira Code', 'Consolas', 'Monaco', monospace;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .code-editor .cm-content[data-placeholder]::before {\n content: attr(data-placeholder);\n color: var(--fallback-bc, oklch(var(--bc) / 0.4));\n position: absolute;\n pointer-events: none;\n }\n\n .context-menu {\n min-width: 150px;\n }\n\n .context-menu .menu-separator {\n height: 1px;\n background: var(--fallback-bc, oklch(var(--bc) / 0.2));\n margin: 0.25rem 0;\n }\n\n .context-menu .disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n `}</style>\n </div>\n );\n});\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport default CodeEditor;\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CodeEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/CodeEditor.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { EditorView, keymap, lineNumbers, highlightActiveLine, highlightActiveLineGutter, drawSelection } from '@codemirror/view';\nimport { EditorState, Extension, Compartment } from '@codemirror/state';\nimport { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';\nimport { syntaxHighlighting, defaultHighlightStyle, foldGutter, indentOnInput, bracketMatching } from '@codemirror/language';\nimport { completionKeymap, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\nimport { lintKeymap } from '@codemirror/lint';\nimport { searchKeymap } from '@codemirror/search';\nimport { javascript } from '@codemirror/lang-javascript';\nimport { python } from '@codemirror/lang-python';\nimport { html } from '@codemirror/lang-html';\nimport { css } from '@codemirror/lang-css';\nimport { json } from '@codemirror/lang-json';\nimport { markdown } from '@codemirror/lang-markdown';\nimport { jumpToDefinition, smartAutocompletion, bracketMatchingStyle, lineHighlightStyle, jumpTargetHighlight } from '../extensions';\nimport { createThemeExtension, createHighlightExtension } from '../themes';\nimport { collectVariables, generateOutline } from '../utils';\nimport { defaultContextMenu } from '../extensions/contextMenu';\n\n// 导出类型\nexport type {\n CodeEditorProps,\n CodeEditorHandle,\n LanguageType,\n EditorTheme,\n ContextMenuItem,\n VariableInfo,\n OutlineItem,\n AutocompletionConfig,\n JumpToDefinitionConfig,\n CodeSnippet,\n HistoryEntry,\n} from '../types';\n\nimport type { CodeEditorProps, CodeEditorHandle, AutocompletionConfig, JumpToDefinitionConfig, HistoryEntry } from '../types';\n\n// ============= 语言扩展映射 =============\n\nconst getLanguageExtension = (language: string): Extension => {\n const langMap: Record<string, () => Extension> = {\n javascript: () => javascript({ jsx: false }),\n jsx: () => javascript({ jsx: true }),\n typescript: () => javascript({ jsx: false, typescript: true }),\n tsx: () => javascript({ jsx: true, typescript: true }),\n python,\n html,\n css,\n json,\n markdown,\n };\n\n return langMap[language]?.() || javascript();\n};\n\n// ============= CodeEditor 组件 =============\n\nconst CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(({\n value = '',\n onChange,\n language = 'javascript',\n theme = 'light',\n readOnly = false,\n lineNumbers: showLineNumbers = true,\n highlightActiveLine: shouldHighlightActiveLine = true,\n autocompletion = true,\n jumpToDefinition: jumpToDefinitionConfig = true,\n contextMenu,\n onVariablesCollected,\n onOutlineGenerated,\n enableHistory = false,\n historyLimit = 50,\n historySaveInterval = 3, // 默认 3 * 10s = 30s\n onHistoryChange,\n className = '',\n height = '400px',\n minHeight,\n maxHeight,\n placeholder,\n extensions: customExtensions = [],\n}, ref) => {\n const editorRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<EditorView | null>(null);\n const [contextMenuState, setContextMenuState] = useState<{\n visible: boolean;\n x: number;\n y: number;\n }>({ visible: false, x: 0, y: 0 });\n\n // 历史记录状态\n const [codeHistory, setCodeHistory] = useState<HistoryEntry[]>([]);\n const [currentHistoryIndex, setCurrentHistoryIndex] = useState<number>(-1);\n const lastSaveTime = useRef<number>(0);\n const isRestoringHistory = useRef<boolean>(false);\n const isExternalUpdate = useRef<boolean>(false); // 标记是否是外部更新\n const pendingContent = useRef<string>('');\n const hasChanges = useRef<boolean>(false);\n const lastSavedContent = useRef<string>(''); // 记录上次保存的内容\n\n // 配置隔间,用于动态更新\n const languageCompartment = useRef(new Compartment());\n const themeCompartment = useRef(new Compartment());\n const highlightCompartment = useRef(new Compartment());\n const readOnlyCompartment = useRef(new Compartment());\n\n // 使用 ref 存储 language,确保 updateListener 能访问到最新值\n const languageRef = useRef(language);\n\n // 更新 languageRef\n useEffect(() => {\n languageRef.current = language;\n }, [language]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n if (viewRef.current) {\n try {\n const lineInfo = viewRef.current.state.doc.line(line);\n viewRef.current.dispatch({\n selection: { anchor: lineInfo.from, head: lineInfo.to },\n scrollIntoView: true,\n });\n viewRef.current.focus();\n } catch (error) {\n console.error('Failed to jump to line:', error);\n }\n }\n }, []);\n\n // 添加历史记录\n const addToHistory = useCallback((content: string, description?: string) => {\n // 如果是外部更新或正在恢复历史,不添加记录\n if (!enableHistory || isRestoringHistory.current || isExternalUpdate.current) {\n return;\n }\n\n const now = Date.now();\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n const timeSinceLastSave = now - lastSaveTime.current;\n const timeCheckPassed = timeSinceLastSave >= intervalMs;\n\n // 按配置的间隔记录\n if (!timeCheckPassed) {\n // 时间未到,标记有变更,但不立即保存\n hasChanges.current = true;\n pendingContent.current = content;\n return;\n }\n\n // 时间检查已通过,现在检查内容是否真的发生变化\n if (content === lastSavedContent.current && !description) {\n // 内容没有变化,不保存\n hasChanges.current = false;\n return;\n }\n\n // 时间检查通过 + 内容有变化 → 保存!\n lastSaveTime.current = now;\n hasChanges.current = false;\n lastSavedContent.current = content; // 记录本次保存的内容\n\n setCodeHistory((prevHistory) => {\n // 如果当前不在最新位置,删除后面的历史\n const newHistory = currentHistoryIndex >= 0\n ? prevHistory.slice(0, currentHistoryIndex + 1)\n : prevHistory;\n\n const newEntry: HistoryEntry = {\n id: `${now}-${Math.random()}`,\n timestamp: new Date(now),\n content,\n description,\n };\n\n const updatedHistory = [...newHistory, newEntry];\n\n // 限制历史记录数量\n if (updatedHistory.length > historyLimit) {\n updatedHistory.shift();\n }\n\n const newIndex = updatedHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(updatedHistory, newIndex);\n }\n }, 0);\n\n return updatedHistory;\n });\n }, [enableHistory, historyLimit, historySaveInterval, currentHistoryIndex, onHistoryChange]);\n\n // 恢复历史记录\n const restoreHistory = useCallback((index: number) => {\n if (index < 0 || index >= codeHistory.length) return;\n\n isRestoringHistory.current = true;\n const entry = codeHistory[index];\n\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: entry.content,\n },\n });\n }\n\n // 清除当前版本之后的所有版本\n const newHistory = codeHistory.slice(0, index + 1);\n setCodeHistory(newHistory);\n\n // 回滚的版本成为最新版本\n const newIndex = newHistory.length - 1;\n setCurrentHistoryIndex(newIndex);\n\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange(newHistory, newIndex);\n }\n }, 0);\n\n // 触发 onChange\n if (onChange) {\n onChange(entry.content);\n }\n\n // 延迟重置标志,确保不会立即添加到历史\n setTimeout(() => {\n isRestoringHistory.current = false;\n }, 100);\n }, [codeHistory, onChange, onHistoryChange]);\n\n // 暴露历史记录相关方法\n useImperativeHandle(ref, () => ({\n jumpToLine,\n getView: () => viewRef.current,\n getValue: () => viewRef.current?.state.doc.toString() || '',\n setValue: (newValue: string) => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: newValue,\n },\n });\n }\n },\n focus: () => viewRef.current?.focus(),\n getHistory: () => codeHistory,\n restoreHistory,\n clearHistory: () => {\n setCodeHistory([]);\n setCurrentHistoryIndex(-1);\n // 重置所有历史记录相关的内部状态\n lastSaveTime.current = 0;\n hasChanges.current = false;\n pendingContent.current = '';\n lastSavedContent.current = '';\n // 延迟调用 onHistoryChange 避免在渲染期间更新父组件\n setTimeout(() => {\n if (onHistoryChange) {\n onHistoryChange([], -1);\n }\n }, 0);\n },\n } as any), [jumpToLine, codeHistory, restoreHistory, onHistoryChange]);\n\n // 定时保存待处理的历史记录\n useEffect(() => {\n if (!enableHistory) return;\n\n const intervalMs = historySaveInterval * 10000; // 转换为毫秒\n\n const interval = setInterval(() => {\n if (hasChanges.current && pendingContent.current) {\n addToHistory(pendingContent.current);\n }\n }, intervalMs);\n\n return () => clearInterval(interval);\n }, [enableHistory, historySaveInterval, addToHistory]);\n\n // 初始化编辑器\n useEffect(() => {\n if (!editorRef.current) return;\n\n const updateListener = EditorView.updateListener.of((update) => {\n if (update.docChanged && onChange) {\n const newContent = update.state.doc.toString();\n onChange(newContent);\n\n // 添加到历史记录\n // 注意:只有在用户实际输入时才添加,外部更新不添加\n if (enableHistory && !isExternalUpdate.current) {\n addToHistory(newContent);\n }\n\n // 如果是外部更新触发的变更,重置标志\n if (isExternalUpdate.current) {\n isExternalUpdate.current = false;\n }\n }\n\n if (update.docChanged && onVariablesCollected) {\n const code = update.state.doc.toString();\n // 使用 languageRef.current 获取最新的 language 值\n const variables = collectVariables(code, languageRef.current);\n onVariablesCollected(variables);\n }\n\n if (update.docChanged && onOutlineGenerated) {\n const code = update.state.doc.toString();\n // 使用 languageRef.current 获取最新的 language 值\n const outline = generateOutline(code, languageRef.current);\n onOutlineGenerated(outline);\n }\n });\n\n const baseExtensions: Extension[] = [\n history(),\n drawSelection(),\n bracketMatching(),\n closeBrackets(),\n indentOnInput(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n languageCompartment.current.of(getLanguageExtension(language)),\n themeCompartment.current.of(createThemeExtension(theme)),\n highlightCompartment.current.of(createHighlightExtension(theme)),\n readOnlyCompartment.current.of(EditorState.readOnly.of(readOnly)),\n updateListener,\n keymap.of([\n ...closeBracketsKeymap,\n ...defaultKeymap,\n ...searchKeymap,\n ...historyKeymap,\n ...completionKeymap,\n ...lintKeymap,\n indentWithTab,\n ]),\n bracketMatchingStyle,\n lineHighlightStyle,\n jumpTargetHighlight,\n ];\n\n // 可选扩展\n if (showLineNumbers) {\n baseExtensions.push(lineNumbers(), foldGutter(), highlightActiveLineGutter());\n }\n\n if (shouldHighlightActiveLine) {\n baseExtensions.push(highlightActiveLine());\n }\n\n // 自动补全\n if (autocompletion) {\n const config: AutocompletionConfig = typeof autocompletion === 'object' ? autocompletion : {};\n baseExtensions.push(smartAutocompletion(language, config));\n }\n\n // 跳转到定义\n if (jumpToDefinitionConfig) {\n const config: JumpToDefinitionConfig = typeof jumpToDefinitionConfig === 'object'\n ? jumpToDefinitionConfig\n : {};\n baseExtensions.push(jumpToDefinition(jumpToLine, config));\n }\n\n // 占位符\n if (placeholder) {\n baseExtensions.push(\n EditorView.contentAttributes.of({ 'data-placeholder': placeholder })\n );\n }\n\n // 自定义扩展\n if (customExtensions.length > 0) {\n baseExtensions.push(...customExtensions);\n }\n\n const startState = EditorState.create({\n doc: value,\n extensions: baseExtensions,\n });\n\n const view = new EditorView({\n state: startState,\n parent: editorRef.current,\n });\n\n viewRef.current = view;\n\n // 延迟初始收集变量和大纲(避免在渲染期间更新父组件)\n setTimeout(() => {\n if (onVariablesCollected) {\n const variables = collectVariables(value, language);\n onVariablesCollected(variables);\n }\n\n if (onOutlineGenerated) {\n const outline = generateOutline(value, language);\n onOutlineGenerated(outline);\n }\n }, 0);\n\n // 添加初始内容到历史记录\n if (enableHistory && value) {\n addToHistory(value, 'Initial content');\n }\n\n return () => {\n view.destroy();\n };\n }, []); // 只在挂载时初始化\n\n // 更新值\n useEffect(() => {\n if (viewRef.current && value !== viewRef.current.state.doc.toString()) {\n isExternalUpdate.current = true; // 标记为外部更新\n viewRef.current.dispatch({\n changes: {\n from: 0,\n to: viewRef.current.state.doc.length,\n insert: value,\n },\n });\n // 注意:标志会在 updateListener 中被立即重置,不需要 setTimeout\n }\n }, [value]);\n\n // 更新语言\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: languageCompartment.current.reconfigure(getLanguageExtension(language)),\n });\n\n const code = viewRef.current.state.doc.toString();\n\n // 延迟执行回调,避免在渲染期间更新父组件\n setTimeout(() => {\n if (onVariablesCollected) {\n const variables = collectVariables(code, language);\n onVariablesCollected(variables);\n }\n if (onOutlineGenerated) {\n const outline = generateOutline(code, language);\n onOutlineGenerated(outline);\n }\n }, 0);\n }\n }, [language, onVariablesCollected, onOutlineGenerated]);\n\n // 更新主题\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: [\n themeCompartment.current.reconfigure(createThemeExtension(theme)),\n highlightCompartment.current.reconfigure(createHighlightExtension(theme)),\n ],\n });\n }\n }, [theme]);\n\n // 更新只读状态\n useEffect(() => {\n if (viewRef.current) {\n viewRef.current.dispatch({\n effects: readOnlyCompartment.current.reconfigure(EditorState.readOnly.of(readOnly)),\n });\n }\n }, [readOnly]);\n\n // 处理右键菜单\n const handleContextMenu = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n setContextMenuState({\n visible: true,\n x: e.clientX,\n y: e.clientY,\n });\n }, []);\n\n const closeContextMenu = useCallback(() => {\n setContextMenuState({ visible: false, x: 0, y: 0 });\n }, []);\n\n const handleMenuItemClick = useCallback(\n (item: any) => {\n if (viewRef.current && !item.disabled) {\n item.action(viewRef.current);\n }\n closeContextMenu();\n },\n [closeContextMenu]\n );\n\n // 点击其他地方关闭菜单\n useEffect(() => {\n if (contextMenuState.visible) {\n const handleClick = () => closeContextMenu();\n document.addEventListener('click', handleClick);\n return () => document.removeEventListener('click', handleClick);\n }\n }, [contextMenuState.visible, closeContextMenu]);\n\n const editorStyles: React.CSSProperties = {\n height,\n minHeight,\n maxHeight,\n overflow: 'auto',\n };\n\n const menuItems = contextMenu || defaultContextMenu;\n\n return (\n <div className={`code-editor-wrapper ${className}`}>\n <div\n ref={editorRef}\n onContextMenu={handleContextMenu}\n style={editorStyles}\n className=\"code-editor\"\n />\n\n {/* 上下文菜单 */}\n {contextMenuState.visible && (\n <div\n className=\"context-menu\"\n style={{\n position: 'fixed',\n top: contextMenuState.y,\n left: contextMenuState.x,\n zIndex: 1000,\n }}\n >\n <ul className=\"menu bg-base-200 rounded-box shadow-lg\">\n {menuItems.map((item, index) => {\n if (item.separator) {\n return <li key={index} className=\"menu-separator\" />;\n }\n return (\n <li key={index}>\n <a\n onClick={() => handleMenuItemClick(item)}\n className={item.disabled ? 'disabled' : ''}\n >\n {item.label}\n </a>\n </li>\n );\n })}\n </ul>\n </div>\n )}\n\n <style>{`\n .code-editor-wrapper {\n position: relative;\n border: 1px solid var(--fallback-bc, oklch(var(--bc) / 0.2));\n border-radius: 0.5rem;\n overflow: hidden;\n }\n\n .code-editor .cm-editor {\n height: 100%;\n }\n\n .code-editor .cm-scroller {\n overflow: auto;\n font-family: 'Fira Code', 'Consolas', 'Monaco', monospace;\n font-size: 14px;\n line-height: 1.5;\n }\n\n .code-editor .cm-content[data-placeholder]::before {\n content: attr(data-placeholder);\n color: var(--fallback-bc, oklch(var(--bc) / 0.4));\n position: absolute;\n pointer-events: none;\n }\n\n .context-menu {\n min-width: 150px;\n }\n\n .context-menu .menu-separator {\n height: 1px;\n background: var(--fallback-bc, oklch(var(--bc) / 0.2));\n margin: 0.25rem 0;\n }\n\n .context-menu .disabled {\n opacity: 0.5;\n pointer-events: none;\n }\n `}</style>\n </div>\n );\n});\n\nCodeEditor.displayName = 'CodeEditor';\n\nexport default CodeEditor;\n\n"],"mappings":"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"}
|
|
@@ -1,227 +1,170 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { extractFootnotes as
|
|
5
|
-
import { useCallback as
|
|
6
|
-
import { jsx as
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}),
|
|
167
|
-
n === "right" && (d || s) && g(),
|
|
168
|
-
/* @__PURE__ */ p("style", { children: `
|
|
169
|
-
.markdown-sidebar-light {
|
|
170
|
-
color: #000000;
|
|
171
|
-
}
|
|
172
|
-
.markdown-sidebar-dark {
|
|
173
|
-
color: #d4d4d4;
|
|
174
|
-
}
|
|
175
|
-
.markdown-sidebar-dark .card,
|
|
176
|
-
.markdown-sidebar-dark .toc-panel,
|
|
177
|
-
.markdown-sidebar-dark .footnote-panel,
|
|
178
|
-
.markdown-sidebar-dark .outline-panel,
|
|
179
|
-
.markdown-sidebar-dark .variable-panel {
|
|
180
|
-
background-color: #1e1e1e !important;
|
|
181
|
-
border-color: #3e3e42 !important;
|
|
182
|
-
color: #d4d4d4 !important;
|
|
183
|
-
}
|
|
184
|
-
.markdown-sidebar-dark .border-base-300 {
|
|
185
|
-
border-color: #3e3e42 !important;
|
|
186
|
-
}
|
|
187
|
-
.markdown-sidebar-dark input,
|
|
188
|
-
.markdown-sidebar-dark .input {
|
|
189
|
-
background-color: #2d2d2d !important;
|
|
190
|
-
border-color: #3e3e42 !important;
|
|
191
|
-
color: #d4d4d4 !important;
|
|
192
|
-
}
|
|
193
|
-
.markdown-sidebar-dark button,
|
|
194
|
-
.markdown-sidebar-dark .btn {
|
|
195
|
-
color: #d4d4d4 !important;
|
|
196
|
-
}
|
|
197
|
-
.markdown-sidebar-dark .hover\\:bg-base-200:hover,
|
|
198
|
-
.markdown-sidebar-dark .toc-item:hover,
|
|
199
|
-
.markdown-sidebar-dark .outline-item:hover,
|
|
200
|
-
.markdown-sidebar-dark .variable-item:hover,
|
|
201
|
-
.markdown-sidebar-dark .footnote-item:hover {
|
|
202
|
-
background-color: #2d2d2d !important;
|
|
203
|
-
}
|
|
204
|
-
.markdown-sidebar-dark .bg-primary\\/20 {
|
|
205
|
-
background-color: rgba(96, 165, 250, 0.2) !important;
|
|
206
|
-
}
|
|
207
|
-
.markdown-sidebar-dark .bg-base-200 {
|
|
208
|
-
background-color: #2d2d2d !important;
|
|
209
|
-
}
|
|
210
|
-
.markdown-sidebar-dark .bg-warning\\/10 {
|
|
211
|
-
background-color: rgba(251, 191, 36, 0.1) !important;
|
|
212
|
-
}
|
|
213
|
-
.markdown-sidebar-dark .border-warning\\/30 {
|
|
214
|
-
border-color: rgba(251, 191, 36, 0.3) !important;
|
|
215
|
-
}
|
|
216
|
-
.markdown-sidebar-dark .text-warning {
|
|
217
|
-
color: #fbbf24 !important;
|
|
218
|
-
}
|
|
219
|
-
` })
|
|
220
|
-
]
|
|
221
|
-
});
|
|
222
|
-
};
|
|
223
|
-
export {
|
|
224
|
-
H as default
|
|
1
|
+
import e from "./CodeEditor.js";
|
|
2
|
+
import t from "../panels/TableOfContentsPanel.js";
|
|
3
|
+
import n from "../panels/FootnotePanel.js";
|
|
4
|
+
import { extractFootnotes as r, extractMarkdownSections as i, markdownExtensions as a } from "./markdownExtensions.js";
|
|
5
|
+
import { useCallback as o, useEffect as s, useRef as c, useState as l } from "react";
|
|
6
|
+
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/pro/CodeEditor/editors/MarkdownEditor.tsx
|
|
8
|
+
var f = (e) => {
|
|
9
|
+
let t = e.split("\n").filter((e) => e.trim());
|
|
10
|
+
if (t.length < 2) return e;
|
|
11
|
+
let n = t.map((e) => e.split("|").map((e) => e.trim()).filter((e, t, n) => t > 0 && t < n.length - 1)), r = [];
|
|
12
|
+
return n.forEach((e) => {
|
|
13
|
+
e.forEach((e, t) => {
|
|
14
|
+
r[t] = Math.max(r[t] || 0, e.length);
|
|
15
|
+
});
|
|
16
|
+
}), n.map((e, t) => "| " + e.map((e, n) => {
|
|
17
|
+
if (t === 1 && e.match(/^:?-+:?$/)) {
|
|
18
|
+
let t = e.startsWith(":"), i = e.endsWith(":"), a = r[n];
|
|
19
|
+
return t && i ? ":" + "-".repeat(a - 2) + ":" : t ? ":" + "-".repeat(a - 1) : i ? "-".repeat(a - 1) + ":" : "-".repeat(a);
|
|
20
|
+
}
|
|
21
|
+
return e.padEnd(r[n], " ");
|
|
22
|
+
}).join(" | ") + " |").join("\n");
|
|
23
|
+
}, p = (e, t) => {
|
|
24
|
+
let n = e.state.doc.lineAt(t);
|
|
25
|
+
if (!n.text.includes("|")) return null;
|
|
26
|
+
let r = n.number, i = n.number - 1;
|
|
27
|
+
for (; i >= 1 && e.state.doc.line(i).text.includes("|");) r = i, i--;
|
|
28
|
+
let a = n.number;
|
|
29
|
+
i = n.number + 1;
|
|
30
|
+
let o = e.state.doc.lines;
|
|
31
|
+
for (; i <= o && e.state.doc.line(i).text.includes("|");) a = i, i++;
|
|
32
|
+
let s = e.state.doc.line(r), c = e.state.doc.line(a);
|
|
33
|
+
return {
|
|
34
|
+
start: s.from,
|
|
35
|
+
end: c.to,
|
|
36
|
+
text: e.state.doc.sliceString(s.from, c.to)
|
|
37
|
+
};
|
|
38
|
+
}, m = ({ value: m = "", onChange: h, showTableOfContents: g = !0, showFootnotes: _ = !0, onSectionsChange: v, onFootnotesChange: y, tableOfContentsPosition: b = "right", customExtensions: x = [], customContextMenu: S = [], ...C }) => {
|
|
39
|
+
let [w, T] = l([]), [E, D] = l([]), [O, k] = l(1);
|
|
40
|
+
c(null), s(() => {
|
|
41
|
+
let e = i(m), t = r(m);
|
|
42
|
+
T(e), D(t), v && v(e), y && y(t);
|
|
43
|
+
}, [
|
|
44
|
+
m,
|
|
45
|
+
v,
|
|
46
|
+
y
|
|
47
|
+
]);
|
|
48
|
+
let A = o((e) => {
|
|
49
|
+
let t = document.querySelector(`.cm-line:nth-child(${e})`);
|
|
50
|
+
t && t.scrollIntoView({
|
|
51
|
+
behavior: "smooth",
|
|
52
|
+
block: "center"
|
|
53
|
+
});
|
|
54
|
+
}, []), j = [
|
|
55
|
+
{
|
|
56
|
+
label: "格式化表格",
|
|
57
|
+
action: (e) => {
|
|
58
|
+
let t = e.state.selection.main, n = p(e, t.from);
|
|
59
|
+
if (n) {
|
|
60
|
+
let t = f(n.text);
|
|
61
|
+
e.dispatch({ changes: {
|
|
62
|
+
from: n.start,
|
|
63
|
+
to: n.end,
|
|
64
|
+
insert: t
|
|
65
|
+
} });
|
|
66
|
+
} else alert("请将光标放在表格中");
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
label: "",
|
|
71
|
+
action: () => {},
|
|
72
|
+
separator: !0
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
label: "剪切",
|
|
76
|
+
action: (e) => {
|
|
77
|
+
let t = e.state.selection.main, n = e.state.sliceDoc(t.from, t.to);
|
|
78
|
+
navigator.clipboard.writeText(n), e.dispatch({ changes: {
|
|
79
|
+
from: t.from,
|
|
80
|
+
to: t.to,
|
|
81
|
+
insert: ""
|
|
82
|
+
} });
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
label: "复制",
|
|
87
|
+
action: (e) => {
|
|
88
|
+
let t = e.state.selection.main, n = e.state.sliceDoc(t.from, t.to);
|
|
89
|
+
navigator.clipboard.writeText(n);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
label: "粘贴",
|
|
94
|
+
action: async (e) => {
|
|
95
|
+
let t = await navigator.clipboard.readText(), n = e.state.selection.main;
|
|
96
|
+
e.dispatch({ changes: {
|
|
97
|
+
from: n.from,
|
|
98
|
+
to: n.to,
|
|
99
|
+
insert: t
|
|
100
|
+
} });
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
label: "",
|
|
105
|
+
action: () => {},
|
|
106
|
+
separator: !0
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
label: "全选",
|
|
110
|
+
action: (e) => {
|
|
111
|
+
e.dispatch({ selection: {
|
|
112
|
+
anchor: 0,
|
|
113
|
+
head: e.state.doc.length
|
|
114
|
+
} });
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
...S
|
|
118
|
+
], M = [...a(), ...x], N = () => {
|
|
119
|
+
let e = [
|
|
120
|
+
"dark",
|
|
121
|
+
"retro",
|
|
122
|
+
"cyberpunk",
|
|
123
|
+
"matrix"
|
|
124
|
+
].includes(C.theme || "light") ? "markdown-sidebar-dark" : "markdown-sidebar-light";
|
|
125
|
+
return /* @__PURE__ */ d("div", {
|
|
126
|
+
className: `markdown-sidebar space-y-4 ${e}`,
|
|
127
|
+
style: { width: "320px" },
|
|
128
|
+
children: [g && /* @__PURE__ */ u(t, {
|
|
129
|
+
sections: w,
|
|
130
|
+
onSectionClick: A,
|
|
131
|
+
currentLine: O,
|
|
132
|
+
theme: C.theme
|
|
133
|
+
}), _ && E.length > 0 && /* @__PURE__ */ u(n, {
|
|
134
|
+
footnotes: E,
|
|
135
|
+
onFootnoteClick: A,
|
|
136
|
+
onJumpToDefinition: (e, t) => {
|
|
137
|
+
console.log(`Jumping to definition of footnote ${e} at line ${t}`), A(t);
|
|
138
|
+
},
|
|
139
|
+
onJumpToReference: (e, t) => {
|
|
140
|
+
console.log(`Jumping to reference of footnote ${e} at line ${t}`), A(t);
|
|
141
|
+
},
|
|
142
|
+
theme: C.theme
|
|
143
|
+
})]
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
return /* @__PURE__ */ d("div", {
|
|
147
|
+
className: "markdown-editor-wrapper flex gap-4",
|
|
148
|
+
children: [
|
|
149
|
+
b === "left" && (g || _) && N(),
|
|
150
|
+
/* @__PURE__ */ u("div", {
|
|
151
|
+
className: "markdown-editor-main flex-1",
|
|
152
|
+
children: /* @__PURE__ */ u(e, {
|
|
153
|
+
...C,
|
|
154
|
+
value: m,
|
|
155
|
+
onChange: h,
|
|
156
|
+
language: "markdown",
|
|
157
|
+
autocompletion: !1,
|
|
158
|
+
extensions: M,
|
|
159
|
+
contextMenu: j
|
|
160
|
+
})
|
|
161
|
+
}),
|
|
162
|
+
b === "right" && (g || _) && N(),
|
|
163
|
+
/* @__PURE__ */ u("style", { children: "\n .markdown-sidebar-light {\n color: #000000;\n }\n .markdown-sidebar-dark {\n color: #d4d4d4;\n }\n .markdown-sidebar-dark .card,\n .markdown-sidebar-dark .toc-panel,\n .markdown-sidebar-dark .footnote-panel,\n .markdown-sidebar-dark .outline-panel,\n .markdown-sidebar-dark .variable-panel {\n background-color: #1e1e1e !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .border-base-300 {\n border-color: #3e3e42 !important;\n }\n .markdown-sidebar-dark input,\n .markdown-sidebar-dark .input {\n background-color: #2d2d2d !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark button,\n .markdown-sidebar-dark .btn {\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .hover\\:bg-base-200:hover,\n .markdown-sidebar-dark .toc-item:hover,\n .markdown-sidebar-dark .outline-item:hover,\n .markdown-sidebar-dark .variable-item:hover,\n .markdown-sidebar-dark .footnote-item:hover {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-primary\\/20 {\n background-color: rgba(96, 165, 250, 0.2) !important;\n }\n .markdown-sidebar-dark .bg-base-200 {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-warning\\/10 {\n background-color: rgba(251, 191, 36, 0.1) !important;\n }\n .markdown-sidebar-dark .border-warning\\/30 {\n border-color: rgba(251, 191, 36, 0.3) !important;\n }\n .markdown-sidebar-dark .text-warning {\n color: #fbbf24 !important;\n }\n " })
|
|
164
|
+
]
|
|
165
|
+
});
|
|
225
166
|
};
|
|
167
|
+
//#endregion
|
|
168
|
+
export { m as default };
|
|
226
169
|
|
|
227
170
|
//# sourceMappingURL=MarkdownEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/MarkdownEditor.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport CodeEditor, { CodeEditorProps, ContextMenuItem } from './CodeEditor';\nimport TableOfContentsPanel from '../panels/TableOfContentsPanel';\nimport FootnotePanel from '../panels/FootnotePanel';\nimport {\n markdownExtensions,\n extractMarkdownSections,\n extractFootnotes,\n MarkdownSection,\n FootnoteInfo,\n} from './markdownExtensions';\nimport { EditorView } from '@codemirror/view';\n\nexport interface MarkdownEditorProps extends Omit<CodeEditorProps, 'language' | 'extensions' | 'autocompletion' | 'contextMenu'> {\n showTableOfContents?: boolean;\n showFootnotes?: boolean;\n onSectionsChange?: (sections: MarkdownSection[]) => void;\n onFootnotesChange?: (footnotes: FootnoteInfo[]) => void;\n tableOfContentsPosition?: 'left' | 'right';\n customExtensions?: CodeEditorProps['extensions'];\n customContextMenu?: ContextMenuItem[];\n}\n\n// 表格格式化函数\nconst formatMarkdownTable = (tableText: string): string => {\n const lines = tableText.split('\\n').filter(line => line.trim());\n if (lines.length < 2) return tableText;\n\n // 解析表格\n const rows = lines.map(line => {\n return line.split('|')\n .map(cell => cell.trim())\n .filter((_, i, arr) => i > 0 && i < arr.length - 1); // 移除首尾空元素\n });\n\n // 计算每列的最大宽度\n const colWidths: number[] = [];\n rows.forEach(row => {\n row.forEach((cell, i) => {\n colWidths[i] = Math.max(colWidths[i] || 0, cell.length);\n });\n });\n\n // 格式化每一行\n const formattedRows = rows.map((row, rowIndex) => {\n const cells = row.map((cell, colIndex) => {\n // 对于分隔行,保持对齐标记\n if (rowIndex === 1 && cell.match(/^:?-+:?$/)) {\n const hasLeft = cell.startsWith(':');\n const hasRight = cell.endsWith(':');\n const width = colWidths[colIndex];\n\n if (hasLeft && hasRight) {\n return ':' + '-'.repeat(width - 2) + ':';\n } else if (hasLeft) {\n return ':' + '-'.repeat(width - 1);\n } else if (hasRight) {\n return '-'.repeat(width - 1) + ':';\n } else {\n return '-'.repeat(width);\n }\n }\n\n return cell.padEnd(colWidths[colIndex], ' ');\n });\n\n return '| ' + cells.join(' | ') + ' |';\n });\n\n return formattedRows.join('\\n');\n};\n\n// 检测是否在表格中\nconst isInTable = (view: EditorView, pos: number): { start: number; end: number; text: string } | null => {\n const line = view.state.doc.lineAt(pos);\n const lineText = line.text;\n\n if (!lineText.includes('|')) return null;\n\n // 向上查找表格开始\n let startLine = line.number;\n let currentLine = line.number - 1;\n while (currentLine >= 1) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n startLine = currentLine;\n currentLine--;\n }\n\n // 向下查找表格结束\n let endLine = line.number;\n currentLine = line.number + 1;\n const totalLines = view.state.doc.lines;\n while (currentLine <= totalLines) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n endLine = currentLine;\n currentLine++;\n }\n\n const startLineObj = view.state.doc.line(startLine);\n const endLineObj = view.state.doc.line(endLine);\n\n return {\n start: startLineObj.from,\n end: endLineObj.to,\n text: view.state.doc.sliceString(startLineObj.from, endLineObj.to),\n };\n};\n\nconst MarkdownEditor: React.FC<MarkdownEditorProps> = ({\n value = '',\n onChange,\n showTableOfContents = true,\n showFootnotes = true,\n onSectionsChange,\n onFootnotesChange,\n tableOfContentsPosition = 'right',\n customExtensions = [],\n customContextMenu = [],\n ...codeEditorProps\n}) => {\n const [sections, setSections] = useState<MarkdownSection[]>([]);\n const [footnotes, setFootnotes] = useState<FootnoteInfo[]>([]);\n const [currentLine, setCurrentLine] = useState(1);\n const editorViewRef = useRef<EditorView | null>(null);\n\n // 提取章节和脚注\n useEffect(() => {\n const newSections = extractMarkdownSections(value);\n const newFootnotes = extractFootnotes(value);\n\n setSections(newSections);\n setFootnotes(newFootnotes);\n\n if (onSectionsChange) {\n onSectionsChange(newSections);\n }\n\n if (onFootnotesChange) {\n onFootnotesChange(newFootnotes);\n }\n }, [value, onSectionsChange, onFootnotesChange]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n const lineElement = document.querySelector(`.cm-line:nth-child(${line})`);\n if (lineElement) {\n lineElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, []);\n\n // Markdown 专属上下文菜单\n const markdownContextMenu: ContextMenuItem[] = [\n {\n label: '格式化表格',\n action: (view) => {\n const selection = view.state.selection.main;\n const tableInfo = isInTable(view, selection.from);\n\n if (tableInfo) {\n const formatted = formatMarkdownTable(tableInfo.text);\n view.dispatch({\n changes: {\n from: tableInfo.start,\n to: tableInfo.end,\n insert: formatted,\n },\n });\n } else {\n alert('请将光标放在表格中');\n }\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '剪切',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: '' },\n });\n },\n },\n {\n label: '复制',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n },\n },\n {\n label: '粘贴',\n action: async (view) => {\n const text = await navigator.clipboard.readText();\n const selection = view.state.selection.main;\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n });\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '全选',\n action: (view) => {\n view.dispatch({\n selection: { anchor: 0, head: view.state.doc.length },\n });\n },\n },\n ...customContextMenu,\n ];\n\n // 合并扩展\n const allExtensions = [...markdownExtensions(), ...customExtensions];\n\n // 侧边栏内容\n const renderSidebar = () => {\n // 根据主题决定侧边栏的样式类\n const darkThemes = ['dark', 'retro', 'cyberpunk', 'matrix'];\n const sidebarThemeClass =\n darkThemes.includes(codeEditorProps.theme || 'light')\n ? 'markdown-sidebar-dark'\n : 'markdown-sidebar-light';\n\n return (\n <div className={`markdown-sidebar space-y-4 ${sidebarThemeClass}`} style={{ width: '320px' }}>\n {showTableOfContents && (\n <TableOfContentsPanel\n sections={sections}\n onSectionClick={jumpToLine}\n currentLine={currentLine}\n theme={codeEditorProps.theme}\n />\n )}\n {showFootnotes && footnotes.length > 0 && (\n <FootnotePanel\n footnotes={footnotes}\n onFootnoteClick={jumpToLine}\n onJumpToDefinition={(id, line) => {\n console.log(`Jumping to definition of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n onJumpToReference={(id, line) => {\n console.log(`Jumping to reference of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n theme={codeEditorProps.theme}\n />\n )}\n </div>\n );\n };\n\n return (\n <div className=\"markdown-editor-wrapper flex gap-4\">\n {/* 左侧边栏 */}\n {tableOfContentsPosition === 'left' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 编辑器 */}\n <div className=\"markdown-editor-main flex-1\">\n <CodeEditor\n {...codeEditorProps}\n value={value}\n onChange={onChange}\n language=\"markdown\"\n autocompletion={false}\n extensions={allExtensions}\n contextMenu={markdownContextMenu}\n />\n </div>\n\n {/* 右侧边栏 */}\n {tableOfContentsPosition === 'right' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 侧边栏主题样式 */}\n <style>{`\n .markdown-sidebar-light {\n color: #000000;\n }\n .markdown-sidebar-dark {\n color: #d4d4d4;\n }\n .markdown-sidebar-dark .card,\n .markdown-sidebar-dark .toc-panel,\n .markdown-sidebar-dark .footnote-panel,\n .markdown-sidebar-dark .outline-panel,\n .markdown-sidebar-dark .variable-panel {\n background-color: #1e1e1e !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .border-base-300 {\n border-color: #3e3e42 !important;\n }\n .markdown-sidebar-dark input,\n .markdown-sidebar-dark .input {\n background-color: #2d2d2d !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark button,\n .markdown-sidebar-dark .btn {\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .hover\\\\:bg-base-200:hover,\n .markdown-sidebar-dark .toc-item:hover,\n .markdown-sidebar-dark .outline-item:hover,\n .markdown-sidebar-dark .variable-item:hover,\n .markdown-sidebar-dark .footnote-item:hover {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-primary\\\\/20 {\n background-color: rgba(96, 165, 250, 0.2) !important;\n }\n .markdown-sidebar-dark .bg-base-200 {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-warning\\\\/10 {\n background-color: rgba(251, 191, 36, 0.1) !important;\n }\n .markdown-sidebar-dark .border-warning\\\\/30 {\n border-color: rgba(251, 191, 36, 0.3) !important;\n }\n .markdown-sidebar-dark .text-warning {\n color: #fbbf24 !important;\n }\n `}</style>\n </div>\n );\n};\n\nexport default MarkdownEditor;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarkdownEditor.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/editors/MarkdownEditor.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from 'react';\nimport CodeEditor, { CodeEditorProps, ContextMenuItem } from './CodeEditor';\nimport TableOfContentsPanel from '../panels/TableOfContentsPanel';\nimport FootnotePanel from '../panels/FootnotePanel';\nimport {\n markdownExtensions,\n extractMarkdownSections,\n extractFootnotes,\n MarkdownSection,\n FootnoteInfo,\n} from './markdownExtensions';\nimport { EditorView } from '@codemirror/view';\n\nexport interface MarkdownEditorProps extends Omit<CodeEditorProps, 'language' | 'extensions' | 'autocompletion' | 'contextMenu'> {\n showTableOfContents?: boolean;\n showFootnotes?: boolean;\n onSectionsChange?: (sections: MarkdownSection[]) => void;\n onFootnotesChange?: (footnotes: FootnoteInfo[]) => void;\n tableOfContentsPosition?: 'left' | 'right';\n customExtensions?: CodeEditorProps['extensions'];\n customContextMenu?: ContextMenuItem[];\n}\n\n// 表格格式化函数\nconst formatMarkdownTable = (tableText: string): string => {\n const lines = tableText.split('\\n').filter(line => line.trim());\n if (lines.length < 2) return tableText;\n\n // 解析表格\n const rows = lines.map(line => {\n return line.split('|')\n .map(cell => cell.trim())\n .filter((_, i, arr) => i > 0 && i < arr.length - 1); // 移除首尾空元素\n });\n\n // 计算每列的最大宽度\n const colWidths: number[] = [];\n rows.forEach(row => {\n row.forEach((cell, i) => {\n colWidths[i] = Math.max(colWidths[i] || 0, cell.length);\n });\n });\n\n // 格式化每一行\n const formattedRows = rows.map((row, rowIndex) => {\n const cells = row.map((cell, colIndex) => {\n // 对于分隔行,保持对齐标记\n if (rowIndex === 1 && cell.match(/^:?-+:?$/)) {\n const hasLeft = cell.startsWith(':');\n const hasRight = cell.endsWith(':');\n const width = colWidths[colIndex];\n\n if (hasLeft && hasRight) {\n return ':' + '-'.repeat(width - 2) + ':';\n } else if (hasLeft) {\n return ':' + '-'.repeat(width - 1);\n } else if (hasRight) {\n return '-'.repeat(width - 1) + ':';\n } else {\n return '-'.repeat(width);\n }\n }\n\n return cell.padEnd(colWidths[colIndex], ' ');\n });\n\n return '| ' + cells.join(' | ') + ' |';\n });\n\n return formattedRows.join('\\n');\n};\n\n// 检测是否在表格中\nconst isInTable = (view: EditorView, pos: number): { start: number; end: number; text: string } | null => {\n const line = view.state.doc.lineAt(pos);\n const lineText = line.text;\n\n if (!lineText.includes('|')) return null;\n\n // 向上查找表格开始\n let startLine = line.number;\n let currentLine = line.number - 1;\n while (currentLine >= 1) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n startLine = currentLine;\n currentLine--;\n }\n\n // 向下查找表格结束\n let endLine = line.number;\n currentLine = line.number + 1;\n const totalLines = view.state.doc.lines;\n while (currentLine <= totalLines) {\n const l = view.state.doc.line(currentLine);\n if (!l.text.includes('|')) break;\n endLine = currentLine;\n currentLine++;\n }\n\n const startLineObj = view.state.doc.line(startLine);\n const endLineObj = view.state.doc.line(endLine);\n\n return {\n start: startLineObj.from,\n end: endLineObj.to,\n text: view.state.doc.sliceString(startLineObj.from, endLineObj.to),\n };\n};\n\nconst MarkdownEditor: React.FC<MarkdownEditorProps> = ({\n value = '',\n onChange,\n showTableOfContents = true,\n showFootnotes = true,\n onSectionsChange,\n onFootnotesChange,\n tableOfContentsPosition = 'right',\n customExtensions = [],\n customContextMenu = [],\n ...codeEditorProps\n}) => {\n const [sections, setSections] = useState<MarkdownSection[]>([]);\n const [footnotes, setFootnotes] = useState<FootnoteInfo[]>([]);\n const [currentLine, setCurrentLine] = useState(1);\n const editorViewRef = useRef<EditorView | null>(null);\n\n // 提取章节和脚注\n useEffect(() => {\n const newSections = extractMarkdownSections(value);\n const newFootnotes = extractFootnotes(value);\n\n setSections(newSections);\n setFootnotes(newFootnotes);\n\n if (onSectionsChange) {\n onSectionsChange(newSections);\n }\n\n if (onFootnotesChange) {\n onFootnotesChange(newFootnotes);\n }\n }, [value, onSectionsChange, onFootnotesChange]);\n\n // 跳转到指定行\n const jumpToLine = useCallback((line: number) => {\n const lineElement = document.querySelector(`.cm-line:nth-child(${line})`);\n if (lineElement) {\n lineElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }\n }, []);\n\n // Markdown 专属上下文菜单\n const markdownContextMenu: ContextMenuItem[] = [\n {\n label: '格式化表格',\n action: (view) => {\n const selection = view.state.selection.main;\n const tableInfo = isInTable(view, selection.from);\n\n if (tableInfo) {\n const formatted = formatMarkdownTable(tableInfo.text);\n view.dispatch({\n changes: {\n from: tableInfo.start,\n to: tableInfo.end,\n insert: formatted,\n },\n });\n } else {\n alert('请将光标放在表格中');\n }\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '剪切',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: '' },\n });\n },\n },\n {\n label: '复制',\n action: (view) => {\n const selection = view.state.selection.main;\n const text = view.state.sliceDoc(selection.from, selection.to);\n navigator.clipboard.writeText(text);\n },\n },\n {\n label: '粘贴',\n action: async (view) => {\n const text = await navigator.clipboard.readText();\n const selection = view.state.selection.main;\n view.dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n });\n },\n },\n { label: '', action: () => { }, separator: true },\n {\n label: '全选',\n action: (view) => {\n view.dispatch({\n selection: { anchor: 0, head: view.state.doc.length },\n });\n },\n },\n ...customContextMenu,\n ];\n\n // 合并扩展\n const allExtensions = [...markdownExtensions(), ...customExtensions];\n\n // 侧边栏内容\n const renderSidebar = () => {\n // 根据主题决定侧边栏的样式类\n const darkThemes = ['dark', 'retro', 'cyberpunk', 'matrix'];\n const sidebarThemeClass =\n darkThemes.includes(codeEditorProps.theme || 'light')\n ? 'markdown-sidebar-dark'\n : 'markdown-sidebar-light';\n\n return (\n <div className={`markdown-sidebar space-y-4 ${sidebarThemeClass}`} style={{ width: '320px' }}>\n {showTableOfContents && (\n <TableOfContentsPanel\n sections={sections}\n onSectionClick={jumpToLine}\n currentLine={currentLine}\n theme={codeEditorProps.theme}\n />\n )}\n {showFootnotes && footnotes.length > 0 && (\n <FootnotePanel\n footnotes={footnotes}\n onFootnoteClick={jumpToLine}\n onJumpToDefinition={(id, line) => {\n console.log(`Jumping to definition of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n onJumpToReference={(id, line) => {\n console.log(`Jumping to reference of footnote ${id} at line ${line}`);\n jumpToLine(line);\n }}\n theme={codeEditorProps.theme}\n />\n )}\n </div>\n );\n };\n\n return (\n <div className=\"markdown-editor-wrapper flex gap-4\">\n {/* 左侧边栏 */}\n {tableOfContentsPosition === 'left' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 编辑器 */}\n <div className=\"markdown-editor-main flex-1\">\n <CodeEditor\n {...codeEditorProps}\n value={value}\n onChange={onChange}\n language=\"markdown\"\n autocompletion={false}\n extensions={allExtensions}\n contextMenu={markdownContextMenu}\n />\n </div>\n\n {/* 右侧边栏 */}\n {tableOfContentsPosition === 'right' && (showTableOfContents || showFootnotes) && renderSidebar()}\n\n {/* 侧边栏主题样式 */}\n <style>{`\n .markdown-sidebar-light {\n color: #000000;\n }\n .markdown-sidebar-dark {\n color: #d4d4d4;\n }\n .markdown-sidebar-dark .card,\n .markdown-sidebar-dark .toc-panel,\n .markdown-sidebar-dark .footnote-panel,\n .markdown-sidebar-dark .outline-panel,\n .markdown-sidebar-dark .variable-panel {\n background-color: #1e1e1e !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .border-base-300 {\n border-color: #3e3e42 !important;\n }\n .markdown-sidebar-dark input,\n .markdown-sidebar-dark .input {\n background-color: #2d2d2d !important;\n border-color: #3e3e42 !important;\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark button,\n .markdown-sidebar-dark .btn {\n color: #d4d4d4 !important;\n }\n .markdown-sidebar-dark .hover\\\\:bg-base-200:hover,\n .markdown-sidebar-dark .toc-item:hover,\n .markdown-sidebar-dark .outline-item:hover,\n .markdown-sidebar-dark .variable-item:hover,\n .markdown-sidebar-dark .footnote-item:hover {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-primary\\\\/20 {\n background-color: rgba(96, 165, 250, 0.2) !important;\n }\n .markdown-sidebar-dark .bg-base-200 {\n background-color: #2d2d2d !important;\n }\n .markdown-sidebar-dark .bg-warning\\\\/10 {\n background-color: rgba(251, 191, 36, 0.1) !important;\n }\n .markdown-sidebar-dark .border-warning\\\\/30 {\n border-color: rgba(251, 191, 36, 0.3) !important;\n }\n .markdown-sidebar-dark .text-warning {\n color: #fbbf24 !important;\n }\n `}</style>\n </div>\n );\n};\n\nexport default MarkdownEditor;\n"],"mappings":"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"}
|