diff --git a/src/client/chunks/file-icons.tsx b/src/client/chunks/file-icons.tsx new file mode 100644 index 0000000..29ac96d --- /dev/null +++ b/src/client/chunks/file-icons.tsx @@ -0,0 +1,694 @@ +/** + * Lazy chunk entry: the colored file-icon theme dataset — brand and generic + * glyphs paired with their display color (extensions / exact file names / + * directory names), consumed by `registerColoredFileIcons` in the core half + * when the user turns the theme on. + * + * Data provenance: the tables below come from PR #429 (@fenter, + * `feat/file-type-icons`, the 563-entry table); they are reused here as the + * plugin's built-in OPTIONAL icon theme. The case-variant folder keys + * (`Android`/`android`, `IOS`/`ios`) were folded into one rule because the + * resolver matches names case-insensitively. + * + * Why a chunk: ~160 react-icons glyphs (Simple Icons brands + VSCodicons) and + * ~700 lines of table would otherwise sit in the startup bundle for a theme + * most users never enable. The core half only fetches this on demand. + * + * Skin contract: this module is the ONE documented exception to the + * token-only rule (guide §12) — brand colors are identity, not chrome, and + * the theme is opt-in, so they cannot ride `--dsw-alias-*`. Nothing here is + * imported by the core bundle; keep it that way. + */ +import type { ReactNode } from 'react' +import { + SiAngular, SiApple, SiAstro, SiBabel, SiBiome, SiBun, SiC, SiClojure, + SiCmake, SiCoffeescript, SiComposer, SiConventionalcommits, SiCplusplus, + SiCrystal, SiCss, SiCypress, SiDart, SiDjango, SiDocker, SiDocusaurus, + SiDotenv, SiDotnet, SiElixir, SiElm, SiErlang, SiEsbuild, SiEslint, + SiGatsby, SiGit, SiGithub, SiGitlab, SiGnubash, SiGo, SiGodotengine, + SiGooglecloud, SiGradle, SiGraphql, SiGrunt, SiGulp, SiHaskell, SiHelm, + SiHtml5, SiJavascript, SiJenkins, SiJest, SiJulia, SiKotlin, SiKubernetes, + SiLerna, SiLess, SiLua, SiMarkdown, SiMysql, SiNetlify, SiNextdotjs, SiNim, + SiNixos, SiNodedotjs, SiNpm, SiNuxt, SiNx, SiOcaml, SiPerl, SiPhp, SiPnpm, + SiPostcss, SiPrettier, SiPrisma, SiPython, SiRacket, SiReact, SiRemix, + SiRollupdotjs, SiRuby, SiRust, SiSass, SiScala, SiSolidity, SiSqlite, + SiStorybook, SiStylelint, SiSvelte, SiSwc, SiSwift, SiTailwindcss, SiTauri, + SiTerraform, SiToml, SiTurbo, SiTypescript, SiVercel, SiVim, SiVite, + SiVitepress, SiVitest, SiVuedotjs, SiWebpack, SiYaml, SiYarn, SiZig +} from 'react-icons/si' +import { + VscBook, VscFile, VscFileBinary, VscFileCode, VscFileMedia, VscFilePdf, + VscFileText, VscFileZip, VscJson, VscKey, + VscMap, VscMusic, VscSettings, VscTerminalCmd, VscTerminalPowershell +} from 'react-icons/vsc' +import type { IconType } from 'react-icons' + +interface IconEntry { + Icon: IconType + color: string +} + +/** Render one colored icon at the tree's 14px size. */ +export function colored(entry: IconEntry, size = 14): ReactNode { + const { Icon, color } = entry + return +} + +// ── Brand file icons (extension → { icon, brand color }) ──────────────── + +export const FILE_ICON_BY_EXT: Partial> = { + // TypeScript / JavaScript + ts: { Icon: SiTypescript, color: '#3178C6' }, + tsx: { Icon: SiReact, color: '#61DAFB' }, + js: { Icon: SiJavascript, color: '#F7DF1E' }, + jsx: { Icon: SiReact, color: '#61DAFB' }, + mjs: { Icon: SiJavascript, color: '#F7DF1E' }, + cjs: { Icon: SiJavascript, color: '#F7DF1E' }, + mtjs: { Icon: SiJavascript, color: '#F7DF1E' }, + cts: { Icon: SiTypescript, color: '#3178C6' }, + // Web frameworks + vue: { Icon: SiVuedotjs, color: '#42B883' }, + svelte: { Icon: SiSvelte, color: '#FF3E00' }, + astro: { Icon: SiAstro, color: '#FF5E00' }, + html: { Icon: SiHtml5, color: '#E34F26' }, + htm: { Icon: SiHtml5, color: '#E34F26' }, + xhtml: { Icon: SiHtml5, color: '#E34F26' }, + css: { Icon: SiCss, color: '#1572B6' }, + scss: { Icon: SiSass, color: '#CC6699' }, + sass: { Icon: SiSass, color: '#CC6699' }, + less: { Icon: SiLess, color: '#1D365D' }, + styl: { Icon: VscFileCode, color: '#BF1B1B' }, + pug: { Icon: VscFileCode, color: '#A86454' }, + jade: { Icon: VscFileCode, color: '#A86454' }, + hbs: { Icon: VscFileCode, color: '#F0772B' }, + handlebars: { Icon: VscFileCode, color: '#F0772B' }, + ejs: { Icon: VscFileCode, color: '#E44D26' }, + eta: { Icon: VscFileCode, color: '#E44D26' }, + njk: { Icon: VscFileCode, color: '#2C7873' }, + nunjucks: { Icon: VscFileCode, color: '#2C7873' }, + twig: { Icon: VscFileCode, color: '#41C47B' }, + liquid: { Icon: VscFileCode, color: '#41C47B' }, + // Systems + py: { Icon: SiPython, color: '#3776AB' }, + pyi: { Icon: SiPython, color: '#3776AB' }, + pyw: { Icon: SiPython, color: '#3776AB' }, + rb: { Icon: SiRuby, color: '#CC342D' }, + go: { Icon: SiGo, color: '#00ADD8' }, + rs: { Icon: SiRust, color: '#DEA584' }, + php: { Icon: SiPhp, color: '#777BB4' }, + swift: { Icon: SiSwift, color: '#F05138' }, + kt: { Icon: SiKotlin, color: '#7F52FF' }, + kts: { Icon: SiKotlin, color: '#7F52FF' }, + dart: { Icon: SiDart, color: '#0175C2' }, + lua: { Icon: SiLua, color: '#2C2D72' }, + scala: { Icon: SiScala, color: '#DC322F' }, + clj: { Icon: SiClojure, color: '#5F5F5F' }, + cljs: { Icon: SiClojure, color: '#5F5F5F' }, + cljc: { Icon: SiClojure, color: '#5F5F5F' }, + edn: { Icon: SiClojure, color: '#5F5F5F' }, + pl: { Icon: SiPerl, color: '#393939' }, + pm: { Icon: SiPerl, color: '#393939' }, + hs: { Icon: SiHaskell, color: '#5E5086' }, + erl: { Icon: SiErlang, color: '#A90533' }, + jl: { Icon: SiJulia, color: '#9558B2' }, + ex: { Icon: SiElixir, color: '#4B275F' }, + exs: { Icon: SiElixir, color: '#4B275F' }, + elm: { Icon: SiElm, color: '#60B5CC' }, + nim: { Icon: SiNim, color: '#FFE95B' }, + zig: { Icon: SiZig, color: '#F7A41D' }, + ml: { Icon: SiOcaml, color: '#EC672F' }, + mli: { Icon: SiOcaml, color: '#EC672F' }, + sol: { Icon: SiSolidity, color: '#363636' }, + rkt: { Icon: SiRacket, color: '#9C1C1C' }, + vim: { Icon: SiVim, color: '#019733' }, + viml: { Icon: SiVim, color: '#019733' }, + ahk: { Icon: VscFileCode, color: '#334455' }, + feature: { Icon: VscFileCode, color: '#00C356' }, + groovy: { Icon: VscFileCode, color: '#4298B8' }, + gradle: { Icon: SiGradle, color: '#02303A' }, + proto: { Icon: VscFileCode, color: '#4285F4' }, + thrift: { Icon: VscFileCode, color: '#6B7280' }, + nix: { Icon: SiNixos, color: '#7EB1D6' }, + // C / C++ + c: { Icon: SiC, color: '#A8B9CC' }, + h: { Icon: SiC, color: '#A8B9CC' }, + cpp: { Icon: SiCplusplus, color: '#00599C' }, + cc: { Icon: SiCplusplus, color: '#00599C' }, + cxx: { Icon: SiCplusplus, color: '#00599C' }, + hpp: { Icon: SiCplusplus, color: '#00599C' }, + hxx: { Icon: SiCplusplus, color: '#00599C' }, + ino: { Icon: VscFileCode, color: '#00878F' }, + cs: { Icon: SiDotnet, color: '#512BD4' }, + fs: { Icon: SiDotnet, color: '#512BD4' }, + fsx: { Icon: SiDotnet, color: '#512BD4' }, + vb: { Icon: SiDotnet, color: '#512BD4' }, + // Shell + sh: { Icon: SiGnubash, color: '#4EAA25' }, + bash: { Icon: SiGnubash, color: '#4EAA25' }, + zsh: { Icon: SiGnubash, color: '#4EAA25' }, + fish: { Icon: SiGnubash, color: '#4EAA25' }, + ps1: { Icon: VscTerminalPowershell, color: '#012456' }, + psd1: { Icon: VscTerminalPowershell, color: '#012456' }, + psm1: { Icon: VscTerminalPowershell, color: '#012456' }, + bat: { Icon: VscTerminalCmd, color: '#C8C8C8' }, + cmd: { Icon: VscTerminalCmd, color: '#C8C8C8' }, + awk: { Icon: VscFileCode, color: '#4EAA25' }, + // Data / config + json: { Icon: VscJson, color: '#F7DF1E' }, + jsonc: { Icon: VscJson, color: '#F7DF1E' }, + json5: { Icon: VscJson, color: '#F7DF1E' }, + yaml: { Icon: SiYaml, color: '#CB171E' }, + yml: { Icon: SiYaml, color: '#CB171E' }, + toml: { Icon: SiToml, color: '#9C4121' }, + ini: { Icon: VscSettings, color: '#8B5CF6' }, + conf: { Icon: VscSettings, color: '#8B5CF6' }, + cfg: { Icon: VscSettings, color: '#8B5CF6' }, + env: { Icon: SiDotenv, color: '#ECD53F' }, + xml: { Icon: VscFileCode, color: '#E3792B' }, + plist: { Icon: VscSettings, color: '#6B7280' }, + properties: { Icon: VscSettings, color: '#8B5CF6' }, + csv: { Icon: VscFileText, color: '#2CB553' }, + tsv: { Icon: VscFileText, color: '#2CB553' }, + // Docs + md: { Icon: SiMarkdown, color: '#0844B8' }, + markdown: { Icon: SiMarkdown, color: '#0844B8' }, + mdx: { Icon: SiMarkdown, color: '#0844B8' }, + txt: { Icon: VscFileText, color: '#6B7280' }, + log: { Icon: VscFileText, color: '#6B7280' }, + pdf: { Icon: VscFilePdf, color: '#E53935' }, + rst: { Icon: VscFileText, color: '#7D3CBE' }, + adoc: { Icon: VscFileText, color: '#E40046' }, + asciidoc: { Icon: VscFileText, color: '#E40046' }, + tex: { Icon: VscFileText, color: '#3D6117' }, + latex: { Icon: VscFileText, color: '#3D6117' }, + org: { Icon: VscFileText, color: '#77D0B0' }, + rtf: { Icon: VscFileText, color: '#6B7280' }, + // Office + doc: { Icon: VscFileText, color: '#2B579A' }, + docx: { Icon: VscFileText, color: '#2B579A' }, + xls: { Icon: VscFileText, color: '#217346' }, + xlsx: { Icon: VscFileText, color: '#217346' }, + ppt: { Icon: VscFileText, color: '#D24726' }, + pptx: { Icon: VscFileText, color: '#D24726' }, + odt: { Icon: VscFileText, color: '#18A303' }, + ods: { Icon: VscFileText, color: '#18A303' }, + odp: { Icon: VscFileText, color: '#18A303' }, + // Images + png: { Icon: VscFileMedia, color: '#A855F7' }, + jpg: { Icon: VscFileMedia, color: '#A855F7' }, + jpeg: { Icon: VscFileMedia, color: '#A855F7' }, + gif: { Icon: VscFileMedia, color: '#A855F7' }, + webp: { Icon: VscFileMedia, color: '#A855F7' }, + svg: { Icon: VscFileMedia, color: '#FFB13B' }, + ico: { Icon: VscFileMedia, color: '#A855F7' }, + bmp: { Icon: VscFileMedia, color: '#A855F7' }, + avif: { Icon: VscFileMedia, color: '#A855F7' }, + tiff: { Icon: VscFileMedia, color: '#A855F7' }, + tif: { Icon: VscFileMedia, color: '#A855F7' }, + heic: { Icon: VscFileMedia, color: '#A855F7' }, + heif: { Icon: VscFileMedia, color: '#A855F7' }, + psd: { Icon: VscFileMedia, color: '#31A8FF' }, + ai: { Icon: VscFileMedia, color: '#FF9A00' }, + eps: { Icon: VscFileMedia, color: '#FFB13B' }, + raw: { Icon: VscFileMedia, color: '#6B7280' }, + xcf: { Icon: VscFileMedia, color: '#535555' }, + // Video + mp4: { Icon: VscFileMedia, color: '#FF6B6B' }, + webm: { Icon: VscFileMedia, color: '#FF6B6B' }, + mov: { Icon: VscFileMedia, color: '#FF6B6B' }, + mkv: { Icon: VscFileMedia, color: '#FF6B6B' }, + avi: { Icon: VscFileMedia, color: '#FF6B6B' }, + wmv: { Icon: VscFileMedia, color: '#FF6B6B' }, + flv: { Icon: VscFileMedia, color: '#FF6B6B' }, + m4v: { Icon: VscFileMedia, color: '#FF6B6B' }, + m3u8: { Icon: VscFileMedia, color: '#FF6B6B' }, + // Audio + mp3: { Icon: VscMusic, color: '#EC4899' }, + wav: { Icon: VscMusic, color: '#EC4899' }, + flac: { Icon: VscMusic, color: '#EC4899' }, + ogg: { Icon: VscMusic, color: '#EC4899' }, + m4a: { Icon: VscMusic, color: '#EC4899' }, + aac: { Icon: VscMusic, color: '#EC4899' }, + opus: { Icon: VscMusic, color: '#EC4899' }, + midi: { Icon: VscMusic, color: '#EC4899' }, + mid: { Icon: VscMusic, color: '#EC4899' }, + wma: { Icon: VscMusic, color: '#EC4899' }, + aiff: { Icon: VscMusic, color: '#EC4899' }, + mka: { Icon: VscMusic, color: '#EC4899' }, + // Archives + zip: { Icon: VscFileZip, color: '#F59E0B' }, + tar: { Icon: VscFileZip, color: '#F59E0B' }, + gz: { Icon: VscFileZip, color: '#F59E0B' }, + tgz: { Icon: VscFileZip, color: '#F59E0B' }, + rar: { Icon: VscFileZip, color: '#F59E0B' }, + '7z': { Icon: VscFileZip, color: '#F59E0B' }, + bz2: { Icon: VscFileZip, color: '#F59E0B' }, + xz: { Icon: VscFileZip, color: '#F59E0B' }, + iso: { Icon: VscFileZip, color: '#F59E0B' }, + dmg: { Icon: VscFileZip, color: '#F59E0B' }, + jar: { Icon: VscFileZip, color: '#F59E0B' }, + war: { Icon: VscFileZip, color: '#F59E0B' }, + ear: { Icon: VscFileZip, color: '#F59E0B' }, + apk: { Icon: VscFileZip, color: '#3DDC84' }, + deb: { Icon: VscFileZip, color: '#A81D33' }, + rpm: { Icon: VscFileZip, color: '#000000' }, + msi: { Icon: VscFileZip, color: '#6B7280' }, + lz: { Icon: VscFileZip, color: '#F59E0B' }, + zst: { Icon: VscFileZip, color: '#F59E0B' }, + cab: { Icon: VscFileZip, color: '#F59E0B' }, + // Database + db: { Icon: SiSqlite, color: '#003B57' }, + sqlite: { Icon: SiSqlite, color: '#003B57' }, + sqlite3: { Icon: SiSqlite, color: '#003B57' }, + sql: { Icon: SiMysql, color: '#4479A1' }, + // Source maps + map: { Icon: VscMap, color: '#6B7280' }, + // Keys / certs + pem: { Icon: VscKey, color: '#10B981' }, + key: { Icon: VscKey, color: '#10B981' }, + crt: { Icon: VscKey, color: '#10B981' }, + pub: { Icon: VscKey, color: '#10B981' }, + cer: { Icon: VscKey, color: '#10B981' }, + der: { Icon: VscKey, color: '#10B981' }, + p12: { Icon: VscKey, color: '#10B981' }, + pfx: { Icon: VscKey, color: '#10B981' }, + jks: { Icon: VscKey, color: '#10B981' }, + keystore: { Icon: VscKey, color: '#10B981' }, + csr: { Icon: VscKey, color: '#10B981' }, + ovpn: { Icon: VscKey, color: '#10B981' }, + // Fonts + ttf: { Icon: VscFileBinary, color: '#A855F7' }, + otf: { Icon: VscFileBinary, color: '#A855F7' }, + woff: { Icon: VscFileBinary, color: '#A855F7' }, + woff2: { Icon: VscFileBinary, color: '#A855F7' }, + eot: { Icon: VscFileBinary, color: '#A855F7' }, + // GraphQL + graphql: { Icon: SiGraphql, color: '#E10098' }, + gql: { Icon: SiGraphql, color: '#E10098' }, + // Terraform / IaC + tf: { Icon: SiTerraform, color: '#7B42BC' }, + tfvars: { Icon: SiTerraform, color: '#7B42BC' }, + tfstate: { Icon: SiTerraform, color: '#7B42BC' }, + hcl: { Icon: SiTerraform, color: '#7B42BC' }, + // Godot + gd: { Icon: SiGodotengine, color: '#478CBF' }, + // Crystal + cr: { Icon: SiCrystal, color: '#000000' }, + // CoffeeScript + coffee: { Icon: SiCoffeescript, color: '#2F2614' }, +} + +// ── Special filenames (exact match, case-sensitive) ────────────────────── + +export const FILE_ICON_BY_NAME: Partial> = { + // Package managers + 'package.json': { Icon: SiNpm, color: '#CB3837' }, + 'package-lock.json': { Icon: SiNpm, color: '#CB3837' }, + 'pnpm-lock.yaml': { Icon: SiPnpm, color: '#F69220' }, + 'yarn.lock': { Icon: SiYarn, color: '#2C8EBB' }, + 'Cargo.lock': { Icon: SiRust, color: '#DEA584' }, + 'Cargo.toml': { Icon: SiRust, color: '#DEA584' }, + 'go.sum': { Icon: SiGo, color: '#00ADD8' }, + 'go.mod': { Icon: SiGo, color: '#00ADD8' }, + 'go.work': { Icon: SiGo, color: '#00ADD8' }, + 'composer.json': { Icon: SiComposer, color: '#885630' }, + 'composer.lock': { Icon: SiComposer, color: '#885630' }, + 'poetry.lock': { Icon: SiPython, color: '#3776AB' }, + 'uv.lock': { Icon: SiPython, color: '#3776AB' }, + 'bun.lockb': { Icon: SiBun, color: '#FBF0DF' }, + 'bun.lock': { Icon: SiBun, color: '#FBF0DF' }, + 'mix.lock': { Icon: SiElixir, color: '#4B275F' }, + 'Podfile': { Icon: SiApple, color: '#A6A6A6' }, + 'Podfile.lock': { Icon: SiApple, color: '#A6A6A6' }, + 'Package.resolved': { Icon: SiSwift, color: '#F05138' }, + 'packages.lock.json': { Icon: SiNodedotjs, color: '#339933' }, + 'flake.lock': { Icon: SiNixos, color: '#7EB1D6' }, + 'flake.nix': { Icon: SiNixos, color: '#7EB1D6' }, + 'default.nix': { Icon: SiNixos, color: '#7EB1D6' }, + 'shell.nix': { Icon: SiNixos, color: '#7EB1D6' }, + // Git + '.gitignore': { Icon: SiGit, color: '#F05032' }, + '.gitattributes': { Icon: SiGit, color: '#F05032' }, + '.gitmodules': { Icon: SiGit, color: '#F05032' }, + '.gitconfig': { Icon: SiGit, color: '#F05032' }, + '.gitmessage': { Icon: SiGit, color: '#F05032' }, + '.git-blame-ignore-revs': { Icon: SiGit, color: '#F05032' }, + '.gitkeep': { Icon: VscFile, color: '#6B7280' }, + '.keep': { Icon: VscFile, color: '#6B7280' }, + // Docs + 'LICENSE': { Icon: VscBook, color: '#6B7280' }, + 'LICENSE.md': { Icon: VscBook, color: '#6B7280' }, + 'LICENSE.txt': { Icon: VscBook, color: '#6B7280' }, + 'README.md': { Icon: SiMarkdown, color: '#0844B8' }, + 'CHANGELOG.md': { Icon: SiMarkdown, color: '#0844B8' }, + 'CONTRIBUTING.md': { Icon: VscBook, color: '#6B7280' }, + 'CODE_OF_CONDUCT.md': { Icon: VscBook, color: '#6B7280' }, + 'SECURITY.md': { Icon: VscBook, color: '#6B7280' }, + 'AUTHORS': { Icon: VscBook, color: '#6B7280' }, + 'MAINTAINERS': { Icon: VscBook, color: '#6B7280' }, + 'CODEOWNERS': { Icon: SiGithub, color: '#181717' }, + // Docker + 'Dockerfile': { Icon: SiDocker, color: '#2496ED' }, + 'Dockerfile.dev': { Icon: SiDocker, color: '#2496ED' }, + 'Dockerfile.prod': { Icon: SiDocker, color: '#2496ED' }, + 'Dockerfile.test': { Icon: SiDocker, color: '#2496ED' }, + 'docker-compose.yml': { Icon: SiDocker, color: '#2496ED' }, + 'docker-compose.yaml': { Icon: SiDocker, color: '#2496ED' }, + 'docker-compose.override.yml': { Icon: SiDocker, color: '#2496ED' }, + 'Containerfile': { Icon: SiDocker, color: '#2496ED' }, + '.dockerignore': { Icon: SiDocker, color: '#2496ED' }, + '.containerignore': { Icon: SiDocker, color: '#2496ED' }, + // Build + 'Makefile': { Icon: SiCmake, color: '#064F8C' }, + 'CMakeLists.txt': { Icon: SiCmake, color: '#064F8C' }, + '.editorconfig': { Icon: VscSettings, color: '#E0EFEF' }, + // Env + '.env': { Icon: SiDotenv, color: '#ECD53F' }, + '.env.local': { Icon: SiDotenv, color: '#ECD53F' }, + '.env.development': { Icon: SiDotenv, color: '#ECD53F' }, + '.env.production': { Icon: SiDotenv, color: '#ECD53F' }, + '.env.example': { Icon: SiDotenv, color: '#ECD53F' }, + '.env.test': { Icon: SiDotenv, color: '#ECD53F' }, + '.env.staging': { Icon: SiDotenv, color: '#ECD53F' }, + '.env.docker': { Icon: SiDotenv, color: '#ECD53F' }, + // TypeScript / JS config + 'tsconfig.json': { Icon: SiTypescript, color: '#3178C6' }, + 'tsconfig.base.json': { Icon: SiTypescript, color: '#3178C6' }, + 'jsconfig.json': { Icon: SiJavascript, color: '#F7DF1E' }, + // Bundlers / build tools + 'vite.config.ts': { Icon: SiVite, color: '#646CFF' }, + 'vite.config.js': { Icon: SiVite, color: '#646CFF' }, + 'vite.config.mts': { Icon: SiVite, color: '#646CFF' }, + 'vite.config.mjs': { Icon: SiVite, color: '#646CFF' }, + 'webpack.config.js': { Icon: SiWebpack, color: '#1C78C0' }, + 'webpack.config.ts': { Icon: SiWebpack, color: '#1C78C0' }, + 'rollup.config.js': { Icon: SiRollupdotjs, color: '#C3413D' }, + 'rollup.config.mjs': { Icon: SiRollupdotjs, color: '#C3413D' }, + 'esbuild.config.js': { Icon: SiEsbuild, color: '#FFCF00' }, + 'gulpfile.js': { Icon: SiGulp, color: '#CF4647' }, + 'gulpfile.ts': { Icon: SiGulp, color: '#CF4647' }, + 'gulpfile.mjs': { Icon: SiGulp, color: '#CF4647' }, + 'gruntfile.js': { Icon: SiGrunt, color: '#FBA937' }, + 'tsup.config.ts': { Icon: VscSettings, color: '#646CFF' }, + 'tsdown.config.ts': { Icon: VscSettings, color: '#646CFF' }, + 'unbuild.config.ts': { Icon: VscSettings, color: '#646CFF' }, + 'farm.config.ts': { Icon: VscSettings, color: '#646CFF' }, + 'rspack.config.js': { Icon: VscSettings, color: '#646CFF' }, + 'swc.config.js': { Icon: SiSwc, color: '#E0BD6E' }, + '.swcrc': { Icon: SiSwc, color: '#E0BD6E' }, + 'turbo.json': { Icon: SiTurbo, color: '#6DD3C6' }, + 'turbo.config.json': { Icon: SiTurbo, color: '#6DD3C6' }, + 'nx.json': { Icon: SiNx, color: '#14305F' }, + 'lerna.json': { Icon: SiLerna, color: '#9333EA' }, + 'biome.json': { Icon: SiBiome, color: '#60A5FA' }, + // Frameworks + 'next.config.js': { Icon: SiNextdotjs, color: '#000000' }, + 'next.config.mjs': { Icon: SiNextdotjs, color: '#000000' }, + 'next.config.ts': { Icon: SiNextdotjs, color: '#000000' }, + 'nuxt.config.ts': { Icon: SiNuxt, color: '#00DC82' }, + 'nuxt.config.js': { Icon: SiNuxt, color: '#00DC82' }, + 'angular.json': { Icon: SiAngular, color: '#DD0031' }, + 'svelte.config.js': { Icon: SiSvelte, color: '#FF3E00' }, + 'astro.config.mjs': { Icon: SiAstro, color: '#FF5E00' }, + 'astro.config.ts': { Icon: SiAstro, color: '#FF5E00' }, + 'remix.config.js': { Icon: SiRemix, color: '#3992FF' }, + 'gatsby-config.js': { Icon: SiGatsby, color: '#663399' }, + 'gatsby-config.ts': { Icon: SiGatsby, color: '#663399' }, + 'tailwind.config.js': { Icon: SiTailwindcss, color: '#06B6D4' }, + 'tailwind.config.ts': { Icon: SiTailwindcss, color: '#06B6D4' }, + 'tauri.conf.json': { Icon: SiTauri, color: '#FFC131' }, + 'vercel.json': { Icon: SiVercel, color: '#000000' }, + 'netlify.toml': { Icon: SiNetlify, color: '#00C7B7' }, + 'docusaurus.config.js': { Icon: SiDocusaurus, color: '#3ECCF4' }, + 'docusaurus.config.ts': { Icon: SiDocusaurus, color: '#3ECCF4' }, + 'vitepress.config.ts': { Icon: SiVitepress, color: '#5672CD' }, + 'vitepress.config.js': { Icon: SiVitepress, color: '#5672CD' }, + // Testing + 'playwright.config.ts': { Icon: VscSettings, color: '#2EAD33' }, + 'playwright.config.js': { Icon: VscSettings, color: '#2EAD33' }, + 'vitest.config.ts': { Icon: SiVitest, color: '#FCC00B' }, + 'vitest.config.js': { Icon: SiVitest, color: '#FCC00B' }, + 'jest.config.js': { Icon: SiJest, color: '#C21325' }, + 'jest.config.ts': { Icon: SiJest, color: '#C21325' }, + 'cypress.config.ts': { Icon: SiCypress, color: '#17202C' }, + 'cypress.config.js': { Icon: SiCypress, color: '#17202C' }, + // Linting / formatting + '.eslintrc.js': { Icon: SiEslint, color: '#4B32C3' }, + '.eslintrc.json': { Icon: SiEslint, color: '#4B32C3' }, + '.eslintrc.cjs': { Icon: SiEslint, color: '#4B32C3' }, + '.eslintrc.mjs': { Icon: SiEslint, color: '#4B32C3' }, + '.eslintrc.yml': { Icon: SiEslint, color: '#4B32C3' }, + 'eslint.config.js': { Icon: SiEslint, color: '#4B32C3' }, + 'eslint.config.mjs': { Icon: SiEslint, color: '#4B32C3' }, + 'eslint.config.ts': { Icon: SiEslint, color: '#4B32C3' }, + '.eslintignore': { Icon: SiEslint, color: '#4B32C3' }, + '.prettierrc': { Icon: SiPrettier, color: '#F7B93E' }, + '.prettierrc.json': { Icon: SiPrettier, color: '#F7B93E' }, + '.prettierrc.js': { Icon: SiPrettier, color: '#F7B93E' }, + '.prettierrc.cjs': { Icon: SiPrettier, color: '#F7B93E' }, + '.prettierrc.mjs': { Icon: SiPrettier, color: '#F7B93E' }, + '.prettierrc.toml': { Icon: SiPrettier, color: '#F7B93E' }, + '.prettierrc.json5': { Icon: SiPrettier, color: '#F7B93E' }, + 'prettier.config.js': { Icon: SiPrettier, color: '#F7B93E' }, + 'prettier.config.mjs': { Icon: SiPrettier, color: '#F7B93E' }, + '.prettierignore': { Icon: SiPrettier, color: '#F7B93E' }, + '.stylelintrc': { Icon: SiStylelint, color: '#263A6F' }, + '.stylelintrc.json': { Icon: SiStylelint, color: '#263A6F' }, + '.stylelintrc.js': { Icon: SiStylelint, color: '#263A6F' }, + '.stylelintignore': { Icon: SiStylelint, color: '#263A6F' }, + 'babel.config.js': { Icon: SiBabel, color: '#F9DC3D' }, + 'babel.config.json': { Icon: SiBabel, color: '#F9DC3D' }, + '.babelrc': { Icon: SiBabel, color: '#F9DC3D' }, + '.babelrc.json': { Icon: SiBabel, color: '#F9DC3D' }, + '.babelrc.cjs': { Icon: SiBabel, color: '#F9DC3D' }, + 'postcss.config.js': { Icon: SiPostcss, color: '#DD3A8C' }, + 'postcss.config.ts': { Icon: SiPostcss, color: '#DD3A8C' }, + '.postcssrc': { Icon: SiPostcss, color: '#DD3A8C' }, + '.postcssrc.json': { Icon: SiPostcss, color: '#DD3A8C' }, + // Other config + '.npmrc': { Icon: SiNpm, color: '#CB3837' }, + '.yarnrc': { Icon: SiYarn, color: '#2C8EBB' }, + '.pnpmrc': { Icon: SiPnpm, color: '#F69220' }, + '.npmignore': { Icon: SiNpm, color: '#CB3837' }, + '.nvmrc': { Icon: SiNodedotjs, color: '#339933' }, + '.node-version': { Icon: SiNodedotjs, color: '#339933' }, + '.ruby-version': { Icon: SiRuby, color: '#CC342D' }, + '.python-version': { Icon: SiPython, color: '#3776AB' }, + '.lintstagedrc': { Icon: VscSettings, color: '#F7B500' }, + '.lintstagedrc.json': { Icon: VscSettings, color: '#F7B500' }, + '.commitlintrc': { Icon: SiConventionalcommits, color: '#FE5197' }, + '.commitlintrc.json': { Icon: SiConventionalcommits, color: '#FE5197' }, + '.releaserc': { Icon: VscSettings, color: '#F7B500' }, + '.releaserc.json': { Icon: VscSettings, color: '#F7B500' }, + '.czrc': { Icon: VscSettings, color: '#F7B500' }, + // Ruby / Python + 'Gemfile': { Icon: SiRuby, color: '#CC342D' }, + 'Gemfile.lock': { Icon: SiRuby, color: '#CC342D' }, + 'Rakefile': { Icon: SiRuby, color: '#CC342D' }, + 'requirements.txt': { Icon: SiPython, color: '#3776AB' }, + 'setup.py': { Icon: SiPython, color: '#3776AB' }, + 'pyproject.toml': { Icon: SiPython, color: '#3776AB' }, + 'manage.py': { Icon: SiDjango, color: '#092E20' }, + // CI/CD + 'Jenkinsfile': { Icon: SiJenkins, color: '#D24939' }, + '.gitlab-ci.yml': { Icon: SiGitlab, color: '#FC6D26' }, + '.travis.yml': { Icon: VscSettings, color: '#3EAAAF' }, + 'azure-pipelines.yml': { Icon: VscSettings, color: '#0078D4' }, + 'bitbucket-pipelines.yml': { Icon: VscSettings, color: '#0052CC' }, + '.drone.yml': { Icon: VscSettings, color: '#212121' }, + 'cloudbuild.yaml': { Icon: SiGooglecloud, color: '#4285F4' }, + // K8s / Helm + 'Chart.yaml': { Icon: SiHelm, color: '#0F1689' }, + 'values.yaml': { Icon: SiHelm, color: '#0F1689' }, + 'kustomization.yaml': { Icon: SiKubernetes, color: '#326CE5' }, + 'kustomization.yml': { Icon: SiKubernetes, color: '#326CE5' }, + 'skaffold.yaml': { Icon: SiKubernetes, color: '#326CE5' }, + '.helmignore': { Icon: SiHelm, color: '#0F1689' }, + // Serverless + 'serverless.yml': { Icon: VscSettings, color: '#6B7280' }, + 'sam.yaml': { Icon: VscSettings, color: '#6B7280' }, + 'appspec.yml': { Icon: VscSettings, color: '#6B7280' }, + // Prisma + 'schema.prisma': { Icon: SiPrisma, color: '#5D8AA8' }, + // Misc + 'Procfile': { Icon: SiNodedotjs, color: '#339933' }, + '.storybook/main.js': { Icon: SiStorybook, color: '#FF4785' }, + '.storybook/main.ts': { Icon: SiStorybook, color: '#FF4785' }, + '.storybook/preview.js': { Icon: SiStorybook, color: '#FF4785' }, + '.storybook/preview.ts': { Icon: SiStorybook, color: '#FF4785' }, +} + +// ── Special folder colors ─────────────────────────────────────────────── + +/** Folder name → tint color (applied to VscFolder / VscFolderOpened). */ +export const FOLDER_COLOR: Record = { + // Package / dependency + node_modules: '#CB3837', + packages: '#CB3837', + // Source + src: '#3178C6', + source: '#3178C6', + app: '#3178C6', + apps: '#3178C6', + core: '#A855F7', + common: '#6B7280', + shared: '#6B7280', + internal: '#6B7280', + modules: '#3178C6', + plugins: '#42B883', + // Git + '.git': '#F05032', + '.github': '#F05032', + '.husky': '#F05032', + // Output + public: '#42B883', + static: '#42B883', + dist: '#E34F26', + build: '#E34F26', + out: '#E34F26', + '.output': '#E34F26', + '.next': '#000000', + '.nuxt': '#00DC82', + '.svelte-kit': '#FF3E00', + '.astro': '#FF5E00', + '.turbo': '#6DD3C6', + '.parcel-cache': '#6B7280', + '.vercel': '#000000', + '.netlify': '#00C7B7', + '.serverless': '#6B7280', + '.terraform': '#7B42BC', + '.terragrunt-cache': '#7B42BC', + '.docusaurus': '#3ECCF4', + '.cache': '#6B7280', + // Testing + test: '#F7DF1E', + tests: '#F7DF1E', + __tests__: '#F7DF1E', + __mocks__: '#F7DF1E', + __snapshots__: '#F7DF1E', + __pacts__: '#F7DF1E', + spec: '#F7DF1E', + specs: '#F7DF1E', + mocks: '#F7DF1E', + fixtures: '#F7DF1E', + e2e: '#F7DF1E', + cypress: '#17202C', + '.nyc_output': '#F7DF1E', + coverage: '#42B883', + // IDE / editor + '.vscode': '#3178C6', + '.idea': '#3178C6', + '.devcontainer': '#3178C6', + '.codesandbox': '#6B7280', + '.stackblitz': '#6B7280', + '.gitpod': '#6B7280', + // Assets + assets: '#A855F7', + images: '#A855F7', + img: '#A855F7', + icons: '#A855F7', + fonts: '#A855F7', + media: '#A855F7', + resources: '#A855F7', + content: '#A855F7', + // Styles + styles: '#CC6699', + stylesheets: '#CC6699', + css: '#CC6699', + themes: '#CC6699', + templates: '#CC6699', + partials: '#CC6699', + layouts: '#CC6699', + // Components + components: '#42B883', + composables: '#42B883', + hooks: '#42B883', + // Library + lib: '#6B7280', + libs: '#6B7280', + vendor: '#6B7280', + // Docs + docs: '#0844B8', + documentation: '#0844B8', + examples: '#6B7280', + playground: '#42B883', + benchmarks: '#4EAA25', + // Scripts + scripts: '#4EAA25', + bin: '#4EAA25', + tools: '#4EAA25', + // Config + config: '#F7B500', + configs: '#F7B500', + '.config': '#F7B500', + // i18n + locales: '#F7B500', + i18n: '#F7B500', + translations: '#F7B500', + lang: '#F7B500', + language: '#F7B500', + // Routing + pages: '#3178C6', + views: '#3178C6', + routes: '#3178C6', + router: '#3178C6', + // State + store: '#A855F7', + stores: '#A855F7', + state: '#A855F7', + // Utils + utils: '#6B7280', + helpers: '#6B7280', + types: '#3178C6', + typings: '#3178C6', + // Backend + api: '#42B883', + server: '#42B883', + services: '#42B883', + client: '#3178C6', + clients: '#3178C6', + middleware: '#CC6699', + controllers: '#42B883', + models: '#A855F7', + entities: '#A855F7', + repositories: '#A855F7', + migrations: '#4479A1', + seeds: '#4479A1', + factories: '#4479A1', + // Jobs / workers + tasks: '#4EAA25', + jobs: '#4EAA25', + workers: '#4EAA25', + queues: '#4EAA25', + // Events + events: '#F7DF1E', + listeners: '#F7DF1E', + observers: '#F7DF1E', + notifications: '#F7DF1E', + mail: '#F7DF1E', + emails: '#F7DF1E', + channels: '#F7DF1E', + commands: '#4EAA25', + console: '#4EAA25', + cron: '#4EAA25', + // Temp / data + pub: '#42B883', + tmp: '#6B7280', + temp: '#6B7280', + cache: '#6B7280', + logs: '#6B7280', + data: '#A855F7', + backup: '#6B7280', + www: '#42B883', + webroot: '#42B883', + // CI/CD + '.gitlab': '#FC6D26', + '.circleci': '#6B7280', + '.travis': '#6B7280', + '.drone': '#6B7280', + '.azure': '#0078D4', + // Mobile + android: '#3DDC84', + ios: '#000000', + Platforms: '#3178C6', +}