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":"FileExplorer.js","names":[],"sources":["../../../../src/components/pro/FileExplorer/FileExplorer.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { FileExplorerProps, FileEntry, ViewMode, SortConfig, SortField } from './types';\nimport { Breadcrumb } from './Breadcrumb';\nimport { Toolbar } from './Toolbar';\nimport { ListView } from './ListView';\nimport { GridView } from './GridView';\nimport { CreateDialog } from './CreateDialog';\nimport { FileUploader } from '../../FileUploader/FileUploader';\nimport type { UploadResult } from '../../FileUploader/types';\n\nconst defaultLabels = {\n loading: 'Loading...',\n emptyFolder: 'This folder is empty',\n items: 'items',\n uploadFiles: 'Upload',\n};\n\n// --- Sorting ---\n\nfunction compareEntries(a: FileEntry, b: FileEntry, field: SortField, direction: 'asc' | 'desc'): number {\n // Folders always first\n if (a.type !== b.type) {\n return a.type === 'folder' ? -1 : 1;\n }\n\n let cmp = 0;\n switch (field) {\n case 'name':\n cmp = a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });\n break;\n case 'size':\n cmp = (a.size || 0) - (b.size || 0);\n break;\n case 'modifiedAt': {\n const dateA = a.modifiedAt ? new Date(a.modifiedAt).getTime() : 0;\n const dateB = b.modifiedAt ? new Date(b.modifiedAt).getTime() : 0;\n cmp = dateA - dateB;\n break;\n }\n case 'type': {\n const extA = a.name.split('.').pop()?.toLowerCase() || '';\n const extB = b.name.split('.').pop()?.toLowerCase() || '';\n cmp = extA.localeCompare(extB);\n break;\n }\n }\n\n return direction === 'desc' ? -cmp : cmp;\n}\n\nexport const FileExplorer: React.FC<FileExplorerProps> = ({\n adapter,\n uploadAdapter,\n initialPath = '/',\n viewMode: initialViewMode = 'list',\n enableCreate = false,\n enableDelete = false,\n enableRename = false,\n enableUpload = false,\n uploadAccept,\n uploadMaxFileSize,\n className = '',\n labels: userLabels,\n onFileSelect,\n onPathChange,\n onUploadComplete,\n onUploadError,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n // State\n const [currentPath, setCurrentPath] = useState(initialPath);\n const [entries, setEntries] = useState<FileEntry[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>(initialViewMode);\n const [sortConfig, setSortConfig] = useState<SortConfig>({ field: 'name', direction: 'asc' });\n const [createType, setCreateType] = useState<'file' | 'folder' | null>(null);\n const [showUploader, setShowUploader] = useState(false);\n\n // Fetch entries when path changes\n const fetchEntries = useCallback(async (path: string) => {\n setIsLoading(true);\n try {\n const result = await adapter.list(path);\n setEntries(result);\n } catch (err) {\n console.error('Failed to list directory:', err);\n setEntries([]);\n } finally {\n setIsLoading(false);\n }\n }, [adapter]);\n\n useEffect(() => {\n fetchEntries(currentPath);\n }, [currentPath, fetchEntries]);\n\n // Navigate to a path\n const navigateTo = useCallback((path: string) => {\n setCurrentPath(path);\n setSearchQuery('');\n setCreateType(null);\n setShowUploader(false);\n onPathChange?.(path);\n }, [onPathChange]);\n\n // Filter + sort entries\n const processedEntries = useMemo(() => {\n let filtered = entries;\n\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n filtered = entries.filter(e => e.name.toLowerCase().includes(q));\n }\n\n return [...filtered].sort((a, b) => compareEntries(a, b, sortConfig.field, sortConfig.direction));\n }, [entries, searchQuery, sortConfig]);\n\n // Entry click: select file or navigate into folder\n const handleEntryClick = useCallback((entry: FileEntry) => {\n if (entry.type === 'folder') {\n navigateTo(entry.path);\n } else {\n onFileSelect?.(entry);\n }\n }, [navigateTo, onFileSelect]);\n\n const handleEntryDoubleClick = useCallback((entry: FileEntry) => {\n if (entry.type === 'folder') {\n navigateTo(entry.path);\n } else {\n onFileSelect?.(entry);\n }\n }, [navigateTo, onFileSelect]);\n\n // Delete\n const handleDelete = useCallback(async (entry: FileEntry) => {\n if (!adapter.delete) return;\n try {\n await adapter.delete(entry.path);\n setEntries(prev => prev.filter(e => e.path !== entry.path));\n } catch (err) {\n console.error('Failed to delete:', err);\n }\n }, [adapter]);\n\n // Rename\n const handleRename = useCallback(async (entry: FileEntry) => {\n if (!adapter.rename) return;\n const newName = window.prompt('New name:', entry.name);\n if (!newName || newName === entry.name) return;\n try {\n const updated = await adapter.rename(entry.path, newName);\n setEntries(prev => prev.map(e => e.path === entry.path ? updated : e));\n } catch (err) {\n console.error('Failed to rename:', err);\n }\n }, [adapter]);\n\n // Create folder / file\n const handleCreate = useCallback(async (name: string) => {\n if (!createType) return;\n\n try {\n let newEntry: FileEntry | undefined;\n if (createType === 'folder' && adapter.createFolder) {\n newEntry = await adapter.createFolder(currentPath, name);\n } else if (createType === 'file' && adapter.createFile) {\n newEntry = await adapter.createFile(currentPath, name);\n }\n if (newEntry) {\n setEntries(prev => [...prev, newEntry!]);\n }\n } catch (err) {\n console.error('Failed to create:', err);\n } finally {\n setCreateType(null);\n }\n }, [createType, currentPath, adapter]);\n\n // Upload complete: refresh listing and notify parent\n const handleUploadComplete = useCallback((results: UploadResult[]) => {\n // Refresh the current directory listing to show newly uploaded files\n fetchEntries(currentPath);\n onUploadComplete?.(results);\n }, [fetchEntries, currentPath, onUploadComplete]);\n\n const hasUpload = enableUpload && !!uploadAdapter;\n\n return (\n <div className={`flex flex-col bg-base-100 rounded-xl border border-base-300 overflow-hidden shadow-lg ${className}`}>\n {/* Breadcrumb */}\n <div className=\"border-b border-base-300 px-2\">\n <Breadcrumb\n path={currentPath}\n labels={labels}\n adapter={adapter}\n onNavigate={navigateTo}\n />\n </div>\n\n {/* Toolbar */}\n <Toolbar\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n viewMode={viewMode}\n onViewModeChange={setViewMode}\n sortConfig={sortConfig}\n onSortChange={setSortConfig}\n enableCreate={enableCreate}\n hasCreateFolder={!!adapter.createFolder}\n hasCreateFile={!!adapter.createFile}\n onCreateFolder={() => setCreateType('folder')}\n onCreateFile={() => setCreateType('file')}\n enableUpload={hasUpload}\n onUploadFiles={() => setShowUploader(prev => !prev)}\n labels={labels}\n />\n\n {/* Create dialog */}\n {createType && (\n <div className=\"px-3 py-2 border-b border-base-300\">\n <CreateDialog\n type={createType}\n labels={labels}\n onConfirm={handleCreate}\n onCancel={() => setCreateType(null)}\n />\n </div>\n )}\n\n {/* Upload panel */}\n {showUploader && uploadAdapter && (\n <div className=\"px-3 py-3 border-b border-base-300 bg-base-200/30\">\n <FileUploader\n adapter={uploadAdapter}\n accept={uploadAccept}\n maxFileSize={uploadMaxFileSize}\n multiple\n autoUpload\n labels={labels as any}\n onUploadComplete={handleUploadComplete}\n onError={onUploadError}\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto min-h-[300px]\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-16\">\n <span className=\"loading loading-spinner loading-md opacity-50\" />\n <span className=\"ml-2 text-sm opacity-50\">{labels.loading}</span>\n </div>\n ) : viewMode === 'list' ? (\n <ListView\n entries={processedEntries}\n sortConfig={sortConfig}\n onSortChange={setSortConfig}\n onEntryClick={handleEntryClick}\n onEntryDoubleClick={handleEntryDoubleClick}\n onDelete={enableDelete ? handleDelete : undefined}\n onRename={enableRename ? handleRename : undefined}\n enableDelete={enableDelete}\n enableRename={enableRename}\n labels={labels}\n />\n ) : (\n <GridView\n entries={processedEntries}\n onEntryClick={handleEntryClick}\n onEntryDoubleClick={handleEntryDoubleClick}\n onDelete={enableDelete ? handleDelete : undefined}\n onRename={enableRename ? handleRename : undefined}\n enableDelete={enableDelete}\n enableRename={enableRename}\n labels={labels}\n />\n )}\n </div>\n\n {/* Status bar */}\n <div className=\"border-t border-base-300 px-3 py-1.5 text-xs opacity-50 flex items-center justify-between\">\n <span>{processedEntries.length} {labels.items}</span>\n {searchQuery && (\n <span className=\"italic\">Filtered from {entries.length}</span>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileExplorer.js","names":["defaultLabels","compareEntries","a","b","cmp","field","extA","extB","direction","FileExplorer","initialViewMode","userLabels","labels","currentPath","setCurrentPath","useState","initialPath","entries","setEntries","isLoading","setIsLoading","searchQuery","setSearchQuery","viewMode","setViewMode","sortConfig","setSortConfig","createType","setCreateType","showUploader","setShowUploader","fetchEntries","useCallback","result","adapter","path","err","navigateTo","onPathChange","processedEntries","useMemo","filtered","q","handleEntryClick","entry","onFileSelect","handleEntryDoubleClick","handleDelete","prev","e","handleRename","newName","updated","handleCreate","newEntry","name","handleUploadComplete","onUploadComplete","results","hasUpload","enableUpload","uploadAdapter","className","Breadcrumb","Toolbar","CreateDialog","FileUploader","uploadAccept","uploadMaxFileSize","onUploadError","ListView","enableDelete","enableRename","GridView"],"sources":["../../../../src/components/pro/FileExplorer/FileExplorer.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { FileExplorerProps, FileEntry, ViewMode, SortConfig, SortField } from './types';\nimport { Breadcrumb } from './Breadcrumb';\nimport { Toolbar } from './Toolbar';\nimport { ListView } from './ListView';\nimport { GridView } from './GridView';\nimport { CreateDialog } from './CreateDialog';\nimport { FileUploader } from '../../FileUploader/FileUploader';\nimport type { UploadResult } from '../../FileUploader/types';\n\nconst defaultLabels = {\n loading: 'Loading...',\n emptyFolder: 'This folder is empty',\n items: 'items',\n uploadFiles: 'Upload',\n};\n\n// --- Sorting ---\n\nfunction compareEntries(a: FileEntry, b: FileEntry, field: SortField, direction: 'asc' | 'desc'): number {\n // Folders always first\n if (a.type !== b.type) {\n return a.type === 'folder' ? -1 : 1;\n }\n\n let cmp = 0;\n switch (field) {\n case 'name':\n cmp = a.name.localeCompare(b.name, undefined, { sensitivity: 'base' });\n break;\n case 'size':\n cmp = (a.size || 0) - (b.size || 0);\n break;\n case 'modifiedAt': {\n const dateA = a.modifiedAt ? new Date(a.modifiedAt).getTime() : 0;\n const dateB = b.modifiedAt ? new Date(b.modifiedAt).getTime() : 0;\n cmp = dateA - dateB;\n break;\n }\n case 'type': {\n const extA = a.name.split('.').pop()?.toLowerCase() || '';\n const extB = b.name.split('.').pop()?.toLowerCase() || '';\n cmp = extA.localeCompare(extB);\n break;\n }\n }\n\n return direction === 'desc' ? -cmp : cmp;\n}\n\nexport const FileExplorer: React.FC<FileExplorerProps> = ({\n adapter,\n uploadAdapter,\n initialPath = '/',\n viewMode: initialViewMode = 'list',\n enableCreate = false,\n enableDelete = false,\n enableRename = false,\n enableUpload = false,\n uploadAccept,\n uploadMaxFileSize,\n className = '',\n labels: userLabels,\n onFileSelect,\n onPathChange,\n onUploadComplete,\n onUploadError,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n // State\n const [currentPath, setCurrentPath] = useState(initialPath);\n const [entries, setEntries] = useState<FileEntry[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [viewMode, setViewMode] = useState<ViewMode>(initialViewMode);\n const [sortConfig, setSortConfig] = useState<SortConfig>({ field: 'name', direction: 'asc' });\n const [createType, setCreateType] = useState<'file' | 'folder' | null>(null);\n const [showUploader, setShowUploader] = useState(false);\n\n // Fetch entries when path changes\n const fetchEntries = useCallback(async (path: string) => {\n setIsLoading(true);\n try {\n const result = await adapter.list(path);\n setEntries(result);\n } catch (err) {\n console.error('Failed to list directory:', err);\n setEntries([]);\n } finally {\n setIsLoading(false);\n }\n }, [adapter]);\n\n useEffect(() => {\n fetchEntries(currentPath);\n }, [currentPath, fetchEntries]);\n\n // Navigate to a path\n const navigateTo = useCallback((path: string) => {\n setCurrentPath(path);\n setSearchQuery('');\n setCreateType(null);\n setShowUploader(false);\n onPathChange?.(path);\n }, [onPathChange]);\n\n // Filter + sort entries\n const processedEntries = useMemo(() => {\n let filtered = entries;\n\n if (searchQuery) {\n const q = searchQuery.toLowerCase();\n filtered = entries.filter(e => e.name.toLowerCase().includes(q));\n }\n\n return [...filtered].sort((a, b) => compareEntries(a, b, sortConfig.field, sortConfig.direction));\n }, [entries, searchQuery, sortConfig]);\n\n // Entry click: select file or navigate into folder\n const handleEntryClick = useCallback((entry: FileEntry) => {\n if (entry.type === 'folder') {\n navigateTo(entry.path);\n } else {\n onFileSelect?.(entry);\n }\n }, [navigateTo, onFileSelect]);\n\n const handleEntryDoubleClick = useCallback((entry: FileEntry) => {\n if (entry.type === 'folder') {\n navigateTo(entry.path);\n } else {\n onFileSelect?.(entry);\n }\n }, [navigateTo, onFileSelect]);\n\n // Delete\n const handleDelete = useCallback(async (entry: FileEntry) => {\n if (!adapter.delete) return;\n try {\n await adapter.delete(entry.path);\n setEntries(prev => prev.filter(e => e.path !== entry.path));\n } catch (err) {\n console.error('Failed to delete:', err);\n }\n }, [adapter]);\n\n // Rename\n const handleRename = useCallback(async (entry: FileEntry) => {\n if (!adapter.rename) return;\n const newName = window.prompt('New name:', entry.name);\n if (!newName || newName === entry.name) return;\n try {\n const updated = await adapter.rename(entry.path, newName);\n setEntries(prev => prev.map(e => e.path === entry.path ? updated : e));\n } catch (err) {\n console.error('Failed to rename:', err);\n }\n }, [adapter]);\n\n // Create folder / file\n const handleCreate = useCallback(async (name: string) => {\n if (!createType) return;\n\n try {\n let newEntry: FileEntry | undefined;\n if (createType === 'folder' && adapter.createFolder) {\n newEntry = await adapter.createFolder(currentPath, name);\n } else if (createType === 'file' && adapter.createFile) {\n newEntry = await adapter.createFile(currentPath, name);\n }\n if (newEntry) {\n setEntries(prev => [...prev, newEntry!]);\n }\n } catch (err) {\n console.error('Failed to create:', err);\n } finally {\n setCreateType(null);\n }\n }, [createType, currentPath, adapter]);\n\n // Upload complete: refresh listing and notify parent\n const handleUploadComplete = useCallback((results: UploadResult[]) => {\n // Refresh the current directory listing to show newly uploaded files\n fetchEntries(currentPath);\n onUploadComplete?.(results);\n }, [fetchEntries, currentPath, onUploadComplete]);\n\n const hasUpload = enableUpload && !!uploadAdapter;\n\n return (\n <div className={`flex flex-col bg-base-100 rounded-xl border border-base-300 overflow-hidden shadow-lg ${className}`}>\n {/* Breadcrumb */}\n <div className=\"border-b border-base-300 px-2\">\n <Breadcrumb\n path={currentPath}\n labels={labels}\n adapter={adapter}\n onNavigate={navigateTo}\n />\n </div>\n\n {/* Toolbar */}\n <Toolbar\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n viewMode={viewMode}\n onViewModeChange={setViewMode}\n sortConfig={sortConfig}\n onSortChange={setSortConfig}\n enableCreate={enableCreate}\n hasCreateFolder={!!adapter.createFolder}\n hasCreateFile={!!adapter.createFile}\n onCreateFolder={() => setCreateType('folder')}\n onCreateFile={() => setCreateType('file')}\n enableUpload={hasUpload}\n onUploadFiles={() => setShowUploader(prev => !prev)}\n labels={labels}\n />\n\n {/* Create dialog */}\n {createType && (\n <div className=\"px-3 py-2 border-b border-base-300\">\n <CreateDialog\n type={createType}\n labels={labels}\n onConfirm={handleCreate}\n onCancel={() => setCreateType(null)}\n />\n </div>\n )}\n\n {/* Upload panel */}\n {showUploader && uploadAdapter && (\n <div className=\"px-3 py-3 border-b border-base-300 bg-base-200/30\">\n <FileUploader\n adapter={uploadAdapter}\n accept={uploadAccept}\n maxFileSize={uploadMaxFileSize}\n multiple\n autoUpload\n labels={labels as any}\n onUploadComplete={handleUploadComplete}\n onError={onUploadError}\n />\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto min-h-[300px]\">\n {isLoading ? (\n <div className=\"flex items-center justify-center py-16\">\n <span className=\"loading loading-spinner loading-md opacity-50\" />\n <span className=\"ml-2 text-sm opacity-50\">{labels.loading}</span>\n </div>\n ) : viewMode === 'list' ? (\n <ListView\n entries={processedEntries}\n sortConfig={sortConfig}\n onSortChange={setSortConfig}\n onEntryClick={handleEntryClick}\n onEntryDoubleClick={handleEntryDoubleClick}\n onDelete={enableDelete ? handleDelete : undefined}\n onRename={enableRename ? handleRename : undefined}\n enableDelete={enableDelete}\n enableRename={enableRename}\n labels={labels}\n />\n ) : (\n <GridView\n entries={processedEntries}\n onEntryClick={handleEntryClick}\n onEntryDoubleClick={handleEntryDoubleClick}\n onDelete={enableDelete ? handleDelete : undefined}\n onRename={enableRename ? handleRename : undefined}\n enableDelete={enableDelete}\n enableRename={enableRename}\n labels={labels}\n />\n )}\n </div>\n\n {/* Status bar */}\n <div className=\"border-t border-base-300 px-3 py-1.5 text-xs opacity-50 flex items-center justify-between\">\n <span>{processedEntries.length} {labels.items}</span>\n {searchQuery && (\n <span className=\"italic\">Filtered from {entries.length}</span>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileIcon.js","names":[],"sources":["../../../../src/components/pro/FileExplorer/FileIcon.tsx"],"sourcesContent":["import React from 'react';\nimport { FileIconProps } from './types';\n\nconst sizeMap = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-8 w-8',\n};\n\n// --- Icon components ---\n\nconst FolderIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-warning`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\" />\n </svg>\n);\n\nconst ImageIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-success`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n);\n\nconst VideoIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-error`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n);\n\nconst AudioIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-secondary`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3\" />\n </svg>\n);\n\nconst CodeIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-info`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n);\n\nconst DocIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-primary`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" 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\nconst ArchiveIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-accent`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4\" />\n </svg>\n);\n\nconst GenericFileIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} opacity-60`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n);\n\n// --- MIME / extension to category mapping ---\n\nfunction getFileCategory(entry: { name: string; mimeType?: string }): string {\n const mime = entry.mimeType || '';\n const ext = entry.name.split('.').pop()?.toLowerCase() || '';\n\n if (mime.startsWith('image/') || ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'ico'].includes(ext)) return 'image';\n if (mime.startsWith('video/') || ['mp4', 'webm', 'avi', 'mov', 'mkv'].includes(ext)) return 'video';\n if (mime.startsWith('audio/') || ['mp3', 'wav', 'flac', 'aac', 'ogg', 'm4a'].includes(ext)) return 'audio';\n if (['js', 'ts', 'tsx', 'jsx', 'py', 'rs', 'go', 'java', 'c', 'cpp', 'h', 'css', 'html', 'json', 'xml', 'yaml', 'yml', 'toml', 'sh', 'bash', 'sql'].includes(ext)) return 'code';\n if (['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'md', 'rtf', 'csv'].includes(ext)) return 'document';\n if (['zip', 'tar', 'gz', 'bz2', 'rar', '7z', 'xz'].includes(ext)) return 'archive';\n\n return 'generic';\n}\n\n// --- Main component ---\n\nexport const FileIcon: React.FC<FileIconProps> = ({\n entry,\n size = 'sm',\n className = '',\n}) => {\n const sizeClass = sizeMap[size];\n\n if (entry.type === 'folder') {\n return <span className={className}><FolderIcon sizeClass={sizeClass} /></span>;\n }\n\n const category = getFileCategory(entry);\n\n const IconComponent = {\n image: ImageIcon,\n video: VideoIcon,\n audio: AudioIcon,\n code: CodeIcon,\n document: DocIcon,\n archive: ArchiveIcon,\n generic: GenericFileIcon,\n }[category] || GenericFileIcon;\n\n return <span className={className}><IconComponent sizeClass={sizeClass} /></span>;\n};\n"],"mappings":";;;AAGA,
|
|
1
|
+
{"version":3,"file":"FileIcon.js","names":["sizeMap","FolderIcon","sizeClass","ImageIcon","VideoIcon","AudioIcon","CodeIcon","DocIcon","ArchiveIcon","GenericFileIcon","getFileCategory","mime","entry","ext","FileIcon","size","category","IconComponent"],"sources":["../../../../src/components/pro/FileExplorer/FileIcon.tsx"],"sourcesContent":["import React from 'react';\nimport { FileIconProps } from './types';\n\nconst sizeMap = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-8 w-8',\n};\n\n// --- Icon components ---\n\nconst FolderIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-warning`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z\" />\n </svg>\n);\n\nconst ImageIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-success`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n);\n\nconst VideoIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-error`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n);\n\nconst AudioIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-secondary`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 19V6l12-3v13M9 19c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zm12-3c0 1.105-1.343 2-3 2s-3-.895-3-2 1.343-2 3-2 3 .895 3 2zM9 10l12-3\" />\n </svg>\n);\n\nconst CodeIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-info`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n);\n\nconst DocIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-primary`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" 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\nconst ArchiveIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} text-accent`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4\" />\n </svg>\n);\n\nconst GenericFileIcon: React.FC<{ sizeClass: string }> = ({ sizeClass }) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={`${sizeClass} opacity-60`} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 21h10a2 2 0 002-2V9.414a1 1 0 00-.293-.707l-5.414-5.414A1 1 0 0012.586 3H7a2 2 0 00-2 2v14a2 2 0 002 2z\" />\n </svg>\n);\n\n// --- MIME / extension to category mapping ---\n\nfunction getFileCategory(entry: { name: string; mimeType?: string }): string {\n const mime = entry.mimeType || '';\n const ext = entry.name.split('.').pop()?.toLowerCase() || '';\n\n if (mime.startsWith('image/') || ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'ico'].includes(ext)) return 'image';\n if (mime.startsWith('video/') || ['mp4', 'webm', 'avi', 'mov', 'mkv'].includes(ext)) return 'video';\n if (mime.startsWith('audio/') || ['mp3', 'wav', 'flac', 'aac', 'ogg', 'm4a'].includes(ext)) return 'audio';\n if (['js', 'ts', 'tsx', 'jsx', 'py', 'rs', 'go', 'java', 'c', 'cpp', 'h', 'css', 'html', 'json', 'xml', 'yaml', 'yml', 'toml', 'sh', 'bash', 'sql'].includes(ext)) return 'code';\n if (['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'md', 'rtf', 'csv'].includes(ext)) return 'document';\n if (['zip', 'tar', 'gz', 'bz2', 'rar', '7z', 'xz'].includes(ext)) return 'archive';\n\n return 'generic';\n}\n\n// --- Main component ---\n\nexport const FileIcon: React.FC<FileIconProps> = ({\n entry,\n size = 'sm',\n className = '',\n}) => {\n const sizeClass = sizeMap[size];\n\n if (entry.type === 'folder') {\n return <span className={className}><FolderIcon sizeClass={sizeClass} /></span>;\n }\n\n const category = getFileCategory(entry);\n\n const IconComponent = {\n image: ImageIcon,\n video: VideoIcon,\n audio: AudioIcon,\n code: CodeIcon,\n document: DocIcon,\n archive: ArchiveIcon,\n generic: GenericFileIcon,\n }[category] || GenericFileIcon;\n\n return <span className={className}><IconComponent sizeClass={sizeClass} /></span>;\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GridView.js","names":[],"sources":["../../../../src/components/pro/FileExplorer/GridView.tsx"],"sourcesContent":["import React from 'react';\nimport { GridViewProps } from './types';\nimport { FileIcon } from './FileIcon';\nimport Button from '../../Button';\nimport { formatFileSize } from '../../FileUploader/DropZone';\n\nconst defaultLabels = {\n emptyFolder: 'This folder is empty',\n noResults: 'No files match your search',\n delete: 'Delete',\n rename: 'Rename',\n};\n\nconst TrashIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" 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 </svg>\n);\n\nconst EditIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n);\n\nexport const GridView: React.FC<GridViewProps> = ({\n entries,\n onEntryClick,\n onEntryDoubleClick,\n onDelete,\n onRename,\n enableDelete = false,\n enableRename = false,\n labels: userLabels,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n if (entries.length === 0) {\n return (\n <div className={`flex items-center justify-center py-16 opacity-50 text-sm ${className}`}>\n {labels.emptyFolder}\n </div>\n );\n }\n\n return (\n <div className={`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-2 p-3 ${className}`}>\n {entries.map(entry => (\n <div\n key={entry.path}\n className=\"relative group flex flex-col items-center p-3 rounded-xl hover:bg-base-200/60 cursor-pointer transition-colors min-h-[100px]\"\n onClick={() => onEntryClick(entry)}\n onDoubleClick={() => onEntryDoubleClick(entry)}\n >\n {/* Thumbnail or icon */}\n {entry.thumbnail ? (\n <div className=\"w-12 h-12 rounded-lg overflow-hidden bg-base-200 flex items-center justify-center mb-2\">\n <img\n src={entry.thumbnail}\n alt={entry.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n ) : (\n <div className=\"mb-2\">\n <FileIcon entry={entry} size=\"lg\" />\n </div>\n )}\n\n {/* Name */}\n <span className={`text-xs text-center truncate w-full ${entry.type === 'folder' ? 'font-medium' : ''}`} title={entry.name}>\n {entry.name}\n </span>\n\n {/* Size for files */}\n {entry.type === 'file' && entry.size != null && (\n <span className=\"text-[10px] opacity-40 mt-0.5\">\n {formatFileSize(entry.size)}\n </span>\n )}\n\n {/* Hover actions */}\n {(enableDelete || enableRename) && (\n <div className=\"absolute top-1 right-1 flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n {enableRename && onRename && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRename(entry)}\n >\n <EditIcon />\n </Button>\n </span>\n )}\n {enableDelete && onDelete && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n className=\"text-error\"\n onClick={() => onDelete(entry)}\n >\n <TrashIcon />\n </Button>\n </span>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n};\n"],"mappings":";;;;;;AAMA,
|
|
1
|
+
{"version":3,"file":"GridView.js","names":["Button","ButtonWithCompounds","defaultLabels","TrashIcon","EditIcon","GridView","userLabels","labels","entries","className","onEntryClick","entry","onEntryDoubleClick","FileIcon","formatFileSize","enableDelete","enableRename","onRename","onDelete"],"sources":["../../../../src/components/pro/FileExplorer/GridView.tsx"],"sourcesContent":["import React from 'react';\nimport { GridViewProps } from './types';\nimport { FileIcon } from './FileIcon';\nimport Button from '../../Button';\nimport { formatFileSize } from '../../FileUploader/DropZone';\n\nconst defaultLabels = {\n emptyFolder: 'This folder is empty',\n noResults: 'No files match your search',\n delete: 'Delete',\n rename: 'Rename',\n};\n\nconst TrashIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" 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 </svg>\n);\n\nconst EditIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n);\n\nexport const GridView: React.FC<GridViewProps> = ({\n entries,\n onEntryClick,\n onEntryDoubleClick,\n onDelete,\n onRename,\n enableDelete = false,\n enableRename = false,\n labels: userLabels,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n if (entries.length === 0) {\n return (\n <div className={`flex items-center justify-center py-16 opacity-50 text-sm ${className}`}>\n {labels.emptyFolder}\n </div>\n );\n }\n\n return (\n <div className={`grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-2 p-3 ${className}`}>\n {entries.map(entry => (\n <div\n key={entry.path}\n className=\"relative group flex flex-col items-center p-3 rounded-xl hover:bg-base-200/60 cursor-pointer transition-colors min-h-[100px]\"\n onClick={() => onEntryClick(entry)}\n onDoubleClick={() => onEntryDoubleClick(entry)}\n >\n {/* Thumbnail or icon */}\n {entry.thumbnail ? (\n <div className=\"w-12 h-12 rounded-lg overflow-hidden bg-base-200 flex items-center justify-center mb-2\">\n <img\n src={entry.thumbnail}\n alt={entry.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n ) : (\n <div className=\"mb-2\">\n <FileIcon entry={entry} size=\"lg\" />\n </div>\n )}\n\n {/* Name */}\n <span className={`text-xs text-center truncate w-full ${entry.type === 'folder' ? 'font-medium' : ''}`} title={entry.name}>\n {entry.name}\n </span>\n\n {/* Size for files */}\n {entry.type === 'file' && entry.size != null && (\n <span className=\"text-[10px] opacity-40 mt-0.5\">\n {formatFileSize(entry.size)}\n </span>\n )}\n\n {/* Hover actions */}\n {(enableDelete || enableRename) && (\n <div className=\"absolute top-1 right-1 flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n {enableRename && onRename && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRename(entry)}\n >\n <EditIcon />\n </Button>\n </span>\n )}\n {enableDelete && onDelete && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n className=\"text-error\"\n onClick={() => onDelete(entry)}\n >\n <TrashIcon />\n </Button>\n </span>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n};\n"],"mappings":";;;;;;AAMA,IAAME,IAAgB;CAClB,aAAa;CACb,WAAW;CACX,QAAQ;CACR,QAAQ;AACZ,GAEMC,UACF,kBAAC,OAAD;CAAK,OAAM;CAA6B,WAAU;CAAc,MAAK;CAAO,SAAQ;CAAY,QAAO;CAAe,aAAa;CAC/H,UAAA,kBAAC,QAAD;EAAM,eAAc;EAAQ,gBAAe;EAAQ,GAAE;CAAgI,CAAA;AACpL,CAAA,GAGHC,UACF,kBAAC,OAAD;CAAK,OAAM;CAA6B,WAAU;CAAc,MAAK;CAAO,SAAQ;CAAY,QAAO;CAAe,aAAa;CAC/H,UAAA,kBAAC,QAAD;EAAM,eAAc;EAAQ,gBAAe;EAAQ,GAAE;CAA0H,CAAA;AAC9K,CAAA,GAGIC,KAAqC,EAC9C,YACA,iBACA,uBACA,aACA,aACA,kBAAe,IACf,kBAAe,IACf,QAAQC,GACR,eAAY,SACV;CACF,IAAMC,IAAS;EAAE,GAAGL;EAAe,GAAGI;CAAW;CAUjD,OARIE,EAAQ,WAAW,IAEf,kBAAC,OAAD;EAAK,WAAW,6DAA6DC;EACxE,UAAAF,EAAO;CACP,CAAA,IAKT,kBAAC,OAAD;EAAK,WAAW,2EAA2EE;EACtF,UAAAD,EAAQ,KAAI,MACT,kBAAC,OAAD;GAEI,WAAU;GACV,eAAeE,EAAaC,CAAK;GACjC,qBAAqBC,EAAmBD,CAAK;GAJjD,UAAA;IAOKA,EAAM,YACH,kBAAC,OAAD;KAAK,WAAU;KACX,UAAA,kBAAC,OAAD;MACI,KAAKA,EAAM;MACX,KAAKA,EAAM;MACX,WAAU;KACb,CAAA;IACA,CAAA,IAEL,kBAAC,OAAD;KAAK,WAAU;KACX,UAAA,kBAACE,GAAD;MAAiB;MAAO,MAAK;KAAM,CAAA;IAClC,CAAA;IAIT,kBAAC,QAAD;KAAM,WAAW,uCAAuCF,EAAM,SAAS,WAAW,gBAAgB;KAAM,OAAOA,EAAM;KAChH,UAAAA,EAAM;IACL,CAAA;IAGLA,EAAM,SAAS,UAAUA,EAAM,QAAQ,QACpC,kBAAC,QAAD;KAAM,WAAU;KACX,UAAAG,EAAeH,EAAM,IAAI;IACxB,CAAA;KAIRI,KAAgBC,MACd,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACKA,KAAgBC,KACb,kBAAC,QAAD;MAAM,UAAU,MAAM,EAAE,gBAAgB;MACpC,UAAA,kBAACjB,GAAD;OACI,SAAQ;OACR,MAAK;OACL,QAAA;OACA,eAAeiB,EAASN,CAAK;OAE7B,UAAA,kBAACP,GAAD,CAAW,CAAA;MACP,CAAA;KACN,CAAA,GAETW,KAAgBG,KACb,kBAAC,QAAD;MAAM,UAAU,MAAM,EAAE,gBAAgB;MACpC,UAAA,kBAAClB,GAAD;OACI,SAAQ;OACR,MAAK;OACL,QAAA;OACA,WAAU;OACV,eAAekB,EAASP,CAAK;OAE7B,UAAA,kBAACR,GAAD,CAAY,CAAA;MACR,CAAA;KACN,CAAA,CAET;;GAER;EA9DI,GAAAQ,EAAM,IA8DV,CACR;CACA,CAAA;AAEb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListView.js","names":[],"sources":["../../../../src/components/pro/FileExplorer/ListView.tsx"],"sourcesContent":["import React from 'react';\nimport { ListViewProps, SortField } from './types';\nimport { FileIcon } from './FileIcon';\nimport Button from '../../Button';\nimport { formatFileSize } from '../../FileUploader/DropZone';\n\nconst defaultLabels = {\n name: 'Name',\n size: 'Size',\n modified: 'Modified',\n type: 'Type',\n delete: 'Delete',\n rename: 'Rename',\n emptyFolder: 'This folder is empty',\n noResults: 'No files match your search',\n};\n\n// --- Icons ---\n\nconst SortAscIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3 inline\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n);\n\nconst SortDescIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3 inline\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\nconst SortNeutralIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3 inline opacity-30\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n);\n\nconst TrashIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" 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 </svg>\n);\n\nconst EditIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n);\n\ntype ColumnDef = {\n field: SortField;\n labelKey: keyof typeof defaultLabels;\n className: string;\n};\n\nconst columns: ColumnDef[] = [\n { field: 'name', labelKey: 'name', className: 'flex-1 min-w-0' },\n { field: 'size', labelKey: 'size', className: 'w-20 text-right hidden sm:block' },\n { field: 'modifiedAt', labelKey: 'modified', className: 'w-32 hidden md:block' },\n { field: 'type', labelKey: 'type', className: 'w-16 hidden lg:block' },\n];\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return '-';\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });\n } catch {\n return dateStr;\n }\n}\n\nfunction getExtension(name: string): string {\n const parts = name.split('.');\n return parts.length > 1 ? parts.pop()!.toUpperCase() : '-';\n}\n\nexport const ListView: React.FC<ListViewProps> = ({\n entries,\n sortConfig,\n onSortChange,\n onEntryClick,\n onEntryDoubleClick,\n onDelete,\n onRename,\n enableDelete = false,\n enableRename = false,\n labels: userLabels,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n const handleHeaderClick = (field: SortField) => {\n if (sortConfig.field === field) {\n onSortChange({ field, direction: sortConfig.direction === 'asc' ? 'desc' : 'asc' });\n } else {\n onSortChange({ field, direction: 'asc' });\n }\n };\n\n const sortIcon = (field: SortField) => {\n if (sortConfig.field !== field) return <SortNeutralIcon />;\n return sortConfig.direction === 'asc' ? <SortAscIcon /> : <SortDescIcon />;\n };\n\n if (entries.length === 0) {\n return (\n <div className={`flex items-center justify-center py-16 opacity-50 text-sm ${className}`}>\n {labels.emptyFolder}\n </div>\n );\n }\n\n return (\n <div className={`overflow-x-auto ${className}`}>\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-base-300 text-xs font-medium opacity-60 select-none\">\n {/* Icon spacer */}\n <div className=\"w-6 flex-shrink-0\" />\n {columns.map(col => (\n <div\n key={col.field}\n className={`${col.className} cursor-pointer hover:opacity-100 transition-opacity flex items-center gap-1`}\n onClick={() => handleHeaderClick(col.field)}\n >\n {labels[col.labelKey]}\n {sortIcon(col.field)}\n </div>\n ))}\n {/* Actions spacer */}\n {(enableDelete || enableRename) && <div className=\"w-16 flex-shrink-0\" />}\n </div>\n\n {/* Rows */}\n <div className=\"divide-y divide-base-200\">\n {entries.map(entry => (\n <div\n key={entry.path}\n className=\"flex items-center gap-2 px-3 py-2 hover:bg-base-200/60 cursor-pointer transition-colors group min-h-[44px]\"\n onClick={() => onEntryClick(entry)}\n onDoubleClick={() => onEntryDoubleClick(entry)}\n >\n {/* Icon */}\n <div className=\"w-6 flex-shrink-0 flex items-center justify-center\">\n <FileIcon entry={entry} size=\"sm\" />\n </div>\n\n {/* Name */}\n <div className=\"flex-1 min-w-0\">\n <span className={`text-sm truncate block ${entry.type === 'folder' ? 'font-medium' : ''}`}>\n {entry.name}\n </span>\n </div>\n\n {/* Size */}\n <div className=\"w-20 text-right hidden sm:block\">\n <span className=\"text-xs opacity-60\">\n {entry.type === 'file' && entry.size != null ? formatFileSize(entry.size) : '-'}\n </span>\n </div>\n\n {/* Modified */}\n <div className=\"w-32 hidden md:block\">\n <span className=\"text-xs opacity-60\">\n {formatDate(entry.modifiedAt)}\n </span>\n </div>\n\n {/* Type */}\n <div className=\"w-16 hidden lg:block\">\n <span className=\"text-xs opacity-50\">\n {entry.type === 'folder' ? 'Folder' : getExtension(entry.name)}\n </span>\n </div>\n\n {/* Actions */}\n {(enableDelete || enableRename) && (\n <div className=\"w-16 flex-shrink-0 flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n {enableRename && onRename && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRename(entry)}\n >\n <EditIcon />\n </Button>\n </span>\n )}\n {enableDelete && onDelete && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n className=\"text-error\"\n onClick={() => onDelete(entry)}\n >\n <TrashIcon />\n </Button>\n </span>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListView.js","names":["Button","ButtonWithCompounds","defaultLabels","SortAscIcon","SortDescIcon","SortNeutralIcon","TrashIcon","EditIcon","columns","formatDate","dateStr","getExtension","parts","name","ListView","userLabels","labels","handleHeaderClick","sortConfig","field","onSortChange","sortIcon","entries","className","col","enableDelete","enableRename","onEntryClick","entry","onEntryDoubleClick","FileIcon","formatFileSize","onRename","onDelete"],"sources":["../../../../src/components/pro/FileExplorer/ListView.tsx"],"sourcesContent":["import React from 'react';\nimport { ListViewProps, SortField } from './types';\nimport { FileIcon } from './FileIcon';\nimport Button from '../../Button';\nimport { formatFileSize } from '../../FileUploader/DropZone';\n\nconst defaultLabels = {\n name: 'Name',\n size: 'Size',\n modified: 'Modified',\n type: 'Type',\n delete: 'Delete',\n rename: 'Rename',\n emptyFolder: 'This folder is empty',\n noResults: 'No files match your search',\n};\n\n// --- Icons ---\n\nconst SortAscIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3 inline\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n);\n\nconst SortDescIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3 inline\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\nconst SortNeutralIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3 inline opacity-30\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 16V4m0 0L3 8m4-4l4 4m6 0v12m0 0l4-4m-4 4l-4-4\" />\n </svg>\n);\n\nconst TrashIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" 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 </svg>\n);\n\nconst EditIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3.5 w-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z\" />\n </svg>\n);\n\ntype ColumnDef = {\n field: SortField;\n labelKey: keyof typeof defaultLabels;\n className: string;\n};\n\nconst columns: ColumnDef[] = [\n { field: 'name', labelKey: 'name', className: 'flex-1 min-w-0' },\n { field: 'size', labelKey: 'size', className: 'w-20 text-right hidden sm:block' },\n { field: 'modifiedAt', labelKey: 'modified', className: 'w-32 hidden md:block' },\n { field: 'type', labelKey: 'type', className: 'w-16 hidden lg:block' },\n];\n\nfunction formatDate(dateStr?: string): string {\n if (!dateStr) return '-';\n try {\n const d = new Date(dateStr);\n return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });\n } catch {\n return dateStr;\n }\n}\n\nfunction getExtension(name: string): string {\n const parts = name.split('.');\n return parts.length > 1 ? parts.pop()!.toUpperCase() : '-';\n}\n\nexport const ListView: React.FC<ListViewProps> = ({\n entries,\n sortConfig,\n onSortChange,\n onEntryClick,\n onEntryDoubleClick,\n onDelete,\n onRename,\n enableDelete = false,\n enableRename = false,\n labels: userLabels,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n const handleHeaderClick = (field: SortField) => {\n if (sortConfig.field === field) {\n onSortChange({ field, direction: sortConfig.direction === 'asc' ? 'desc' : 'asc' });\n } else {\n onSortChange({ field, direction: 'asc' });\n }\n };\n\n const sortIcon = (field: SortField) => {\n if (sortConfig.field !== field) return <SortNeutralIcon />;\n return sortConfig.direction === 'asc' ? <SortAscIcon /> : <SortDescIcon />;\n };\n\n if (entries.length === 0) {\n return (\n <div className={`flex items-center justify-center py-16 opacity-50 text-sm ${className}`}>\n {labels.emptyFolder}\n </div>\n );\n }\n\n return (\n <div className={`overflow-x-auto ${className}`}>\n {/* Header */}\n <div className=\"flex items-center gap-2 px-3 py-2 border-b border-base-300 text-xs font-medium opacity-60 select-none\">\n {/* Icon spacer */}\n <div className=\"w-6 flex-shrink-0\" />\n {columns.map(col => (\n <div\n key={col.field}\n className={`${col.className} cursor-pointer hover:opacity-100 transition-opacity flex items-center gap-1`}\n onClick={() => handleHeaderClick(col.field)}\n >\n {labels[col.labelKey]}\n {sortIcon(col.field)}\n </div>\n ))}\n {/* Actions spacer */}\n {(enableDelete || enableRename) && <div className=\"w-16 flex-shrink-0\" />}\n </div>\n\n {/* Rows */}\n <div className=\"divide-y divide-base-200\">\n {entries.map(entry => (\n <div\n key={entry.path}\n className=\"flex items-center gap-2 px-3 py-2 hover:bg-base-200/60 cursor-pointer transition-colors group min-h-[44px]\"\n onClick={() => onEntryClick(entry)}\n onDoubleClick={() => onEntryDoubleClick(entry)}\n >\n {/* Icon */}\n <div className=\"w-6 flex-shrink-0 flex items-center justify-center\">\n <FileIcon entry={entry} size=\"sm\" />\n </div>\n\n {/* Name */}\n <div className=\"flex-1 min-w-0\">\n <span className={`text-sm truncate block ${entry.type === 'folder' ? 'font-medium' : ''}`}>\n {entry.name}\n </span>\n </div>\n\n {/* Size */}\n <div className=\"w-20 text-right hidden sm:block\">\n <span className=\"text-xs opacity-60\">\n {entry.type === 'file' && entry.size != null ? formatFileSize(entry.size) : '-'}\n </span>\n </div>\n\n {/* Modified */}\n <div className=\"w-32 hidden md:block\">\n <span className=\"text-xs opacity-60\">\n {formatDate(entry.modifiedAt)}\n </span>\n </div>\n\n {/* Type */}\n <div className=\"w-16 hidden lg:block\">\n <span className=\"text-xs opacity-50\">\n {entry.type === 'folder' ? 'Folder' : getExtension(entry.name)}\n </span>\n </div>\n\n {/* Actions */}\n {(enableDelete || enableRename) && (\n <div className=\"w-16 flex-shrink-0 flex gap-0.5 opacity-0 group-hover:opacity-100 transition-opacity\">\n {enableRename && onRename && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRename(entry)}\n >\n <EditIcon />\n </Button>\n </span>\n )}\n {enableDelete && onDelete && (\n <span onClick={(e) => e.stopPropagation()}>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n className=\"text-error\"\n onClick={() => onDelete(entry)}\n >\n <TrashIcon />\n </Button>\n </span>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","names":[],"sources":["../../../../src/components/pro/FileExplorer/Toolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { ToolbarProps, SortField } from './types';\nimport Button from '../../Button';\nimport Input from '../../Input';\n\nconst defaultLabels = {\n searchPlaceholder: 'Search files...',\n listView: 'List',\n gridView: 'Grid',\n newFolder: 'New Folder',\n newFile: 'New File',\n sortBy: 'Sort',\n name: 'Name',\n size: 'Size',\n modified: 'Modified',\n type: 'Type',\n};\n\n// --- Icons ---\n\nconst ListIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n);\n\nconst GridIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\n </svg>\n);\n\nconst FolderPlusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z\" />\n </svg>\n);\n\nconst FilePlusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m5 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\nconst UploadIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n);\n\nconst SearchIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nconst SortAscIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n);\n\nconst SortDescIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\nconst sortFields: SortField[] = ['name', 'size', 'modifiedAt', 'type'];\n\nconst sortFieldLabelMap: Record<SortField, keyof typeof defaultLabels> = {\n name: 'name',\n size: 'size',\n modifiedAt: 'modified',\n type: 'type',\n};\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n searchQuery,\n onSearchChange,\n viewMode,\n onViewModeChange,\n sortConfig,\n onSortChange,\n enableCreate = false,\n hasCreateFolder = false,\n hasCreateFile = false,\n onCreateFolder,\n onCreateFile,\n enableUpload = false,\n onUploadFiles,\n labels: userLabels,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n const handleSortFieldClick = (field: SortField) => {\n if (sortConfig.field === field) {\n onSortChange({ field, direction: sortConfig.direction === 'asc' ? 'desc' : 'asc' });\n } else {\n onSortChange({ field, direction: 'asc' });\n }\n };\n\n return (\n <div className={`flex flex-wrap items-center gap-2 px-2 py-2 border-b border-base-300 ${className}`}>\n {/* Search */}\n <div className=\"flex-1 min-w-[120px] max-w-xs\">\n <Input\n size=\"sm\"\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n leftSection={<SearchIcon />}\n />\n </div>\n\n {/* Sort buttons */}\n <div className=\"flex items-center gap-0.5\">\n {sortFields.map(field => (\n <button\n key={field}\n className={`btn btn-xs ${sortConfig.field === field ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => handleSortFieldClick(field)}\n >\n {labels[sortFieldLabelMap[field]]}\n {sortConfig.field === field && (\n <span className=\"ml-0.5\">\n {sortConfig.direction === 'asc' ? <SortAscIcon /> : <SortDescIcon />}\n </span>\n )}\n </button>\n ))}\n </div>\n\n {/* View mode toggle */}\n <Button.Group>\n <Button\n size=\"xs\"\n variant={viewMode === 'list' ? 'primary' : 'ghost'}\n onClick={() => onViewModeChange('list')}\n square\n >\n <ListIcon />\n </Button>\n <Button\n size=\"xs\"\n variant={viewMode === 'grid' ? 'primary' : 'ghost'}\n onClick={() => onViewModeChange('grid')}\n square\n >\n <GridIcon />\n </Button>\n </Button.Group>\n\n {/* Create actions */}\n {enableCreate && (\n <div className=\"flex gap-1\">\n {hasCreateFolder && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n leftSection={<FolderPlusIcon />}\n onClick={onCreateFolder}\n >\n {labels.newFolder}\n </Button>\n )}\n {hasCreateFile && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n leftSection={<FilePlusIcon />}\n onClick={onCreateFile}\n >\n {labels.newFile}\n </Button>\n )}\n </div>\n )}\n\n {/* Upload action */}\n {enableUpload && (\n <Button\n size=\"xs\"\n variant=\"primary\"\n outline\n leftSection={<UploadIcon />}\n onClick={onUploadFiles}\n >\n {(labels as any).uploadFiles || 'Upload'}\n </Button>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Toolbar.js","names":["Button","ButtonWithCompounds","Input","defaultLabels","ListIcon","GridIcon","FolderPlusIcon","FilePlusIcon","UploadIcon","SearchIcon","SortAscIcon","SortDescIcon","sortFields","sortFieldLabelMap","Toolbar","userLabels","labels","handleSortFieldClick","sortConfig","field","onSortChange","className","searchQuery","onSearchChange","viewMode","onViewModeChange","enableCreate","hasCreateFolder","onCreateFolder","hasCreateFile","onCreateFile","enableUpload","onUploadFiles"],"sources":["../../../../src/components/pro/FileExplorer/Toolbar.tsx"],"sourcesContent":["import React from 'react';\nimport { ToolbarProps, SortField } from './types';\nimport Button from '../../Button';\nimport Input from '../../Input';\n\nconst defaultLabels = {\n searchPlaceholder: 'Search files...',\n listView: 'List',\n gridView: 'Grid',\n newFolder: 'New Folder',\n newFile: 'New File',\n sortBy: 'Sort',\n name: 'Name',\n size: 'Size',\n modified: 'Modified',\n type: 'Type',\n};\n\n// --- Icons ---\n\nconst ListIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6h16M4 10h16M4 14h16M4 18h16\" />\n </svg>\n);\n\nconst GridIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z\" />\n </svg>\n);\n\nconst FolderPlusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z\" />\n </svg>\n);\n\nconst FilePlusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 13h6m-3-3v6m5 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\nconst UploadIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n);\n\nconst SearchIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4 opacity-50\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n);\n\nconst SortAscIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 15l7-7 7 7\" />\n </svg>\n);\n\nconst SortDescIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-3 w-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n);\n\nconst sortFields: SortField[] = ['name', 'size', 'modifiedAt', 'type'];\n\nconst sortFieldLabelMap: Record<SortField, keyof typeof defaultLabels> = {\n name: 'name',\n size: 'size',\n modifiedAt: 'modified',\n type: 'type',\n};\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n searchQuery,\n onSearchChange,\n viewMode,\n onViewModeChange,\n sortConfig,\n onSortChange,\n enableCreate = false,\n hasCreateFolder = false,\n hasCreateFile = false,\n onCreateFolder,\n onCreateFile,\n enableUpload = false,\n onUploadFiles,\n labels: userLabels,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n const handleSortFieldClick = (field: SortField) => {\n if (sortConfig.field === field) {\n onSortChange({ field, direction: sortConfig.direction === 'asc' ? 'desc' : 'asc' });\n } else {\n onSortChange({ field, direction: 'asc' });\n }\n };\n\n return (\n <div className={`flex flex-wrap items-center gap-2 px-2 py-2 border-b border-base-300 ${className}`}>\n {/* Search */}\n <div className=\"flex-1 min-w-[120px] max-w-xs\">\n <Input\n size=\"sm\"\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n leftSection={<SearchIcon />}\n />\n </div>\n\n {/* Sort buttons */}\n <div className=\"flex items-center gap-0.5\">\n {sortFields.map(field => (\n <button\n key={field}\n className={`btn btn-xs ${sortConfig.field === field ? 'btn-primary' : 'btn-ghost'}`}\n onClick={() => handleSortFieldClick(field)}\n >\n {labels[sortFieldLabelMap[field]]}\n {sortConfig.field === field && (\n <span className=\"ml-0.5\">\n {sortConfig.direction === 'asc' ? <SortAscIcon /> : <SortDescIcon />}\n </span>\n )}\n </button>\n ))}\n </div>\n\n {/* View mode toggle */}\n <Button.Group>\n <Button\n size=\"xs\"\n variant={viewMode === 'list' ? 'primary' : 'ghost'}\n onClick={() => onViewModeChange('list')}\n square\n >\n <ListIcon />\n </Button>\n <Button\n size=\"xs\"\n variant={viewMode === 'grid' ? 'primary' : 'ghost'}\n onClick={() => onViewModeChange('grid')}\n square\n >\n <GridIcon />\n </Button>\n </Button.Group>\n\n {/* Create actions */}\n {enableCreate && (\n <div className=\"flex gap-1\">\n {hasCreateFolder && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n leftSection={<FolderPlusIcon />}\n onClick={onCreateFolder}\n >\n {labels.newFolder}\n </Button>\n )}\n {hasCreateFile && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n leftSection={<FilePlusIcon />}\n onClick={onCreateFile}\n >\n {labels.newFile}\n </Button>\n )}\n </div>\n )}\n\n {/* Upload action */}\n {enableUpload && (\n <Button\n size=\"xs\"\n variant=\"primary\"\n outline\n leftSection={<UploadIcon />}\n onClick={onUploadFiles}\n >\n {(labels as any).uploadFiles || 'Upload'}\n </Button>\n )}\n </div>\n );\n};\n"],"mappings":"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"}
|