// Flat monochrome file & folder icons — all use currentColor / var(--text-dim)
interface IconProps {
size?: number;
}
const DIM = "var(--text-dim)";
// ── Folder ────────────────────────────────────────────────────────────────
export function FolderIcon({ size = 14, open = false }: IconProps & { open?: boolean }) {
if (open) {
return (
);
}
return (
);
}
// ── Generic file (fallback) ────────────────────────────────────────────────
export function GenericFileIcon({ size = 14 }: IconProps) {
return (
);
}
// ── File with label text (used for most types) ────────────────────────────
// Renders the file outline + a short text badge
function LabelFileIcon({ label, size = 14 }: { label: string; size?: number }) {
const s = size / 14; // scale factor
return (
);
}
// ── Specific icons ────────────────────────────────────────────────────────
export function TypeScriptIcon({ size = 14 }: IconProps) {
return ;
}
export function TypeScriptReactIcon({ size = 14 }: IconProps) {
return ;
}
export function JavaScriptIcon({ size = 14 }: IconProps) {
return ;
}
export function JavaScriptReactIcon({ size = 14 }: IconProps) {
return ;
}
export function PythonIcon({ size = 14 }: IconProps) {
return ;
}
export function JsonIcon({ size = 14 }: IconProps) {
return ;
}
export function CssIcon({ size = 14 }: IconProps) {
return ;
}
export function ScssIcon({ size = 14 }: IconProps) {
return ;
}
export function HtmlIcon({ size = 14 }: IconProps) {
return ;
}
export function MarkdownIcon({ size = 14 }: IconProps) {
// file outline + M↓ symbol
return (
);
}
export function YamlIcon({ size = 14 }: IconProps) {
return ;
}
export function TomlIcon({ size = 14 }: IconProps) {
return ;
}
export function ShellIcon({ size = 14 }: IconProps) {
// file outline + > prompt
return (
);
}
export function RustIcon({ size = 14 }: IconProps) {
return ;
}
export function GoIcon({ size = 14 }: IconProps) {
return ;
}
export function SqlIcon({ size = 14 }: IconProps) {
return ;
}
export function GraphqlIcon({ size = 14 }: IconProps) {
return ;
}
export function TerraformIcon({ size = 14 }: IconProps) {
return ;
}
export function DockerfileIcon({ size = 14 }: IconProps) {
// file outline + container stack
return (
);
}
export function EnvIcon({ size = 14 }: IconProps) {
// file outline + key symbol
return (
);
}
export function GitIcon({ size = 14 }: IconProps) {
// file outline + git branch lines
return (
);
}
export function LockFileIcon({ size = 14 }: IconProps) {
return (
);
}
export function DocFileIcon({ size = 14 }: IconProps) {
return ;
}
export function PdfFileIcon({ size = 14 }: IconProps) {
return ;
}
export function ConfigIcon({ size = 14 }: IconProps) {
return (
);
}
// ── Main resolver ─────────────────────────────────────────────────────────
export function getFileIcon(name: string, size = 14): React.ReactNode {
const lower = name.toLowerCase();
const ext = lower.split(".").pop() ?? "";
if (lower === "dockerfile" || lower.startsWith("dockerfile.")) return ;
if (lower === ".env" || lower.startsWith(".env.")) return ;
if (lower === ".gitignore" || lower === ".gitattributes" || lower === ".gitmodules") return ;
if (lower === "package-lock.json" || lower === "yarn.lock" || lower === "bun.lock" || lower === "pnpm-lock.yaml" || lower === "cargo.lock") return ;
if (lower.endsWith(".config.ts") || lower.endsWith(".config.js") || lower.endsWith(".config.mjs") || lower.endsWith(".config.cjs")) return ;
if ([".eslintrc", ".eslintrc.js", ".eslintrc.json", ".eslintrc.yml", "eslint.config.mjs", "eslint.config.js"].includes(lower)) return ;
switch (ext) {
case "ts": return ;
case "tsx": return ;
case "js":
case "mjs":
case "cjs": return ;
case "jsx": return ;
case "py": return ;
case "json":
case "jsonl": return ;
case "css":
case "less": return ;
case "scss": return ;
case "html":
case "htm": return ;
case "md":
case "mdx": return ;
case "yaml":
case "yml": return ;
case "toml": return ;
case "sh":
case "bash":
case "zsh":
case "fish": return ;
case "rs": return ;
case "go": return ;
case "sql": return ;
case "graphql":
case "gql": return ;
case "tf":
case "hcl": return ;
case "docx": return ;
case "pdf": return ;
case "lock": return ;
default: return ;
}
}