Files
codeaashu-claude-code/web/components/tools/FileIcon.tsx
ashutoshpythoncs@gmail.com b564857c0b claude-code
2026-03-31 18:58:05 +05:30

107 lines
1.8 KiB
TypeScript

"use client";
import {
FileText,
FileCode,
FileJson,
FileImage,
File,
Database,
Settings,
Package,
Globe,
BookOpen,
type LucideIcon,
} from "lucide-react";
const EXT_MAP: Record<string, LucideIcon> = {
// JavaScript / TypeScript
js: FileCode,
jsx: FileCode,
ts: FileCode,
tsx: FileCode,
mjs: FileCode,
cjs: FileCode,
// Web
html: Globe,
htm: Globe,
css: FileCode,
scss: FileCode,
sass: FileCode,
less: FileCode,
// Data
json: FileJson,
jsonc: FileJson,
yaml: FileJson,
yml: FileJson,
toml: FileJson,
xml: FileJson,
csv: Database,
// Config
env: Settings,
gitignore: Settings,
eslintrc: Settings,
prettierrc: Settings,
editorconfig: Settings,
// Docs
md: BookOpen,
mdx: BookOpen,
txt: FileText,
rst: FileText,
// Images
png: FileImage,
jpg: FileImage,
jpeg: FileImage,
gif: FileImage,
svg: FileImage,
ico: FileImage,
webp: FileImage,
// Package
lock: Package,
// Python
py: FileCode,
pyc: FileCode,
// Ruby
rb: FileCode,
// Go
go: FileCode,
// Rust
rs: FileCode,
// Java / Kotlin
java: FileCode,
kt: FileCode,
// C / C++
c: FileCode,
cpp: FileCode,
h: FileCode,
hpp: FileCode,
// Shell
sh: FileCode,
bash: FileCode,
zsh: FileCode,
fish: FileCode,
// SQL
sql: Database,
};
function getExtension(filePath: string): string {
const parts = filePath.split(".");
if (parts.length < 2) return "";
return parts[parts.length - 1].toLowerCase();
}
export function getFileIcon(filePath: string): LucideIcon {
const ext = getExtension(filePath);
return EXT_MAP[ext] ?? File;
}
interface FileIconProps {
filePath: string;
className?: string;
}
export function FileIcon({ filePath, className }: FileIconProps) {
const Icon = getFileIcon(filePath);
return <Icon className={className} />;
}