'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;