49 lines
1.1 KiB
TypeScript
49 lines
1.1 KiB
TypeScript
|
|
'use client';
|
||
|
|
|
||
|
|
import {
|
||
|
|
FileText,
|
||
|
|
Code,
|
||
|
|
Code2,
|
||
|
|
Image,
|
||
|
|
File,
|
||
|
|
Folder,
|
||
|
|
} from 'lucide-react';
|
||
|
|
|
||
|
|
interface FileIconProps {
|
||
|
|
name: string;
|
||
|
|
type: 'file' | 'dir';
|
||
|
|
className?: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export default function FileIcon({ name, type, className = 'w-4 h-4' }: FileIconProps) {
|
||
|
|
if (type === 'dir') {
|
||
|
|
return <Folder className={`${className} text-accent-cyan`} />;
|
||
|
|
}
|
||
|
|
|
||
|
|
const ext = name.split('.').pop()?.toLowerCase() ?? '';
|
||
|
|
|
||
|
|
switch (ext) {
|
||
|
|
case 'md':
|
||
|
|
return <FileText className={`${className} text-surface-400`} />;
|
||
|
|
case 'json':
|
||
|
|
return <Code className={`${className} text-surface-400`} />;
|
||
|
|
case 'js':
|
||
|
|
case 'ts':
|
||
|
|
case 'py':
|
||
|
|
case 'css':
|
||
|
|
case 'html':
|
||
|
|
return <Code2 className={`${className} text-surface-400`} />;
|
||
|
|
case 'jpg':
|
||
|
|
case 'jpeg':
|
||
|
|
case 'png':
|
||
|
|
case 'gif':
|
||
|
|
case 'webp':
|
||
|
|
case 'svg':
|
||
|
|
return <Image className={`${className} text-surface-400`} />;
|
||
|
|
case 'pdf':
|
||
|
|
return <File className={`${className} text-surface-400`} />;
|
||
|
|
default:
|
||
|
|
return <File className={`${className} text-surface-400`} />;
|
||
|
|
}
|
||
|
|
}
|