file-tree
jolyui-ui/file-treeFreeComponent
jolyui/ui publishes no description for this item.
Install it
npx shadcn@latest add https://jolyui.dev/r/file-tree.jsonSource
1import { ChevronRight, File, Folder, FolderOpen } from "lucide-react";2import { AnimatePresence, motion } from "motion/react";3import * as React from "react";4import { cn } from "@/lib/utils";56export interface TreeNode {7 id: string;8 name: string;9 type: "file" | "folder";10 children?: TreeNode[];11 icon?: React.ReactNode;12}1314interface FileTreeContextValue {15 selectedId: string | null;16 setSelectedId: (id: string | null) => void;17 expandedIds: Set<string>;18 toggleExpanded: (id: string) => void;19}2021const FileTreeContext = React.createContext<FileTreeContextValue | null>(null);2223function useFileTree() {24 const context = React.useContext(FileTreeContext);25 if (!context) {26 throw new Error("useFileTree must be used within a FileTree");27 }28 return context;29}3031function getAllFolderIds(nodes: TreeNode[]): string[] {32 const ids: string[] = [];33 for (const node of nodes) {34 if (node.type === "folder") {35 ids.push(node.id);36 if (node.children) {37 ids.push(...getAllFolderIds(node.children));38 }39 }40 }41 return ids;42}4344interface FileTreeProps {45 data: TreeNode[];46 className?: string;47 defaultExpandedIds?: string[];48 expandAllByDefault?: boolean;49 onSelect?: (node: TreeNode) => void;50}5152export function FileTree({53 data,54 className,55 defaultExpandedIds = [],56 expandAllByDefault = false,57 onSelect,58}: FileTreeProps) {59 const [selectedId, setSelectedId] = React.useState<string | null>(null);60 const [expandedIds, setExpandedIds] = React.useState<Set<string>>(61 new Set(expandAllByDefault ? getAllFolderIds(data) : defaultExpandedIds),62 );6364 const toggleExpanded = React.useCallback((id: string) => {65 setExpandedIds((prev) => {66 const next = new Set(prev);67 if (next.has(id)) {68 next.delete(id);69 } else {70 next.add(id);71 }72 return next;73 });74 }, []);7576 const handleSelect = React.useCallback(77 (node: TreeNode) => {78 setSelectedId(node.id);79 onSelect?.(node);80 },81 [onSelect],82 );8384 return (85 <FileTreeContext.Provider86 value={{87 selectedId,88 setSelectedId: (id) => setSelectedId(id),89 expandedIds,90 toggleExpanded,91 }}92 >93 <div94 className={cn(95 "rounded-lg border border-border bg-card p-2 font-mono text-sm",96 className,97 )}98 role="tree"99 aria-label="File tree"100 >101 <TreeNodeList nodes={data} level={0} onSelect={handleSelect} />102 </div>103// … truncated
What it pulls in
npm packages
Files it writes
More from jolyui/ui
All 199 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| ai-prompt-boxai-prompt-box | jolyui/ui | Components | Free | 4 deps | |
| animated-beamanimated-beam | jolyui/ui | Components | Free | 1 dep | |
| animated-tableanimated-table | jolyui/ui | Components | Free | 2 deps | |
| animated-theme-toggleanimated-theme-toggle | jolyui/ui | Components | Free | 2 deps | |
| animated-toastanimated-toast | jolyui/ui | Components | Free | 2 deps | |
| animated-tooltipanimated-tooltip | jolyui/ui | Components | Free | 1 dep | |
| bento-gridbento-grid | jolyui/ui | Components | Free | no deps | |
| buttonbutton | jolyui/ui | Components | Free | 3 deps |
