File Tree
magicui/file-treeFreeComponent
A component used to showcase the folder and file structure of a directory.
Live preview
live · rendered by the registry
Rendered by magicui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://magicui.design/r/file-tree.jsonSource
1"use client"23import React, {4 createContext,5 forwardRef,6 useCallback,7 useContext,8 useEffect,9 useState,10} from "react"11import * as AccordionPrimitive from "@radix-ui/react-accordion"12import { FileIcon, FolderIcon, FolderOpenIcon } from "lucide-react"1314import { cn } from "@/lib/utils"15import { Button } from "@/components/ui/button"16import { ScrollArea } from "@/components/ui/scroll-area"1718type TreeViewElement = {19 id: string20 name: string21 type?: "file" | "folder"22 isSelectable?: boolean23 children?: TreeViewElement[]24}2526type TreeSortMode =27 | "default"28 | "none"29 | ((a: TreeViewElement, b: TreeViewElement) => number)3031type TreeContextProps = {32 selectedId: string | undefined33 expandedItems: string[] | undefined34 indicator: boolean35 handleExpand: (id: string) => void36 selectItem: (id: string) => void37 setExpandedItems?: React.Dispatch<React.SetStateAction<string[] | undefined>>38 openIcon?: React.ReactNode39 closeIcon?: React.ReactNode40 direction: "rtl" | "ltr"41}4243const TreeContext = createContext<TreeContextProps | null>(null)4445const useTree = () => {46 const context = useContext(TreeContext)47 if (!context) {48 throw new Error("useTree must be used within a TreeProvider")49 }50 return context51}5253type Direction = "rtl" | "ltr" | undefined5455const isFolderElement = (element: TreeViewElement) => {56 if (element.type) {57 return element.type === "folder"58 }5960 return Array.isArray(element.children)61}6263const mergeExpandedItems = (64 currentItems: string[] | undefined,65 nextItems: string[]66) => [...new Set([...(currentItems ?? []), ...nextItems])]6768const treeCollator = new Intl.Collator("en", {69 numeric: true,70 sensitivity: "base",71})7273const defaultTreeComparator = (a: TreeViewElement, b: TreeViewElement) => {74 const aIsFolder = isFolderElement(a)75 const bIsFolder = isFolderElement(b)7677 if (aIsFolder !== bIsFolder) {78 return aIsFolder ? -1 : 179 }8081 return treeCollator.compare(a.name, b.name)82}8384const getTreeComparator = (sort: TreeSortMode) => {85 if (sort === "none") {86 return undefined87 }8889 if (sort === "default") {90 return defaultTreeComparator91 }9293 return sort94}9596const sortTreeElements = (97 elements: TreeViewElement[],98 sort: TreeSortMode99): TreeViewElement[] => {100 const comparator = getTreeComparator(sort)101102 const nextElements = elements.map((element) => {103 if (!Array.isArray(element.children)) {104 return element105 }106107 return {108 ...element,109// … truncated
Files it writes
More from magicui
All 247 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Androidandroid | magicui | Components | Free | no deps | |
| Animated Beamanimated-beam | magicui | Components | Free | 1 dep | |
| Animated Circular Progress Baranimated-circular-progress-bar | magicui | Components | Free | no deps | |
| Animated Gradient Textanimated-gradient-text | magicui | Components | Free | no deps | |
| Animated Grid Patternanimated-grid-pattern | magicui | Components | Free | 1 dep | |
| Animated Listanimated-list | magicui | Components | Free | 1 dep | |
| Animated Shiny Textanimated-shiny-text | magicui | Components | Free | no deps | |
| Theme Toggleranimated-theme-toggler | magicui | Components | Free | 1 dep |
