'use client'; import React, { useState, ReactNode, Children, isValidElement, cloneElement } from 'react'; import { ChevronRight, File as FileIcon, Folder as FolderIcon, FolderOpen } from 'lucide-react'; interface FileProps { name: string; children?: ReactNode; } const FileComponent = ({ name }: FileProps) => { const [isHovered, setIsHovered] = useState(false); const fileExtension = name.split('.').pop()?.toUpperCase(); return (
setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} tabIndex={-1} > {name} {isHovered && fileExtension && ( {fileExtension} )}
); }; const FolderComponent = ({ name, children }: FileProps) => { const [isOpen, setIsOpen] = useState(true); // Set to true by default const [isHovered, setIsHovered] = useState(false); const hasChildren = React.Children.count(children) > 0; return (
hasChildren && setIsOpen(!isOpen)} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} tabIndex={-1} onKeyDown={(e) => e.preventDefault()} > {hasChildren ? ( ) : (
)} {isOpen ? ( ) : ( )} {name}
{isOpen && hasChildren && (
{children}
)}
); }; export const Files = ({ children }: { children: ReactNode }) => { return (
e.preventDefault()} >
{Children.map(children, (child, index) => { if (isValidElement(child)) { return cloneElement(child, { key: index }); } return null; })}
); }; export const Folder = ({ name, children }: FileProps) => { return {children}; }; export const File = ({ name }: FileProps) => { return ; }; // MDX Components export const FileTreeMdx = { Files, File, Folder, }; export default FileTreeMdx;