Luca Perullo
Components

Component

LiveNew

File Tree

Compose con <Tree>, <Folder>, <File>. Stato expanded in Set<string>, selected separato. Indent 18px per livello.

CodeSidebarClient
Open in ClaudeSorgente

Esempio01

file-tree.tsx
001Default · project root
002Deep nesting · monorepo
003Selected leaf · file picker

Note Per evitare collisioni: Folder e File qui sono i sub-component del file-tree, non i Lucide icon. Importa Lucide aliasati se servono nello stesso scope.

Prompt LLM02

Incolla in Claude o ChatGPT per generare la tua variante. Include il contesto del brand, i token e i vincoli del progetto.

Prompt · file-tree
Open in Claude
Sei un senior frontend engineer. Stai lavorando su un sito Next.js 16 + React 19 + Tailwind v4 in italiano, look chanhdai-inspired: colonna stretta 672px, Geist Sans + Geist Mono, hairline 1px, divisori a stripe diagonale, palette zinc.

Token CSS disponibili: --bg, --bg-alt, --fg, --fg-muted, --fg-soft, --border, --border-strong, --accent. Usa SEMPRE queste variabili tramite le utility tailwind generate (bg-bg, text-fg-muted, border-border, ecc.). Helper "cn" da "@/lib/utils". Niente librerie UI extra: solo lucide-react e tailwind-merge.

Genera <Tree> + <Folder> + <File> per file-tree gerarchico.
Type:
- TreeContextValue = { expanded: Set<string>; toggle; selected; select; depth }
Props Tree:
- children: ReactNode.
- initialExpandedItems?: string[].
- initialSelectedId?: string.
- className?.

Implementazione:
- "use client". createContext + useTree() hook che throw se manca.
- Tree: useState<Set<string>> expanded, useState<string|undefined> selected, toggle aggiunge/rimuove. role="tree".
- Folder props: value, element, children, className. Toggle on click. Indent depth*18px. ChevronRight rotate-90 quando open. FolderOpenIcon/FolderIcon Lucide aliasate.
- File props: value, children, className?, onClick?. Selezione = bg-accent/10 text-fg.
- Indent helper component.

Output: file completo src/components/file-tree.tsx, esporta Tree, Folder, File.

Uso tipico03

tsx
<Tree initialExpandedItems={["src"]} initialSelectedId="page.tsx">
  <Folder value="src" element="src">
    <File value="page.tsx">page.tsx</File>
  </Folder>
</Tree>

Dipendenze04

npm
  • lucide-react
  • tailwind-merge
  • clsx
Interno
  • @/lib/utils#cn

Ti è servito? Dimmelo, oppure proponi il prossimo componente.