dishui 0.0.106 → 0.0.110
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/.release-verified.json +3 -2
- package/dist/components/Accordion/index.js.map +1 -1
- package/dist/components/Avatar/index.js.map +1 -1
- package/dist/components/Badge/index.js.map +1 -1
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/ButtonMenu/index.js.map +1 -1
- package/dist/components/Card/Metric2.js.map +1 -1
- package/dist/components/Card/Ticket2.js.map +1 -1
- package/dist/components/Card/index.js.map +1 -1
- package/dist/components/Chart/Chart.js.map +1 -1
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/ChoicePicker/index.js.map +1 -1
- package/dist/components/Column/index.js.map +1 -1
- package/dist/components/ConfirmDialog/index.js.map +1 -1
- package/dist/components/DateTimeInput/index.js.map +1 -1
- package/dist/components/Demo/index.js.map +1 -1
- package/dist/components/Demo/source.js.map +1 -1
- package/dist/components/Divider/index.js.map +1 -1
- package/dist/components/EmptyState/index.js.map +1 -1
- package/dist/components/Field/index.js.map +1 -1
- package/dist/components/FileUploader/DropZone.js.map +1 -1
- package/dist/components/FileUploader/FileItem.js.map +1 -1
- package/dist/components/FileUploader/FileUploader.js.map +1 -1
- package/dist/components/FileUploader/UploadQueue.js.map +1 -1
- package/dist/components/GroupButton/index.js.map +1 -1
- package/dist/components/GroupedTable/index.js.map +1 -1
- package/dist/components/Icon/index.js.map +1 -1
- package/dist/components/Image/index.js.map +1 -1
- package/dist/components/Input/index.js.map +1 -1
- package/dist/components/Label/index.js.map +1 -1
- package/dist/components/Layout/index.js.map +1 -1
- package/dist/components/LayoutSuite/DashboardSuite.js.map +1 -1
- package/dist/components/LayoutSuite/index.js.map +1 -1
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/codeThemes.js.map +1 -1
- package/dist/components/Markdown/markdownComponents.js.map +1 -1
- package/dist/components/Markdown/parseCodeBlockMeta.js.map +1 -1
- package/dist/components/Markdown/useMarkdownSource.js.map +1 -1
- package/dist/components/Markdown/useMarkmapRenderer.js.map +1 -1
- package/dist/components/Markdown/useMermaidRenderer.js.map +1 -1
- package/dist/components/Modal/focusScope.js.map +1 -1
- package/dist/components/Modal/index.js.map +1 -1
- package/dist/components/MultipleChoice/index.js.map +1 -1
- package/dist/components/NavigationList/index.js.map +1 -1
- package/dist/components/Page/Float2.js.map +1 -1
- package/dist/components/Page/index.js.map +1 -1
- package/dist/components/Page/resize2.js.map +1 -1
- package/dist/components/PageHeader/index.js.map +1 -1
- package/dist/components/PagePanel/index.js.map +1 -1
- package/dist/components/ProtectedRoute/index.js.map +1 -1
- package/dist/components/Resizable/ResizeGrip.js.map +1 -1
- package/dist/components/Resizable/index.js.map +1 -1
- package/dist/components/Resizable/useResize.js.map +1 -1
- package/dist/components/Row/index.js.map +1 -1
- package/dist/components/Section/index.js.map +1 -1
- package/dist/components/Select/index.js.map +1 -1
- package/dist/components/SidebarToggleButton/index.js.map +1 -1
- package/dist/components/Skeleton/index.js.map +1 -1
- package/dist/components/Slider/index.js.map +1 -1
- package/dist/components/Switch/index.js.map +1 -1
- package/dist/components/Tab/index.js.map +1 -1
- package/dist/components/Table/index.js.map +1 -1
- package/dist/components/Tabs/index.js.map +1 -1
- package/dist/components/Tabs/tabNavigation.js.map +1 -1
- package/dist/components/Text/index.js.map +1 -1
- package/dist/components/Textarea/index.js.map +1 -1
- package/dist/components/Tooltip/index.js.map +1 -1
- package/dist/components/Tree/Tree.js.map +1 -1
- package/dist/components/ai/AgentChat/index.js.map +1 -1
- package/dist/components/ai/AgentRunCard/index.js.map +1 -1
- package/dist/components/ai/AgentScreen/index.js.map +1 -1
- package/dist/components/ai/ApprovalCard/index.js.map +1 -1
- package/dist/components/ai/CodeView/index.js.map +1 -1
- package/dist/components/ai/CommandSearch/index.js.map +1 -1
- package/dist/components/ai/ContextCards/index.js.map +1 -1
- package/dist/components/ai/DiffTable/index.js.map +1 -1
- package/dist/components/ai/FilterTable/index.js.map +1 -1
- package/dist/components/ai/FineTuneCard/index.js.map +1 -1
- package/dist/components/ai/InsightCards/index.js.map +1 -1
- package/dist/components/ai/IssueCard/index.js.map +1 -1
- package/dist/components/ai/LoadingState/index.js.map +1 -1
- package/dist/components/ai/PromptBar/index.js.map +1 -1
- package/dist/components/ai/RecommendationCard/index.js.map +1 -1
- package/dist/components/ai/RecordsTable/index.js.map +1 -1
- package/dist/components/ai/SelectionActions/index.js.map +1 -1
- package/dist/components/ai/StateFlow/index.js.map +1 -1
- package/dist/components/ai/StreamingText/index.js.map +1 -1
- package/dist/components/ai/TaskRows/index.js.map +1 -1
- package/dist/components/ai/Thinking/index.js.map +1 -1
- package/dist/components/ai/ToolChips/index.js.map +1 -1
- package/dist/components/ai/shared.js.map +1 -1
- package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
- package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
- package/dist/components/pro/ArticleControl/buildHeadingTree.js.map +1 -1
- package/dist/components/pro/ArticleControl/useArticleToc.js.map +1 -1
- package/dist/components/pro/Calendar/Calendar.js +165 -160
- package/dist/components/pro/Calendar/Calendar.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarDrag.js.map +1 -1
- package/dist/components/pro/Calendar/hooks/useCalendarState.js +31 -31
- package/dist/components/pro/Calendar/hooks/useCalendarState.js.map +1 -1
- package/dist/components/pro/Calendar/utils.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
- package/dist/components/pro/CodeEditor/editors/markdownExtensions.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/contextMenu.js.map +1 -1
- package/dist/components/pro/CodeEditor/extensions/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/index.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/javascript.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/python.js.map +1 -1
- package/dist/components/pro/CodeEditor/langs/snippets.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js +65 -59
- package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
- package/dist/components/pro/CodeEditor/themes.js.map +1 -1
- package/dist/components/pro/CodeEditor/utils.js.map +1 -1
- package/dist/components/pro/DataTable/DataTable.js.map +1 -1
- package/dist/components/pro/DataTable/Filters.js.map +1 -1
- package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
- package/dist/components/pro/DataTable/PivotView.js.map +1 -1
- package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
- package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
- package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
- package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
- package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
- package/dist/components/pro/DataTable/extension.js.map +1 -1
- package/dist/components/pro/DataTable/pivotEngine.js.map +1 -1
- package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
- package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
- package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
- package/dist/components/pro/DataTable/treeDataUtils.js.map +1 -1
- package/dist/components/pro/DataTable/useColumnDragReorder.js.map +1 -1
- package/dist/components/pro/DataTable/useDataTableModel.js +119 -104
- package/dist/components/pro/DataTable/useDataTableModel.js.map +1 -1
- package/dist/components/pro/DataTable/utils.js.map +1 -1
- package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
- package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
- package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
- package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
- package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
- package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
- package/dist/components/pro/Flow/Flow.js.map +1 -1
- package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
- package/dist/components/pro/Flow/archify/build.js.map +1 -1
- package/dist/components/pro/Flow/archify/convert.js.map +1 -1
- package/dist/components/pro/Flow/archify/palette.js.map +1 -1
- package/dist/components/pro/Flow/archify/presets.js.map +1 -1
- package/dist/components/pro/Flow/archify/spec.js.map +1 -1
- package/dist/components/pro/Flow/canvas/AlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/canvas/GridRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/MiniMapRenderer.js.map +1 -1
- package/dist/components/pro/Flow/canvas/PixiApp.js.map +1 -1
- package/dist/components/pro/Flow/canvas/SelectionOverlay.js.map +1 -1
- package/dist/components/pro/Flow/canvas/ViewportContainer.js.map +1 -1
- package/dist/components/pro/Flow/constants.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowAIContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowContext.js.map +1 -1
- package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
- package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgeMarkers.js.map +1 -1
- package/dist/components/pro/Flow/edges/edgePaths.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useAlignmentGuides.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useCompactMode.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useDraggablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useFlowImportExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useKeyboardShortcuts.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePdfExport.js.map +1 -1
- package/dist/components/pro/Flow/hooks/usePixiApp.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useResizablePanel.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useSelection.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useUndoRedo.js.map +1 -1
- package/dist/components/pro/Flow/hooks/useViewport.js.map +1 -1
- package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/GeometricLineTool.js.map +1 -1
- package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
- package/dist/components/pro/Flow/lines/lineSmoothing.js.map +1 -1
- package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
- package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
- package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeHandles.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
- package/dist/components/pro/Flow/nodes/NodeText.js.map +1 -1
- package/dist/components/pro/Flow/nodes/aiClient.js.map +1 -1
- package/dist/components/pro/Flow/nodes/animAnchors.js.map +1 -1
- package/dist/components/pro/Flow/nodes/chartGeometryBudget.js.map +1 -1
- package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/demandRender.js.map +1 -1
- package/dist/components/pro/Flow/nodes/nodeUtils.js.map +1 -1
- package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIconTexture.js.map +1 -1
- package/dist/components/pro/Flow/nodes/svgIcons.js.map +1 -1
- package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
- package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
- package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
- package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
- package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
- package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
- package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
- package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
- package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
- package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
- package/dist/components/pro/Flow/types.js.map +1 -1
- package/dist/components/pro/Flow/utils/dashedLine.js.map +1 -1
- package/dist/components/pro/Flow/utils/gradient.js.map +1 -1
- package/dist/components/pro/Flow/utils/pdfExport.js.map +1 -1
- package/dist/components/pro/Flow/utils/themeColor.js.map +1 -1
- package/dist/components/pro/Gantt/Gantt.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttDrag.js.map +1 -1
- package/dist/components/pro/Gantt/hooks/useGanttState.js +79 -71
- package/dist/components/pro/Gantt/hooks/useGanttState.js.map +1 -1
- package/dist/components/pro/Gantt/utils.js.map +1 -1
- package/dist/components/pro/Kanban/Kanban.js.map +1 -1
- package/dist/components/pro/Kanban/Swimlanes.js.map +1 -1
- package/dist/components/pro/Kanban/useKanbanDrag.js.map +1 -1
- package/dist/components/pro/Kanban/utils.js.map +1 -1
- package/dist/components/pro/RichTextEditor/AIRewrite.d.ts +1 -0
- package/dist/components/pro/RichTextEditor/AIRewrite.js +109 -88
- package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
- package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
- package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
- package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/RichTextEditor.js +133 -132
- package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
- package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -1
- package/dist/components/pro/RichTextEditor/Toolbar/useAnchoredDropdown.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/CommentMark.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/FontSize.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/ResizableImage.js.map +1 -1
- package/dist/components/pro/RichTextEditor/extensions/legacyMermaid.js.map +1 -1
- package/dist/components/pro/RichTextEditor/types.d.ts +2 -0
- package/dist/components/pro/RichTextEditor/types.js.map +1 -1
- package/dist/components/pro/Sprite/Molly/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Molly/animations.js +52 -0
- package/dist/components/pro/Sprite/Molly/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Molly/events.js +46 -0
- package/dist/components/pro/Sprite/Molly/events.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Molly/index.js +12 -0
- package/dist/components/pro/Sprite/Molly/index.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.d.ts +3 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js +48 -0
- package/dist/components/pro/Sprite/Molly/legFlexion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js +51 -0
- package/dist/components/pro/Sprite/Molly/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Molly/model.js +614 -0
- package/dist/components/pro/Sprite/Molly/model.js.map +1 -0
- package/dist/components/pro/Sprite/Molly/rig.d.ts +25 -0
- package/dist/components/pro/Sprite/Molly/rig.js +102 -0
- package/dist/components/pro/Sprite/Molly/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/animations.d.ts +6 -0
- package/dist/components/pro/Sprite/Ruby/animations.js +58 -0
- package/dist/components/pro/Sprite/Ruby/animations.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/events.d.ts +2 -0
- package/dist/components/pro/Sprite/Ruby/events.js +46 -0
- package/dist/components/pro/Sprite/Ruby/events.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/index.d.ts +1 -0
- package/dist/components/pro/Sprite/Ruby/index.js +12 -0
- package/dist/components/pro/Sprite/Ruby/index.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.d.ts +4 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js +41 -0
- package/dist/components/pro/Sprite/Ruby/locomotion.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/model.d.ts +23 -0
- package/dist/components/pro/Sprite/Ruby/model.js +605 -0
- package/dist/components/pro/Sprite/Ruby/model.js.map +1 -0
- package/dist/components/pro/Sprite/Ruby/rig.d.ts +26 -0
- package/dist/components/pro/Sprite/Ruby/rig.js +112 -0
- package/dist/components/pro/Sprite/Ruby/rig.js.map +1 -0
- package/dist/components/pro/Sprite/Sprite.d.ts +23 -0
- package/dist/components/pro/Sprite/Sprite2.js +224 -0
- package/dist/components/pro/Sprite/Sprite2.js.map +1 -0
- package/dist/components/pro/Sprite/actions.d.ts +3 -0
- package/dist/components/pro/Sprite/actions.js +16 -0
- package/dist/components/pro/Sprite/actions.js.map +1 -0
- package/dist/components/pro/Sprite/createSpriteScene.d.ts +4 -0
- package/dist/components/pro/Sprite/createSpriteScene.js +14 -0
- package/dist/components/pro/Sprite/createSpriteScene.js.map +1 -0
- package/dist/components/pro/Sprite/index.d.ts +4 -0
- package/dist/components/pro/Sprite/shared/animation.d.ts +33 -0
- package/dist/components/pro/Sprite/shared/animation.js +39 -0
- package/dist/components/pro/Sprite/shared/animation.js.map +1 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js +127 -0
- package/dist/components/pro/Sprite/shared/createSpriteStage.js.map +1 -0
- package/dist/components/pro/Sprite/shared/events.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/events.js +21 -0
- package/dist/components/pro/Sprite/shared/events.js.map +1 -0
- package/dist/components/pro/Sprite/shared/face.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/face.js +33 -0
- package/dist/components/pro/Sprite/shared/face.js.map +1 -0
- package/dist/components/pro/Sprite/shared/faceSurface.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js +66 -0
- package/dist/components/pro/Sprite/shared/faceSurface.js.map +1 -0
- package/dist/components/pro/Sprite/shared/gait.d.ts +5 -0
- package/dist/components/pro/Sprite/shared/gait.js +19 -0
- package/dist/components/pro/Sprite/shared/gait.js.map +1 -0
- package/dist/components/pro/Sprite/shared/geometry.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/geometry.js +59 -0
- package/dist/components/pro/Sprite/shared/geometry.js.map +1 -0
- package/dist/components/pro/Sprite/shared/magicEffect.d.ts +27 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js +61 -0
- package/dist/components/pro/Sprite/shared/magicEffect.js.map +1 -0
- package/dist/components/pro/Sprite/shared/playback.d.ts +8 -0
- package/dist/components/pro/Sprite/shared/playback.js +74 -0
- package/dist/components/pro/Sprite/shared/playback.js.map +1 -0
- package/dist/components/pro/Sprite/shared/rig.d.ts +6 -0
- package/dist/components/pro/Sprite/shared/rig.js +48 -0
- package/dist/components/pro/Sprite/shared/rig.js.map +1 -0
- package/dist/components/pro/Sprite/shared/scene.d.ts +9 -0
- package/dist/components/pro/Sprite/shared/scene.js +21 -0
- package/dist/components/pro/Sprite/shared/scene.js.map +1 -0
- package/dist/components/pro/Sprite/shared/sculptor.d.ts +14 -0
- package/dist/components/pro/Sprite/shared/sculptor.js +78 -0
- package/dist/components/pro/Sprite/shared/sculptor.js.map +1 -0
- package/dist/components/pro/Sprite/shared/speechBubble.d.ts +15 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js +129 -0
- package/dist/components/pro/Sprite/shared/speechBubble.js.map +1 -0
- package/dist/components/pro/Sprite/types.d.ts +40 -0
- package/dist/contexts/AppContext.js.map +1 -1
- package/dist/contexts/authentication.js.map +1 -1
- package/dist/data-table.js +3 -3
- package/dist/data-table.js.map +1 -1
- package/dist/dishui.css +1 -1
- package/dist/hooks/useClickOutside.js.map +1 -1
- package/dist/hooks/useContainerElement.js.map +1 -1
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useCopyToClipboard.js.map +1 -1
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useDraggable.js.map +1 -1
- package/dist/hooks/useTableColumns.js.map +1 -1
- package/dist/hooks/useTableData.js.map +1 -1
- package/dist/index-nostyled.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +116 -115
- package/dist/layouts/MainLayout.js.map +1 -1
- package/dist/layouts/Navbar.js.map +1 -1
- package/dist/layouts/Sidebar.js.map +1 -1
- package/dist/layouts/headbar/Headbar.js.map +1 -1
- package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
- package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
- package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
- package/dist/sprite.js +2 -0
- package/dist/styles/themeStyles.js.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/flexLayout.js.map +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/menu.js.map +1 -1
- package/dist/utils/rehype-code-meta.js.map +1 -1
- package/dist/utils/remark-code-meta.js.map +1 -1
- package/dist/utils/routerBuilder.js.map +1 -1
- package/dist/utils/safeStorage.js.map +1 -1
- package/dist/utils/selection.js +29 -20
- package/dist/utils/selection.js.map +1 -1
- package/dist/utils/themes.js.map +1 -1
- package/package.json +15 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FootnotePanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/FootnotePanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { FootnoteInfo } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface FootnotePanelProps {\n footnotes: FootnoteInfo[];\n onFootnoteClick: (line: number) => void;\n onJumpToDefinition?: (id: string, line: number) => void;\n onJumpToReference?: (id: string, line: number) => void;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst FootnotePanel: React.FC<FootnotePanelProps> = ({\n footnotes,\n onFootnoteClick,\n onJumpToDefinition,\n onJumpToReference,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n\n // 过滤脚注\n const filteredFootnotes = footnotes.filter((footnote) =>\n footnote.id.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 分类脚注\n const defined = filteredFootnotes.filter((f) => f.definitionLine);\n const undefinedFootnotes = filteredFootnotes.filter((f) => !f.definitionLine);\n\n return (\n <div className={`footnote-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"footnote-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"\n />\n </svg>\n <span className=\"font-semibold\">脚注</span>\n <span className=\"text-xs opacity-60 ml-auto\">({footnotes.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索脚注...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 脚注列表 */}\n <div className=\"footnote-content max-h-96 overflow-y-auto\">\n {filteredFootnotes.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的脚注' : '暂无脚注'}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {/* 已定义的脚注 */}\n {defined.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2\">已定义</div>\n {defined.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-base-200 rounded p-2 mb-1 hover:bg-base-300 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-primary\">\n [^{footnote.id}]\n </span>\n <div className=\"flex gap-1\">\n {footnote.definitionLine && (\n <button\n className=\"btn btn-xs btn-ghost tooltip tooltip-left\"\n data-tip=\"跳转到定义\"\n onClick={() => {\n onFootnoteClick(footnote.definitionLine!);\n if (onJumpToDefinition) {\n onJumpToDefinition(footnote.id, footnote.definitionLine!);\n }\n }}\n title=\"跳转到定义\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n <div className=\"text-xs opacity-70 mb-2\">\n {footnote.definitionLine && `定义: 第 ${footnote.definitionLine} 行`}\n {footnote.referenceLines && footnote.referenceLines.length > 0 && (\n <div className=\"mt-1\">\n 引用 ({footnote.referenceLines.length}): \n {footnote.referenceLines.map((refLine, idx) => (\n <button\n key={idx}\n className=\"btn btn-xs btn-ghost ml-1 text-info\"\n onClick={() => {\n onFootnoteClick(refLine);\n if (onJumpToReference) {\n onJumpToReference(footnote.id, refLine);\n }\n }}\n title={`跳转到第 ${refLine} 行`}\n >\n L{refLine}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 未定义的脚注 */}\n {undefinedFootnotes.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2 text-warning\">\n 未定义\n </div>\n {undefinedFootnotes.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-warning/10 border border-warning/30 rounded p-2 mb-1 hover:bg-warning/20 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-warning\">\n [^{footnote.id}]\n </span>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => onFootnoteClick(footnote.line)}\n title=\"跳转到引用\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\n />\n </svg>\n </button>\n </div>\n <div className=\"text-xs opacity-70\">\n 引用: 第 {footnote.line} 行 | ⚠️ 缺少定义\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FootnotePanel;\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FootnotePanel.js","names":["FootnotePanel","filter","setFilter","useState","filteredFootnotes","footnotes","footnote","defined","f","undefinedFootnotes","className","onFootnoteClick","onJumpToDefinition","refLine","onJumpToReference","idx"],"sources":["../../../../../src/components/pro/CodeEditor/panels/FootnotePanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { FootnoteInfo } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface FootnotePanelProps {\n footnotes: FootnoteInfo[];\n onFootnoteClick: (line: number) => void;\n onJumpToDefinition?: (id: string, line: number) => void;\n onJumpToReference?: (id: string, line: number) => void;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst FootnotePanel: React.FC<FootnotePanelProps> = ({\n footnotes,\n onFootnoteClick,\n onJumpToDefinition,\n onJumpToReference,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n\n // 过滤脚注\n const filteredFootnotes = footnotes.filter((footnote) =>\n footnote.id.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 分类脚注\n const defined = filteredFootnotes.filter((f) => f.definitionLine);\n const undefinedFootnotes = filteredFootnotes.filter((f) => !f.definitionLine);\n\n return (\n <div className={`footnote-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"footnote-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\"\n />\n </svg>\n <span className=\"font-semibold\">脚注</span>\n <span className=\"text-xs opacity-60 ml-auto\">({footnotes.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索脚注...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 脚注列表 */}\n <div className=\"footnote-content max-h-96 overflow-y-auto\">\n {filteredFootnotes.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的脚注' : '暂无脚注'}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {/* 已定义的脚注 */}\n {defined.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2\">已定义</div>\n {defined.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-base-200 rounded p-2 mb-1 hover:bg-base-300 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-primary\">\n [^{footnote.id}]\n </span>\n <div className=\"flex gap-1\">\n {footnote.definitionLine && (\n <button\n className=\"btn btn-xs btn-ghost tooltip tooltip-left\"\n data-tip=\"跳转到定义\"\n onClick={() => {\n onFootnoteClick(footnote.definitionLine!);\n if (onJumpToDefinition) {\n onJumpToDefinition(footnote.id, footnote.definitionLine!);\n }\n }}\n title=\"跳转到定义\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n <div className=\"text-xs opacity-70 mb-2\">\n {footnote.definitionLine && `定义: 第 ${footnote.definitionLine} 行`}\n {footnote.referenceLines && footnote.referenceLines.length > 0 && (\n <div className=\"mt-1\">\n 引用 ({footnote.referenceLines.length}): \n {footnote.referenceLines.map((refLine, idx) => (\n <button\n key={idx}\n className=\"btn btn-xs btn-ghost ml-1 text-info\"\n onClick={() => {\n onFootnoteClick(refLine);\n if (onJumpToReference) {\n onJumpToReference(footnote.id, refLine);\n }\n }}\n title={`跳转到第 ${refLine} 行`}\n >\n L{refLine}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 未定义的脚注 */}\n {undefinedFootnotes.length > 0 && (\n <div>\n <div className=\"text-xs font-semibold opacity-70 mb-1 px-2 text-warning\">\n 未定义\n </div>\n {undefinedFootnotes.map((footnote) => (\n <div\n key={footnote.id}\n className=\"footnote-item bg-warning/10 border border-warning/30 rounded p-2 mb-1 hover:bg-warning/20 cursor-pointer transition-colors\"\n >\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"font-mono text-sm font-semibold text-warning\">\n [^{footnote.id}]\n </span>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => onFootnoteClick(footnote.line)}\n title=\"跳转到引用\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 7l5 5m0 0l-5 5m5-5H6\"\n />\n </svg>\n </button>\n </div>\n <div className=\"text-xs opacity-70\">\n 引用: 第 {footnote.line} 行 | ⚠️ 缺少定义\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default FootnotePanel;\n\n"],"mappings":"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"}
|
|
@@ -1,66 +1,72 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { jsx as
|
|
1
|
+
import { useEffect as e, useState as t } from "react";
|
|
2
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
3
3
|
//#region src/components/pro/CodeEditor/panels/HistoryPanel.tsx
|
|
4
|
-
var
|
|
5
|
-
let [
|
|
6
|
-
|
|
4
|
+
var i = ({ history: i, currentIndex: a, onRestore: o, onClear: s, className: c = "", height: l, maxHeight: u = "600px" }) => {
|
|
5
|
+
let [d, f] = t(null), [p, m] = t(() => Date.now());
|
|
6
|
+
e(() => {
|
|
7
|
+
if (i.length === 0) return;
|
|
8
|
+
let e = setInterval(() => m(Date.now()), 1e3);
|
|
9
|
+
return () => clearInterval(e);
|
|
10
|
+
}, [i.length]);
|
|
11
|
+
let h = (e) => {
|
|
12
|
+
let t = p - e.getTime(), n = Math.floor(t / 1e3), r = Math.floor(n / 60), i = Math.floor(r / 60), a = Math.floor(i / 24);
|
|
7
13
|
return a > 0 ? `${a}d ago` : i > 0 ? `${i}h ago` : r > 0 ? `${r}m ago` : `${n}s ago`;
|
|
8
|
-
},
|
|
14
|
+
}, g = (e) => e.toLocaleTimeString("en-US", {
|
|
9
15
|
hour: "2-digit",
|
|
10
16
|
minute: "2-digit",
|
|
11
17
|
second: "2-digit"
|
|
12
|
-
}),
|
|
13
|
-
d
|
|
14
|
-
},
|
|
18
|
+
}), _ = (e) => {
|
|
19
|
+
f(d === e ? null : e);
|
|
20
|
+
}, v = (e, t = 50) => {
|
|
15
21
|
let n = e.split("\n")[0];
|
|
16
22
|
return n.length > t ? n.substring(0, t) + "..." : n;
|
|
17
23
|
};
|
|
18
|
-
return /* @__PURE__ */
|
|
19
|
-
className: `history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${
|
|
24
|
+
return /* @__PURE__ */ r("div", {
|
|
25
|
+
className: `history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${c}`,
|
|
20
26
|
children: [
|
|
21
|
-
/* @__PURE__ */
|
|
27
|
+
/* @__PURE__ */ r("div", {
|
|
22
28
|
className: "history-header mb-2",
|
|
23
|
-
children: [/* @__PURE__ */
|
|
29
|
+
children: [/* @__PURE__ */ r("div", {
|
|
24
30
|
className: "flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300",
|
|
25
31
|
children: [
|
|
26
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ n("svg", {
|
|
27
33
|
className: "w-5 h-5",
|
|
28
34
|
fill: "none",
|
|
29
35
|
viewBox: "0 0 24 24",
|
|
30
36
|
stroke: "currentColor",
|
|
31
|
-
children: /* @__PURE__ */
|
|
37
|
+
children: /* @__PURE__ */ n("path", {
|
|
32
38
|
strokeLinecap: "round",
|
|
33
39
|
strokeLinejoin: "round",
|
|
34
40
|
strokeWidth: 2,
|
|
35
41
|
d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"
|
|
36
42
|
})
|
|
37
43
|
}),
|
|
38
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ n("span", {
|
|
39
45
|
className: "font-semibold",
|
|
40
46
|
children: "History"
|
|
41
47
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
48
|
+
/* @__PURE__ */ r("span", {
|
|
43
49
|
className: "text-xs opacity-60 ml-auto",
|
|
44
50
|
children: [
|
|
45
51
|
"(",
|
|
46
|
-
|
|
52
|
+
i.length,
|
|
47
53
|
")"
|
|
48
54
|
]
|
|
49
55
|
})
|
|
50
56
|
]
|
|
51
|
-
}), /* @__PURE__ */
|
|
57
|
+
}), /* @__PURE__ */ n("div", {
|
|
52
58
|
className: "flex gap-2 mb-2",
|
|
53
|
-
children: /* @__PURE__ */
|
|
59
|
+
children: /* @__PURE__ */ r("button", {
|
|
54
60
|
className: "btn btn-xs btn-ghost flex-1",
|
|
55
|
-
onClick:
|
|
56
|
-
disabled:
|
|
61
|
+
onClick: s,
|
|
62
|
+
disabled: i.length === 0,
|
|
57
63
|
title: "Clear history",
|
|
58
|
-
children: [/* @__PURE__ */
|
|
64
|
+
children: [/* @__PURE__ */ n("svg", {
|
|
59
65
|
className: "w-4 h-4",
|
|
60
66
|
fill: "none",
|
|
61
67
|
viewBox: "0 0 24 24",
|
|
62
68
|
stroke: "currentColor",
|
|
63
|
-
children: /* @__PURE__ */
|
|
69
|
+
children: /* @__PURE__ */ n("path", {
|
|
64
70
|
strokeLinecap: "round",
|
|
65
71
|
strokeLinejoin: "round",
|
|
66
72
|
strokeWidth: 2,
|
|
@@ -70,70 +76,70 @@ var r = ({ history: r, currentIndex: i, onRestore: a, onClear: o, className: s =
|
|
|
70
76
|
})
|
|
71
77
|
})]
|
|
72
78
|
}),
|
|
73
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ n("div", {
|
|
74
80
|
className: "history-content overflow-y-auto",
|
|
75
81
|
style: {
|
|
76
|
-
height:
|
|
77
|
-
maxHeight:
|
|
82
|
+
height: l,
|
|
83
|
+
maxHeight: l ? void 0 : u
|
|
78
84
|
},
|
|
79
|
-
children:
|
|
85
|
+
children: i.length === 0 ? /* @__PURE__ */ n("div", {
|
|
80
86
|
className: "text-center text-sm opacity-60 py-4",
|
|
81
87
|
children: "No history yet"
|
|
82
|
-
}) : /* @__PURE__ */
|
|
88
|
+
}) : /* @__PURE__ */ n("div", {
|
|
83
89
|
className: "space-y-1",
|
|
84
|
-
children: [...
|
|
85
|
-
let s =
|
|
86
|
-
return /* @__PURE__ */
|
|
90
|
+
children: [...i].reverse().map((e, t) => {
|
|
91
|
+
let s = i.length - 1 - t, c = d === e.id, l = s === a, u = e.content.split("\n").length, f = s + 1;
|
|
92
|
+
return /* @__PURE__ */ r("div", {
|
|
87
93
|
className: `history-item border rounded p-2 cursor-pointer transition-colors ${l ? "border-primary bg-primary/10" : "border-base-300 hover:bg-base-200"}`,
|
|
88
|
-
children: [/* @__PURE__ */
|
|
94
|
+
children: [/* @__PURE__ */ r("div", {
|
|
89
95
|
className: "flex items-start gap-2",
|
|
90
|
-
onClick: () =>
|
|
91
|
-
children: [/* @__PURE__ */
|
|
96
|
+
onClick: () => _(e.id),
|
|
97
|
+
children: [/* @__PURE__ */ r("div", {
|
|
92
98
|
className: "flex-1 min-w-0",
|
|
93
99
|
children: [
|
|
94
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ r("div", {
|
|
95
101
|
className: "flex items-center gap-2 mb-1",
|
|
96
102
|
children: [
|
|
97
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ r("span", {
|
|
98
104
|
className: "font-mono text-xs font-bold",
|
|
99
|
-
children: ["#",
|
|
105
|
+
children: ["#", f]
|
|
100
106
|
}),
|
|
101
|
-
l && /* @__PURE__ */
|
|
107
|
+
l && /* @__PURE__ */ n("span", {
|
|
102
108
|
className: "badge badge-primary badge-xs",
|
|
103
109
|
children: "Current"
|
|
104
110
|
}),
|
|
105
|
-
/* @__PURE__ */
|
|
111
|
+
/* @__PURE__ */ n("span", {
|
|
106
112
|
className: "text-xs opacity-60 ml-auto",
|
|
107
|
-
children:
|
|
113
|
+
children: h(e.timestamp)
|
|
108
114
|
})
|
|
109
115
|
]
|
|
110
116
|
}),
|
|
111
|
-
e.description && /* @__PURE__ */
|
|
117
|
+
e.description && /* @__PURE__ */ n("div", {
|
|
112
118
|
className: "text-sm mb-1",
|
|
113
119
|
children: e.description
|
|
114
120
|
}),
|
|
115
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ n("div", {
|
|
116
122
|
className: "text-xs font-mono opacity-70 truncate",
|
|
117
|
-
children:
|
|
123
|
+
children: v(e.content)
|
|
118
124
|
}),
|
|
119
|
-
/* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ r("div", {
|
|
120
126
|
className: "text-xs opacity-50 mt-1",
|
|
121
127
|
children: [
|
|
122
|
-
|
|
128
|
+
g(e.timestamp),
|
|
123
129
|
" • ",
|
|
124
|
-
|
|
130
|
+
u,
|
|
125
131
|
" lines"
|
|
126
132
|
]
|
|
127
133
|
})
|
|
128
134
|
]
|
|
129
|
-
}), /* @__PURE__ */
|
|
135
|
+
}), /* @__PURE__ */ n("button", {
|
|
130
136
|
className: `btn btn-xs btn-ghost transition-transform ${c ? "rotate-180" : ""}`,
|
|
131
|
-
children: /* @__PURE__ */
|
|
137
|
+
children: /* @__PURE__ */ n("svg", {
|
|
132
138
|
className: "w-4 h-4",
|
|
133
139
|
fill: "none",
|
|
134
140
|
viewBox: "0 0 24 24",
|
|
135
141
|
stroke: "currentColor",
|
|
136
|
-
children: /* @__PURE__ */
|
|
142
|
+
children: /* @__PURE__ */ n("path", {
|
|
137
143
|
strokeLinecap: "round",
|
|
138
144
|
strokeLinejoin: "round",
|
|
139
145
|
strokeWidth: 2,
|
|
@@ -141,26 +147,26 @@ var r = ({ history: r, currentIndex: i, onRestore: a, onClear: o, className: s =
|
|
|
141
147
|
})
|
|
142
148
|
})
|
|
143
149
|
})]
|
|
144
|
-
}), c && /* @__PURE__ */
|
|
150
|
+
}), c && /* @__PURE__ */ r("div", {
|
|
145
151
|
className: "mt-2 pt-2 border-t border-base-300",
|
|
146
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ n("div", {
|
|
147
153
|
className: "bg-base-200 rounded p-2 mb-2 max-h-32 overflow-y-auto",
|
|
148
|
-
children: /* @__PURE__ */
|
|
154
|
+
children: /* @__PURE__ */ n("pre", {
|
|
149
155
|
className: "text-xs font-mono whitespace-pre-wrap break-words",
|
|
150
156
|
children: e.content
|
|
151
157
|
})
|
|
152
|
-
}), /* @__PURE__ */
|
|
158
|
+
}), /* @__PURE__ */ r("button", {
|
|
153
159
|
className: "btn btn-xs btn-primary w-full",
|
|
154
160
|
onClick: (e) => {
|
|
155
|
-
e.stopPropagation(),
|
|
161
|
+
e.stopPropagation(), o(s);
|
|
156
162
|
},
|
|
157
163
|
disabled: l,
|
|
158
|
-
children: [/* @__PURE__ */
|
|
164
|
+
children: [/* @__PURE__ */ n("svg", {
|
|
159
165
|
className: "w-4 h-4 mr-1",
|
|
160
166
|
fill: "none",
|
|
161
167
|
viewBox: "0 0 24 24",
|
|
162
168
|
stroke: "currentColor",
|
|
163
|
-
children: /* @__PURE__ */
|
|
169
|
+
children: /* @__PURE__ */ n("path", {
|
|
164
170
|
strokeLinecap: "round",
|
|
165
171
|
strokeLinejoin: "round",
|
|
166
172
|
strokeWidth: 2,
|
|
@@ -173,11 +179,11 @@ var r = ({ history: r, currentIndex: i, onRestore: a, onClear: o, className: s =
|
|
|
173
179
|
})
|
|
174
180
|
})
|
|
175
181
|
}),
|
|
176
|
-
/* @__PURE__ */
|
|
182
|
+
/* @__PURE__ */ n("style", { children: "\n .history-panel .history-item {\n transition: all 0.2s ease;\n }\n\n .history-panel .history-item:hover {\n transform: translateX(2px);\n }\n " })
|
|
177
183
|
]
|
|
178
184
|
});
|
|
179
185
|
};
|
|
180
186
|
//#endregion
|
|
181
|
-
export {
|
|
187
|
+
export { i as default };
|
|
182
188
|
|
|
183
189
|
//# sourceMappingURL=HistoryPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HistoryPanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/HistoryPanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\n\nexport interface HistoryEntry {\n id: string;\n timestamp: Date;\n content: string;\n description?: string;\n}\n\nexport interface HistoryPanelProps {\n history: HistoryEntry[];\n currentIndex: number;\n onRestore: (index: number) => void;\n onClear?: () => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\nconst HistoryPanel: React.FC<HistoryPanelProps> = ({\n history,\n currentIndex,\n onRestore,\n onClear,\n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [expandedEntry, setExpandedEntry] = useState<string | null>(null);\n\n const formatTimestamp = (date: Date) => {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ago`;\n } else if (hours > 0) {\n return `${hours}h ago`;\n } else if (minutes > 0) {\n return `${minutes}m ago`;\n } else {\n return `${seconds}s ago`;\n }\n };\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n const toggleExpand = (id: string) => {\n setExpandedEntry(expandedEntry === id ? null : id);\n };\n\n const getContentPreview = (content: string, maxLength: number = 50) => {\n const firstLine = content.split('\\n')[0];\n if (firstLine.length > maxLength) {\n return firstLine.substring(0, maxLength) + '...';\n }\n return firstLine;\n };\n\n return (\n <div className={`history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"history-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span className=\"font-semibold\">History</span>\n <span className=\"text-xs opacity-60 ml-auto\">({history.length})</span>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost flex-1\"\n onClick={onClear}\n disabled={history.length === 0}\n title=\"Clear history\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n Clear\n </button>\n </div>\n </div>\n\n <div\n className=\"history-content overflow-y-auto\"\n style={{\n height: height,\n maxHeight: !height ? maxHeight : undefined\n }}\n >\n {history.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n No history yet\n </div>\n ) : (\n <div className=\"space-y-1\">\n {[...history].reverse().map((entry, reverseIndex) => {\n const index = history.length - 1 - reverseIndex;\n const isExpanded = expandedEntry === entry.id;\n const isCurrent = index === currentIndex;\n const lineCount = entry.content.split('\\n').length;\n const versionNumber = index + 1;\n\n return (\n <div\n key={entry.id}\n className={`history-item border rounded p-2 cursor-pointer transition-colors ${isCurrent\n ? 'border-primary bg-primary/10'\n : 'border-base-300 hover:bg-base-200'\n }`}\n >\n <div\n className=\"flex items-start gap-2\"\n onClick={() => toggleExpand(entry.id)}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"font-mono text-xs font-bold\">\n #{versionNumber}\n </span>\n {isCurrent && (\n <span className=\"badge badge-primary badge-xs\">Current</span>\n )}\n <span className=\"text-xs opacity-60 ml-auto\">\n {formatTimestamp(entry.timestamp)}\n </span>\n </div>\n\n {entry.description && (\n <div className=\"text-sm mb-1\">{entry.description}</div>\n )}\n\n <div className=\"text-xs font-mono opacity-70 truncate\">\n {getContentPreview(entry.content)}\n </div>\n\n <div className=\"text-xs opacity-50 mt-1\">\n {formatTime(entry.timestamp)} • {lineCount} lines\n </div>\n </div>\n\n <button\n className={`btn btn-xs btn-ghost transition-transform ${isExpanded ? 'rotate-180' : ''\n }`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n </div>\n\n {isExpanded && (\n <div className=\"mt-2 pt-2 border-t border-base-300\">\n <div className=\"bg-base-200 rounded p-2 mb-2 max-h-32 overflow-y-auto\">\n <pre className=\"text-xs font-mono whitespace-pre-wrap break-words\">\n {entry.content}\n </pre>\n </div>\n\n <button\n className=\"btn btn-xs btn-primary w-full\"\n onClick={(e) => {\n e.stopPropagation();\n onRestore(index);\n }}\n disabled={isCurrent}\n >\n <svg\n className=\"w-4 h-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n Restore this version\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n <style>{`\n .history-panel .history-item {\n transition: all 0.2s ease;\n }\n\n .history-panel .history-item:hover {\n transform: translateX(2px);\n }\n `}</style>\n </div>\n );\n};\n\nexport default HistoryPanel;\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HistoryPanel.js","names":["HistoryPanel","expandedEntry","setExpandedEntry","useState","now","setNow","history","timer","formatTimestamp","diff","date","seconds","minutes","hours","days","formatTime","toggleExpand","id","getContentPreview","firstLine","content","maxLength","className","onClear","height","maxHeight","index","reverseIndex","isExpanded","entry","isCurrent","currentIndex","lineCount","versionNumber","onRestore"],"sources":["../../../../../src/components/pro/CodeEditor/panels/HistoryPanel.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\n\nexport interface HistoryEntry {\n id: string;\n timestamp: Date;\n content: string;\n description?: string;\n}\n\nexport interface HistoryPanelProps {\n history: HistoryEntry[];\n currentIndex: number;\n onRestore: (index: number) => void;\n onClear?: () => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\nconst HistoryPanel: React.FC<HistoryPanelProps> = ({\n history,\n currentIndex,\n onRestore,\n onClear,\n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [expandedEntry, setExpandedEntry] = useState<string | null>(null);\n const [now, setNow] = useState(() => Date.now());\n\n useEffect(() => {\n if (history.length === 0) return;\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, [history.length]);\n\n const formatTimestamp = (date: Date) => {\n const diff = now - date.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days}d ago`;\n } else if (hours > 0) {\n return `${hours}h ago`;\n } else if (minutes > 0) {\n return `${minutes}m ago`;\n } else {\n return `${seconds}s ago`;\n }\n };\n\n const formatTime = (date: Date) => {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n };\n\n const toggleExpand = (id: string) => {\n setExpandedEntry(expandedEntry === id ? null : id);\n };\n\n const getContentPreview = (content: string, maxLength: number = 50) => {\n const firstLine = content.split('\\n')[0];\n if (firstLine.length > maxLength) {\n return firstLine.substring(0, maxLength) + '...';\n }\n return firstLine;\n };\n\n return (\n <div className={`history-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"history-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <span className=\"font-semibold\">History</span>\n <span className=\"text-xs opacity-60 ml-auto\">({history.length})</span>\n </div>\n\n {/* Actions */}\n <div className=\"flex gap-2 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost flex-1\"\n onClick={onClear}\n disabled={history.length === 0}\n title=\"Clear history\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16\"\n />\n </svg>\n Clear\n </button>\n </div>\n </div>\n\n <div\n className=\"history-content overflow-y-auto\"\n style={{\n height: height,\n maxHeight: !height ? maxHeight : undefined\n }}\n >\n {history.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n No history yet\n </div>\n ) : (\n <div className=\"space-y-1\">\n {[...history].reverse().map((entry, reverseIndex) => {\n const index = history.length - 1 - reverseIndex;\n const isExpanded = expandedEntry === entry.id;\n const isCurrent = index === currentIndex;\n const lineCount = entry.content.split('\\n').length;\n const versionNumber = index + 1;\n\n return (\n <div\n key={entry.id}\n className={`history-item border rounded p-2 cursor-pointer transition-colors ${isCurrent\n ? 'border-primary bg-primary/10'\n : 'border-base-300 hover:bg-base-200'\n }`}\n >\n <div\n className=\"flex items-start gap-2\"\n onClick={() => toggleExpand(entry.id)}\n >\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"font-mono text-xs font-bold\">\n #{versionNumber}\n </span>\n {isCurrent && (\n <span className=\"badge badge-primary badge-xs\">Current</span>\n )}\n <span className=\"text-xs opacity-60 ml-auto\">\n {formatTimestamp(entry.timestamp)}\n </span>\n </div>\n\n {entry.description && (\n <div className=\"text-sm mb-1\">{entry.description}</div>\n )}\n\n <div className=\"text-xs font-mono opacity-70 truncate\">\n {getContentPreview(entry.content)}\n </div>\n\n <div className=\"text-xs opacity-50 mt-1\">\n {formatTime(entry.timestamp)} • {lineCount} lines\n </div>\n </div>\n\n <button\n className={`btn btn-xs btn-ghost transition-transform ${isExpanded ? 'rotate-180' : ''\n }`}\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M19 9l-7 7-7-7\"\n />\n </svg>\n </button>\n </div>\n\n {isExpanded && (\n <div className=\"mt-2 pt-2 border-t border-base-300\">\n <div className=\"bg-base-200 rounded p-2 mb-2 max-h-32 overflow-y-auto\">\n <pre className=\"text-xs font-mono whitespace-pre-wrap break-words\">\n {entry.content}\n </pre>\n </div>\n\n <button\n className=\"btn btn-xs btn-primary w-full\"\n onClick={(e) => {\n e.stopPropagation();\n onRestore(index);\n }}\n disabled={isCurrent}\n >\n <svg\n className=\"w-4 h-4 mr-1\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n Restore this version\n </button>\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n <style>{`\n .history-panel .history-item {\n transition: all 0.2s ease;\n }\n\n .history-panel .history-item:hover {\n transform: translateX(2px);\n }\n `}</style>\n </div>\n );\n};\n\nexport default HistoryPanel;\n\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutlinePanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/OutlinePanel.tsx"],"sourcesContent":["import React from 'react';\nimport { OutlineItem } from '../types';\n\nexport interface OutlinePanelProps {\n outline: OutlineItem[];\n onItemClick: (line: number) => void;\n className?: string;\n}\n\nconst OutlinePanel: React.FC<OutlinePanelProps> = ({ outline, onItemClick, className = '' }) => {\n const getIcon = (type: OutlineItem['type']) => {\n switch (type) {\n case 'function':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n );\n case 'class':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\" />\n </svg>\n );\n case 'method':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n case 'variable':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n );\n case 'interface':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM14 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1h-4a1 1 0 01-1-1V5z\" />\n </svg>\n );\n case 'type':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n const renderOutlineItem = (item: OutlineItem, depth: number = 0) => {\n return (\n <div key={`${item.name}-${item.line}`}>\n <div\n className=\"outline-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded\"\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n onClick={() => onItemClick(item.line)}\n >\n <span className=\"text-primary\">{getIcon(item.type)}</span>\n <span className=\"text-sm truncate flex-1\">{item.name}</span>\n <span className=\"text-xs opacity-60\">{item.line}</span>\n </div>\n {item.children && item.children.length > 0 && (\n <div className=\"outline-children\">\n {item.children.map((child) => renderOutlineItem(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`outline-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"outline-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h7\" />\n </svg>\n <span className=\"font-semibold\">大纲</span>\n </div>\n <div className=\"outline-content max-h-96 overflow-y-auto\">\n {outline.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">暂无大纲</div>\n ) : (\n outline.map((item) => renderOutlineItem(item))\n )}\n </div>\n </div>\n );\n};\n\nexport default OutlinePanel;\n\n"],"mappings":";;;AASA,
|
|
1
|
+
{"version":3,"file":"OutlinePanel.js","names":["OutlinePanel","getIcon","type","renderOutlineItem","depth","onItemClick","item","child","className","outline"],"sources":["../../../../../src/components/pro/CodeEditor/panels/OutlinePanel.tsx"],"sourcesContent":["import React from 'react';\nimport { OutlineItem } from '../types';\n\nexport interface OutlinePanelProps {\n outline: OutlineItem[];\n onItemClick: (line: number) => void;\n className?: string;\n}\n\nconst OutlinePanel: React.FC<OutlinePanelProps> = ({ outline, onItemClick, className = '' }) => {\n const getIcon = (type: OutlineItem['type']) => {\n switch (type) {\n case 'function':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n );\n case 'class':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10\" />\n </svg>\n );\n case 'method':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n );\n case 'variable':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n );\n case 'interface':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM14 5a1 1 0 011-1h4a1 1 0 011 1v7a1 1 0 01-1 1h-4a1 1 0 01-1-1V5z\" />\n </svg>\n );\n case 'type':\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n );\n default:\n return null;\n }\n };\n\n const renderOutlineItem = (item: OutlineItem, depth: number = 0) => {\n return (\n <div key={`${item.name}-${item.line}`}>\n <div\n className=\"outline-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded\"\n style={{ paddingLeft: `${depth * 16 + 8}px` }}\n onClick={() => onItemClick(item.line)}\n >\n <span className=\"text-primary\">{getIcon(item.type)}</span>\n <span className=\"text-sm truncate flex-1\">{item.name}</span>\n <span className=\"text-xs opacity-60\">{item.line}</span>\n </div>\n {item.children && item.children.length > 0 && (\n <div className=\"outline-children\">\n {item.children.map((child) => renderOutlineItem(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`outline-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"outline-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h7\" />\n </svg>\n <span className=\"font-semibold\">大纲</span>\n </div>\n <div className=\"outline-content max-h-96 overflow-y-auto\">\n {outline.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">暂无大纲</div>\n ) : (\n outline.map((item) => renderOutlineItem(item))\n )}\n </div>\n </div>\n );\n};\n\nexport default OutlinePanel;\n\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableOfContentsPanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/TableOfContentsPanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { MarkdownSection } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface TableOfContentsPanelProps {\n sections: MarkdownSection[];\n onSectionClick: (line: number) => void;\n currentLine?: number;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst TableOfContentsPanel: React.FC<TableOfContentsPanelProps> = ({\n sections,\n onSectionClick,\n currentLine = 1,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set());\n\n // 过滤章节\n const filteredSections = sections.filter((section) =>\n section.title.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 构建层级结构\n const buildHierarchy = (sections: MarkdownSection[]) => {\n const root: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n const stack: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n\n for (const section of sections) {\n const node = { ...section, children: [] };\n\n // 找到合适的父节点\n while (stack.length > 0 && stack[stack.length - 1].level >= section.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(node);\n } else {\n const parent = stack[stack.length - 1];\n if (!parent.children) parent.children = [];\n parent.children.push(node);\n }\n\n stack.push(node);\n }\n\n return root;\n };\n\n const hierarchy = buildHierarchy(filteredSections);\n\n // 切换展开/折叠\n const toggleExpand = (id: string) => {\n const newExpanded = new Set(expandedSections);\n if (newExpanded.has(id)) {\n newExpanded.delete(id);\n } else {\n newExpanded.add(id);\n }\n setExpandedSections(newExpanded);\n };\n\n // 获取章节图标\n const getSectionIcon = (level: number) => {\n const icons = [\n // H1\n <svg key=\"h1\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H2\n <svg key=\"h2\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H3\n <svg key=\"h3\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H4\n <svg key=\"h4\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H5\n <svg key=\"h5\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H6\n <svg key=\"h6\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n ];\n return icons[level - 1] || icons[0];\n };\n\n // 渲染章节项\n const renderSection = (\n section: MarkdownSection & { children?: MarkdownSection[] },\n depth: number = 0\n ) => {\n const hasChildren = section.children && section.children.length > 0;\n const isExpanded = expandedSections.has(section.id);\n const isActive = currentLine >= section.line && \n (sections.find(s => s.line > section.line && s.level <= section.level)?.line || Infinity) > currentLine;\n\n const levelColors = [\n 'text-primary',\n 'text-secondary',\n 'text-accent',\n 'text-info',\n 'text-success',\n 'text-warning',\n ];\n const colorClass = levelColors[(section.level - 1) % levelColors.length];\n\n return (\n <div key={section.id}>\n <div\n className={`toc-item flex items-center gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors ${\n isActive ? 'bg-primary/20 font-semibold' : 'hover:bg-base-200'\n }`}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSectionClick(section.line)}\n >\n {hasChildren && (\n <button\n className=\"btn btn-xs btn-ghost btn-circle\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(section.id);\n }}\n >\n {isExpanded ? (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n )}\n {!hasChildren && <span className=\"w-6\"></span>}\n <span className={colorClass}>{getSectionIcon(section.level)}</span>\n <span className=\"text-sm truncate flex-1\" title={section.title}>\n {section.title}\n </span>\n <span className=\"text-xs opacity-60\">{section.line}</span>\n </div>\n\n {hasChildren && (isExpanded || !hasChildren) && (\n <div className=\"toc-children\">\n {section.children!.map((child) => renderSection(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`toc-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"toc-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n <span className=\"font-semibold\">目录</span>\n <span className=\"text-xs opacity-60 ml-auto\">({sections.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索章节...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 操作按钮 */}\n <div className=\"flex gap-1 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => {\n const allIds = new Set(sections.map((s) => s.id));\n setExpandedSections(allIds);\n }}\n >\n 全部展开\n </button>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => setExpandedSections(new Set())}\n >\n 全部折叠\n </button>\n </div>\n\n {/* 章节列表 */}\n <div className=\"toc-content max-h-[600px] overflow-y-auto\">\n {filteredSections.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的章节' : '暂无章节'}\n </div>\n ) : (\n hierarchy.map((section) => renderSection(section))\n )}\n </div>\n\n <style>{`\n .toc-item {\n user-select: none;\n }\n .toc-children {\n margin-top: 2px;\n }\n .toc-panel {\n position: relative;\n z-index: 1;\n }\n .toc-item button {\n z-index: 2;\n }\n `}</style>\n </div>\n );\n};\n\nexport default TableOfContentsPanel;\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TableOfContentsPanel.js","names":["TableOfContentsPanel","filter","setFilter","useState","expandedSections","setExpandedSections","filteredSections","sections","section","hierarchy","root","stack","node","parent","toggleExpand","newExpanded","id","getSectionIcon","icons","level","renderSection","hasChildren","isExpanded","isActive","currentLine","s","levelColors","colorClass","depth","onSectionClick","e","child","className","allIds"],"sources":["../../../../../src/components/pro/CodeEditor/panels/TableOfContentsPanel.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { MarkdownSection } from '../editors/markdownExtensions';\nimport { EditorTheme } from '../types';\n\nexport interface TableOfContentsPanelProps {\n sections: MarkdownSection[];\n onSectionClick: (line: number) => void;\n currentLine?: number;\n className?: string;\n theme?: EditorTheme;\n}\n\nconst TableOfContentsPanel: React.FC<TableOfContentsPanelProps> = ({\n sections,\n onSectionClick,\n currentLine = 1,\n className = '',\n theme = 'light',\n}) => {\n const [filter, setFilter] = useState('');\n const [expandedSections, setExpandedSections] = useState<Set<string>>(new Set());\n\n // 过滤章节\n const filteredSections = sections.filter((section) =>\n section.title.toLowerCase().includes(filter.toLowerCase())\n );\n\n // 构建层级结构\n const buildHierarchy = (sections: MarkdownSection[]) => {\n const root: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n const stack: Array<MarkdownSection & { children?: MarkdownSection[] }> = [];\n\n for (const section of sections) {\n const node = { ...section, children: [] };\n\n // 找到合适的父节点\n while (stack.length > 0 && stack[stack.length - 1].level >= section.level) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n root.push(node);\n } else {\n const parent = stack[stack.length - 1];\n if (!parent.children) parent.children = [];\n parent.children.push(node);\n }\n\n stack.push(node);\n }\n\n return root;\n };\n\n const hierarchy = buildHierarchy(filteredSections);\n\n // 切换展开/折叠\n const toggleExpand = (id: string) => {\n const newExpanded = new Set(expandedSections);\n if (newExpanded.has(id)) {\n newExpanded.delete(id);\n } else {\n newExpanded.add(id);\n }\n setExpandedSections(newExpanded);\n };\n\n // 获取章节图标\n const getSectionIcon = (level: number) => {\n const icons = [\n // H1\n <svg key=\"h1\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H2\n <svg key=\"h2\" className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z\" />\n </svg>,\n // H3\n <svg key=\"h3\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H4\n <svg key=\"h4\" className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H5\n <svg key=\"h5\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n // H6\n <svg key=\"h6\" className=\"w-2 h-2\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>,\n ];\n return icons[level - 1] || icons[0];\n };\n\n // 渲染章节项\n const renderSection = (\n section: MarkdownSection & { children?: MarkdownSection[] },\n depth: number = 0\n ) => {\n const hasChildren = section.children && section.children.length > 0;\n const isExpanded = expandedSections.has(section.id);\n const isActive = currentLine >= section.line && \n (sections.find(s => s.line > section.line && s.level <= section.level)?.line || Infinity) > currentLine;\n\n const levelColors = [\n 'text-primary',\n 'text-secondary',\n 'text-accent',\n 'text-info',\n 'text-success',\n 'text-warning',\n ];\n const colorClass = levelColors[(section.level - 1) % levelColors.length];\n\n return (\n <div key={section.id}>\n <div\n className={`toc-item flex items-center gap-2 px-2 py-1.5 rounded cursor-pointer transition-colors ${\n isActive ? 'bg-primary/20 font-semibold' : 'hover:bg-base-200'\n }`}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSectionClick(section.line)}\n >\n {hasChildren && (\n <button\n className=\"btn btn-xs btn-ghost btn-circle\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpand(section.id);\n }}\n >\n {isExpanded ? (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n )}\n {!hasChildren && <span className=\"w-6\"></span>}\n <span className={colorClass}>{getSectionIcon(section.level)}</span>\n <span className=\"text-sm truncate flex-1\" title={section.title}>\n {section.title}\n </span>\n <span className=\"text-xs opacity-60\">{section.line}</span>\n </div>\n\n {hasChildren && (isExpanded || !hasChildren) && (\n <div className=\"toc-children\">\n {section.children!.map((child) => renderSection(child, depth + 1))}\n </div>\n )}\n </div>\n );\n };\n\n return (\n <div className={`toc-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n {/* 标题 */}\n <div className=\"toc-header flex items-center gap-2 px-2 py-1 mb-2 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 6h16M4 10h16M4 14h16M4 18h16\"\n />\n </svg>\n <span className=\"font-semibold\">目录</span>\n <span className=\"text-xs opacity-60 ml-auto\">({sections.length})</span>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"搜索章节...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 操作按钮 */}\n <div className=\"flex gap-1 mb-2\">\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => {\n const allIds = new Set(sections.map((s) => s.id));\n setExpandedSections(allIds);\n }}\n >\n 全部展开\n </button>\n <button\n className=\"btn btn-xs btn-ghost\"\n onClick={() => setExpandedSections(new Set())}\n >\n 全部折叠\n </button>\n </div>\n\n {/* 章节列表 */}\n <div className=\"toc-content max-h-[600px] overflow-y-auto\">\n {filteredSections.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? '未找到匹配的章节' : '暂无章节'}\n </div>\n ) : (\n hierarchy.map((section) => renderSection(section))\n )}\n </div>\n\n <style>{`\n .toc-item {\n user-select: none;\n }\n .toc-children {\n margin-top: 2px;\n }\n .toc-panel {\n position: relative;\n z-index: 1;\n }\n .toc-item button {\n z-index: 2;\n }\n `}</style>\n </div>\n );\n};\n\nexport default TableOfContentsPanel;\n\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariablePanel.js","names":[],"sources":["../../../../../src/components/pro/CodeEditor/panels/VariablePanel.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { VariableInfo } from '../types';\n\nexport interface VariablePanelProps {\n variables: VariableInfo[];\n onVariableClick: (line: number) => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\ntype VariableType = 'all' | 'class' | 'function' | 'variable' | 'constant' | 'interface' | 'type' | 'method';\n\nconst VariablePanel: React.FC<VariablePanelProps> = ({ \n variables, \n onVariableClick, \n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [filter, setFilter] = useState('');\n const [sortBy, setSortBy] = useState<'name' | 'line' | 'type'>('line');\n const [selectedType, setSelectedType] = useState<VariableType>('all');\n\n // 统计各类型数量\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {\n all: variables.length,\n class: 0,\n function: 0,\n variable: 0,\n constant: 0,\n interface: 0,\n type: 0,\n method: 0,\n };\n \n variables.forEach((v) => {\n if (v.type && counts[v.type] !== undefined) {\n counts[v.type]++;\n }\n });\n \n return counts;\n }, [variables]);\n\n const filteredVariables = useMemo(() => {\n return variables\n .filter((v) => {\n // 类型过滤\n if (selectedType !== 'all' && v.type !== selectedType) {\n return false;\n }\n // 名称过滤\n return v.name.toLowerCase().includes(filter.toLowerCase());\n })\n .sort((a, b) => {\n switch (sortBy) {\n case 'name':\n return a.name.localeCompare(b.name);\n case 'line':\n return a.line - b.line;\n case 'type':\n return (a.type || '').localeCompare(b.type || '');\n default:\n return 0;\n }\n });\n }, [variables, filter, sortBy, selectedType]);\n\n const getTypeColor = (type?: string) => {\n switch (type) {\n case 'function':\n case 'method':\n return 'text-primary';\n case 'class':\n return 'text-secondary';\n case 'variable':\n return 'text-accent';\n case 'constant':\n return 'text-warning';\n case 'interface':\n case 'type':\n return 'text-info';\n default:\n return 'text-base-content';\n }\n };\n\n const getTypeIcon = (type?: string) => {\n switch (type) {\n case 'function':\n return 'ƒ';\n case 'method':\n return 'ⓜ';\n case 'class':\n return 'C';\n case 'variable':\n return 'v';\n case 'constant':\n return 'K';\n case 'interface':\n return 'I';\n case 'type':\n return 'T';\n default:\n return '?';\n }\n };\n\n const typeButtons: Array<{ type: VariableType; label: string }> = [\n { type: 'all', label: 'All' },\n { type: 'class', label: 'Classes' },\n { type: 'function', label: 'Functions' },\n { type: 'variable', label: 'Variables' },\n { type: 'constant', label: 'Constants' },\n { type: 'interface', label: 'Interfaces' },\n { type: 'type', label: 'Types' },\n { type: 'method', label: 'Methods' },\n ];\n\n return (\n <div className={`variable-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"variable-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n <span className=\"font-semibold\">Symbols</span>\n <span className=\"text-xs opacity-60 ml-auto\">({filteredVariables.length})</span>\n </div>\n\n {/* 类型过滤按钮 - 单行横向滚动 */}\n <div className=\"mb-2 overflow-x-auto\">\n <div className=\"flex gap-1 min-w-max pb-1\">\n {typeButtons.map(({ type, label }) => {\n const count = typeCounts[type];\n if (type !== 'all' && count === 0) return null;\n return (\n <button\n key={type}\n className={`btn btn-xs whitespace-nowrap flex-shrink-0 ${selectedType === type ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSelectedType(type)}\n >\n {label}\n {count > 0 && <span className=\"ml-1 text-xs opacity-70\">({count})</span>}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"Search symbols...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 排序选项 */}\n <div className=\"flex gap-1\">\n <button\n className={`btn btn-xs ${sortBy === 'line' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('line')}\n >\n Line\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'name' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('name')}\n >\n Name\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'type' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('type')}\n >\n Type\n </button>\n </div>\n </div>\n\n <div \n className=\"variable-content overflow-y-auto\"\n style={{ \n height: height, \n maxHeight: !height ? maxHeight : undefined \n }}\n >\n {filteredVariables.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? 'No matching symbols' : 'No symbols'}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {filteredVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${variable.line}-${index}`}\n className=\"variable-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded transition-colors\"\n onClick={() => onVariableClick(variable.line)}\n title={`${variable.type}: ${variable.name} (line ${variable.line})`}\n >\n <span className={`font-mono font-bold text-xs ${getTypeColor(variable.type)}`}>\n {getTypeIcon(variable.type)}\n </span>\n <span className=\"text-sm truncate flex-1 font-mono\">{variable.name}</span>\n <span className=\"text-xs opacity-60\">{variable.line}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <style>{`\n .variable-panel .overflow-x-auto {\n scrollbar-width: thin;\n scrollbar-color: oklch(var(--bc) / 0.2) transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar {\n height: 4px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb {\n background: oklch(var(--bc) / 0.2);\n border-radius: 2px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb:hover {\n background: oklch(var(--bc) / 0.3);\n }\n `}</style>\n </div>\n );\n};\n\nexport default VariablePanel;\n\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VariablePanel.js","names":["VariablePanel","filter","setFilter","useState","sortBy","setSortBy","selectedType","setSelectedType","typeCounts","useMemo","counts","variables","v","filteredVariables","a","b","getTypeColor","type","getTypeIcon","className","count","label","height","maxHeight","onVariableClick","variable","index"],"sources":["../../../../../src/components/pro/CodeEditor/panels/VariablePanel.tsx"],"sourcesContent":["import React, { useState, useMemo } from 'react';\nimport { VariableInfo } from '../types';\n\nexport interface VariablePanelProps {\n variables: VariableInfo[];\n onVariableClick: (line: number) => void;\n className?: string;\n height?: string;\n maxHeight?: string;\n}\n\ntype VariableType = 'all' | 'class' | 'function' | 'variable' | 'constant' | 'interface' | 'type' | 'method';\n\nconst VariablePanel: React.FC<VariablePanelProps> = ({ \n variables, \n onVariableClick, \n className = '',\n height,\n maxHeight = '600px',\n}) => {\n const [filter, setFilter] = useState('');\n const [sortBy, setSortBy] = useState<'name' | 'line' | 'type'>('line');\n const [selectedType, setSelectedType] = useState<VariableType>('all');\n\n // 统计各类型数量\n const typeCounts = useMemo(() => {\n const counts: Record<string, number> = {\n all: variables.length,\n class: 0,\n function: 0,\n variable: 0,\n constant: 0,\n interface: 0,\n type: 0,\n method: 0,\n };\n \n variables.forEach((v) => {\n if (v.type && counts[v.type] !== undefined) {\n counts[v.type]++;\n }\n });\n \n return counts;\n }, [variables]);\n\n const filteredVariables = useMemo(() => {\n return variables\n .filter((v) => {\n // 类型过滤\n if (selectedType !== 'all' && v.type !== selectedType) {\n return false;\n }\n // 名称过滤\n return v.name.toLowerCase().includes(filter.toLowerCase());\n })\n .sort((a, b) => {\n switch (sortBy) {\n case 'name':\n return a.name.localeCompare(b.name);\n case 'line':\n return a.line - b.line;\n case 'type':\n return (a.type || '').localeCompare(b.type || '');\n default:\n return 0;\n }\n });\n }, [variables, filter, sortBy, selectedType]);\n\n const getTypeColor = (type?: string) => {\n switch (type) {\n case 'function':\n case 'method':\n return 'text-primary';\n case 'class':\n return 'text-secondary';\n case 'variable':\n return 'text-accent';\n case 'constant':\n return 'text-warning';\n case 'interface':\n case 'type':\n return 'text-info';\n default:\n return 'text-base-content';\n }\n };\n\n const getTypeIcon = (type?: string) => {\n switch (type) {\n case 'function':\n return 'ƒ';\n case 'method':\n return 'ⓜ';\n case 'class':\n return 'C';\n case 'variable':\n return 'v';\n case 'constant':\n return 'K';\n case 'interface':\n return 'I';\n case 'type':\n return 'T';\n default:\n return '?';\n }\n };\n\n const typeButtons: Array<{ type: VariableType; label: string }> = [\n { type: 'all', label: 'All' },\n { type: 'class', label: 'Classes' },\n { type: 'function', label: 'Functions' },\n { type: 'variable', label: 'Variables' },\n { type: 'constant', label: 'Constants' },\n { type: 'interface', label: 'Interfaces' },\n { type: 'type', label: 'Types' },\n { type: 'method', label: 'Methods' },\n ];\n\n return (\n <div className={`variable-panel bg-base-100 border border-base-300 rounded-lg p-2 ${className}`}>\n <div className=\"variable-header mb-2\">\n <div className=\"flex items-center gap-2 px-2 py-1 mb-3 border-b border-base-300\">\n <svg className=\"w-5 h-5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\" />\n </svg>\n <span className=\"font-semibold\">Symbols</span>\n <span className=\"text-xs opacity-60 ml-auto\">({filteredVariables.length})</span>\n </div>\n\n {/* 类型过滤按钮 - 单行横向滚动 */}\n <div className=\"mb-2 overflow-x-auto\">\n <div className=\"flex gap-1 min-w-max pb-1\">\n {typeButtons.map(({ type, label }) => {\n const count = typeCounts[type];\n if (type !== 'all' && count === 0) return null;\n return (\n <button\n key={type}\n className={`btn btn-xs whitespace-nowrap flex-shrink-0 ${selectedType === type ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSelectedType(type)}\n >\n {label}\n {count > 0 && <span className=\"ml-1 text-xs opacity-70\">({count})</span>}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* 搜索框 */}\n <input\n type=\"text\"\n placeholder=\"Search symbols...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"input input-sm input-bordered w-full mb-2\"\n />\n\n {/* 排序选项 */}\n <div className=\"flex gap-1\">\n <button\n className={`btn btn-xs ${sortBy === 'line' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('line')}\n >\n Line\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'name' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('name')}\n >\n Name\n </button>\n <button\n className={`btn btn-xs ${sortBy === 'type' ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => setSortBy('type')}\n >\n Type\n </button>\n </div>\n </div>\n\n <div \n className=\"variable-content overflow-y-auto\"\n style={{ \n height: height, \n maxHeight: !height ? maxHeight : undefined \n }}\n >\n {filteredVariables.length === 0 ? (\n <div className=\"text-center text-sm opacity-60 py-4\">\n {filter ? 'No matching symbols' : 'No symbols'}\n </div>\n ) : (\n <div className=\"space-y-1\">\n {filteredVariables.map((variable, index) => (\n <div\n key={`${variable.name}-${variable.line}-${index}`}\n className=\"variable-item flex items-center gap-2 px-2 py-1 hover:bg-base-200 cursor-pointer rounded transition-colors\"\n onClick={() => onVariableClick(variable.line)}\n title={`${variable.type}: ${variable.name} (line ${variable.line})`}\n >\n <span className={`font-mono font-bold text-xs ${getTypeColor(variable.type)}`}>\n {getTypeIcon(variable.type)}\n </span>\n <span className=\"text-sm truncate flex-1 font-mono\">{variable.name}</span>\n <span className=\"text-xs opacity-60\">{variable.line}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <style>{`\n .variable-panel .overflow-x-auto {\n scrollbar-width: thin;\n scrollbar-color: oklch(var(--bc) / 0.2) transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar {\n height: 4px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-track {\n background: transparent;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb {\n background: oklch(var(--bc) / 0.2);\n border-radius: 2px;\n }\n\n .variable-panel .overflow-x-auto::-webkit-scrollbar-thumb:hover {\n background: oklch(var(--bc) / 0.3);\n }\n `}</style>\n </div>\n );\n};\n\nexport default VariablePanel;\n\n"],"mappings":"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"}
|