@xyne/workflow-ui 0.4.3 → 0.6.0
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/components/analytics/AnalyticsDashboard.d.ts.map +1 -1
- package/dist/components/analytics/AnalyticsDashboard.js +17 -2
- package/dist/components/analytics/AnalyticsDashboard.js.map +1 -1
- package/dist/components/analytics/FolderCard.d.ts +2 -1
- package/dist/components/analytics/FolderCard.d.ts.map +1 -1
- package/dist/components/analytics/FolderCard.js +4 -3
- package/dist/components/analytics/FolderCard.js.map +1 -1
- package/dist/components/analytics/FolderGrid.d.ts +3 -1
- package/dist/components/analytics/FolderGrid.d.ts.map +1 -1
- package/dist/components/analytics/FolderGrid.js +9 -5
- package/dist/components/analytics/FolderGrid.js.map +1 -1
- package/dist/components/automations/AutomationListView.d.ts.map +1 -1
- package/dist/components/automations/AutomationListView.js +68 -31
- package/dist/components/automations/AutomationListView.js.map +1 -1
- package/dist/components/browser/EntryGrid.d.ts +17 -0
- package/dist/components/browser/EntryGrid.d.ts.map +1 -0
- package/dist/components/browser/EntryGrid.js +90 -0
- package/dist/components/browser/EntryGrid.js.map +1 -0
- package/dist/components/browser/EntryList.d.ts +19 -0
- package/dist/components/browser/EntryList.d.ts.map +1 -0
- package/dist/components/browser/EntryList.js +75 -0
- package/dist/components/browser/EntryList.js.map +1 -0
- package/dist/components/browser/FolderCard.d.ts +6 -0
- package/dist/components/browser/FolderCard.d.ts.map +1 -0
- package/dist/components/browser/FolderCard.js +8 -0
- package/dist/components/browser/FolderCard.js.map +1 -0
- package/dist/components/browser/MoveDialog.d.ts +16 -0
- package/dist/components/browser/MoveDialog.d.ts.map +1 -0
- package/dist/components/browser/MoveDialog.js +102 -0
- package/dist/components/browser/MoveDialog.js.map +1 -0
- package/dist/components/browser/NameDialog.d.ts +16 -0
- package/dist/components/browser/NameDialog.d.ts.map +1 -0
- package/dist/components/browser/NameDialog.js +76 -0
- package/dist/components/browser/NameDialog.js.map +1 -0
- package/dist/components/browser/SearchField.d.ts +11 -0
- package/dist/components/browser/SearchField.d.ts.map +1 -0
- package/dist/components/browser/SearchField.js +14 -0
- package/dist/components/browser/SearchField.js.map +1 -0
- package/dist/components/browser/ViewToggle.d.ts +8 -0
- package/dist/components/browser/ViewToggle.d.ts.map +1 -0
- package/dist/components/browser/ViewToggle.js +10 -0
- package/dist/components/browser/ViewToggle.js.map +1 -0
- package/dist/components/browser/constants.d.ts +4 -0
- package/dist/components/browser/constants.d.ts.map +1 -0
- package/dist/components/browser/constants.js +4 -0
- package/dist/components/browser/constants.js.map +1 -0
- package/dist/components/browser/types.d.ts +29 -0
- package/dist/components/browser/types.d.ts.map +1 -0
- package/dist/components/browser/types.js +2 -0
- package/dist/components/browser/types.js.map +1 -0
- package/dist/components/browser/utils.d.ts +8 -0
- package/dist/components/browser/utils.d.ts.map +1 -0
- package/dist/components/browser/utils.js +36 -0
- package/dist/components/browser/utils.js.map +1 -0
- package/dist/components/builder/AddStepButton.d.ts +6 -0
- package/dist/components/builder/AddStepButton.d.ts.map +1 -0
- package/dist/components/builder/AddStepButton.js +7 -0
- package/dist/components/builder/AddStepButton.js.map +1 -0
- package/dist/components/builder/BranchEdge.d.ts +3 -0
- package/dist/components/builder/BranchEdge.d.ts.map +1 -0
- package/dist/components/builder/BranchEdge.js +19 -0
- package/dist/components/builder/BranchEdge.js.map +1 -0
- package/dist/components/builder/BuilderToolbar.d.ts +10 -0
- package/dist/components/builder/BuilderToolbar.d.ts.map +1 -0
- package/dist/components/builder/BuilderToolbar.js +16 -0
- package/dist/components/builder/BuilderToolbar.js.map +1 -0
- package/dist/components/builder/StepConfigDrawer.d.ts +11 -0
- package/dist/components/builder/StepConfigDrawer.d.ts.map +1 -0
- package/dist/components/builder/StepConfigDrawer.js +21 -0
- package/dist/components/builder/StepConfigDrawer.js.map +1 -0
- package/dist/components/builder/StepNode.d.ts +15 -0
- package/dist/components/builder/StepNode.d.ts.map +1 -0
- package/dist/components/builder/StepNode.js +56 -0
- package/dist/components/builder/StepNode.js.map +1 -0
- package/dist/components/builder/StepPalette.d.ts +7 -0
- package/dist/components/builder/StepPalette.d.ts.map +1 -0
- package/dist/components/builder/StepPalette.js +83 -0
- package/dist/components/builder/StepPalette.js.map +1 -0
- package/dist/components/builder/StepPicker.d.ts +9 -0
- package/dist/components/builder/StepPicker.d.ts.map +1 -0
- package/dist/components/builder/StepPicker.js +95 -0
- package/dist/components/builder/StepPicker.js.map +1 -0
- package/dist/components/builder/TriggerConfigPanel.d.ts +10 -0
- package/dist/components/builder/TriggerConfigPanel.d.ts.map +1 -0
- package/dist/components/builder/TriggerConfigPanel.js +49 -0
- package/dist/components/builder/TriggerConfigPanel.js.map +1 -0
- package/dist/components/builder/TriggerNode.d.ts +9 -0
- package/dist/components/builder/TriggerNode.d.ts.map +1 -0
- package/dist/components/builder/TriggerNode.js +30 -0
- package/dist/components/builder/TriggerNode.js.map +1 -0
- package/dist/components/builder/TriggerPicker.d.ts +8 -0
- package/dist/components/builder/TriggerPicker.d.ts.map +1 -0
- package/dist/components/builder/TriggerPicker.js +61 -0
- package/dist/components/builder/TriggerPicker.js.map +1 -0
- package/dist/components/builder/WorkflowBuilder.d.ts +20 -0
- package/dist/components/builder/WorkflowBuilder.d.ts.map +1 -0
- package/dist/components/builder/WorkflowBuilder.js +157 -0
- package/dist/components/builder/WorkflowBuilder.js.map +1 -0
- package/dist/components/builder/edge-types.d.ts +3 -0
- package/dist/components/builder/edge-types.d.ts.map +1 -0
- package/dist/components/builder/edge-types.js +5 -0
- package/dist/components/builder/edge-types.js.map +1 -0
- package/dist/components/builder/node-types.d.ts +3 -0
- package/dist/components/builder/node-types.d.ts.map +1 -0
- package/dist/components/builder/node-types.js +11 -0
- package/dist/components/builder/node-types.js.map +1 -0
- package/dist/components/builder/v2/AddStepButton.d.ts +6 -0
- package/dist/components/builder/v2/AddStepButton.d.ts.map +1 -0
- package/dist/components/builder/v2/AddStepButton.js +6 -0
- package/dist/components/builder/v2/AddStepButton.js.map +1 -0
- package/dist/components/builder/v2/BranchEdge.d.ts +3 -0
- package/dist/components/builder/v2/BranchEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/BranchEdge.js +46 -0
- package/dist/components/builder/v2/BranchEdge.js.map +1 -0
- package/dist/components/builder/v2/LoopBodyEdge.d.ts +7 -0
- package/dist/components/builder/v2/LoopBodyEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/LoopBodyEdge.js +19 -0
- package/dist/components/builder/v2/LoopBodyEdge.js.map +1 -0
- package/dist/components/builder/v2/LoopbackEdge.d.ts +10 -0
- package/dist/components/builder/v2/LoopbackEdge.d.ts.map +1 -0
- package/dist/components/builder/v2/LoopbackEdge.js +26 -0
- package/dist/components/builder/v2/LoopbackEdge.js.map +1 -0
- package/dist/components/builder/v2/StepNode.d.ts +21 -0
- package/dist/components/builder/v2/StepNode.d.ts.map +1 -0
- package/dist/components/builder/v2/StepNode.js +36 -0
- package/dist/components/builder/v2/StepNode.js.map +1 -0
- package/dist/components/builder/v2/StepPicker.d.ts +8 -0
- package/dist/components/builder/v2/StepPicker.d.ts.map +1 -0
- package/dist/components/builder/v2/StepPicker.js +73 -0
- package/dist/components/builder/v2/StepPicker.js.map +1 -0
- package/dist/components/builder/v2/TerminalNode.d.ts +6 -0
- package/dist/components/builder/v2/TerminalNode.d.ts.map +1 -0
- package/dist/components/builder/v2/TerminalNode.js +7 -0
- package/dist/components/builder/v2/TerminalNode.js.map +1 -0
- package/dist/components/builder/v2/TriggerNode.d.ts +10 -0
- package/dist/components/builder/v2/TriggerNode.d.ts.map +1 -0
- package/dist/components/builder/v2/TriggerNode.js +20 -0
- package/dist/components/builder/v2/TriggerNode.js.map +1 -0
- package/dist/components/builder/v2/TriggerPicker.d.ts +7 -0
- package/dist/components/builder/v2/TriggerPicker.d.ts.map +1 -0
- package/dist/components/builder/v2/TriggerPicker.js +45 -0
- package/dist/components/builder/v2/TriggerPicker.js.map +1 -0
- package/dist/components/builder/v2/WorkflowBuilder.d.ts +14 -0
- package/dist/components/builder/v2/WorkflowBuilder.d.ts.map +1 -0
- package/dist/components/builder/v2/WorkflowBuilder.js +189 -0
- package/dist/components/builder/v2/WorkflowBuilder.js.map +1 -0
- package/dist/components/builder/v2/edge-types.d.ts +3 -0
- package/dist/components/builder/v2/edge-types.d.ts.map +1 -0
- package/dist/components/builder/v2/edge-types.js +9 -0
- package/dist/components/builder/v2/edge-types.js.map +1 -0
- package/dist/components/builder/v2/icons.d.ts +25 -0
- package/dist/components/builder/v2/icons.d.ts.map +1 -0
- package/dist/components/builder/v2/icons.js +43 -0
- package/dist/components/builder/v2/icons.js.map +1 -0
- package/dist/components/builder/v2/layout-engine.d.ts +76 -0
- package/dist/components/builder/v2/layout-engine.d.ts.map +1 -0
- package/dist/components/builder/v2/layout-engine.js +465 -0
- package/dist/components/builder/v2/layout-engine.js.map +1 -0
- package/dist/components/builder/v2/node-types.d.ts +3 -0
- package/dist/components/builder/v2/node-types.d.ts.map +1 -0
- package/dist/components/builder/v2/node-types.js +11 -0
- package/dist/components/builder/v2/node-types.js.map +1 -0
- package/dist/components/builder/v2/theme.d.ts +28 -0
- package/dist/components/builder/v2/theme.d.ts.map +1 -0
- package/dist/components/builder/v2/theme.js +63 -0
- package/dist/components/builder/v2/theme.js.map +1 -0
- package/dist/components/builder/v3/EnhancedSchemaFormRenderer.js +7 -4
- package/dist/components/builder/v3/EnhancedSchemaFormRenderer.js.map +1 -1
- package/dist/components/builder/v3/StepNode.d.ts +2 -1
- package/dist/components/builder/v3/StepNode.d.ts.map +1 -1
- package/dist/components/builder/v3/StepNode.js +2 -2
- package/dist/components/builder/v3/StepNode.js.map +1 -1
- package/dist/components/dashboard/WorkflowSummaryEditor.d.ts +11 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.d.ts.map +1 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.js +46 -0
- package/dist/components/dashboard/WorkflowSummaryEditor.js.map +1 -0
- package/dist/components/execution/ApprovalsView.d.ts +7 -0
- package/dist/components/execution/ApprovalsView.d.ts.map +1 -0
- package/dist/components/execution/ApprovalsView.js +133 -0
- package/dist/components/execution/ApprovalsView.js.map +1 -0
- package/dist/components/execution/ExecutionEdge.d.ts +4 -0
- package/dist/components/execution/ExecutionEdge.d.ts.map +1 -0
- package/dist/components/execution/ExecutionEdge.js +27 -0
- package/dist/components/execution/ExecutionEdge.js.map +1 -0
- package/dist/components/execution/ExecutionStepNode.d.ts +14 -0
- package/dist/components/execution/ExecutionStepNode.d.ts.map +1 -0
- package/dist/components/execution/ExecutionStepNode.js +47 -0
- package/dist/components/execution/ExecutionStepNode.js.map +1 -0
- package/dist/components/execution/ExecutionTree.d.ts +3 -2
- package/dist/components/execution/ExecutionTree.d.ts.map +1 -1
- package/dist/components/execution/ExecutionTree.js +28 -3
- package/dist/components/execution/ExecutionTree.js.map +1 -1
- package/dist/components/execution/ExecutionTriggerNode.d.ts +9 -0
- package/dist/components/execution/ExecutionTriggerNode.d.ts.map +1 -0
- package/dist/components/execution/ExecutionTriggerNode.js +15 -0
- package/dist/components/execution/ExecutionTriggerNode.js.map +1 -0
- package/dist/components/execution/ExecutionViewer.d.ts.map +1 -1
- package/dist/components/execution/ExecutionViewer.js +2 -2
- package/dist/components/execution/ExecutionViewer.js.map +1 -1
- package/dist/components/execution/SchemaAwareRenderer.d.ts.map +1 -1
- package/dist/components/execution/SchemaAwareRenderer.js +4 -2
- package/dist/components/execution/SchemaAwareRenderer.js.map +1 -1
- package/dist/components/execution/StepAgentPanels.d.ts +9 -0
- package/dist/components/execution/StepAgentPanels.d.ts.map +1 -0
- package/dist/components/execution/StepAgentPanels.js +133 -0
- package/dist/components/execution/StepAgentPanels.js.map +1 -0
- package/dist/components/execution/StepDetailPanel.d.ts +3 -2
- package/dist/components/execution/StepDetailPanel.d.ts.map +1 -1
- package/dist/components/execution/StepDetailPanel.js +70 -4
- package/dist/components/execution/StepDetailPanel.js.map +1 -1
- package/dist/components/execution/execution-layout.d.ts +31 -0
- package/dist/components/execution/execution-layout.d.ts.map +1 -0
- package/dist/components/execution/execution-layout.js +90 -0
- package/dist/components/execution/execution-layout.js.map +1 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +3 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/shared/AttachmentCard.d.ts +18 -0
- package/dist/components/shared/AttachmentCard.d.ts.map +1 -0
- package/dist/components/shared/AttachmentCard.js +56 -0
- package/dist/components/shared/AttachmentCard.js.map +1 -0
- package/dist/components/shared/JsonTreeViewer.d.ts +9 -0
- package/dist/components/shared/JsonTreeViewer.d.ts.map +1 -0
- package/dist/components/shared/JsonTreeViewer.js +46 -0
- package/dist/components/shared/JsonTreeViewer.js.map +1 -0
- package/dist/components/workflows/WorkflowBrowser.d.ts +14 -0
- package/dist/components/workflows/WorkflowBrowser.d.ts.map +1 -0
- package/dist/components/workflows/WorkflowBrowser.js +300 -0
- package/dist/components/workflows/WorkflowBrowser.js.map +1 -0
- package/dist/hooks/use-approval-count.d.ts +3 -0
- package/dist/hooks/use-approval-count.d.ts.map +1 -0
- package/dist/hooks/use-approval-count.js +29 -0
- package/dist/hooks/use-approval-count.js.map +1 -0
- package/dist/hooks/use-execution-viewer.d.ts +6 -0
- package/dist/hooks/use-execution-viewer.d.ts.map +1 -1
- package/dist/hooks/use-execution-viewer.js +14 -0
- package/dist/hooks/use-execution-viewer.js.map +1 -1
- package/dist/hooks/use-folder-list.d.ts +2 -1
- package/dist/hooks/use-folder-list.d.ts.map +1 -1
- package/dist/hooks/use-folder-list.js +7 -3
- package/dist/hooks/use-folder-list.js.map +1 -1
- package/dist/hooks/use-schema-form.d.ts.map +1 -1
- package/dist/hooks/use-schema-form.js +16 -5
- package/dist/hooks/use-schema-form.js.map +1 -1
- package/dist/hooks/use-variable-picker.d.ts.map +1 -1
- package/dist/hooks/use-variable-picker.js +8 -0
- package/dist/hooks/use-variable-picker.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { FolderSymlink, Pencil, Trash2 } from 'lucide-react';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
5
|
+
import { cn } from '../shared/cn.js';
|
|
6
|
+
import { ROW_ESTIMATE_GRID_PX } from './constants.js';
|
|
7
|
+
import { defaultLeading, isEntryDisabled, useScrollMargin } from './utils.js';
|
|
8
|
+
function colsFor(width) {
|
|
9
|
+
if (width >= 1280)
|
|
10
|
+
return 5;
|
|
11
|
+
if (width >= 1024)
|
|
12
|
+
return 4;
|
|
13
|
+
if (width >= 640)
|
|
14
|
+
return 3;
|
|
15
|
+
return 2;
|
|
16
|
+
}
|
|
17
|
+
function useResponsiveCols() {
|
|
18
|
+
const [cols, setCols] = useState(() => typeof window === 'undefined' ? 2 : colsFor(window.innerWidth));
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const update = () => { setCols(colsFor(window.innerWidth)); };
|
|
21
|
+
update();
|
|
22
|
+
window.addEventListener('resize', update);
|
|
23
|
+
return () => { window.removeEventListener('resize', update); };
|
|
24
|
+
}, []);
|
|
25
|
+
return cols;
|
|
26
|
+
}
|
|
27
|
+
export function EntryGrid({ entries, onOpen, renderLeading = defaultLeading, disableFiles = false, disableFolders = false, onDelete, onRename, onMove, selectedIds, onToggleSelect, scrollParentRef, }) {
|
|
28
|
+
const isSelecting = (selectedIds?.size ?? 0) > 0;
|
|
29
|
+
const cols = useResponsiveCols();
|
|
30
|
+
const rowCount = Math.ceil(entries.length / cols);
|
|
31
|
+
const [editingId, setEditingId] = useState(null);
|
|
32
|
+
const [editingValue, setEditingValue] = useState('');
|
|
33
|
+
const startEdit = (e) => {
|
|
34
|
+
setEditingId(e.id);
|
|
35
|
+
setEditingValue(e.name);
|
|
36
|
+
};
|
|
37
|
+
const cancelEdit = () => {
|
|
38
|
+
setEditingId(null);
|
|
39
|
+
setEditingValue('');
|
|
40
|
+
};
|
|
41
|
+
const commitEdit = (e) => {
|
|
42
|
+
const next = editingValue.trim();
|
|
43
|
+
setEditingId(null);
|
|
44
|
+
setEditingValue('');
|
|
45
|
+
if (next && next !== e.name) {
|
|
46
|
+
onRename?.(e, next);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const { listRef: gridRef, scrollMargin } = useScrollMargin(scrollParentRef);
|
|
50
|
+
const virtualizer = useVirtualizer({
|
|
51
|
+
count: rowCount,
|
|
52
|
+
getScrollElement: () => scrollParentRef.current,
|
|
53
|
+
estimateSize: () => ROW_ESTIMATE_GRID_PX,
|
|
54
|
+
overscan: 3,
|
|
55
|
+
scrollMargin,
|
|
56
|
+
getItemKey: (i) => `row-${String(i)}-c${String(cols)}`,
|
|
57
|
+
});
|
|
58
|
+
return (_jsx("div", { ref: gridRef, role: "list", className: "animate-fade-up", style: { height: `${String(virtualizer.getTotalSize())}px`, position: 'relative' }, children: virtualizer.getVirtualItems().map((virtualRow) => {
|
|
59
|
+
const start = virtualRow.index * cols;
|
|
60
|
+
const rowEntries = entries.slice(start, start + cols);
|
|
61
|
+
return (_jsx("div", { "data-index": virtualRow.index, ref: virtualizer.measureElement, className: "absolute left-0 right-0 grid gap-3 pb-3", style: {
|
|
62
|
+
transform: `translateY(${String(virtualRow.start - virtualizer.options.scrollMargin)}px)`,
|
|
63
|
+
gridTemplateColumns: `repeat(${String(cols)}, minmax(0, 1fr))`,
|
|
64
|
+
}, children: rowEntries.map((e, rowIdx) => {
|
|
65
|
+
const entryIndex = start + rowIdx;
|
|
66
|
+
const intrinsicallyDisabled = isEntryDisabled(e, disableFiles, disableFolders);
|
|
67
|
+
const isEditing = editingId === e.id;
|
|
68
|
+
const disabled = intrinsicallyDisabled || isEditing;
|
|
69
|
+
return (_jsxs("div", { role: "listitem", className: "group relative", children: [_jsxs("button", { type: "button", disabled: disabled, onClick: () => { onOpen?.(e); }, className: cn('flex w-full flex-col items-start gap-3 rounded-2xl border bg-surface-elevated p-4 text-left transition', e.status === 'pending' || e.status === 'processing'
|
|
70
|
+
? 'animate-pulse border-ring/60 ring-1 ring-ring/25'
|
|
71
|
+
: 'border-border', disabled
|
|
72
|
+
? 'cursor-default'
|
|
73
|
+
: 'hover:border-ring/40 hover:bg-secondary/60 active:scale-[0.99]', isEditing && 'border-ring/60 ring-1 ring-ring/30'), title: e.name, children: [_jsx("div", { className: "pl-1 pt-1", children: renderLeading(e, 'md') }), _jsxs("span", { className: "flex w-full min-w-0 flex-col gap-0.5", children: [_jsx("span", { className: "flex min-w-0 items-center gap-1.5", children: isEditing ? (_jsx("input", { type: "text", autoFocus: true, value: editingValue, onChange: (ev) => { setEditingValue(ev.target.value); }, onFocus: (ev) => { ev.target.select(); }, onClick: (ev) => { ev.stopPropagation(); }, onMouseDown: (ev) => { ev.stopPropagation(); }, onKeyDown: (ev) => {
|
|
74
|
+
if (ev.key === 'Enter') {
|
|
75
|
+
ev.preventDefault();
|
|
76
|
+
ev.stopPropagation();
|
|
77
|
+
commitEdit(e);
|
|
78
|
+
}
|
|
79
|
+
else if (ev.key === 'Escape') {
|
|
80
|
+
ev.preventDefault();
|
|
81
|
+
ev.stopPropagation();
|
|
82
|
+
cancelEdit();
|
|
83
|
+
}
|
|
84
|
+
}, onBlur: () => { commitEdit(e); }, maxLength: 255, className: "min-w-0 flex-1 truncate rounded-sm border border-ring/50 bg-background px-1.5 py-0.5 text-[13.5px] font-medium text-foreground outline-none focus:border-ring" })) : (_jsx("span", { className: "truncate text-[13.5px] font-medium text-foreground", children: e.name })) }), e.caption ? (_jsx("span", { className: "truncate text-[11.5px] text-muted-foreground", children: e.caption })) : null] })] }), onToggleSelect && (_jsx("button", { type: "button", "aria-label": selectedIds?.has(e.id) ? `Deselect ${e.name}` : `Select ${e.name}`, onClick: (ev) => { ev.stopPropagation(); onToggleSelect(e, entryIndex, ev.shiftKey); }, className: cn('absolute left-2 top-2 flex h-5 w-5 items-center justify-center rounded-md border transition', selectedIds?.has(e.id)
|
|
85
|
+
? 'border-foreground bg-foreground text-background opacity-100'
|
|
86
|
+
: 'border-border bg-background/80 backdrop-blur-sm', isSelecting ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'), children: selectedIds?.has(e.id) && (_jsx("svg", { viewBox: "0 0 24 24", className: "h-3 w-3", fill: "none", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) })) })), !isEditing && (onRename ?? onDelete ?? onMove) ? (_jsxs("div", { className: "absolute right-2 top-2 flex gap-1 opacity-0 transition group-hover:opacity-100 focus-within:opacity-100", children: [onMove ? (_jsx("button", { type: "button", "aria-label": `Move ${e.name}`, title: "Move", onClick: (ev) => { ev.stopPropagation(); onMove(e); }, className: "grid h-7 w-7 place-items-center rounded-md bg-background/80 text-muted-foreground shadow-sm ring-1 ring-border backdrop-blur-sm transition hover:bg-secondary hover:text-foreground", children: _jsx(FolderSymlink, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })) : null, onRename ? (_jsx("button", { type: "button", "aria-label": `Rename ${e.name}`, title: "Rename", onClick: (ev) => { ev.stopPropagation(); startEdit(e); }, className: "grid h-7 w-7 place-items-center rounded-md bg-background/80 text-muted-foreground shadow-sm ring-1 ring-border backdrop-blur-sm transition hover:bg-secondary hover:text-foreground", children: _jsx(Pencil, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })) : null, onDelete ? (_jsx("button", { type: "button", "aria-label": `Delete ${e.name}`, title: "Delete", onClick: (ev) => { ev.stopPropagation(); onDelete(e); }, className: "grid h-7 w-7 place-items-center rounded-md bg-background/80 text-muted-foreground shadow-sm ring-1 ring-border backdrop-blur-sm transition hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-950/40", children: _jsx(Trash2, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })) : null] })) : null] }, `${e.kind}-${e.id}`));
|
|
87
|
+
}) }, virtualRow.key));
|
|
88
|
+
}) }));
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=EntryGrid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryGrid.js","sourceRoot":"","sources":["../../../src/components/browser/EntryGrid.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BrowserEntry, ColumnDef, LeadingRenderer } from './types.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
entries: ReadonlyArray<BrowserEntry>;
|
|
4
|
+
columns?: ReadonlyArray<ColumnDef>;
|
|
5
|
+
onOpen?: (entry: BrowserEntry) => void;
|
|
6
|
+
nameHeader?: string;
|
|
7
|
+
renderLeading?: LeadingRenderer;
|
|
8
|
+
disableFiles?: boolean;
|
|
9
|
+
disableFolders?: boolean;
|
|
10
|
+
onDelete?: (entry: BrowserEntry) => void;
|
|
11
|
+
onRename?: (entry: BrowserEntry, newName: string) => void;
|
|
12
|
+
onMove?: (entry: BrowserEntry) => void;
|
|
13
|
+
selectedIds?: ReadonlySet<string>;
|
|
14
|
+
onToggleSelect?: (entry: BrowserEntry, index: number, shiftKey: boolean) => void;
|
|
15
|
+
scrollParentRef: React.RefObject<HTMLElement | null>;
|
|
16
|
+
};
|
|
17
|
+
export declare function EntryList({ entries, columns, onOpen, nameHeader, renderLeading, disableFiles, disableFolders, onDelete, onRename, onMove, selectedIds, onToggleSelect, scrollParentRef, }: Props): import("react").JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=EntryList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryList.d.ts","sourceRoot":"","sources":["../../../src/components/browser/EntryList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI3E,KAAK,KAAK,GAAG;IACX,OAAO,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACjF,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACtD,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,OAAY,EACZ,MAAM,EACN,UAAmB,EACnB,aAA8B,EAC9B,YAAoB,EACpB,cAAsB,EACtB,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,WAAW,EACX,cAAc,EACd,eAAe,GAChB,EAAE,KAAK,+BA8NP"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { FolderSymlink, Pencil, Trash2 } from 'lucide-react';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
5
|
+
import { cn } from '../shared/cn.js';
|
|
6
|
+
import { DEFAULT_COL_WIDTH, ROW_ESTIMATE_LIST_PX } from './constants.js';
|
|
7
|
+
import { defaultLeading, isEntryDisabled, useScrollMargin } from './utils.js';
|
|
8
|
+
export function EntryList({ entries, columns = [], onOpen, nameHeader = 'Name', renderLeading = defaultLeading, disableFiles = false, disableFolders = false, onDelete, onRename, onMove, selectedIds, onToggleSelect, scrollParentRef, }) {
|
|
9
|
+
const isSelecting = (selectedIds?.size ?? 0) > 0;
|
|
10
|
+
const [editingId, setEditingId] = useState(null);
|
|
11
|
+
const [editingValue, setEditingValue] = useState('');
|
|
12
|
+
const startEdit = (e) => {
|
|
13
|
+
setEditingId(e.id);
|
|
14
|
+
setEditingValue(e.name);
|
|
15
|
+
};
|
|
16
|
+
const cancelEdit = () => {
|
|
17
|
+
setEditingId(null);
|
|
18
|
+
setEditingValue('');
|
|
19
|
+
};
|
|
20
|
+
const commitEdit = (e) => {
|
|
21
|
+
const next = editingValue.trim();
|
|
22
|
+
setEditingId(null);
|
|
23
|
+
setEditingValue('');
|
|
24
|
+
if (next && next !== e.name) {
|
|
25
|
+
onRename?.(e, next);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const trailingActions = (onMove ? 1 : 0) + (onRename ? 1 : 0) + (onDelete ? 1 : 0);
|
|
29
|
+
const template = [
|
|
30
|
+
'1fr',
|
|
31
|
+
...columns.map((c) => c.width ?? DEFAULT_COL_WIDTH),
|
|
32
|
+
...(trailingActions > 0 ? [`${String(trailingActions * 36)}px`] : []),
|
|
33
|
+
].join(' ');
|
|
34
|
+
const { listRef, scrollMargin } = useScrollMargin(scrollParentRef);
|
|
35
|
+
const virtualizer = useVirtualizer({
|
|
36
|
+
count: entries.length,
|
|
37
|
+
getScrollElement: () => scrollParentRef.current,
|
|
38
|
+
estimateSize: () => ROW_ESTIMATE_LIST_PX,
|
|
39
|
+
overscan: 6,
|
|
40
|
+
scrollMargin,
|
|
41
|
+
getItemKey: (i) => {
|
|
42
|
+
const entry = entries[i];
|
|
43
|
+
return entry ? `${entry.kind}-${entry.id}` : `i-${String(i)}`;
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
const virtualRows = virtualizer.getVirtualItems();
|
|
47
|
+
return (_jsxs("div", { className: "animate-fade-up overflow-hidden rounded-2xl border border-border bg-surface-elevated", children: [_jsxs("div", { className: "grid items-center gap-3 border-b border-border bg-surface-muted/60 px-4 py-2 text-[11.5px] font-medium uppercase tracking-wide text-muted-foreground", style: { gridTemplateColumns: template }, children: [_jsx("span", { children: nameHeader }), columns.map((c) => (_jsx("span", { className: c.mdOnly === false ? undefined : 'hidden md:block', children: c.header }, `h-${c.key}`))), trailingActions > 0 ? _jsx("span", { "aria-hidden": true }) : null] }), _jsx("div", { ref: listRef, role: "list", style: { height: `${String(virtualizer.getTotalSize())}px`, position: 'relative' }, children: virtualRows.map((virtualRow) => {
|
|
48
|
+
const e = entries[virtualRow.index];
|
|
49
|
+
if (!e)
|
|
50
|
+
return null;
|
|
51
|
+
const intrinsicallyDisabled = isEntryDisabled(e, disableFiles, disableFolders);
|
|
52
|
+
const isEditing = editingId === e.id;
|
|
53
|
+
const disabled = intrinsicallyDisabled || isEditing;
|
|
54
|
+
return (_jsx("div", { role: "listitem", "data-index": virtualRow.index, ref: virtualizer.measureElement, className: cn('group absolute left-0 right-0', virtualRow.index > 0 && 'border-t border-border'), style: {
|
|
55
|
+
transform: `translateY(${String(virtualRow.start - virtualizer.options.scrollMargin)}px)`,
|
|
56
|
+
}, children: _jsxs("div", { className: cn('grid w-full items-center gap-3 px-4 py-2 transition', (e.status === 'pending' || e.status === 'processing') &&
|
|
57
|
+
'animate-pulse ring-1 ring-inset ring-ring/30', disabled ? 'cursor-default' : 'hover:bg-secondary/60', isEditing && 'bg-secondary/50'), style: { gridTemplateColumns: template }, title: e.name, children: [_jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [onToggleSelect && (_jsx("button", { type: "button", "aria-label": selectedIds?.has(e.id) ? `Deselect ${e.name}` : `Select ${e.name}`, onClick: (ev) => { ev.stopPropagation(); onToggleSelect(e, virtualRow.index, ev.shiftKey); }, className: cn('flex h-5 w-5 shrink-0 items-center justify-center rounded-md border transition', selectedIds?.has(e.id)
|
|
58
|
+
? 'border-foreground bg-foreground text-background opacity-100'
|
|
59
|
+
: 'border-border bg-background/80', isSelecting ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'), children: selectedIds?.has(e.id) && (_jsx("svg", { viewBox: "0 0 24 24", className: "h-3 w-3", fill: "none", stroke: "currentColor", strokeWidth: 2.5, strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("polyline", { points: "20 6 9 17 4 12" }) })) })), _jsx("span", { className: "flex-shrink-0 pr-1", children: renderLeading(e, 'sm') }), isEditing ? (_jsx("input", { type: "text", autoFocus: true, value: editingValue, onChange: (ev) => { setEditingValue(ev.target.value); }, onFocus: (ev) => { ev.target.select(); }, onClick: (ev) => { ev.stopPropagation(); }, onMouseDown: (ev) => { ev.stopPropagation(); }, onKeyDown: (ev) => {
|
|
60
|
+
if (ev.key === 'Enter') {
|
|
61
|
+
ev.preventDefault();
|
|
62
|
+
ev.stopPropagation();
|
|
63
|
+
commitEdit(e);
|
|
64
|
+
}
|
|
65
|
+
else if (ev.key === 'Escape') {
|
|
66
|
+
ev.preventDefault();
|
|
67
|
+
ev.stopPropagation();
|
|
68
|
+
cancelEdit();
|
|
69
|
+
}
|
|
70
|
+
}, onBlur: () => { commitEdit(e); }, maxLength: 255, className: "min-w-0 flex-1 truncate rounded-sm border border-ring/50 bg-background px-1.5 py-0.5 text-[13.5px] font-medium text-foreground outline-none focus:border-ring" })) : (_jsx("button", { type: "button", disabled: disabled, onClick: () => { onOpen?.(e); }, className: "flex min-w-0 items-center gap-3 text-left disabled:cursor-default", children: _jsx("span", { className: "truncate text-[13.5px] font-medium text-foreground", children: e.name }) }))] }), columns.map((c) => (_jsx("button", { type: "button", disabled: disabled, onClick: () => { onOpen?.(e); }, className: cn(c.mdOnly === false ? undefined : 'hidden md:block', 'truncate text-left tabular-nums text-[12px] text-muted-foreground disabled:cursor-default'), children: c.render ? c.render(e) : (e.columns?.[c.key] ?? '—') }, `c-${c.key}`))), trailingActions > 0 ? (_jsxs("div", { className: cn('flex items-center justify-end gap-0.5 transition', isEditing
|
|
71
|
+
? 'pointer-events-none opacity-0'
|
|
72
|
+
: 'opacity-0 group-hover:opacity-100 focus-within:opacity-100'), children: [onMove ? (_jsx("button", { type: "button", "aria-label": `Move ${e.name}`, title: "Move", onClick: (ev) => { ev.stopPropagation(); onMove(e); }, className: "grid h-7 w-7 place-items-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground", children: _jsx(FolderSymlink, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })) : null, onRename ? (_jsx("button", { type: "button", "aria-label": `Rename ${e.name}`, title: "Rename", onClick: (ev) => { ev.stopPropagation(); startEdit(e); }, className: "grid h-7 w-7 place-items-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground", children: _jsx(Pencil, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })) : null, onDelete ? (_jsx("button", { type: "button", "aria-label": `Delete ${e.name}`, title: "Delete", onClick: (ev) => { ev.stopPropagation(); onDelete(e); }, className: "grid h-7 w-7 place-items-center rounded-md text-muted-foreground transition hover:bg-red-50 hover:text-red-600 dark:hover:bg-red-950/40", children: _jsx(Trash2, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })) : null] })) : null] }) }, virtualRow.key));
|
|
73
|
+
}) })] }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=EntryList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntryList.js","sourceRoot":"","sources":["../../../src/components/browser/EntryList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FolderCard.d.ts","sourceRoot":"","sources":["../../../src/components/browser/FolderCard.tsx"],"names":[],"mappings":"AAGA,KAAK,KAAK,GAAG;IACX,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,IAAW,EAAE,EAAE,KAAK,+BAgBhD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Folder } from 'lucide-react';
|
|
3
|
+
import { cn } from '../shared/cn.js';
|
|
4
|
+
export function FolderCard({ size = 'md' }) {
|
|
5
|
+
const isSm = size === 'sm';
|
|
6
|
+
return (_jsx("div", { "aria-hidden": true, className: cn('flex items-center justify-center', isSm ? 'h-9 w-9' : 'h-14 w-14'), children: _jsx(Folder, { strokeWidth: 1.5, className: cn('text-muted-foreground', isSm ? 'h-5 w-5' : 'h-10 w-10') }) }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=FolderCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FolderCard.js","sourceRoot":"","sources":["../../../src/components/browser/FolderCard.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAMrC,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,EAAS;IAC/C,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3B,OAAO,CACL,mCAEE,SAAS,EAAE,EAAE,CACX,kCAAkC,EAClC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAC/B,YAED,KAAC,MAAM,IACL,WAAW,EAAE,GAAG,EAChB,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,GACtE,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { BrowserEntry } from './types.js';
|
|
2
|
+
interface FolderRecord {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
parentId?: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface MoveDialogProps {
|
|
8
|
+
entries: BrowserEntry[];
|
|
9
|
+
folders: FolderRecord[];
|
|
10
|
+
currentParentId: string | null;
|
|
11
|
+
onMove: (targetFolderId: string | null) => void;
|
|
12
|
+
onClose: () => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function MoveDialog({ entries, folders, currentParentId, onMove, onClose }: MoveDialogProps): import("react").ReactPortal | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=MoveDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoveDialog.d.ts","sourceRoot":"","sources":["../../../src/components/browser/MoveDialog.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAiBD,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,eAAe,sCA+RjG"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { Check, ChevronRight, Folder, Search, X } from 'lucide-react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
5
|
+
import { cn } from '../shared/cn.js';
|
|
6
|
+
function getDescendantIds(id, folders) {
|
|
7
|
+
const result = new Set([id]);
|
|
8
|
+
const queue = [id];
|
|
9
|
+
while (queue.length > 0) {
|
|
10
|
+
const cur = queue.shift();
|
|
11
|
+
for (const f of folders) {
|
|
12
|
+
if (f.parentId === cur) {
|
|
13
|
+
result.add(f.id);
|
|
14
|
+
queue.push(f.id);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
export function MoveDialog({ entries, folders, currentParentId, onMove, onClose }) {
|
|
21
|
+
// If any selected entry is a workflow, Root is not a valid destination
|
|
22
|
+
const hasFolderOnly = entries.every((e) => e.kind === 'folder');
|
|
23
|
+
const entry = entries[0]; // used for display title
|
|
24
|
+
const [query, setQuery] = useState('');
|
|
25
|
+
// Navigation path: array of {id, name} representing the drill-down trail.
|
|
26
|
+
// Empty = browsing root.
|
|
27
|
+
const [browsePath, setBrowsePath] = useState([]);
|
|
28
|
+
// Selected destination: undefined = nothing, null = root, string = folder id.
|
|
29
|
+
const [selected, setSelected] = useState(undefined);
|
|
30
|
+
const browsedFolderId = browsePath.at(-1)?.id ?? null;
|
|
31
|
+
const excludedIds = useMemo(() => {
|
|
32
|
+
const result = new Set();
|
|
33
|
+
for (const e of entries) {
|
|
34
|
+
if (e.kind === 'folder') {
|
|
35
|
+
for (const id of getDescendantIds(e.id, folders))
|
|
36
|
+
result.add(id);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
}, [entries, folders]);
|
|
41
|
+
const hasChildren = (folderId) => folders.some((f) => f.parentId === folderId && !excludedIds.has(f.id));
|
|
42
|
+
// In search mode: flat filtered list. Otherwise: children of browsedFolderId.
|
|
43
|
+
const visibleFolders = useMemo(() => {
|
|
44
|
+
const q = query.trim().toLowerCase();
|
|
45
|
+
const pool = folders.filter((f) => !excludedIds.has(f.id));
|
|
46
|
+
if (q) {
|
|
47
|
+
return pool.filter((f) => f.name.toLowerCase().includes(q));
|
|
48
|
+
}
|
|
49
|
+
return pool.filter((f) => browsedFolderId ? f.parentId === browsedFolderId : !f.parentId);
|
|
50
|
+
}, [folders, excludedIds, query, browsedFolderId]);
|
|
51
|
+
const isCurrentLocation = (id) => id === currentParentId;
|
|
52
|
+
const selectedLabel = useMemo(() => {
|
|
53
|
+
if (selected === undefined)
|
|
54
|
+
return null;
|
|
55
|
+
if (selected === null)
|
|
56
|
+
return 'Root';
|
|
57
|
+
return folders.find((f) => f.id === selected)?.name ?? null;
|
|
58
|
+
}, [selected, folders]);
|
|
59
|
+
const canMove = selected !== undefined && selected !== currentParentId;
|
|
60
|
+
const drillInto = (folder) => {
|
|
61
|
+
setQuery('');
|
|
62
|
+
setBrowsePath((prev) => [...prev, { id: folder.id, name: folder.name }]);
|
|
63
|
+
};
|
|
64
|
+
const goToPathIndex = (index) => {
|
|
65
|
+
setBrowsePath((prev) => (index < 0 ? [] : prev.slice(0, index + 1)));
|
|
66
|
+
};
|
|
67
|
+
const handleBackdrop = (e) => {
|
|
68
|
+
if (e.target === e.currentTarget)
|
|
69
|
+
onClose();
|
|
70
|
+
};
|
|
71
|
+
if (typeof document === 'undefined')
|
|
72
|
+
return null;
|
|
73
|
+
return createPortal(_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center px-4", onMouseDown: handleBackdrop, children: [_jsx("div", { "aria-hidden": true, className: "absolute inset-0 bg-black/40 backdrop-blur-sm" }), _jsxs("div", { className: "relative z-10 flex w-full max-w-2xl flex-col overflow-hidden rounded-2xl border border-border bg-background shadow-2xl", children: [_jsxs("div", { className: "flex items-center justify-between px-6 py-4", children: [_jsx("h2", { className: "text-[15px] font-semibold text-foreground", children: entries.length === 1
|
|
74
|
+
? _jsxs(_Fragment, { children: ["Move \u201C", entry.name, "\u201D"] })
|
|
75
|
+
: _jsxs(_Fragment, { children: ["Move ", entries.length, " items"] }) }), _jsx("button", { type: "button", onClick: onClose, className: "grid h-7 w-7 place-items-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground", children: _jsx(X, { className: "h-4 w-4", strokeWidth: 1.75 }) })] }), _jsx("div", { className: "border-t border-border" }), _jsx("div", { className: "px-6 py-4", children: _jsxs("div", { className: "flex items-center gap-2.5 rounded-full border border-border bg-surface-elevated px-4 py-2.5", children: [_jsx(Search, { className: "h-4 w-4 shrink-0 text-muted-foreground", strokeWidth: 1.75 }), _jsx("input", { autoFocus: true, type: "text", placeholder: "Search folders\u2026", value: query, onChange: (e) => { setQuery(e.target.value); }, className: "flex-1 bg-transparent text-[13.5px] text-foreground placeholder:text-muted-foreground/70 outline-none" }), query && (_jsx("button", { type: "button", onClick: () => { setQuery(''); }, className: "grid h-4 w-4 place-items-center text-muted-foreground transition hover:text-foreground", children: _jsx(X, { className: "h-3 w-3", strokeWidth: 2 }) }))] }) }), _jsx("div", { className: "border-t border-border" }), !query && browsePath.length > 0 && (_jsxs("div", { className: "flex items-center gap-1 border-b border-border px-6 py-2 text-[12px] text-muted-foreground", children: [_jsx("button", { type: "button", onClick: () => { goToPathIndex(-1); }, className: "rounded px-1 py-0.5 transition hover:bg-secondary hover:text-foreground", children: "Root" }), browsePath.map((seg, i) => {
|
|
76
|
+
const isLast = i === browsePath.length - 1;
|
|
77
|
+
return (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: "text-muted-foreground/50", children: "\u203A" }), isLast ? (_jsx("span", { className: "px-1 py-0.5 font-medium text-foreground", children: seg.name })) : (_jsx("button", { type: "button", onClick: () => { goToPathIndex(i); }, className: "rounded px-1 py-0.5 transition hover:bg-secondary hover:text-foreground", children: seg.name }))] }, seg.id));
|
|
78
|
+
})] })), _jsx("div", { className: "min-h-[200px] max-h-[360px] overflow-y-auto px-6 py-4", children: visibleFolders.length === 0 && !(hasFolderOnly && !query && browsePath.length === 0) ? (_jsx("div", { className: "flex h-40 items-center justify-center text-[13px] text-muted-foreground", children: query ? 'No folders match your search' : 'No folders here' })) : (_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [hasFolderOnly && !query && browsePath.length === 0 && (() => {
|
|
79
|
+
const isCurrent = currentParentId === null;
|
|
80
|
+
const isSelected = selected === null;
|
|
81
|
+
return (_jsxs("button", { type: "button", disabled: isCurrent, onClick: () => { setSelected(isSelected ? undefined : null); }, className: cn('flex items-center gap-3 rounded-xl border px-4 py-3 text-left transition', isCurrent
|
|
82
|
+
? 'cursor-default border-border opacity-40'
|
|
83
|
+
: isSelected
|
|
84
|
+
? 'border-ring bg-secondary/60'
|
|
85
|
+
: 'border-border hover:border-ring/50 hover:bg-secondary/40'), children: [_jsx("div", { className: cn('flex h-9 w-9 shrink-0 items-center justify-center rounded-lg transition', isSelected ? 'bg-foreground/10' : 'bg-surface-muted'), children: isSelected
|
|
86
|
+
? _jsx(Check, { className: "h-4 w-4 text-foreground", strokeWidth: 2 })
|
|
87
|
+
: _jsx(Folder, { className: "h-4 w-4 text-muted-foreground", strokeWidth: 1.5 }) }), _jsxs("span", { className: "truncate text-[13px] font-medium text-foreground", children: ["Root", isCurrent && _jsx("span", { className: "ml-1 text-[11px] font-normal text-muted-foreground", children: "(current)" })] })] }, "__root__"));
|
|
88
|
+
})(), visibleFolders.map((f) => {
|
|
89
|
+
const isCurrent = isCurrentLocation(f.id);
|
|
90
|
+
const isSelected = selected === f.id;
|
|
91
|
+
const hasKids = hasChildren(f.id);
|
|
92
|
+
return (_jsxs("div", { className: "flex overflow-hidden rounded-xl border border-border transition hover:border-ring/50", children: [_jsxs("button", { type: "button", disabled: isCurrent, onClick: () => { setSelected(isSelected ? undefined : f.id); }, className: cn('flex flex-1 items-center gap-3 px-4 py-3 text-left transition', isCurrent
|
|
93
|
+
? 'cursor-default opacity-40'
|
|
94
|
+
: isSelected
|
|
95
|
+
? 'bg-secondary/60'
|
|
96
|
+
: 'hover:bg-secondary/40'), children: [_jsx("div", { className: cn('flex h-9 w-9 shrink-0 items-center justify-center rounded-lg transition', isSelected ? 'bg-foreground/10' : 'bg-surface-muted'), children: isSelected ? (_jsx(Check, { className: "h-4 w-4 text-foreground", strokeWidth: 2 })) : (_jsx(Folder, { className: "h-4 w-4 text-muted-foreground", strokeWidth: 1.5 })) }), _jsxs("span", { className: "truncate text-[13px] font-medium text-foreground", children: [f.name, isCurrent && (_jsx("span", { className: "ml-1 text-[11px] font-normal text-muted-foreground", children: "(current)" }))] })] }), hasKids && (_jsxs(_Fragment, { children: [_jsx("div", { className: "w-px self-stretch bg-border" }), _jsx("button", { type: "button", onClick: () => { drillInto(f); }, title: `Open ${f.name}`, className: "flex items-center px-3 text-muted-foreground/60 transition hover:bg-secondary/60 hover:text-foreground", children: _jsx(ChevronRight, { className: "h-4 w-4", strokeWidth: 1.75 }) })] }))] }, f.id));
|
|
97
|
+
})] })) }), _jsx("div", { className: "border-t border-border" }), _jsxs("div", { className: "flex items-center justify-between gap-4 px-6 py-4", children: [_jsx("p", { className: "min-w-0 truncate text-[13px] text-muted-foreground", children: selectedLabel
|
|
98
|
+
? (_jsxs(_Fragment, { children: ["Moving to:", ' ', _jsx("span", { className: "font-medium text-foreground", children: selectedLabel })] }))
|
|
99
|
+
: (_jsx("span", { className: "italic", children: "Select a destination folder" })) }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx("button", { type: "button", onClick: onClose, className: "inline-flex h-9 items-center rounded-full border border-border px-4 text-[13px] text-foreground transition hover:bg-secondary", children: "Cancel" }), _jsx("button", { type: "button", disabled: !canMove, onClick: () => { if (selected !== undefined)
|
|
100
|
+
onMove(selected); }, className: "inline-flex h-9 items-center rounded-full bg-foreground px-5 text-[13px] font-medium text-background transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-40", children: "Move here" })] })] })] })] }), document.body);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=MoveDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MoveDialog.js","sourceRoot":"","sources":["../../../src/components/browser/MoveDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
open: boolean;
|
|
3
|
+
title: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
label: string;
|
|
6
|
+
placeholder?: string;
|
|
7
|
+
helper?: string;
|
|
8
|
+
submitLabel?: string;
|
|
9
|
+
initialValue?: string;
|
|
10
|
+
onSubmit: (name: string) => Promise<void> | void;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
maxLength?: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function NameDialog({ open, title, description, label, placeholder, helper, submitLabel, initialValue, onSubmit, onClose, maxLength, }: Props): import("react").ReactPortal | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=NameDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NameDialog.d.ts","sourceRoot":"","sources":["../../../src/components/browser/NameDialog.tsx"],"names":[],"mappings":"AAKA,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,EACL,WAAW,EACX,MAAM,EACN,WAAsB,EACtB,YAAiB,EACjB,QAAQ,EACR,OAAO,EACP,SAAe,GAChB,EAAE,KAAK,sCA8KP"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useId, useRef, useState } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { Loader2, X } from 'lucide-react';
|
|
5
|
+
import { cn } from '../shared/cn.js';
|
|
6
|
+
export function NameDialog({ open, title, description, label, placeholder, helper, submitLabel = 'Create', initialValue = '', onSubmit, onClose, maxLength = 255, }) {
|
|
7
|
+
const [value, setValue] = useState(initialValue);
|
|
8
|
+
const [error, setError] = useState(null);
|
|
9
|
+
const [busy, setBusy] = useState(false);
|
|
10
|
+
const inputRef = useRef(null);
|
|
11
|
+
const labelId = useId();
|
|
12
|
+
const descId = useId();
|
|
13
|
+
const helperId = useId();
|
|
14
|
+
const errorId = useId();
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
if (open) {
|
|
17
|
+
setValue(initialValue);
|
|
18
|
+
setError(null);
|
|
19
|
+
setBusy(false);
|
|
20
|
+
}
|
|
21
|
+
}, [open, initialValue]);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (!open)
|
|
24
|
+
return undefined;
|
|
25
|
+
const id = window.setTimeout(() => {
|
|
26
|
+
inputRef.current?.focus();
|
|
27
|
+
inputRef.current?.select();
|
|
28
|
+
}, 10);
|
|
29
|
+
return () => { window.clearTimeout(id); };
|
|
30
|
+
}, [open]);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!open)
|
|
33
|
+
return undefined;
|
|
34
|
+
const onKey = (e) => {
|
|
35
|
+
if (e.key === 'Escape' && !busy) {
|
|
36
|
+
e.stopPropagation();
|
|
37
|
+
onClose();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
window.addEventListener('keydown', onKey);
|
|
41
|
+
return () => { window.removeEventListener('keydown', onKey); };
|
|
42
|
+
}, [open, busy, onClose]);
|
|
43
|
+
if (!open || typeof document === 'undefined')
|
|
44
|
+
return null;
|
|
45
|
+
const trimmed = value.trim();
|
|
46
|
+
const isValid = trimmed.length > 0 && trimmed.length <= maxLength;
|
|
47
|
+
const handleSubmit = async () => {
|
|
48
|
+
if (!isValid || busy)
|
|
49
|
+
return;
|
|
50
|
+
setBusy(true);
|
|
51
|
+
setError(null);
|
|
52
|
+
try {
|
|
53
|
+
await onSubmit(trimmed);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
const msg = err instanceof Error ? err.message : 'Something went wrong';
|
|
57
|
+
setError(msg);
|
|
58
|
+
setBusy(false);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const onBackdropMouseDown = (e) => {
|
|
62
|
+
if (e.target === e.currentTarget && !busy)
|
|
63
|
+
onClose();
|
|
64
|
+
};
|
|
65
|
+
const describedBy = [description ? descId : null, helper ? helperId : null, error ? errorId : null]
|
|
66
|
+
.filter((x) => x !== null)
|
|
67
|
+
.join(' ');
|
|
68
|
+
return createPortal(_jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center px-4", role: "presentation", onMouseDown: onBackdropMouseDown, children: [_jsx("div", { "aria-hidden": true, className: "absolute inset-0 bg-black/50 backdrop-blur-sm animate-fade-in" }), _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-labelledby": labelId, "aria-describedby": describedBy || undefined, className: cn('relative z-10 w-full max-w-[420px] overflow-hidden rounded-2xl border border-border bg-surface-elevated shadow-2xl', 'animate-scale-in'), onMouseDown: (e) => { e.stopPropagation(); }, children: [_jsxs("div", { className: "flex items-start justify-between gap-3 px-5 pb-2 pt-4", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("h2", { id: labelId, className: "text-[15px] font-semibold leading-tight text-foreground", children: title }), description ? (_jsx("p", { id: descId, className: "mt-1 text-[12.5px] leading-snug text-muted-foreground", children: description })) : null] }), _jsx("button", { type: "button", "aria-label": "Close", disabled: busy, onClick: onClose, className: "grid h-7 w-7 flex-shrink-0 place-items-center rounded-md text-muted-foreground transition hover:bg-secondary hover:text-foreground disabled:opacity-40", children: _jsx(X, { className: "h-3.5 w-3.5", strokeWidth: 1.75 }) })] }), _jsxs("form", { onSubmit: (e) => { e.preventDefault(); void handleSubmit(); }, className: "px-5 pb-4 pt-2", children: [_jsx("label", { htmlFor: `${labelId}-input`, className: "mb-1.5 block text-[12px] font-medium text-foreground", children: label }), _jsx("input", { id: `${labelId}-input`, ref: inputRef, type: "text", value: value, disabled: busy, maxLength: maxLength, placeholder: placeholder, "aria-invalid": error !== null, "aria-describedby": describedBy || undefined, onChange: (e) => {
|
|
69
|
+
setValue(e.target.value);
|
|
70
|
+
if (error)
|
|
71
|
+
setError(null);
|
|
72
|
+
}, className: cn('block w-full rounded-lg border bg-surface px-3 py-2 text-[13.5px] text-foreground transition placeholder:text-muted-foreground/70 focus:outline-none focus:ring-2 disabled:opacity-60', error
|
|
73
|
+
? 'border-red-400 focus:border-red-500 focus:ring-red-500/30 dark:border-red-700/60'
|
|
74
|
+
: 'border-border focus:border-ring focus:ring-ring/30') }), error ? (_jsx("p", { id: errorId, role: "alert", className: "mt-1.5 text-[11.5px] leading-snug text-red-600 dark:text-red-400", children: error })) : helper ? (_jsx("p", { id: helperId, className: "mt-1.5 text-[11.5px] leading-snug text-muted-foreground", children: helper })) : null, _jsxs("div", { className: "mt-4 flex items-center justify-end gap-2", children: [_jsx("button", { type: "button", onClick: onClose, disabled: busy, className: "inline-flex h-8 items-center rounded-md px-3 text-[12.5px] text-muted-foreground transition hover:bg-secondary hover:text-foreground disabled:opacity-50", children: "Cancel" }), _jsxs("button", { type: "submit", disabled: !isValid || busy, className: cn('inline-flex h-8 items-center gap-1.5 rounded-md px-3 text-[12.5px] font-medium transition', 'bg-foreground text-background hover:opacity-90', 'disabled:cursor-not-allowed disabled:opacity-50'), children: [busy ? _jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin", strokeWidth: 1.75 }) : null, submitLabel] })] })] })] })] }), document.body);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=NameDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NameDialog.js","sourceRoot":"","sources":["../../../src/components/browser/NameDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
value: string;
|
|
3
|
+
onChange: (next: string) => void;
|
|
4
|
+
placeholder?: string;
|
|
5
|
+
autoFocus?: boolean;
|
|
6
|
+
className?: string;
|
|
7
|
+
ariaLabel?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function SearchField({ value, onChange, placeholder, autoFocus, className, ariaLabel, }: Props): import("react").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=SearchField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchField.d.ts","sourceRoot":"","sources":["../../../src/components/browser/SearchField.tsx"],"names":[],"mappings":"AAIA,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAsB,EACtB,SAAS,EACT,SAAS,EACT,SAAS,GACV,EAAE,KAAK,+BAmCP"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Search, X } from 'lucide-react';
|
|
3
|
+
import { useEffect, useRef } from 'react';
|
|
4
|
+
import { cn } from '../shared/cn.js';
|
|
5
|
+
export function SearchField({ value, onChange, placeholder = 'Search', autoFocus, className, ariaLabel, }) {
|
|
6
|
+
const inputRef = useRef(null);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
if (autoFocus) {
|
|
9
|
+
inputRef.current?.focus();
|
|
10
|
+
}
|
|
11
|
+
}, [autoFocus]);
|
|
12
|
+
return (_jsxs("div", { className: cn('relative flex items-center', className), children: [_jsx(Search, { className: "pointer-events-none absolute left-2.5 h-3.5 w-3.5 text-muted-foreground", "aria-hidden": true, strokeWidth: 1.75 }), _jsx("input", { ref: inputRef, type: "search", value: value, onChange: (e) => { onChange(e.target.value); }, placeholder: placeholder, "aria-label": ariaLabel ?? placeholder, className: "h-8 w-full rounded-full border border-border bg-surface-elevated pl-7 pr-7 text-[12.5px] text-foreground placeholder:text-muted-foreground/80 focus:border-ring focus:outline-none [&::-webkit-search-cancel-button]:hidden [&::-webkit-search-decoration]:hidden" }), value !== '' ? (_jsx("button", { type: "button", "aria-label": "Clear search", onClick: () => { onChange(''); }, className: "absolute right-2 grid h-4 w-4 place-items-center rounded-full text-muted-foreground transition hover:text-foreground", children: _jsx(X, { className: "h-3 w-3", "aria-hidden": true, strokeWidth: 2 }) })) : null] }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=SearchField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchField.js","sourceRoot":"","sources":["../../../src/components/browser/SearchField.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAWrC,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,GAAG,QAAQ,EACtB,SAAS,EACT,SAAS,EACT,SAAS,GACH;IACN,MAAM,QAAQ,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IACvD,SAAS,CAAC,GAAS,EAAE;QACnB,IAAI,SAAS,EAAE,CAAC;YACd,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAChB,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,aACzD,KAAC,MAAM,IACL,SAAS,EAAC,yEAAyE,uBAEnF,WAAW,EAAE,IAAI,GACjB,EACF,gBACE,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAC9C,WAAW,EAAE,WAAW,gBACZ,SAAS,IAAI,WAAW,EACpC,SAAS,EAAC,mQAAmQ,GAC7Q,EACD,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CACd,iBACE,IAAI,EAAC,QAAQ,gBACF,cAAc,EACzB,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAChC,SAAS,EAAC,sHAAsH,YAEhI,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,uBAAa,WAAW,EAAE,CAAC,GAAI,GAC9C,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ViewMode } from './types.js';
|
|
2
|
+
type Props = {
|
|
3
|
+
value: ViewMode;
|
|
4
|
+
onChange: (mode: ViewMode) => void;
|
|
5
|
+
};
|
|
6
|
+
export declare function ViewToggle({ value, onChange }: Props): import("react").JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=ViewToggle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewToggle.d.ts","sourceRoot":"","sources":["../../../src/components/browser/ViewToggle.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC;CACpC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,+BAmCpD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { LayoutGrid, List } from 'lucide-react';
|
|
3
|
+
export function ViewToggle({ value, onChange }) {
|
|
4
|
+
return (_jsxs("div", { role: "group", "aria-label": "View mode", className: "inline-flex items-center rounded-full border border-border bg-surface-elevated p-0.5", children: [_jsx("button", { type: "button", "aria-label": "Grid view", "aria-pressed": value === 'grid', onClick: () => { onChange('grid'); }, className: value === 'grid'
|
|
5
|
+
? 'inline-flex h-7 w-7 items-center justify-center rounded-full bg-secondary text-foreground'
|
|
6
|
+
: 'inline-flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition hover:text-foreground', children: _jsx(LayoutGrid, { className: "h-3.5 w-3.5", "aria-hidden": true, strokeWidth: 1.75 }) }), _jsx("button", { type: "button", "aria-label": "List view", "aria-pressed": value === 'list', onClick: () => { onChange('list'); }, className: value === 'list'
|
|
7
|
+
? 'inline-flex h-7 w-7 items-center justify-center rounded-full bg-secondary text-foreground'
|
|
8
|
+
: 'inline-flex h-7 w-7 items-center justify-center rounded-full text-muted-foreground transition hover:text-foreground', children: _jsx(List, { className: "h-3.5 w-3.5", "aria-hidden": true, strokeWidth: 1.75 }) })] }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ViewToggle.js.map
|