vfs-kit 1.0.1 → 1.0.3
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/LICENSE +21 -21
- package/README.md +618 -35
- package/dist/VfsAdapter-BWjniD9Y.d.mts +57 -0
- package/dist/VfsAdapter-DOBt_TyL.d.ts +57 -0
- package/dist/VfsEngine-B6nhgyjQ.d.mts +152 -0
- package/dist/VfsEngine-DLx0iUpi.d.ts +152 -0
- package/dist/VfsNode-D10gxL5W.d.mts +48 -0
- package/dist/VfsNode-D10gxL5W.d.ts +48 -0
- package/dist/adapters/index.d.mts +201 -0
- package/dist/adapters/index.d.ts +201 -0
- package/dist/adapters/index.js +1159 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/index.mjs +1159 -0
- package/dist/adapters/index.mjs.map +1 -0
- package/dist/chunk-2FEJBM4N.js +60 -0
- package/dist/chunk-2FEJBM4N.js.map +1 -0
- package/dist/chunk-7OQI6PNM.mjs +60 -0
- package/dist/chunk-7OQI6PNM.mjs.map +1 -0
- package/dist/chunk-ALWOZGZI.mjs +23 -0
- package/dist/chunk-ALWOZGZI.mjs.map +1 -0
- package/dist/chunk-POSVS4C7.mjs +531 -0
- package/dist/chunk-POSVS4C7.mjs.map +1 -0
- package/dist/chunk-R3ROYAMW.js +23 -0
- package/dist/chunk-R3ROYAMW.js.map +1 -0
- package/dist/chunk-SWRBVSS6.mjs +16 -0
- package/dist/chunk-SWRBVSS6.mjs.map +1 -0
- package/dist/chunk-U2CKTXY7.js +16 -0
- package/dist/chunk-U2CKTXY7.js.map +1 -0
- package/dist/chunk-WZVVI3HX.js +531 -0
- package/dist/chunk-WZVVI3HX.js.map +1 -0
- package/dist/components/index.d.mts +193 -0
- package/dist/components/index.d.ts +193 -0
- package/dist/components/index.js +1197 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +1197 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/hooks/index.d.mts +120 -0
- package/dist/hooks/index.d.ts +120 -0
- package/dist/hooks/index.js +51 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +51 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/index.d.mts +42 -0
- package/dist/index.d.ts +38 -3
- package/dist/index.js +528 -13
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +530 -0
- package/dist/index.mjs.map +1 -0
- package/dist/useVfsTabs-ZHDaLrM1.d.mts +39 -0
- package/dist/useVfsTabs-ZHDaLrM1.d.ts +39 -0
- package/package.json +59 -61
- package/dist/index.cjs +0 -43
- package/dist/index.d.cts +0 -7
- package/index.js +0 -7
- package/src/components/TreeView.tsx +0 -5
- package/src/components/index.ts +0 -1
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useVfs.ts +0 -3
- package/src/index.ts +0 -2
- package/tsconfig.json +0 -44
- package/tsup.config.ts +0 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/react/components/inline-input.tsx","../../src/react/components/file-renderer.tsx","../../src/react/components/tab-list.tsx","../../src/react/components/file-tree/file-tree.tsx","../../src/react/components/file-tree/file-tree-base.tsx","../../src/react/components/file-tree/helpers.ts","../../src/react/components/file-tree/components.tsx"],"sourcesContent":["import { useEffect, useRef, useState, KeyboardEvent } from \"react\";\n\nexport interface InlineInputProps {\n initialValue?: string;\n\n onSubmit: (value: string) => void;\n onComplete: () => void;\n validate?: (value: string) => string | null;\n\n icon?: React.ReactNode;\n className?: string;\n selectOnMount?: boolean;\n trim?: boolean;\n}\n\nexport function InlineInput({\n initialValue = \"\",\n onSubmit,\n onComplete,\n validate,\n icon,\n className,\n selectOnMount = true,\n trim = true,\n}: InlineInputProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const [value, setValue ] = useState(initialValue);\n const [error, setError ] = useState<string | null>(null);\n const committed = useRef(false);\n\n useEffect(() => {\n const el = inputRef.current;\n if (!el) return;\n el.focus();\n if (selectOnMount) el.select();\n }, [selectOnMount]);\n\n const commit = () => {\n if (committed.current) return;\n const final = trim ? value.trim() : value;\n\n if (!final) {\n onComplete();\n return;\n }\n\n if (validate) {\n const err = validate(final);\n if (err) {\n setError(err);\n inputRef.current?.focus();\n return;\n }\n }\n\n committed.current = true;\n onSubmit(final);\n onComplete();\n };\n\n const cancel = () => {\n if (committed.current) return;\n committed.current = true;\n onComplete();\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") { e.preventDefault(); commit(); }\n if (e.key === \"Escape\") { e.preventDefault(); cancel(); }\n e.stopPropagation();\n };\n\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4, width: \"100%\" }}>\n {icon && (\n <span style={{ flexShrink: 0, display: \"flex\", alignItems: \"center\" }}>\n {icon}\n </span>\n )}\n <div style={{ flex: 1, position: \"relative\" }}>\n <input\n ref={inputRef}\n value={value}\n onChange={e => { setValue(e.target.value); setError(null); }}\n onKeyDown={onKeyDown}\n onBlur={commit}\n className={className}\n style={{ width: \"100%\", boxSizing: \"border-box\" }}\n spellCheck={false}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n />\n {error && (\n <div style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n zIndex: 100,\n fontSize: 11,\n color: \"#f87171\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n }}>\n {error}\n </div>\n )}\n </div>\n </div>\n );\n}","import { useEffect, useState } from \"react\";\nimport { VfsNode, VfsFileNode } from \"../../core/VfsNode\";\nimport { useVfsContext, useVfsWorkspace } from \"../context/VfsContext\";\nimport { useVfsEngine } from \"../hooks/useVfsEngine\";\n\nexport interface FileRendererRenderProps<TMeta = Record<string, unknown>> {\n node: VfsFileNode<TMeta>;\n content: Uint8Array | null;\n loading: boolean;\n error: Error | null;\n}\n\nexport interface FileRendererBaseProps<TMeta = Record<string, unknown>> {\n node: VfsFileNode<TMeta> | null;\n content?: Uint8Array | null;\n\n children: (props: FileRendererRenderProps<TMeta>) => React.ReactNode;\n fallback?: React.ReactNode;\n\n onLoad?: (node: VfsFileNode<TMeta>, content: Uint8Array) => void;\n onError?: (node: VfsFileNode<TMeta>, error: Error) => void;\n}\n\nexport interface FileRendererProps<TMeta = Record<string, unknown>>\n extends Omit<FileRendererBaseProps<TMeta>, \"node\" | \"content\"> {\n workspaceId?: string;\n}\nexport function FileRendererBase<TMeta = Record<string, unknown>>({\n node,\n content: externalContent,\n children,\n fallback,\n onLoad,\n onError,\n}: FileRendererBaseProps<TMeta>) {\n\n const [content, setContent] = useState<Uint8Array | null>(externalContent ?? null);\n const [loading, setLoading] = useState(false);\n const [error, setError ] = useState<Error | null>(null);\n\n useEffect(() => {\n if (externalContent !== undefined) {\n setContent(externalContent);\n setError(null);\n return;\n }\n\n if (!node) {\n setContent(null);\n setError(null);\n return;\n }\n\n setContent(null);\n }, [node?.id, externalContent]);\n\n if (!node) return <>{fallback ?? null}</>;\n\n return (\n <>\n {children({ node, content, loading, error })}\n </>\n );\n}\n\nexport interface FileRendererProps<TMeta = Record<string, unknown>>\n extends Omit<FileRendererBaseProps<TMeta>, \"node\" | \"content\"> {\n workspaceId?: string;\n activeNodeId: string | null;\n}\nexport function FileRenderer<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>({\n workspaceId,\n activeNodeId,\n children,\n fallback,\n onLoad,\n onError,\n}: FileRendererProps<TMeta>) {\n const { tree } = useVfsEngine<TMeta>(workspaceId);\n\n const [activeNode, setActiveNode] = useState<VfsFileNode<TMeta> | null>(null);\n const [content, setContent ] = useState<Uint8Array | null>(null);\n const [loading, setLoading ] = useState(false);\n const [error, setError ] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!activeNodeId) {\n setActiveNode(null);\n setContent(null);\n setError(null);\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n\n const resolveAndLoad = async () => {\n setContent(null);\n setError(null);\n setLoading(true);\n\n try {\n const node = await tree.getNode(activeNodeId);\n if (cancelled) return;\n\n if (!node || node.kind !== \"file\") {\n setActiveNode(null);\n setLoading(false);\n return;\n }\n\n const fileNode = node as VfsFileNode<TMeta>;\n setActiveNode(fileNode);\n\n const bytes = await tree.readFile(activeNodeId);\n if (cancelled) return;\n\n setContent(bytes);\n onLoad?.(fileNode, bytes);\n } catch (err) {\n if (cancelled) return;\n const e = err instanceof Error ? err : new Error(String(err));\n setError(e);\n onError?.(activeNode!, e);\n } finally {\n if (!cancelled) setLoading(false);\n }\n };\n\n resolveAndLoad();\n return () => { cancelled = true; };\n }, [activeNodeId]);\n\n if (!activeNode) return <>{fallback ?? null}</>;\n\n return (\n <>\n {children({ node: activeNode, content, loading, error })}\n </>\n );\n}","import {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragEndEvent,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext,\n horizontalListSortingStrategy,\n useSortable,\n sortableKeyboardCoordinates,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { useVfsTabs, VfsTab } from \"../hooks/useVfsTabs\";\n\nexport interface TabRenderProps {\n tabs: VfsTab[];\n activeTabId: string | null;\n activeTab: VfsTab | null;\n dragHandleProps: (tabId: string) => Record<string, unknown>;\n onClose: (tabId: string) => void;\n onSetActive: (tabId: string) => void;\n onLock: (tabId: string) => void;\n onUnlock: (tabId: string) => void;\n}\n\nexport interface TabListBaseProps {\n tabs: VfsTab[];\n activeTabId: string | null;\n onReorder: (activeId: string, overId: string) => void;\n onClose: (tabId: string) => void;\n onSetActive: (tabId: string) => void;\n onLock: (tabId: string) => void;\n onUnlock: (tabId: string) => void;\n\n sortable?: boolean;\n\n children?: (props: TabRenderProps) => React.ReactNode;\n\n className?: string;\n}\n\nexport interface TabListProps {\n workspaceIds?: string[];\n sortable?: boolean;\n children?: (props: TabRenderProps) => React.ReactNode;\n className?: string;\n}\n\nfunction DefaultTab({\n tab,\n isActive,\n onSetActive,\n onClose,\n dragHandleProps,\n}: {\n tab: VfsTab;\n isActive: boolean;\n onSetActive: (id: string) => void;\n onClose: (id: string) => void;\n dragHandleProps: (id: string) => Record<string, unknown>;\n}) {\n const handles = dragHandleProps(tab.id);\n return (\n <div\n {...handles}\n onClick={() => onSetActive(tab.id)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 12px\",\n cursor: \"pointer\",\n userSelect: \"none\",\n borderBottom: isActive ? \"2px solid #3b82f6\" : \"2px solid transparent\",\n opacity: 1,\n }}\n >\n <span style={{ fontSize: 13 }}>\n {tab.isDirty ? `● ${tab.title}` : tab.title}\n {tab.isLocked ? \" 🔒\" : \"\"}\n </span>\n {!tab.isLocked && (\n <button\n onClick={(e) => { e.stopPropagation(); onClose(tab.id); }}\n style={{ background: \"none\", border: \"none\", cursor: \"pointer\", padding: 0, lineHeight: 1 }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n\nfunction SortableTabWrapper({\n tab,\n isActive,\n onSetActive,\n onClose,\n renderTab,\n dragHandleProps,\n}: {\n tab: VfsTab;\n isActive: boolean;\n onSetActive: (id: string) => void;\n onClose: (id: string) => void;\n renderTab?: (props: TabRenderProps) => React.ReactNode;\n dragHandleProps: (tabId: string) => Record<string, unknown>;\n}) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: tab.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.4 : 1,\n flexShrink: 0,\n };\n\n const mergedDragHandleProps = (tabId: string) => ({\n ...dragHandleProps(tabId),\n ...attributes,\n ...listeners,\n });\n\n return (\n <div ref={setNodeRef} style={style}>\n {renderTab ? null : (\n <DefaultTab\n tab={tab}\n isActive={isActive}\n onSetActive={onSetActive}\n onClose={onClose}\n dragHandleProps={mergedDragHandleProps}\n />\n )}\n </div>\n );\n}\n\nexport function TabListBase({\n tabs,\n activeTabId,\n onReorder,\n onClose,\n onSetActive,\n onLock,\n onUnlock,\n sortable = false,\n children,\n className,\n}: TabListBaseProps) {\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (over && active.id !== over.id) {\n onReorder(String(active.id), String(over.id));\n }\n };\n\n const dragHandleProps = (_tabId: string): Record<string, unknown> => ({});\n\n const renderProps: TabRenderProps = {\n tabs,\n activeTabId,\n activeTab: tabs.find(t => t.id === activeTabId) ?? null,\n dragHandleProps,\n onClose,\n onSetActive,\n onLock,\n onUnlock,\n };\n\n if (!sortable) {\n return (\n <div\n className={className}\n style={{ display: \"flex\", overflow: \"hidden\" }}\n >\n {children ? children(renderProps) : (\n tabs.map(tab => (\n <DefaultTab\n key={tab.id}\n tab={tab}\n isActive={tab.id === activeTabId}\n onSetActive={onSetActive}\n onClose={onClose}\n dragHandleProps={dragHandleProps}\n />\n ))\n )}\n </div>\n );\n }\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={tabs.map(t => t.id)}\n strategy={horizontalListSortingStrategy}\n >\n <div\n className={className}\n style={{ display: \"flex\", overflow: \"hidden\" }}\n >\n {children ? (\n tabs.map(tab => (\n <SortableTabWrapper\n key={tab.id}\n tab={tab}\n isActive={tab.id === activeTabId}\n onSetActive={onSetActive}\n onClose={onClose}\n dragHandleProps={dragHandleProps}\n />\n ))\n ) : (\n tabs.map(tab => (\n <SortableTabWrapper\n key={tab.id}\n tab={tab}\n isActive={tab.id === activeTabId}\n onSetActive={onSetActive}\n onClose={onClose}\n dragHandleProps={dragHandleProps}\n />\n ))\n )}\n </div>\n </SortableContext>\n </DndContext>\n );\n}\n\nexport function TabList({\n workspaceIds,\n sortable,\n children,\n className,\n}: TabListProps) {\n const tabs = useVfsTabs({ workspaceIds });\n\n return (\n <TabListBase\n tabs={tabs.tabs}\n activeTabId={tabs.activeTabId}\n onReorder={tabs.reorder}\n onClose={tabs.close}\n onSetActive={tabs.setActive}\n onLock={tabs.lock}\n onUnlock={tabs.unlock}\n sortable={sortable}\n className={className}\n >\n {children ? (props) => children({\n ...props,\n dragHandleProps: props.dragHandleProps,\n }) : undefined}\n </TabListBase>\n );\n}","import { useEffect, useCallback, useState, useMemo } from \"react\";\nimport { VfsNode } from \"../../../core/VfsNode\";\nimport { useVfsEngine } from \"../../hooks/useVfsEngine\";\nimport { useVfsTabs } from \"../../hooks/useVfsTabs\";\nimport { useVfsSelection } from \"../../hooks/useVfsSelection\";\nimport { useVfsExpanded } from \"../../hooks/useVfsExpanded\";\nimport { FileTreeBase } from \"./file-tree-base\";\nimport {\n FileTreeProps,\n InlineCreateState,\n} from \"./types\";\nimport { resolveInlineCreateParent } from \"./helpers\";\n\n// ── Tree state (atomic to prevent split-render ghost files) ────────────────\n\ninterface TreeState<TMeta> {\n nodes: Map<string, VfsNode<TMeta>>;\n childIndex: Map<string, string[]>;\n rootIds: string[];\n}\n\nconst EMPTY_TREE = <TMeta,>(): TreeState<TMeta> => ({\n nodes: new Map(),\n childIndex: new Map(),\n rootIds: [],\n});\n\n// ── FileTree ───────────────────────────────────────────────────────────────\n\nexport function FileTree<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>({\n workspaceId,\n inlineCreate: inlineCreateProp,\n onCancelCreate,\n ...rest\n}: FileTreeProps<TMeta>) {\n const { tree, fs, status } = useVfsEngine<TMeta>(workspaceId);\n\n const workspaceIds = useMemo(\n () => workspaceId ? [workspaceId] : undefined,\n [workspaceId],\n );\n\n const tabs = useVfsTabs({ workspaceIds });\n const selection = useVfsSelection();\n const expanded = useVfsExpanded({ workspaceIds });\n\n // ── Atomic tree state ────────────────────────────────────────────────\n const [treeState, setTreeState] = useState<TreeState<TMeta>>(EMPTY_TREE<TMeta>);\n const [renamingId, setRenamingId] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n const sync = async () => {\n const roots = await tree.getChildren(null);\n if (cancelled) return;\n\n const newNodes = new Map<string, VfsNode<TMeta>>();\n const newIndex = new Map<string, string[]>();\n const visited = new Set<string>();\n\n const walk = async (parentId: string | null) => {\n const children = await tree.getChildren(parentId);\n if (cancelled) return;\n newIndex.set(parentId ?? \"@@root\", children.map(c => c.id));\n\n for (const child of children) {\n if (visited.has(child.id)) continue;\n visited.add(child.id);\n newNodes.set(child.id, child);\n if (child.kind === \"folder\") {\n await walk(child.id);\n if (cancelled) return;\n }\n }\n };\n\n await walk(null);\n if (cancelled) return;\n\n setTreeState({\n nodes: newNodes,\n childIndex: newIndex,\n rootIds: roots.map(r => r.id),\n });\n };\n\n sync();\n return () => { cancelled = true; };\n }, [status.version]);\n\n // ── Inline-create parent resolution ─────────────────────────────────\n\n const resolvedInlineCreate = useMemo((): InlineCreateState | null => {\n if (!inlineCreateProp) return null;\n const parentId = resolveInlineCreateParent(\n selection.selection,\n tabs.activeTab?.nodeId ?? null,\n treeState.nodes,\n );\n // Auto-expand the parent so the input is visible\n if (parentId && !expanded.expandedIds.has(parentId)) {\n expanded.expand(parentId);\n }\n return { kind: inlineCreateProp.kind, parentId };\n }, [inlineCreateProp, selection.selection, tabs.activeTab?.nodeId, treeState.nodes, expanded]);\n\n // ── Handlers ─────────────────────────────────────────────────────────\n\n const handleCreate = useCallback(async (\n kind: \"file\" | \"folder\",\n parentId: string | null,\n name: string,\n ) => {\n if (kind === \"file\") {\n await fs.createFile(parentId, name);\n } else {\n await fs.createFolder(parentId, name);\n if (parentId) expanded.expand(parentId);\n }\n onCancelCreate?.();\n }, [fs, expanded, onCancelCreate]);\n\n const handleMove = useCallback(async (\n ids: string[],\n targetId: string | null,\n ) => {\n await fs.move(ids, targetId);\n }, [fs]);\n\n return (\n <FileTreeBase<TMeta>\n nodes={treeState.nodes}\n childIndex={treeState.childIndex}\n rootIds={treeState.rootIds}\n expandedIds={expanded.expandedIds}\n selection={selection.selection}\n activeNodeId={tabs.activeTab?.nodeId ?? null}\n renamingId={renamingId}\n onExpand={expanded.expand}\n onCollapse={expanded.collapse}\n onSelect={selection.select}\n onToggle={selection.toggle}\n onRangeSelect={selection.selectRange}\n onOpen={(node) => {\n if (node.kind === \"file\") tabs.open(node.id, workspaceId ?? \"\");\n else expanded.toggle(node.id);\n }}\n onRename={(id, newName) => fs.rename(id, newName)}\n onDelete={(ids) => fs.delete(ids)}\n onMove={handleMove}\n onReorder={(parentId, orderedIds) => fs.reorder(parentId, orderedIds)}\n onSetRenaming={setRenamingId}\n onCreate={handleCreate}\n inlineCreate={resolvedInlineCreate}\n onCancelCreate={onCancelCreate ?? (() => {})}\n {...rest}\n />\n );\n}","import {\n useRef, useEffect, useCallback,\n useState, useMemo, KeyboardEvent,\n} from \"react\";\nimport {\n DndContext,\n DragOverlay,\n DragStartEvent,\n DragOverEvent,\n DragEndEvent,\n PointerSensor,\n KeyboardSensor,\n useSensor,\n useSensors,\n pointerWithin,\n} from \"@dnd-kit/core\";\nimport { sortableKeyboardCoordinates } from \"@dnd-kit/sortable\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { VfsNode } from \"../../../core/VfsNode\";\nimport {\n FileTreeBaseProps,\n NodeRenderProps,\n FlatNode,\n DropTarget,\n} from \"./types\";\nimport {\n flattenTree,\n resolveDropTarget,\n measureVisibleSubtree,\n} from \"./helpers\";\nimport {\n DraggableNode,\n DroppableNode,\n RootDropZone,\n DefaultNode,\n DropZoneOverlay,\n InlineCreateRow,\n} from \"./components\";\n\nexport { sortableKeyboardCoordinates };\n\nconst DEFAULT_EMPTY_HEIGHT = 28;\n\n// ── FileTreeBase ───────────────────────────────────────────────────────────\n\nexport function FileTreeBase<TMeta = Record<string, unknown>>({\n nodes, childIndex, rootIds, expandedIds, selection, activeNodeId,\n renamingId, onExpand, onCollapse, onSelect, onToggle, onRangeSelect,\n onOpen, onRename, onDelete, onMove, onReorder, onSetRenaming,\n onCreate, inlineCreate, onCancelCreate,\n sortable = false, draggable = false,\n virtualized = false, virtualizer: virtualizerOverride,\n itemHeight = 28, renderNode, renderActions, renderEmpty,\n children, onKeyDown: customKeyDown, className, folderOverlay,\n}: FileTreeBaseProps<TMeta>) {\n\n const containerRef = useRef<HTMLDivElement>(null);\n const hoverTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [activeId, setActiveId ] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n const [scrollTop, setScrollTop ] = useState(0);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const onScroll = () => setScrollTop(el.scrollTop);\n el.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => el.removeEventListener(\"scroll\", onScroll);\n }, []);\n\n const flatNodes = flattenTree(rootIds, nodes, childIndex, expandedIds);\n const orderedIds = flatNodes.map(f => f.node.id);\n const isDragSession = activeId !== null;\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 6 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n const handleDragStart = useCallback((e: DragStartEvent) => {\n setActiveId(String(e.active.id));\n setDropTarget(null);\n }, []);\n\n const handleDragOver = useCallback((e: DragOverEvent) => {\n if (!e.over) {\n setDropTarget(null);\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n return;\n }\n\n const overId = String(e.over.id);\n const draggedId = String(e.active.id);\n const target = resolveDropTarget(overId, draggedId, nodes);\n\n setDropTarget(target);\n\n // Auto-expand folder after hovering 800 ms\n if (target?.folderId && !target.blocked && !expandedIds.has(target.folderId)) {\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n hoverTimer.current = setTimeout(() => onExpand(target.folderId!), 800);\n } else {\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n }\n }, [nodes, expandedIds, onExpand]);\n\n const handleDragEnd = useCallback((e: DragEndEvent) => {\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n const { active, over } = e;\n setActiveId(null);\n setDropTarget(null);\n\n const draggedId = String(active.id);\n\n if (!over) {\n onMove(selection.includes(draggedId) ? selection : [draggedId], null);\n return;\n }\n\n const overId = String(over.id);\n if (draggedId === overId) return;\n\n const target = resolveDropTarget(overId, draggedId, nodes);\n if (!target || target.blocked) return;\n\n const draggedNode = nodes.get(draggedId);\n if (draggedNode && draggedNode.parentId === target.folderId) return;\n\n onMove(selection.includes(draggedId) ? selection : [draggedId], target.folderId);\n }, [nodes, selection, onMove]);\n\n const handleDragCancel = useCallback(() => {\n if (hoverTimer.current) clearTimeout(hoverTimer.current);\n setActiveId(null);\n setDropTarget(null);\n }, []);\n\n const focusedIndex = useRef<number>(0);\n\n const defaultKeyHandler = useCallback((e: KeyboardEvent, node: VfsNode<TMeta>) => {\n const idx = flatNodes.findIndex(f => f.node.id === node.id);\n const flat = flatNodes[idx];\n\n switch (e.key) {\n case \"ArrowDown\": { e.preventDefault(); const next = flatNodes[idx + 1]; if (next) { onSelect(next.node.id); focusedIndex.current = idx + 1; } break; }\n case \"ArrowUp\": { e.preventDefault(); const prev = flatNodes[idx - 1]; if (prev) { onSelect(prev.node.id); focusedIndex.current = idx - 1; } break; }\n case \"ArrowRight\": {\n e.preventDefault();\n if (node.kind === \"folder\") {\n if (flat.isOpen) { const first = flatNodes[idx + 1]; if (first) onSelect(first.node.id); }\n else onExpand(node.id);\n }\n break;\n }\n case \"ArrowLeft\": {\n e.preventDefault();\n if (node.kind === \"folder\" && flat.isOpen) onCollapse(node.id);\n else if (node.parentId) onSelect(node.parentId);\n break;\n }\n case \"Enter\": { e.preventDefault(); onOpen(node); break; }\n case \"F2\": { e.preventDefault(); onSetRenaming(node.id); break; }\n case \"Delete\":\n case \"Backspace\": { e.preventDefault(); onDelete(selection.includes(node.id) ? selection : [node.id]); break; }\n case \"Escape\": { e.preventDefault(); onSetRenaming(null); break; }\n }\n }, [flatNodes, onSelect, onExpand, onCollapse, onOpen, onSetRenaming, onDelete, selection]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent, node: VfsNode<TMeta>) => {\n if (customKeyDown) customKeyDown(e, node, defaultKeyHandler);\n else defaultKeyHandler(e, node);\n }, [customKeyDown, defaultKeyHandler]);\n\n const dropZoneData = useMemo(() => {\n if (!dropTarget || !folderOverlay || dropTarget.folderId === null) return null;\n const { folderId, blocked } = dropTarget as { folderId: string; blocked: boolean };\n const folderIndex = flatNodes.findIndex(f => f.node.id === folderId);\n if (folderIndex === -1) return null;\n const { rowCount } = measureVisibleSubtree(folderIndex, flatNodes);\n const targetFolder = nodes.get(folderId);\n if (!targetFolder) return null;\n return { folderIndex, rowCount, targetFolder, blocked };\n }, [dropTarget, folderOverlay, flatNodes, nodes]);\n\n const inlineInsertIndex = useMemo(() => {\n if (!inlineCreate) return null;\n const { parentId } = inlineCreate;\n if (parentId === null) return 0;\n const folderIdx = flatNodes.findIndex(f => f.node.id === parentId);\n if (folderIdx === -1) return flatNodes.length;\n return folderIdx + 1;\n }, [inlineCreate, flatNodes]);\n\n const inlineLevel = useMemo(() => {\n if (!inlineCreate?.parentId) return 0;\n const fn = flatNodes.find(f => f.node.id === inlineCreate.parentId);\n return fn ? fn.level + 1 : 0;\n }, [inlineCreate, flatNodes]);\n\n const renderFlatNode = useCallback((flatNode: FlatNode<TMeta>) => {\n const { node } = flatNode;\n const isSelected = selection.includes(node.id);\n const isActive = activeNodeId === node.id;\n const isDragging = activeId === node.id;\n const isOver = !!dropTarget && dropTarget.folderId === node.id && !dropTarget.blocked;\n const isOverBlocked = !!dropTarget && dropTarget.folderId === node.id && !!dropTarget.blocked;\n const isRenaming = renamingId === node.id;\n\n const handleClick = (e: React.MouseEvent) => {\n if (e.ctrlKey || e.metaKey) onToggle(node.id);\n else if (e.shiftKey) onRangeSelect(orderedIds, selection[selection.length - 1] ?? node.id, node.id);\n else {\n onSelect(node.id);\n if (node.kind === \"folder\") {\n expandedIds.has(node.id) ? onCollapse(node.id) : onExpand(node.id);\n }\n }\n };\n\n const nodeProps: NodeRenderProps<TMeta> = {\n flatNode, isSelected, isActive, isDragging, isOver, isOverBlocked,\n isRenaming, isDragSession,\n setRenaming: (v) => onSetRenaming(v ? node.id : null),\n dragHandleProps: {}, style: {},\n onClick: handleClick,\n };\n\n const content = (\n <div\n onKeyDown={isRenaming ? undefined : (e) => handleKeyDown(e as unknown as KeyboardEvent, node)}\n tabIndex={isRenaming ? -1 : 0}\n >\n {renderNode\n ? renderNode(nodeProps)\n : <DefaultNode {...nodeProps} renderActions={renderActions} onOpen={onOpen} />\n }\n </div>\n );\n\n if (!draggable) return <div key={node.id}>{content}</div>;\n\n return (\n <DroppableNode key={node.id} flatNode={flatNode}>\n <DraggableNode\n flatNode={flatNode}\n renderContent={({ dragHandleProps, isDragging: dndDragging }) =>\n renderNode\n ? renderNode({ ...nodeProps, dragHandleProps, isDragging: dndDragging })\n : <DefaultNode {...nodeProps} dragHandleProps={dragHandleProps} isDragging={dndDragging} renderActions={renderActions} onOpen={onOpen} />\n }\n />\n </DroppableNode>\n );\n }, [\n selection, activeNodeId, activeId, dropTarget, renamingId,\n expandedIds, isDragSession, onSelect, onToggle, onRangeSelect,\n onExpand, onCollapse, onOpen, onSetRenaming, renderNode,\n renderActions, handleKeyDown, draggable, orderedIds,\n ]);\n\n const tanstackVirtualizer = useVirtualizer({\n count: flatNodes.length,\n getScrollElement: () => containerRef.current,\n estimateSize: () => itemHeight,\n enabled: virtualized && !virtualizerOverride,\n });\n\n const renderList = () => {\n if (flatNodes.length === 0 && !inlineCreate) return renderEmpty?.() ?? null;\n\n if (virtualizerOverride) {\n const items = flatNodes.map((_, i) => ({\n index: i, start: i * virtualizerOverride.itemHeight, size: virtualizerOverride.itemHeight,\n }));\n return virtualizerOverride.renderItems(\n items, flatNodes.length * virtualizerOverride.itemHeight,\n (index) => renderFlatNode(flatNodes[index]),\n );\n }\n\n if (virtualized) {\n const virtualItems = tanstackVirtualizer.getVirtualItems();\n return (\n <div style={{ height: tanstackVirtualizer.getTotalSize(), position: \"relative\" }}>\n {virtualItems.map(vItem => (\n <div\n key={vItem.key}\n style={{\n position: \"absolute\", top: 0, width: \"100%\",\n height: itemHeight, transform: `translateY(${vItem.start}px)`,\n }}\n >\n {renderFlatNode(flatNodes[vItem.index])}\n </div>\n ))}\n </div>\n );\n }\n\n // Non-virtualized — splice in the inline-create row\n const inlineRow = inlineCreate ? (\n <InlineCreateRow\n key=\"@@inline-create\"\n kind={inlineCreate.kind}\n level={inlineLevel}\n onSubmit={(name) => onCreate(inlineCreate.kind, inlineCreate.parentId, name)}\n onCancel={onCancelCreate}\n />\n ) : null;\n\n if (inlineRow === null) return flatNodes.map(renderFlatNode);\n\n const rows: React.ReactNode[] = [];\n flatNodes.forEach((fn, i) => {\n if (inlineInsertIndex === i) rows.push(inlineRow);\n rows.push(renderFlatNode(fn));\n });\n if (inlineInsertIndex !== null && inlineInsertIndex >= flatNodes.length) rows.push(inlineRow);\n return rows;\n };\n\n if (children) {\n return (\n <div ref={containerRef} className={className}>\n {children({ flatNodes, renderNode: renderFlatNode })}\n </div>\n );\n }\n\n const emptyStateHeight = folderOverlay?.emptyStateHeight ?? DEFAULT_EMPTY_HEIGHT;\n\n const treeBody = (\n <div\n ref={containerRef}\n className={className}\n style={{ overflow: \"auto\", outline: \"none\", position: \"relative\", height: \"100%\" }}\n tabIndex={-1}\n >\n <RootDropZone>\n {renderList()}\n </RootDropZone>\n\n {dropZoneData && folderOverlay && (\n <DropZoneOverlay<TMeta>\n scrollTop={scrollTop}\n folderIndex={dropZoneData.folderIndex}\n rowCount={dropZoneData.rowCount}\n itemHeight={itemHeight}\n emptyStateHeight={emptyStateHeight}\n mode={folderOverlay.mode}\n isBlocked={dropZoneData.blocked}\n targetFolder={dropZoneData.targetFolder as VfsNode<TMeta>}\n renderOverlay={folderOverlay.renderOverlay}\n />\n )}\n\n <DragOverlay dropAnimation={null}>\n {activeId ? (\n <div style={{\n padding: \"4px 12px\", background: \"rgba(30,30,30,0.95)\",\n border: \"1px solid #3b82f6\", borderRadius: 4, fontSize: 13,\n color: \"#fff\", display: \"flex\", alignItems: \"center\", gap: 8,\n boxShadow: \"0 4px 16px rgba(0,0,0,0.4)\", backdropFilter: \"blur(8px)\",\n minWidth: 120, pointerEvents: \"none\", userSelect: \"none\",\n }}>\n {nodes.get(activeId)?.name ?? \"\"}\n {selection.length > 1 && (\n <span style={{ color: \"#555\", fontSize: 11 }}>+{selection.length - 1} more</span>\n )}\n </div>\n ) : null}\n </DragOverlay>\n </div>\n );\n\n if (!draggable) return treeBody;\n\n return (\n <DndContext\n sensors={sensors}\n collisionDetection={pointerWithin}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n {treeBody}\n </DndContext>\n );\n}","import { VfsNode } from \"../../../core/VfsNode\";\nimport { FlatNode } from \"../file-tree\";\nimport { DropTarget } from \"./types\";\n\n\nexport const ROOT_DROP_ID = \"@@root-drop-zone\";\n\n// ── Tree flattening ────────────────────────────────────────────────────────\n\nexport function flattenTree<TMeta>(\n rootIds: string[],\n nodes: Map<string, VfsNode<TMeta>>,\n childIndex: Map<string, string[]>,\n expanded: Set<string>,\n): FlatNode<TMeta>[] {\n const result: FlatNode<TMeta>[] = [];\n const visited: Set<string> = new Set();\n\n function walk(ids: string[], level: number) {\n for (const id of ids) {\n if (visited.has(id)) continue;\n const node = nodes.get(id);\n if (!node || node.deletedAt !== null) continue;\n visited.add(id);\n const children = childIndex.get(id) ?? [];\n const isOpen = expanded.has(id);\n const hasChildren = children.length > 0;\n result.push({ node, level, index: result.length, isOpen, hasChildren });\n if (isOpen && hasChildren) walk(children, level + 1);\n }\n }\n\n walk(rootIds, 0);\n return result;\n}\n\n// ── Ancestor check ─────────────────────────────────────────────────────────\n\nexport function isDescendantOf<TMeta>(\n draggedId: string,\n targetId: string,\n nodes: Map<string, VfsNode<TMeta>>,\n): boolean {\n let current = nodes.get(targetId);\n while (current?.parentId) {\n if (current.parentId === draggedId) return true;\n current = nodes.get(current.parentId);\n }\n return false;\n}\n\n// ── Drop-target resolution ─────────────────────────────────────────────────\n\n/**\n * Resolve the folder drop target for an over-id.\n * - over-id is a folder → that folder\n * - over-id is a file → its parent folder (or root)\n * - over-id is ROOT_DROP_ID → null (root level)\n * Returns null when no valid target can be resolved.\n */\nexport function resolveDropTarget<TMeta>(\n overId: string,\n draggedId: string,\n nodes: Map<string, VfsNode<TMeta>>,\n): DropTarget | null {\n if (overId === ROOT_DROP_ID) return { folderId: null, blocked: false };\n\n const overNode = nodes.get(overId);\n if (!overNode) return null;\n\n const folderId: string | null = overNode.kind === \"folder\"\n ? overNode.id\n : (overNode.parentId ?? null);\n\n const blocked = folderId !== null && (\n folderId === draggedId ||\n isDescendantOf(draggedId, folderId, nodes)\n );\n\n return { folderId, blocked };\n}\n\n// ── Subtree measurement ────────────────────────────────────────────────────\n\n/**\n * Count all visible rows in a folder's open subtree — every descendant at\n * every depth that is currently rendered in the flat list. Used to size the\n * drop-zone overlay so it covers the full visual area of the folder.\n */\nexport function measureVisibleSubtree<TMeta>(\n folderIndex: number,\n flatNodes: FlatNode<TMeta>[],\n): { rowCount: number } {\n const folderLevel = flatNodes[folderIndex].level;\n let rowCount = 0;\n for (let i = folderIndex + 1; i < flatNodes.length; i++) {\n if (flatNodes[i].level <= folderLevel) break;\n rowCount++;\n }\n return { rowCount };\n}\n\n// ── Inline-create parent resolution ───────────────────────────────────────\n\n/**\n * Given the current selection + active node, find the folder that should be\n * the parent for a new inline-created item:\n * - active/selected node is a folder → use it\n * - active/selected node is a file → use its parent folder\n * - otherwise → null (root)\n */\nexport function resolveInlineCreateParent<TMeta>(\n selection: string[],\n activeNodeId: string | null,\n nodes: Map<string, VfsNode<TMeta>>,\n): string | null {\n const candidateId = activeNodeId ?? selection[selection.length - 1] ?? null;\n if (!candidateId) return null;\n const node = nodes.get(candidateId);\n if (!node) return null;\n if (node.kind === \"folder\") return node.id;\n return node.parentId ?? null;\n}","import { useRef, useEffect, useState } from \"react\";\nimport {\n useDraggable,\n useDroppable,\n} from \"@dnd-kit/core\";\nimport {\n FlatNode,\n NodeRenderProps,\n FolderOverlayMode,\n FolderOverlayRenderProps,\n FolderOverlayProps,\n} from \"./types\";\nimport { ROOT_DROP_ID } from \"./helpers\";\nimport { VfsNode } from \"../../../core/VfsNode\";\n\n// ── Default folder-drop overlay ────────────────────────────────────────────\n\nexport function DefaultFolderOverlay({\n isBlocked,\n isEmpty,\n}: {\n isBlocked: boolean;\n isEmpty: boolean;\n}) {\n return (\n <div style={{\n position: \"absolute\", inset: 0, pointerEvents: \"none\", borderRadius: 3,\n border: `1px solid ${isBlocked ? \"#ef4444\" : \"#3b82f6\"}`,\n background: isBlocked ? \"rgba(239,68,68,0.07)\" : \"rgba(59,130,246,0.08)\",\n display: isEmpty ? \"flex\" : \"block\",\n alignItems: \"center\", justifyContent: \"center\",\n fontSize: 11, color: isBlocked ? \"#ef4444\" : \"#3b82f6\",\n }}>\n {isEmpty && !isBlocked && <span style={{ pointerEvents: \"none\" }}>drop here</span>}\n </div>\n );\n}\n\n// ── Drop-zone overlay positioner ───────────────────────────────────────────\n\nexport interface DropZoneOverlayProps<TMeta> {\n scrollTop: number;\n folderIndex: number;\n rowCount: number;\n itemHeight: number;\n emptyStateHeight: number;\n mode: FolderOverlayMode;\n isBlocked: boolean;\n targetFolder: VfsNode<TMeta>;\n renderOverlay?: FolderOverlayProps<TMeta>[\"renderOverlay\"];\n}\n\nexport function DropZoneOverlay<TMeta>({\n scrollTop, folderIndex, rowCount,\n itemHeight, emptyStateHeight, mode, isBlocked, targetFolder, renderOverlay,\n}: DropZoneOverlayProps<TMeta>) {\n const headerTop = folderIndex * itemHeight - scrollTop;\n const headerHeight = itemHeight;\n const isEmpty = rowCount === 0;\n const bodyHeight = isEmpty ? emptyStateHeight : rowCount * itemHeight;\n\n const renderProps: FolderOverlayRenderProps<TMeta> = {\n targetFolder, visibleRowCount: rowCount, isEmpty, mode, isBlocked,\n };\n\n const content = renderOverlay\n ? renderOverlay(renderProps)\n : <DefaultFolderOverlay isBlocked={isBlocked} isEmpty={isEmpty} />;\n\n const baseStyle: React.CSSProperties = {\n position: \"absolute\", left: 0, right: 0, pointerEvents: \"none\", zIndex: 10,\n };\n\n if (mode === \"header\") return (\n <div style={{ ...baseStyle, top: headerTop, height: headerHeight }}>{content}</div>\n );\n if (mode === \"body\") return (\n <div style={{ ...baseStyle, top: headerTop + headerHeight, height: bodyHeight }}>{content}</div>\n );\n return (\n <div style={{ ...baseStyle, top: headerTop, height: headerHeight + bodyHeight }}>{content}</div>\n );\n}\n\n// ── Inline create input row ────────────────────────────────────────────────\n\nexport interface InlineCreateRowProps {\n kind: \"file\" | \"folder\";\n level: number;\n onSubmit: (name: string) => void;\n onCancel: () => void;\n}\n\nexport function InlineCreateRow({ kind, level, onSubmit, onCancel }: InlineCreateRowProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const committed = useRef(false);\n\n useEffect(() => { inputRef.current?.focus(); }, []);\n\n const commit = () => {\n if (committed.current) return;\n const val = inputRef.current?.value.trim() ?? \"\";\n if (!val) { onCancel(); return; }\n committed.current = true;\n onSubmit(val);\n };\n\n const cancel = () => {\n if (committed.current) return;\n committed.current = true;\n onCancel();\n };\n\n return (\n <div style={{\n paddingLeft: level * 12 + 8,\n display: \"flex\", alignItems: \"center\", gap: 6,\n height: 28,\n background: \"rgba(59,130,246,0.08)\",\n borderLeft: \"2px solid #3b82f6\",\n }}>\n <span style={{ fontSize: 12, flexShrink: 0, color: \"#60a5fa\" }}>\n {kind === \"folder\" ? \"▶\" : \"·\"}\n </span>\n <input\n ref={inputRef}\n defaultValue=\"\"\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") { e.preventDefault(); commit(); }\n if (e.key === \"Escape\") { e.preventDefault(); cancel(); }\n }}\n onBlur={cancel}\n style={{\n flex: 1, background: \"transparent\", border: \"none\", outline: \"none\",\n fontSize: 13, color: \"#d4d4d4\", padding: 0, fontFamily: \"inherit\",\n }}\n spellCheck={false}\n autoComplete=\"off\"\n />\n </div>\n );\n}\n\n// ── Free-drag wrappers ─────────────────────────────────────────────────────\n\nexport function DraggableNode<TMeta>({\n flatNode,\n renderContent,\n}: {\n flatNode: FlatNode<TMeta>;\n renderContent: (props: { dragHandleProps: Record<string, unknown>; isDragging: boolean }) => React.ReactNode;\n}) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({ id: flatNode.node.id });\n return (\n <div ref={setNodeRef} style={{ opacity: isDragging ? 0.35 : 1 }}>\n {renderContent({ dragHandleProps: { ...attributes, ...listeners }, isDragging })}\n </div>\n );\n}\n\nexport function DroppableNode<TMeta>({\n flatNode,\n children,\n}: {\n flatNode: FlatNode<TMeta>;\n children: React.ReactNode;\n}) {\n const { setNodeRef } = useDroppable({ id: flatNode.node.id });\n return <div ref={setNodeRef}>{children}</div>;\n}\n\n/** Invisible droppable covering the entire tree container for root-level drops */\nexport function RootDropZone({ children }: { children: React.ReactNode }) {\n const { setNodeRef } = useDroppable({ id: ROOT_DROP_ID });\n return (\n <div ref={setNodeRef} style={{ minHeight: \"100%\", position: \"relative\" }}>\n {children}\n </div>\n );\n}\n\n// ── Default node renderer ──────────────────────────────────────────────────\n\nexport function DefaultNode<TMeta>({\n flatNode, isSelected, isActive, isDragging, isDragSession,\n onClick, dragHandleProps, renderActions, onOpen,\n}: NodeRenderProps<TMeta> & {\n renderActions?: (node: VfsNode<TMeta>) => React.ReactNode;\n onOpen: (node: VfsNode<TMeta>) => void;\n}) {\n const [hovered, setHovered] = useState(false);\n const { node, level } = flatNode;\n\n return (\n <div\n {...dragHandleProps}\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n paddingLeft: level * 12 + 8,\n display: \"flex\", alignItems: \"center\",\n height: 28, cursor: \"pointer\", userSelect: \"none\",\n backgroundColor: isSelected\n ? \"rgba(59,130,246,0.1)\"\n : isActive\n ? \"rgba(255,255,255,0.05)\"\n : (!isDragSession && hovered)\n ? \"rgba(255,255,255,0.03)\"\n : \"transparent\",\n opacity: isDragging ? 0.35 : 1,\n }}\n >\n <span style={{ marginRight: 6, fontSize: 12 }}>\n {node.kind === \"folder\" ? (flatNode.isOpen ? \"▼\" : \"▶\") : \"·\"}\n </span>\n <span style={{\n flex: 1, fontSize: 13,\n overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\",\n }}>\n {node.name}\n </span>\n {renderActions?.(node)}\n </div>\n );\n}"],"mappings":"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","names":["useEffect","useState","jsx","useState","useEffect","jsx","jsxs","useEffect","useCallback","useState","useMemo","useRef","useEffect","useState","DndContext","PointerSensor","KeyboardSensor","useSensor","useSensors","sortableKeyboardCoordinates","useRef","useEffect","useState","jsx","jsxs","useRef","useEffect","useState","jsx","jsxs","useRef","useState","useEffect","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","_a","jsx","jsxs","DndContext","jsx","_a","_b","useMemo","useState","useEffect","useCallback"]}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { a as VfsCommand } from '../VfsEngine-B6nhgyjQ.mjs';
|
|
2
|
+
import { e as VfsNode, c as VfsFileSnapshot } from '../VfsNode-D10gxL5W.mjs';
|
|
3
|
+
import { U as UseVfsTabsOptions, V as VfsTabsApi } from '../useVfsTabs-ZHDaLrM1.mjs';
|
|
4
|
+
export { D as DirtyChecker, a as VfsTab, u as useVfsTabs } from '../useVfsTabs-ZHDaLrM1.mjs';
|
|
5
|
+
import '../VfsAdapter-BWjniD9Y.mjs';
|
|
6
|
+
|
|
7
|
+
interface VfsFsApi<TMeta = Record<string, unknown>> {
|
|
8
|
+
execute: (command: VfsCommand) => Promise<void>;
|
|
9
|
+
createFile: (parentId: string | null, name: string, opts?: {
|
|
10
|
+
mimeType?: string;
|
|
11
|
+
meta?: TMeta;
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
createFolder: (parentId: string | null, name: string, opts?: {
|
|
14
|
+
meta?: TMeta;
|
|
15
|
+
}) => Promise<void>;
|
|
16
|
+
rename: (id: string, newName: string) => Promise<void>;
|
|
17
|
+
delete: (ids: string | string[], permanent?: boolean) => Promise<void>;
|
|
18
|
+
restore: (ids: string | string[]) => Promise<void>;
|
|
19
|
+
purge: (ids: string | string[]) => Promise<void>;
|
|
20
|
+
move: (ids: string | string[], newParentId: string | null) => Promise<void>;
|
|
21
|
+
write: (id: string, content: Uint8Array) => Promise<void>;
|
|
22
|
+
lock: (ids: string | string[]) => Promise<void>;
|
|
23
|
+
unlock: (ids: string | string[]) => Promise<void>;
|
|
24
|
+
reorder: (parentId: string | null, orderedIds: string[]) => Promise<void>;
|
|
25
|
+
snapshot: (fileId: string, label?: string) => Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
interface VfsTreeApi<TMeta = Record<string, unknown>> {
|
|
28
|
+
getNode: (id: string) => Promise<VfsNode<TMeta> | null>;
|
|
29
|
+
getChildren: (parentId: string | null, opts?: {
|
|
30
|
+
includeTrashed?: boolean;
|
|
31
|
+
}) => Promise<VfsNode<TMeta>[]>;
|
|
32
|
+
getPath: (id: string) => Promise<string>;
|
|
33
|
+
readFile: (id: string) => Promise<Uint8Array>;
|
|
34
|
+
readJSON: <T>(id: string) => Promise<T>;
|
|
35
|
+
writeJSON: <T>(id: string, data: T) => Promise<void>;
|
|
36
|
+
search: (query: string, opts?: {
|
|
37
|
+
scope?: string | null;
|
|
38
|
+
kind?: "file" | "folder";
|
|
39
|
+
includeTrashed?: boolean;
|
|
40
|
+
}) => Promise<VfsNode<TMeta>[]>;
|
|
41
|
+
getTrashed: () => Promise<VfsNode<TMeta>[]>;
|
|
42
|
+
getSnapshots: (fileId: string) => Promise<VfsFileSnapshot[]>;
|
|
43
|
+
}
|
|
44
|
+
interface VfsStatusApi {
|
|
45
|
+
pending: boolean;
|
|
46
|
+
error: Error | null;
|
|
47
|
+
version: number;
|
|
48
|
+
}
|
|
49
|
+
interface UseVfsEngineReturn<TMeta = Record<string, unknown>> {
|
|
50
|
+
fs: VfsFsApi<TMeta>;
|
|
51
|
+
tree: VfsTreeApi<TMeta>;
|
|
52
|
+
status: VfsStatusApi;
|
|
53
|
+
}
|
|
54
|
+
declare function useVfsEngine<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>(workspaceId?: string): UseVfsEngineReturn<TMeta>;
|
|
55
|
+
|
|
56
|
+
interface UseVfsSelectionOptions {
|
|
57
|
+
multiSelect?: boolean;
|
|
58
|
+
rangeSelect?: boolean;
|
|
59
|
+
}
|
|
60
|
+
interface VfsSelectionApi {
|
|
61
|
+
selection: string[];
|
|
62
|
+
lastSelectedId: string | null;
|
|
63
|
+
isSelected: (id: string) => boolean;
|
|
64
|
+
select: (id: string) => void;
|
|
65
|
+
toggle: (id: string) => void;
|
|
66
|
+
selectRange: (ids: string[], anchorId: string, targetId: string) => void;
|
|
67
|
+
deselect: (id: string) => void;
|
|
68
|
+
deselectAll: () => void;
|
|
69
|
+
selectAll: (ids: string[]) => void;
|
|
70
|
+
}
|
|
71
|
+
declare function useVfsSelection(options?: UseVfsSelectionOptions): VfsSelectionApi;
|
|
72
|
+
|
|
73
|
+
interface UseVfsExpandedOptions {
|
|
74
|
+
workspaceIds?: string[];
|
|
75
|
+
defaultExpanded?: string[];
|
|
76
|
+
persistKey?: string;
|
|
77
|
+
}
|
|
78
|
+
interface VfsExpandedApi {
|
|
79
|
+
expandedIds: Set<string>;
|
|
80
|
+
isExpanded: (id: string) => boolean;
|
|
81
|
+
expand: (id: string) => void;
|
|
82
|
+
collapse: (id: string) => void;
|
|
83
|
+
toggle: (id: string) => void;
|
|
84
|
+
expandAll: (ids: string[]) => void;
|
|
85
|
+
collapseAll: () => void;
|
|
86
|
+
expandToNode: (id: string, workspaceId?: string) => Promise<void>;
|
|
87
|
+
}
|
|
88
|
+
declare function useVfsExpanded(options?: UseVfsExpandedOptions): VfsExpandedApi;
|
|
89
|
+
|
|
90
|
+
interface UseVfsOptions {
|
|
91
|
+
workspaceId?: string;
|
|
92
|
+
tabs?: UseVfsTabsOptions;
|
|
93
|
+
selection?: UseVfsSelectionOptions;
|
|
94
|
+
expanded?: UseVfsExpandedOptions;
|
|
95
|
+
}
|
|
96
|
+
interface UseVfsReturn<TMeta = Record<string, unknown>> extends UseVfsEngineReturn<TMeta> {
|
|
97
|
+
tabs: VfsTabsApi;
|
|
98
|
+
selection: VfsSelectionApi;
|
|
99
|
+
expanded: VfsExpandedApi;
|
|
100
|
+
}
|
|
101
|
+
declare function useVfs<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>(options?: UseVfsOptions): UseVfsReturn<TMeta>;
|
|
102
|
+
|
|
103
|
+
declare function useSortableTab(tabId: string): {
|
|
104
|
+
ref: (node: HTMLElement | null) => void;
|
|
105
|
+
style: {
|
|
106
|
+
transform: string;
|
|
107
|
+
transition: string;
|
|
108
|
+
opacity: number;
|
|
109
|
+
};
|
|
110
|
+
dragHandleProps: {
|
|
111
|
+
role: string;
|
|
112
|
+
tabIndex: number;
|
|
113
|
+
'aria-disabled': boolean;
|
|
114
|
+
'aria-pressed': boolean | undefined;
|
|
115
|
+
'aria-roledescription': string;
|
|
116
|
+
'aria-describedby': string;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export { type UseVfsEngineReturn, type UseVfsExpandedOptions, type UseVfsOptions, type UseVfsReturn, type UseVfsSelectionOptions, UseVfsTabsOptions, type VfsExpandedApi, type VfsFsApi, type VfsSelectionApi, type VfsStatusApi, VfsTabsApi, type VfsTreeApi, useSortableTab, useVfs, useVfsEngine, useVfsExpanded, useVfsSelection };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { a as VfsCommand } from '../VfsEngine-DLx0iUpi.js';
|
|
2
|
+
import { e as VfsNode, c as VfsFileSnapshot } from '../VfsNode-D10gxL5W.js';
|
|
3
|
+
import { U as UseVfsTabsOptions, V as VfsTabsApi } from '../useVfsTabs-ZHDaLrM1.js';
|
|
4
|
+
export { D as DirtyChecker, a as VfsTab, u as useVfsTabs } from '../useVfsTabs-ZHDaLrM1.js';
|
|
5
|
+
import '../VfsAdapter-DOBt_TyL.js';
|
|
6
|
+
|
|
7
|
+
interface VfsFsApi<TMeta = Record<string, unknown>> {
|
|
8
|
+
execute: (command: VfsCommand) => Promise<void>;
|
|
9
|
+
createFile: (parentId: string | null, name: string, opts?: {
|
|
10
|
+
mimeType?: string;
|
|
11
|
+
meta?: TMeta;
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
createFolder: (parentId: string | null, name: string, opts?: {
|
|
14
|
+
meta?: TMeta;
|
|
15
|
+
}) => Promise<void>;
|
|
16
|
+
rename: (id: string, newName: string) => Promise<void>;
|
|
17
|
+
delete: (ids: string | string[], permanent?: boolean) => Promise<void>;
|
|
18
|
+
restore: (ids: string | string[]) => Promise<void>;
|
|
19
|
+
purge: (ids: string | string[]) => Promise<void>;
|
|
20
|
+
move: (ids: string | string[], newParentId: string | null) => Promise<void>;
|
|
21
|
+
write: (id: string, content: Uint8Array) => Promise<void>;
|
|
22
|
+
lock: (ids: string | string[]) => Promise<void>;
|
|
23
|
+
unlock: (ids: string | string[]) => Promise<void>;
|
|
24
|
+
reorder: (parentId: string | null, orderedIds: string[]) => Promise<void>;
|
|
25
|
+
snapshot: (fileId: string, label?: string) => Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
interface VfsTreeApi<TMeta = Record<string, unknown>> {
|
|
28
|
+
getNode: (id: string) => Promise<VfsNode<TMeta> | null>;
|
|
29
|
+
getChildren: (parentId: string | null, opts?: {
|
|
30
|
+
includeTrashed?: boolean;
|
|
31
|
+
}) => Promise<VfsNode<TMeta>[]>;
|
|
32
|
+
getPath: (id: string) => Promise<string>;
|
|
33
|
+
readFile: (id: string) => Promise<Uint8Array>;
|
|
34
|
+
readJSON: <T>(id: string) => Promise<T>;
|
|
35
|
+
writeJSON: <T>(id: string, data: T) => Promise<void>;
|
|
36
|
+
search: (query: string, opts?: {
|
|
37
|
+
scope?: string | null;
|
|
38
|
+
kind?: "file" | "folder";
|
|
39
|
+
includeTrashed?: boolean;
|
|
40
|
+
}) => Promise<VfsNode<TMeta>[]>;
|
|
41
|
+
getTrashed: () => Promise<VfsNode<TMeta>[]>;
|
|
42
|
+
getSnapshots: (fileId: string) => Promise<VfsFileSnapshot[]>;
|
|
43
|
+
}
|
|
44
|
+
interface VfsStatusApi {
|
|
45
|
+
pending: boolean;
|
|
46
|
+
error: Error | null;
|
|
47
|
+
version: number;
|
|
48
|
+
}
|
|
49
|
+
interface UseVfsEngineReturn<TMeta = Record<string, unknown>> {
|
|
50
|
+
fs: VfsFsApi<TMeta>;
|
|
51
|
+
tree: VfsTreeApi<TMeta>;
|
|
52
|
+
status: VfsStatusApi;
|
|
53
|
+
}
|
|
54
|
+
declare function useVfsEngine<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>(workspaceId?: string): UseVfsEngineReturn<TMeta>;
|
|
55
|
+
|
|
56
|
+
interface UseVfsSelectionOptions {
|
|
57
|
+
multiSelect?: boolean;
|
|
58
|
+
rangeSelect?: boolean;
|
|
59
|
+
}
|
|
60
|
+
interface VfsSelectionApi {
|
|
61
|
+
selection: string[];
|
|
62
|
+
lastSelectedId: string | null;
|
|
63
|
+
isSelected: (id: string) => boolean;
|
|
64
|
+
select: (id: string) => void;
|
|
65
|
+
toggle: (id: string) => void;
|
|
66
|
+
selectRange: (ids: string[], anchorId: string, targetId: string) => void;
|
|
67
|
+
deselect: (id: string) => void;
|
|
68
|
+
deselectAll: () => void;
|
|
69
|
+
selectAll: (ids: string[]) => void;
|
|
70
|
+
}
|
|
71
|
+
declare function useVfsSelection(options?: UseVfsSelectionOptions): VfsSelectionApi;
|
|
72
|
+
|
|
73
|
+
interface UseVfsExpandedOptions {
|
|
74
|
+
workspaceIds?: string[];
|
|
75
|
+
defaultExpanded?: string[];
|
|
76
|
+
persistKey?: string;
|
|
77
|
+
}
|
|
78
|
+
interface VfsExpandedApi {
|
|
79
|
+
expandedIds: Set<string>;
|
|
80
|
+
isExpanded: (id: string) => boolean;
|
|
81
|
+
expand: (id: string) => void;
|
|
82
|
+
collapse: (id: string) => void;
|
|
83
|
+
toggle: (id: string) => void;
|
|
84
|
+
expandAll: (ids: string[]) => void;
|
|
85
|
+
collapseAll: () => void;
|
|
86
|
+
expandToNode: (id: string, workspaceId?: string) => Promise<void>;
|
|
87
|
+
}
|
|
88
|
+
declare function useVfsExpanded(options?: UseVfsExpandedOptions): VfsExpandedApi;
|
|
89
|
+
|
|
90
|
+
interface UseVfsOptions {
|
|
91
|
+
workspaceId?: string;
|
|
92
|
+
tabs?: UseVfsTabsOptions;
|
|
93
|
+
selection?: UseVfsSelectionOptions;
|
|
94
|
+
expanded?: UseVfsExpandedOptions;
|
|
95
|
+
}
|
|
96
|
+
interface UseVfsReturn<TMeta = Record<string, unknown>> extends UseVfsEngineReturn<TMeta> {
|
|
97
|
+
tabs: VfsTabsApi;
|
|
98
|
+
selection: VfsSelectionApi;
|
|
99
|
+
expanded: VfsExpandedApi;
|
|
100
|
+
}
|
|
101
|
+
declare function useVfs<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>(options?: UseVfsOptions): UseVfsReturn<TMeta>;
|
|
102
|
+
|
|
103
|
+
declare function useSortableTab(tabId: string): {
|
|
104
|
+
ref: (node: HTMLElement | null) => void;
|
|
105
|
+
style: {
|
|
106
|
+
transform: string;
|
|
107
|
+
transition: string;
|
|
108
|
+
opacity: number;
|
|
109
|
+
};
|
|
110
|
+
dragHandleProps: {
|
|
111
|
+
role: string;
|
|
112
|
+
tabIndex: number;
|
|
113
|
+
'aria-disabled': boolean;
|
|
114
|
+
'aria-pressed': boolean | undefined;
|
|
115
|
+
'aria-roledescription': string;
|
|
116
|
+
'aria-describedby': string;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
export { type UseVfsEngineReturn, type UseVfsExpandedOptions, type UseVfsOptions, type UseVfsReturn, type UseVfsSelectionOptions, UseVfsTabsOptions, type VfsExpandedApi, type VfsFsApi, type VfsSelectionApi, type VfsStatusApi, VfsTabsApi, type VfsTreeApi, useSortableTab, useVfs, useVfsEngine, useVfsExpanded, useVfsSelection };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkWZVVI3HXjs = require('../chunk-WZVVI3HX.js');
|
|
8
|
+
require('../chunk-U2CKTXY7.js');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var _chunk2FEJBM4Njs = require('../chunk-2FEJBM4N.js');
|
|
13
|
+
|
|
14
|
+
// src/react/hooks/useVfs.ts
|
|
15
|
+
function useVfs(options = {}) {
|
|
16
|
+
const { workspaceId, tabs, selection, expanded } = options;
|
|
17
|
+
const engine = _chunkWZVVI3HXjs.useVfsEngine.call(void 0, workspaceId);
|
|
18
|
+
const tabsApi = _chunkWZVVI3HXjs.useVfsTabs.call(void 0, tabs);
|
|
19
|
+
const selectApi = _chunkWZVVI3HXjs.useVfsSelection.call(void 0, selection);
|
|
20
|
+
const expandApi = _chunkWZVVI3HXjs.useVfsExpanded.call(void 0, expanded);
|
|
21
|
+
return _chunk2FEJBM4Njs.__spreadProps.call(void 0, _chunk2FEJBM4Njs.__spreadValues.call(void 0, {}, engine), {
|
|
22
|
+
tabs: tabsApi,
|
|
23
|
+
selection: selectApi,
|
|
24
|
+
expanded: expandApi
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/react/hooks/useSortableTab.ts
|
|
29
|
+
var _sortable = require('@dnd-kit/sortable');
|
|
30
|
+
var _utilities = require('@dnd-kit/utilities');
|
|
31
|
+
function useSortableTab(tabId) {
|
|
32
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = _sortable.useSortable.call(void 0, { id: tabId });
|
|
33
|
+
return {
|
|
34
|
+
ref: setNodeRef,
|
|
35
|
+
style: {
|
|
36
|
+
transform: _utilities.CSS.Transform.toString(transform),
|
|
37
|
+
transition,
|
|
38
|
+
opacity: isDragging ? 0.4 : 1
|
|
39
|
+
},
|
|
40
|
+
dragHandleProps: _chunk2FEJBM4Njs.__spreadValues.call(void 0, _chunk2FEJBM4Njs.__spreadValues.call(void 0, {}, attributes), listeners)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
exports.useSortableTab = useSortableTab; exports.useVfs = useVfs; exports.useVfsEngine = _chunkWZVVI3HXjs.useVfsEngine; exports.useVfsExpanded = _chunkWZVVI3HXjs.useVfsExpanded; exports.useVfsSelection = _chunkWZVVI3HXjs.useVfsSelection; exports.useVfsTabs = _chunkWZVVI3HXjs.useVfsTabs;
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/ben/Data/Projects/vfs/vfs-kit%20v2/dist/hooks/index.js"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACA;AACA;AACA;AACF,uDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,uDAA6B;AAC7B;AACA;AACA,SAAS,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE;AAC9B,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,OAAO;AAC5D,EAAE,MAAM,OAAO,EAAE,2CAAY,WAAY,CAAC;AAC1C,EAAE,MAAM,QAAQ,EAAE,yCAAU,IAAK,CAAC;AAClC,EAAE,MAAM,UAAU,EAAE,8CAAe,SAAU,CAAC;AAC9C,EAAE,MAAM,UAAU,EAAE,6CAAc,QAAS,CAAC;AAC5C,EAAE,OAAO,4CAAa,6CAAe,CAAE,CAAC,EAAE,MAAM,CAAC,EAAE;AACnD,IAAI,IAAI,EAAE,OAAO;AACjB,IAAI,SAAS,EAAE,SAAS;AACxB,IAAI,QAAQ,EAAE;AACd,EAAE,CAAC,CAAC;AACJ;AACA;AACA;AACA,6CAA+C;AAC/C,+CAAkD;AAClD,SAAS,cAAc,CAAC,KAAK,EAAE;AAC/B,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,mCAAW,EAAG,EAAE,EAAE,MAAM,CAAC,CAAC;AAC7G,EAAE,OAAO;AACT,IAAI,GAAG,EAAE,UAAU;AACnB,IAAI,KAAK,EAAE;AACX,MAAM,SAAS,EAAE,cAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;AACrD,MAAM,UAAU;AAChB,MAAM,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;AAClC,IAAI,CAAC;AACL,IAAI,eAAe,EAAE,6CAAc,6CAAe,CAAE,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS;AAC7E,EAAE,CAAC;AACH;AACA;AACE;AACA;AACA;AACA;AACA;AACA;AACF,+RAAC","file":"/Users/ben/Data/Projects/vfs/vfs-kit v2/dist/hooks/index.js","sourcesContent":[null]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
useVfsEngine,
|
|
4
|
+
useVfsExpanded,
|
|
5
|
+
useVfsSelection,
|
|
6
|
+
useVfsTabs
|
|
7
|
+
} from "../chunk-POSVS4C7.mjs";
|
|
8
|
+
import "../chunk-SWRBVSS6.mjs";
|
|
9
|
+
import {
|
|
10
|
+
__spreadProps,
|
|
11
|
+
__spreadValues
|
|
12
|
+
} from "../chunk-7OQI6PNM.mjs";
|
|
13
|
+
|
|
14
|
+
// src/react/hooks/useVfs.ts
|
|
15
|
+
function useVfs(options = {}) {
|
|
16
|
+
const { workspaceId, tabs, selection, expanded } = options;
|
|
17
|
+
const engine = useVfsEngine(workspaceId);
|
|
18
|
+
const tabsApi = useVfsTabs(tabs);
|
|
19
|
+
const selectApi = useVfsSelection(selection);
|
|
20
|
+
const expandApi = useVfsExpanded(expanded);
|
|
21
|
+
return __spreadProps(__spreadValues({}, engine), {
|
|
22
|
+
tabs: tabsApi,
|
|
23
|
+
selection: selectApi,
|
|
24
|
+
expanded: expandApi
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/react/hooks/useSortableTab.ts
|
|
29
|
+
import { useSortable } from "@dnd-kit/sortable";
|
|
30
|
+
import { CSS as DndCSS } from "@dnd-kit/utilities";
|
|
31
|
+
function useSortableTab(tabId) {
|
|
32
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: tabId });
|
|
33
|
+
return {
|
|
34
|
+
ref: setNodeRef,
|
|
35
|
+
style: {
|
|
36
|
+
transform: DndCSS.Transform.toString(transform),
|
|
37
|
+
transition,
|
|
38
|
+
opacity: isDragging ? 0.4 : 1
|
|
39
|
+
},
|
|
40
|
+
dragHandleProps: __spreadValues(__spreadValues({}, attributes), listeners)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
useSortableTab,
|
|
45
|
+
useVfs,
|
|
46
|
+
useVfsEngine,
|
|
47
|
+
useVfsExpanded,
|
|
48
|
+
useVfsSelection,
|
|
49
|
+
useVfsTabs
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/react/hooks/useVfs.ts","../../src/react/hooks/useSortableTab.ts"],"sourcesContent":["import { useVfsEngine, UseVfsEngineReturn } from \"./useVfsEngine\";\nimport { useVfsTabs, UseVfsTabsOptions, VfsTabsApi } from \"./useVfsTabs\";\nimport { useVfsSelection, UseVfsSelectionOptions, VfsSelectionApi } from \"./useVfsSelection\";\nimport { useVfsExpanded, UseVfsExpandedOptions, VfsExpandedApi } from \"./useVfsExpanded\";\n\nexport interface UseVfsOptions {\n workspaceId?: string;\n tabs?: UseVfsTabsOptions;\n selection?: UseVfsSelectionOptions;\n expanded?: UseVfsExpandedOptions;\n}\n\nexport interface UseVfsReturn<TMeta = Record<string, unknown>>\n extends UseVfsEngineReturn<TMeta> {\n tabs: VfsTabsApi;\n selection: VfsSelectionApi;\n expanded: VfsExpandedApi;\n}\n\nexport function useVfs<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>(\n options: UseVfsOptions = {}\n): UseVfsReturn<TMeta> {\n const { workspaceId, tabs, selection, expanded } = options;\n\n const engine = useVfsEngine<TMeta>(workspaceId);\n const tabsApi = useVfsTabs(tabs);\n const selectApi = useVfsSelection(selection);\n const expandApi = useVfsExpanded(expanded);\n\n return {\n ...engine,\n tabs: tabsApi,\n selection: selectApi,\n expanded: expandApi,\n };\n}","import { useSortable } from \"@dnd-kit/sortable\";\nimport { CSS as DndCSS } from \"@dnd-kit/utilities\";\n\nexport function useSortableTab(tabId: string) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } =\n useSortable({ id: tabId });\n\n return {\n ref: setNodeRef,\n style: {\n transform: DndCSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.4 : 1,\n },\n dragHandleProps: { ...attributes, ...listeners },\n };\n}"],"mappings":";;;;;;;;;;;;;;AAmBO,SAAS,OACZ,UAAyB,CAAC,GACP;AACnB,QAAM,EAAE,aAAa,MAAM,WAAW,SAAS,IAAI;AAEnD,QAAM,SAAY,aAAoB,WAAW;AACjD,QAAM,UAAY,WAAW,IAAI;AACjC,QAAM,YAAY,gBAAgB,SAAS;AAC3C,QAAM,YAAY,eAAe,QAAQ;AAEzC,SAAO,iCACA,SADA;AAAA,IAEH,MAAW;AAAA,IACX,WAAW;AAAA,IACX,UAAW;AAAA,EACf;AACJ;;;ACnCA,SAAS,mBAAmB;AAC5B,SAAS,OAAO,cAAc;AAEvB,SAAS,eAAe,OAAe;AAC1C,QAAM,EAAE,YAAY,WAAW,YAAY,WAAW,YAAY,WAAW,IACzE,YAAY,EAAE,IAAI,MAAM,CAAC;AAE7B,SAAO;AAAA,IACH,KAAK;AAAA,IACL,OAAO;AAAA,MACH,WAAY,OAAO,UAAU,SAAS,SAAS;AAAA,MAC/C;AAAA,MACA,SAAY,aAAa,MAAM;AAAA,IACnC;AAAA,IACA,iBAAiB,kCAAK,aAAe;AAAA,EACzC;AACJ;","names":[]}
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { V as VfsEngineConfig } from './VfsNode-D10gxL5W.mjs';
|
|
2
|
+
export { a as VfsBaseNode, b as VfsFileNode, c as VfsFileSnapshot, d as VfsFolderNode, e as VfsNode, f as VfsNodeOrder, g as VfsOperation } from './VfsNode-D10gxL5W.mjs';
|
|
3
|
+
import { V as VfsAdapter } from './VfsAdapter-BWjniD9Y.mjs';
|
|
4
|
+
export { a as VfsChange, b as VfsCreateFileParams, c as VfsCreateFolderParams, d as VfsSearchOptions } from './VfsAdapter-BWjniD9Y.mjs';
|
|
5
|
+
import { V as VfsEngine } from './VfsEngine-B6nhgyjQ.mjs';
|
|
6
|
+
export { a as VfsCommand, b as VfsEventMap } from './VfsEngine-B6nhgyjQ.mjs';
|
|
7
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
8
|
+
import { ReactNode } from 'react';
|
|
9
|
+
|
|
10
|
+
interface VfsWorkspaceEntry<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>> {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
engine: VfsEngine<TMeta>;
|
|
14
|
+
}
|
|
15
|
+
interface VfsTabPersistenceConfig {
|
|
16
|
+
strategy: "none" | "session" | "permanent";
|
|
17
|
+
}
|
|
18
|
+
interface VfsContextValue<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>> {
|
|
19
|
+
workspaces: Map<string, VfsWorkspaceEntry<TMeta>>;
|
|
20
|
+
activeWorkspaceId: string;
|
|
21
|
+
config: Required<VfsEngineConfig<TMeta>>;
|
|
22
|
+
tabPersistence: VfsTabPersistenceConfig;
|
|
23
|
+
isReady: (workspaceId: string) => boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface VfsWorkspaceInput<TMeta = Record<string, unknown>> {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
adapter: VfsAdapter<TMeta>;
|
|
30
|
+
}
|
|
31
|
+
interface VfsProviderProps<TMeta = Record<string, unknown>> {
|
|
32
|
+
children: ReactNode;
|
|
33
|
+
workspaces: VfsWorkspaceInput<TMeta>[];
|
|
34
|
+
config: Omit<VfsEngineConfig<TMeta>, "allowDuplicateNames" | "duplicateResolution"> & Partial<Pick<VfsEngineConfig<TMeta>, "allowDuplicateNames" | "duplicateResolution">>;
|
|
35
|
+
cacheStrategy?: "eager" | "lazy" | "hybrid";
|
|
36
|
+
tabPersistence?: VfsTabPersistenceConfig;
|
|
37
|
+
activeWorkspaceId?: string;
|
|
38
|
+
fallback?: ReactNode;
|
|
39
|
+
}
|
|
40
|
+
declare function VfsProvider<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>({ children, workspaces: workspaceInputs, config, cacheStrategy, tabPersistence, activeWorkspaceId, fallback, }: VfsProviderProps<TMeta>): react_jsx_runtime.JSX.Element;
|
|
41
|
+
|
|
42
|
+
export { VfsAdapter, type VfsContextValue, VfsEngine, VfsEngineConfig, VfsProvider, type VfsProviderProps, type VfsTabPersistenceConfig, type VfsWorkspaceEntry, type VfsWorkspaceInput };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,42 @@
|
|
|
1
|
+
import { V as VfsEngineConfig } from './VfsNode-D10gxL5W.js';
|
|
2
|
+
export { a as VfsBaseNode, b as VfsFileNode, c as VfsFileSnapshot, d as VfsFolderNode, e as VfsNode, f as VfsNodeOrder, g as VfsOperation } from './VfsNode-D10gxL5W.js';
|
|
3
|
+
import { V as VfsAdapter } from './VfsAdapter-DOBt_TyL.js';
|
|
4
|
+
export { a as VfsChange, b as VfsCreateFileParams, c as VfsCreateFolderParams, d as VfsSearchOptions } from './VfsAdapter-DOBt_TyL.js';
|
|
5
|
+
import { V as VfsEngine } from './VfsEngine-DLx0iUpi.js';
|
|
6
|
+
export { a as VfsCommand, b as VfsEventMap } from './VfsEngine-DLx0iUpi.js';
|
|
1
7
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
8
|
+
import { ReactNode } from 'react';
|
|
2
9
|
|
|
3
|
-
|
|
10
|
+
interface VfsWorkspaceEntry<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>> {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
engine: VfsEngine<TMeta>;
|
|
14
|
+
}
|
|
15
|
+
interface VfsTabPersistenceConfig {
|
|
16
|
+
strategy: "none" | "session" | "permanent";
|
|
17
|
+
}
|
|
18
|
+
interface VfsContextValue<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>> {
|
|
19
|
+
workspaces: Map<string, VfsWorkspaceEntry<TMeta>>;
|
|
20
|
+
activeWorkspaceId: string;
|
|
21
|
+
config: Required<VfsEngineConfig<TMeta>>;
|
|
22
|
+
tabPersistence: VfsTabPersistenceConfig;
|
|
23
|
+
isReady: (workspaceId: string) => boolean;
|
|
24
|
+
}
|
|
4
25
|
|
|
5
|
-
|
|
26
|
+
interface VfsWorkspaceInput<TMeta = Record<string, unknown>> {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
adapter: VfsAdapter<TMeta>;
|
|
30
|
+
}
|
|
31
|
+
interface VfsProviderProps<TMeta = Record<string, unknown>> {
|
|
32
|
+
children: ReactNode;
|
|
33
|
+
workspaces: VfsWorkspaceInput<TMeta>[];
|
|
34
|
+
config: Omit<VfsEngineConfig<TMeta>, "allowDuplicateNames" | "duplicateResolution"> & Partial<Pick<VfsEngineConfig<TMeta>, "allowDuplicateNames" | "duplicateResolution">>;
|
|
35
|
+
cacheStrategy?: "eager" | "lazy" | "hybrid";
|
|
36
|
+
tabPersistence?: VfsTabPersistenceConfig;
|
|
37
|
+
activeWorkspaceId?: string;
|
|
38
|
+
fallback?: ReactNode;
|
|
39
|
+
}
|
|
40
|
+
declare function VfsProvider<TMeta extends Record<string, unknown> | undefined = Record<string, unknown>>({ children, workspaces: workspaceInputs, config, cacheStrategy, tabPersistence, activeWorkspaceId, fallback, }: VfsProviderProps<TMeta>): react_jsx_runtime.JSX.Element;
|
|
6
41
|
|
|
7
|
-
export {
|
|
42
|
+
export { VfsAdapter, type VfsContextValue, VfsEngine, VfsEngineConfig, VfsProvider, type VfsProviderProps, type VfsTabPersistenceConfig, type VfsWorkspaceEntry, type VfsWorkspaceInput };
|