perf(theme): replace file-tree icons with colored icons (#194)

This commit is contained in:
pengzhanbo 2024-09-19 20:29:23 +08:00 committed by GitHub
parent 8f6057adb0
commit bf672279c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 655 additions and 869 deletions

View File

@ -10,7 +10,10 @@ const props = defineProps<{
const active = ref(!!props.expanded)
const el = ref<HTMLElement>()
function toggle() {
function toggle(e: HTMLElementEventMap['click']) {
const target = e.target as HTMLElement
if (target.matches('.comment'))
return
active.value = !active.value
}
@ -18,14 +21,20 @@ onMounted(() => {
if (!el.value || props.type !== 'folder')
return
el.value.querySelector('.tree-node.folder')?.addEventListener('click', toggle)
el.value.querySelector('.tree-node.folder')?.addEventListener(
'click',
toggle as EventListener,
)
})
onUnmounted(() => {
if (!el.value || props.type !== 'folder')
return
el.value.querySelector('.tree-node.folder')?.removeEventListener('click', toggle)
el.value.querySelector('.tree-node.folder')?.removeEventListener(
'click',
toggle as EventListener,
)
})
</script>
@ -114,6 +123,7 @@ onUnmounted(() => {
width: 10px;
height: 10px;
color: var(--vp-c-text-3);
cursor: pointer;
content: "";
background-color: currentcolor;
-webkit-mask: var(--icon) no-repeat;
@ -124,9 +134,19 @@ onUnmounted(() => {
}
.file-tree-item .tree-node .name.focus {
position: relative;
padding: 0 4px;
margin: 0 -4px;
font-weight: bold;
color: var(--vp-c-brand-1);
transition: color var(--t-color);
color: var(--vp-c-bg);
background-color: var(--vp-c-brand-2);
border-radius: 4px;
transition: color var(--t-color), background-color var(--t-color);
}
.file-tree-item .tree-node .name.focus:hover {
color: var(--vp-c-bg);
background-color: var(--vp-c-brand-1);
}
.file-tree-item .tree-node .comment {
@ -136,19 +156,13 @@ onUnmounted(() => {
transition: color var(--t-color);
}
.file-tree-item .tree-node [class*="vp-fti-"] {
display: inline-block;
width: 0.9em;
height: 0.9em;
color: var(--vp-c-text-2);
background-color: currentcolor;
-webkit-mask: var(--icon) no-repeat;
mask: var(--icon) no-repeat;
-webkit-mask-size: 100% 100%;
mask-size: 100% 100%;
.file-tree-item .tree-node [class*="vpi-"] {
width: 1.2em;
height: 1.2em;
margin: 0;
}
.file-tree-item .tree-node.folder [class*="vp-fti-"] {
.file-tree-item .tree-node.folder [class*="vpi-"] {
cursor: pointer;
}

View File

@ -0,0 +1,604 @@
export interface Definitions {
named: Record<string, string>
folders: Record<string, string>
files: Record<string, string>
extensions: Record<string, string>
partials: Record<string, string>
}
export const defaultFolder = 'vscode-icons:default-folder'
export const defaultFile = 'vscode-icons:default-file'
export const definitions: Definitions = {
named: {
// package manager
pnpm: 'vscode-icons:file-type-light-pnpm',
PNPM: 'vscode-icons:file-type-light-pnpm',
npm: 'vscode-icons:file-type-npm',
NPM: 'vscode-icons:file-type-npm',
yarn: 'vscode-icons:file-type-yarn',
Yarn: 'vscode-icons:file-type-yarn',
bun: 'vscode-icons:file-type-bun',
Bun: 'vscode-icons:file-type-bun',
deno: 'vscode-icons:file-type-light-deno',
Deno: 'vscode-icons:file-type-light-deno',
// bundlers
rollup: 'vscode-icons:file-type-rollup',
Rollup: 'vscode-icons:file-type-rollup',
webpack: 'vscode-icons:file-type-webpack',
Webpack: 'vscode-icons:file-type-webpack',
vite: 'vscode-icons:file-type-vite',
Vite: 'vscode-icons:file-type-vite',
esbuild: 'vscode-icons:file-type-esbuild',
Esbuild: 'vscode-icons:file-type-esbuild',
// frameworks
vue: 'vscode-icons:file-type-vue',
Vue: 'vscode-icons:file-type-vue',
svelte: 'vscode-icons:file-type-svelte',
sveltekit: 'vscode-icons:file-type-svelte',
angular: 'vscode-icons:file-type-angular',
Angular: 'vscode-icons:file-type-angular',
react: 'vscode-icons:file-type-reactjs',
React: 'vscode-icons:file-type-reactjs',
next: 'vscode-icons:file-type-light-next',
Next: 'vscode-icons:file-type-light-next',
Nextjs: 'vscode-icons:file-type-light-next',
NextJS: 'vscode-icons:file-type-light-next',
nuxt: 'vscode-icons:file-type-nuxt',
Nuxt: 'vscode-icons:file-type-nuxt',
Nuxtjs: 'vscode-icons:file-type-nuxt',
NuxtJS: 'vscode-icons:file-type-nuxt',
solid: 'logos:solidjs-icon',
Solid: 'logos:solidjs-icon',
solidjs: 'logos:solidjs-icon',
astro: 'vscode-icons:file-type-light-astro',
Astro: 'vscode-icons:file-type-light-astro',
// TODO: code group title icons
// programming languages
html: 'vscode-icons:file-type-html',
HTML: 'vscode-icons:file-type-html',
java: 'vscode-icons:file-type-java',
Java: 'vscode-icons:file-type-java',
JAVA: 'vscode-icons:file-type-java',
php: 'vscode-icons:file-type-php3',
PHP: 'vscode-icons:file-type-php3',
c: 'vscode-icons:file-type-c',
C: 'vscode-icons:file-type-c',
python: 'vscode-icons:file-type-python',
Python: 'vscode-icons:file-type-python',
},
folders: {
'default': 'vscode-icons:default-folder',
'src': 'vscode-icons:folder-type-src',
'dist': 'vscode-icons:folder-type-dist',
'docs': 'vscode-icons:folder-type-docs',
'scripts': 'vscode-icons:folder-type-script',
'shared': 'vscode-icons:folder-type-shared',
'cli': 'vscode-icons:folder-type-cli',
'tauri-src': 'vscode-icons:folder-type-tauri',
'template': 'vscode-icons:folder-type-template',
'templates': 'vscode-icons:folder-type-template',
'theme': 'vscode-icons:folder-type-theme',
'themes': 'vscode-icons:folder-type-theme',
'packages': 'vscode-icons:folder-type-package',
'tools': 'vscode-icons:folder-type-tools',
'utils': 'vscode-icons:folder-type-tools',
'helper': 'vscode-icons:folder-type-helper',
'helpers': 'vscode-icons:folder-type-helper',
'component': 'vscode-icons:folder-type-component',
'components': 'vscode-icons:folder-type-component',
'Component': 'vscode-icons:folder-type-component',
'Components': 'vscode-icons:folder-type-component',
'hooks': 'vscode-icons:folder-type-hook',
'composables': 'vscode-icons:folder-type-hook',
'public': 'vscode-icons:folder-type-public',
'fonts': 'vscode-icons:folder-type-fonts',
'images': 'vscode-icons:folder-type-images',
'apis': 'vscode-icons:folder-type-api',
'style': 'vscode-icons:folder-type-style',
'styles': 'vscode-icons:folder-type-style',
'css': 'vscode-icons:folder-type-css',
'scss': 'vscode-icons:folder-type-light-sass',
'sass': 'vscode-icons:folder-type-light-sass',
'less': 'vscode-icons:folder-type-less',
'plugin': 'vscode-icons:folder-type-plugin',
'plugins': 'vscode-icons:folder-type-plugin',
'typings': 'vscode-icons:folder-type-typings',
'types': 'vscode-icons:folder-type-typings',
'mock': 'vscode-icons:folder-type-mock',
'locales': 'vscode-icons:folder-type-locale',
'locale': 'vscode-icons:folder-type-locale',
'langs': 'vscode-icons:folder-type-locale',
'languages': 'vscode-icons:folder-type-locale',
'config': 'vscode-icons:folder-type-config',
'configs': 'vscode-icons:folder-type-config',
'.config': 'vscode-icons:folder-type-config',
'.configs': 'vscode-icons:folder-type-config',
'controller': 'vscode-icons:folder-type-controller',
'controllers': 'vscode-icons:folder-type-controller',
'Controller': 'vscode-icons:folder-type-controller',
'Controllers': 'vscode-icons:folder-type-controller',
'model': 'vscode-icons:folder-type-model',
'models': 'vscode-icons:folder-type-model',
'Model': 'vscode-icons:folder-type-model',
'Models': 'vscode-icons:folder-type-model',
'service': 'vscode-icons:folder-type-services',
'services': 'vscode-icons:folder-type-services',
'Service': 'vscode-icons:folder-type-services',
'Services': 'vscode-icons:folder-type-services',
'view': 'vscode-icons:folder-type-view',
'views': 'vscode-icons:folder-type-view',
'View': 'vscode-icons:folder-type-view',
'Views': 'vscode-icons:folder-type-view',
'db': 'vscode-icons:folder-type-db',
'database': 'vscode-icons:folder-type-db',
'e2e': 'vscode-icons:folder-type-e2e',
'cypress': 'vscode-icons:folder-type-light-cypress',
'test': 'vscode-icons:folder-type-test',
'.git': 'vscode-icons:folder-type-git',
'.github': 'vscode-icons:folder-type-github',
'.gitlab': 'vscode-icons:folder-type-gitlab',
'.vscode': 'vscode-icons:folder-type-vscode',
'.husky': 'vscode-icons:folder-type-husky',
'.idea': 'vscode-icons:folder-type-idea',
},
files: {
'package.json': 'vscode-icons:file-type-node',
'pnpm-debug.log': 'vscode-icons:file-type-light-pnpm',
'pnpm-lock.yaml': 'vscode-icons:file-type-light-pnpm',
'pnpm-workspace.yaml': 'vscode-icons:file-type-light-pnpm',
'biome.json': 'vscode-icons:file-type-biome',
'bun.lockb': 'vscode-icons:file-type-bun',
'COMMIT_EDITMSG': 'vscode-icons:file-type-git',
'MERGE_MSG': 'vscode-icons:file-type-git',
'karma.conf.js': 'vscode-icons:file-type-karma',
'karma.conf.cjs': 'vscode-icons:file-type-karma',
'karma.conf.mjs': 'vscode-icons:file-type-karma',
'karma.conf.coffee': 'vscode-icons:file-type-karma',
'README.md': 'flat-color-icons:info',
'README.txt': 'flat-color-icons:info',
'README': 'flat-color-icons:info',
'CHANGELOG.md': 'catppuccin:changelog',
'CHANGELOG.txt': 'catppuccin:changelog',
'CHANGELOG': 'catppuccin:changelog',
'CHANGES.md': 'catppuccin:changelog',
'CHANGES.txt': 'catppuccin:changelog',
'CHANGES': 'catppuccin:changelog',
'VERSION.md': 'catppuccin:changelog',
'VERSION.txt': 'catppuccin:changelog',
'VERSION': 'catppuccin:changelog',
'mvnw': 'vscode-icons:file-type-maven',
'pom.xml': 'vscode-icons:file-type-maven',
'tsconfig.json': 'vscode-icons:file-type-tsconfig',
'swagger.json': 'vscode-icons:file-type-swagger',
'swagger.yml': 'vscode-icons:file-type-swagger',
'swagger.yaml': 'vscode-icons:file-type-swagger',
'mime.types': 'vscode-icons:file-type-light-config',
'Jenkinsfile': 'vscode-icons:file-type-jenkins',
'babel.config.js': 'vscode-icons:file-type-babel2',
'babel.config.json': 'vscode-icons:file-type-babel2',
'babel.config.cjs': 'vscode-icons:file-type-babel2',
'BUILD': 'vscode-icons:file-type-bazel',
'BUILD.bazel': 'vscode-icons:file-type-bazel',
'WORKSPACE': 'vscode-icons:file-type-bazel',
'WORKSPACE.bazel': 'vscode-icons:file-type-bazel',
'bower.json': 'vscode-icons:file-type-bower2',
'Bower.json': 'vscode-icons:file-type-bower2',
'eslint.config.js': 'vscode-icons:file-type-eslint',
'eslint.config.ts': 'vscode-icons:file-type-eslint',
'firebase.json': 'vscode-icons:file-type-firebase',
'geckodriver': 'openmoji:firefox',
'Gruntfile.js': 'vscode-icons:file-type-grunt',
'gruntfile.babel.js': 'vscode-icons:file-type-grunt',
'Gruntfile.babel.js': 'vscode-icons:file-type-grunt',
'gruntfile.js': 'vscode-icons:file-type-grunt',
'Gruntfile.coffee': 'vscode-icons:file-type-grunt',
'gruntfile.coffee': 'vscode-icons:file-type-grunt',
'ionic.config.json': 'vscode-icons:file-type-ionic',
'Ionic.config.json': 'vscode-icons:file-type-ionic',
'ionic.project': 'vscode-icons:file-type-ionic',
'Ionic.project': 'vscode-icons:file-type-ionic',
'platformio.ini': 'vscode-icons:file-type-platformio',
'rollup.config.js': 'vscode-icons:file-type-rollup',
'sass-lint.yml': 'vscode-icons:file-type-sass',
'stylelint.config.js': 'vscode-icons:file-type-light-stylelint',
'stylelint.config.cjs': 'vscode-icons:file-type-light-stylelint',
'stylelint.config.mjs': 'vscode-icons:file-type-light-stylelint',
'yarn.clean': 'vscode-icons:file-type-yarn',
'yarn.lock': 'vscode-icons:file-type-yarn',
'webpack.config.js': 'vscode-icons:file-type-webpack',
'webpack.config.cjs': 'vscode-icons:file-type-webpack',
'webpack.config.mjs': 'vscode-icons:file-type-webpack',
'webpack.config.ts': 'vscode-icons:file-type-webpack',
'webpack.config.build.js': 'vscode-icons:file-type-webpack',
'webpack.config.build.cjs': 'vscode-icons:file-type-webpack',
'webpack.config.build.mjs': 'vscode-icons:file-type-webpack',
'webpack.config.build.ts': 'vscode-icons:file-type-webpack',
'webpack.common.js': 'vscode-icons:file-type-webpack',
'webpack.common.cjs': 'vscode-icons:file-type-webpack',
'webpack.common.mjs': 'vscode-icons:file-type-webpack',
'webpack.common.ts': 'vscode-icons:file-type-webpack',
'webpack.dev.js': 'vscode-icons:file-type-webpack',
'webpack.dev.cjs': 'vscode-icons:file-type-webpack',
'webpack.dev.mjs': 'vscode-icons:file-type-webpack',
'webpack.dev.ts': 'vscode-icons:file-type-webpack',
'webpack.prod.js': 'vscode-icons:file-type-webpack',
'webpack.prod.cjs': 'vscode-icons:file-type-webpack',
'webpack.prod.mjs': 'vscode-icons:file-type-webpack',
'webpack.prod.ts': 'vscode-icons:file-type-webpack',
'vite.config.js': 'vscode-icons:file-type-vite',
'vite.config.ts': 'vscode-icons:file-type-vite',
'vite.config.mjs': 'vscode-icons:file-type-vite',
'vite.config.cjs': 'vscode-icons:file-type-vite',
'vitest.config.ts': 'vscode-icons:file-type-vitest',
'vitest.config.js': 'vscode-icons:file-type-vitest',
'vitest.config.mjs': 'vscode-icons:file-type-vitest',
'vitest.config.cjs': 'vscode-icons:file-type-vitest',
'turbo.json': 'vscode-icons:file-type-light-turbo',
'vercel.json': 'vscode-icons:file-type-light-vercel',
'netlify.toml': 'vscode-icons:file-type-light-netlify',
'Cargo.toml': 'vscode-icons:file-type-cargo',
'Cargo.lock': 'vscode-icons:file-type-cargo',
'npm-debug.log': 'vscode-icons:file-type-npm',
},
extensions: {
'.astro': 'vscode-icons:file-type-light-astro',
'.mdx': 'vscode-icons:file-type-light-mdx',
'.cls': 'vscode-icons:file-type-apex',
'.apex': 'vscode-icons:file-type-apex',
'.asm': 'vscode-icons:file-type-assembly',
'.s': 'vscode-icons:file-type-assembly',
'.bicep': 'vscode-icons:file-type-bicep',
'.bzl': 'vscode-icons:file-type-bazel',
'.bazel': 'vscode-icons:file-type-bazel',
'.BUILD': 'vscode-icons:file-type-bazel',
'.WORKSPACE': 'vscode-icons:file-type-bazel',
'.bazelignore': 'vscode-icons:file-type-bazel',
'.bazelversion': 'vscode-icons:file-type-bazel',
'.c': 'vscode-icons:file-type-c',
'.h': 'vscode-icons:file-type-c',
'.m': 'vscode-icons:file-type-c',
'.cs': 'vscode-icons:file-type-csharp',
'.cshtml': 'vscode-icons:file-type-html',
'.aspx': 'vscode-icons:file-type-aspx',
'.ascx': 'vscode-icons:file-type-aspx',
'.asax': 'vvscode-icons:file-type-aspx',
'.master': 'vscode-icons:file-type-html',
'.cc': 'vscode-icons:file-type-cpp',
'.cpp': 'vscode-icons:file-type-cpp',
'.cxx': 'vscode-icons:file-type-cpp',
'.c++': 'vscode-icons:file-type-cpp',
'.hh': 'vscode-icons:file-type-cppheader',
'.hpp': 'vscode-icons:file-type-cppheader',
'.hxx': 'vscode-icons:file-type-cppheader',
'.h++': 'vscode-icons:file-type-cppheader',
'.mm': 'vscode-icons:file-type-cpp',
'.clj': 'vscode-icons:file-type-clojure',
'.cljs': 'vscode-icons:file-type-clojure',
'.cljc': 'vscode-icons:file-type-clojure',
'.edn': 'vscode-icons:file-type-clojure',
'.cfc': 'vscode-icons:file-type-cfc',
'.cfm': 'vscode-icons:file-type-cfm',
'.coffee': 'vscode-icons:file-type-coffeescript',
'.litcoffee': 'vscode-icons:file-type-coffeescript',
'.config': 'vscode-icons:file-type-config',
'.cfg': 'vscode-icons:file-type-config',
'.conf': 'vscode-icons:file-type-config',
'.cr': 'vscode-icons:file-type-light-crystal',
'.ecr': 'vscode-icons:file-type-light-crystal',
'.slang': 'vscode-icons:file-type-slang',
'.cson': 'vscode-icons:file-type-json',
'.css': 'vscode-icons:file-type-css',
'.css.map': 'vscode-icons:file-type-cssmap',
'.sss': 'vscode-icons:file-type-sss',
'.csv': 'vscode-icons:file-type-excel',
'.xls': 'vscode-icons:file-type-excel2',
'.xlsx': 'vscode-icons:file-type-excel2',
'.cu': 'vscode-icons:file-type-cuda',
'.cuh': 'vscode-icons:file-type-cuda',
'.hu': 'vscode-icons:file-type-cuda',
'.cake': 'vscode-icons:file-type-cake',
'.ctp': 'vscode-icons:file-type-cakephp',
'.d': 'vscode-icons:file-type-dependencies',
'.doc': 'vscode-icons:file-type-word2',
'.docx': 'vscode-icons:file-type-word2',
'.ejs': 'vscode-icons:file-type-ejs',
'.ex': 'vscode-icons:file-type-elixir',
'.exs': 'vscode-icons:file-type-elixir',
'.elm': 'vscode-icons:file-type-elm',
'.ico': 'vscode-icons:file-type-favicon',
'.fs': 'vscode-icons:file-type-fsharp',
'.fsx': 'vscode-icons:file-type-fsharp',
'.gitignore': 'vscode-icons:file-type-git',
'.gitconfig': 'vscode-icons:file-type-git',
'.gitkeep': 'vscode-icons:file-type-git',
'.gitattributes': 'vscode-icons:file-type-git',
'.gitmodules': 'vscode-icons:file-type-git',
'.go': 'vscode-icons:file-type-go',
'.slide': 'vscode-icons:file-type-go',
'.article': 'vscode-icons:file-type-go',
'.gd': 'vscode-icons:file-type-godot',
'.godot': 'vscode-icons:file-type-godot',
'.tres': 'vscode-icons:file-type-godot',
'.tscn': 'vscode-icons:file-type-godot',
'.gradle': 'vscode-icons:file-type-light-gradle',
'.groovy': 'vscode-icons:file-type-groovy',
'.gsp': 'vscode-icons:file-type-groovy',
'.gql': 'vscode-icons:file-type-graphql',
'.graphql': 'vscode-icons:file-type-graphql',
'.graphqls': 'vscode-icons:file-type-graphql',
'.hack': 'logos:hack',
'.haml': 'vscode-icons:file-type-haml',
'.handlebars': 'vscode-icons:file-type-handlebars',
'.hbs': 'vscode-icons:file-type-handlebars',
'.hjs': 'vscode-icons:file-type-handlebars',
'.hs': 'vscode-icons:file-type-haskell',
'.lhs': 'vscode-icons:file-type-haskell',
'.hx': 'vscode-icons:file-type-haxe',
'.hxs': 'vscode-icons:file-type-haxe',
'.hxp': 'vscode-icons:file-type-haxe',
'.hxml': 'vscode-icons:file-type-haxe',
'.html': 'vscode-icons:file-type-html',
'.jade': 'file-icons:jade',
'.java': 'vscode-icons:file-type-java',
'.class': 'vscode-icons:file-type-java',
'.classpath': 'vscode-icons:file-type-java',
'.properties': 'vscode-icons:file-type-java',
'.js': 'vscode-icons:file-type-js',
'.js.map': 'vscode-icons:file-type-jsmap',
'.cjs': 'vscode-icons:file-type-js',
'.cjs.map': 'vscode-icons:file-type-jsmap',
'.mjs': 'vscode-icons:file-type-js',
'.mjs.map': 'vscode-icons:file-type-jsmap',
'.spec.js': 'vscode-icons:file-type-light-testjs',
'.spec.cjs': 'vscode-icons:file-type-light-testjs',
'.spec.mjs': 'vscode-icons:file-type-light-testjs',
'.test.js': 'vscode-icons:file-type-light-testjs',
'.test.cjs': 'vscode-icons:file-type-light-testjs',
'.test.mjs': 'vscode-icons:file-type-light-testjs',
'.es': 'vscode-icons:file-type-js',
'.es5': 'vscode-icons:file-type-js',
'.es6': 'vscode-icons:file-type-js',
'.es7': 'vscode-icons:file-type-js',
'.jinja': 'vscode-icons:file-type-jinja',
'.jinja2': 'vscode-icons:file-type-jinja',
'.json': 'vscode-icons:file-type-json',
'.jl': 'vscode-icons:file-type-julia',
'.kt': 'vscode-icons:file-type-kotlin',
'.kts': 'vscode-icons:file-type-kotlin',
'.dart': 'vscode-icons:file-type-dartlang',
'.less': 'vscode-icons:file-type-less',
'.liquid': 'vscode-icons:file-type-liquid',
'.ls': 'vscode-icons:file-type-livescript',
'.lua': 'vscode-icons:file-type-lua',
'.markdown': 'vscode-icons:file-type-markdown',
'.md': 'vscode-icons:file-type-markdown',
'.mustache': 'vscode-icons:file-type-light-mustache',
'.stache': 'vscode-icons:file-type-light-mustache',
'.nim': 'vscode-icons:file-type-light-nim',
'.nims': 'vscode-icons:file-type-light-nim',
'.github-issues': 'mdi:github',
'.ipynb': 'vscode-icons:file-type-jupyter',
'.njk': 'vscode-icons:file-type-nunjucks',
'.nunjucks': 'vscode-icons:file-type-nunjucks',
'.nunjs': 'vscode-icons:file-type-nunjucks',
'.nunj': 'vscode-icons:file-type-nunjucks',
'.njs': 'vscode-icons:file-type-nunjucks',
'.nj': 'vscode-icons:file-type-nunjucks',
'.npm-debug.log': 'vscode-icons:file-type-npm',
'.npmignore': 'catppuccin:npm-ignore',
'.npmrc': 'vscode-icons:file-type-npm',
'.ml': 'vscode-icons:file-type-ocaml',
'.mli': 'vscode-icons:file-type-ocaml',
'.cmx': 'vscode-icons:file-type-ocaml',
'.cmxa': 'vscode-icons:file-type-ocaml',
'.pl': 'vscode-icons:file-type-perl',
'.php': 'vscode-icons:file-type-php',
'.php.inc': 'vscode-icons:file-type-php',
'.pipeline': 'vscode-icons:file-type-pipeline',
'.pddl': 'vscode-icons:file-type-pddl',
'.plan': 'vscode-icons:file-type-pddl-plan',
'.happenings': 'vscode-icons:file-type-pddl-happenings',
'.ps1': 'vscode-icons:file-type-powershell',
'.psd1': 'vscode-icons:file-type-powershell',
'.psm1': 'vscode-icons:file-type-powershell',
'.prisma': 'vscode-icons:file-type-light-prisma',
'.pug': 'vscode-icons:file-type-pug',
'.pp': 'vscode-icons:file-type-puppet',
'.epp': 'vscode-icons:file-type-puppet',
'.purs': 'vscode-icons:file-type-light-purescript',
'.py': 'vscode-icons:file-type-python',
'.jsx': 'vscode-icons:file-type-reactjs',
'.spec.jsx': 'vscode-icons:file-type-reactjs',
'.test.jsx': 'vscode-icons:file-type-reactjs',
'.cjsx': 'vscode-icons:file-type-reactjs',
'.tsx': 'vscode-icons:file-type-reactts',
'.spec.tsx': 'vscode-icons:file-type-reactts',
'.test.tsx': 'vscode-icons:file-type-reactts',
'.res': 'vscode-icons:file-type-rescript',
'.resi': 'vscode-icons:file-type-rescript',
'.R': 'vscode-icons:file-type-r',
'.rmd': 'vscode-icons:file-type-rmd',
'.rb': 'vscode-icons:file-type-ruby',
'.erb': 'vscode-icons:file-type-html',
'.erb.html': 'vscode-icons:file-type-html',
'.html.erb': 'vscode-icons:file-type-html',
'.rs': 'vscode-icons:file-type-rust',
'.sass': 'vscode-icons:file-type-sass',
'.scss': 'vscode-icons:file-type-sass',
'.springBeans': 'seti:spring',
'.slim': 'vscode-icons:file-type-slim',
'.smarty.tpl': 'vscode-icons:file-type-smarty',
'.tpl': 'vscode-icons:file-type-smarty',
'.sbt': 'vscode-icons:file-type-sbt',
'.scala': 'vscode-icons:file-type-scala',
'.sol': 'logos:ethereum-color',
'.styl': 'vscode-icons:file-type-light-stylus',
'.svelte': 'vscode-icons:file-type-svelte',
'.swift': 'vscode-icons:file-type-swift',
'.sql': 'vscode-icons:file-type-sql',
'.soql': 'vscode-icons:file-type-sql',
'.tf': 'vscode-icons:file-type-terraform',
'.tf.json': 'vscode-icons:file-type-terraform',
'.tfvars': 'vscode-icons:file-type-terraform',
'.tfvars.json': 'vscode-icons:file-type-terraform',
'.tex': 'vscode-icons:file-type-light-tex',
'.sty': 'vscode-icons:file-type-light-tex',
'.dtx': 'vscode-icons:file-type-light-tex',
'.ins': 'vscode-icons:file-type-light-tex',
'.txt': 'vscode-icons:file-type-text',
'.toml': 'vscode-icons:file-type-light-toml',
'.twig': 'vscode-icons:file-type-twig',
'.ts': 'vscode-icons:file-type-typescript',
'.spec.ts': 'vscode-icons:file-type-testts',
'.test.ts': 'vscode-icons:file-type-testts',
'.vala': 'vscode-icons:file-type-vala',
'.vapi': 'vscode-icons:file-type-vala',
'.component': 'vscode-icons:file-type-html',
'.vue': 'vscode-icons:file-type-vue',
'.wasm': 'vscode-icons:file-type-wasm',
'.wat': 'vscode-icons:file-type-wasm',
'.xml': 'vscode-icons:file-type-xml',
'.yml': 'vscode-icons:file-type-light-yaml',
'.yaml': 'vscode-icons:file-type-light-yaml',
'.pro': 'vscode-icons:file-type-prolog',
'.zig': 'vscode-icons:file-type-zig',
'.jar': 'vscode-icons:file-type-jar',
'.zip': 'vscode-icons:file-type-zip',
'.ai': 'vscode-icons:file-type-ai',
'.psd': 'vscode-icons:file-type-photoshop',
'.pdf': 'vscode-icons:file-type-pdf2',
'.eot': 'vscode-icons:file-type-light-font',
'.ttf': 'vscode-icons:file-type-light-font',
'.woff': 'vscode-icons:file-type-light-font',
'.woff2': 'vscode-icons:file-type-light-font',
'.otf': 'vscode-icons:file-type-light-font',
'.avif': 'vscode-icons:file-type-avif',
'.gif': 'vscode-icons:file-type-image',
'.jpg': 'vscode-icons:file-type-image',
'.jpeg': 'vscode-icons:file-type-image',
'.png': 'vscode-icons:file-type-image',
'.pxm': 'vscode-icons:file-type-image',
'.svg': 'vscode-icons:file-type-svg',
'.svgx': 'vscode-icons:file-type-image',
'.tiff': 'vscode-icons:file-type-image',
'.webp': 'vscode-icons:file-type-image',
'.sublime-project': 'vscode-icons:file-type-sublime',
'.sublime-workspace': 'vscode-icons:file-type-sublime',
'.code-search': 'vscode-icons:file-type-search-result',
'.sh': 'vscode-icons:file-type-shell',
'.zsh': 'vscode-icons:file-type-shell',
'.fish': 'vscode-icons:file-type-shell',
'.zshrc': 'vscode-icons:file-type-shell',
'.bashrc': 'vscode-icons:file-type-shell',
'.mov': 'vscode-icons:file-type-video',
'.ogv': 'vscode-icons:file-type-video',
'.webm': 'vscode-icons:file-type-video',
'.avi': 'vscode-icons:file-type-video',
'.mpg': 'vscode-icons:file-type-video',
'.mp4': 'vscode-icons:file-type-video',
'.mp3': 'vscode-icons:file-type-audio',
'.ogg': 'vscode-icons:file-type-audio',
'.wav': 'vscode-icons:file-type-audio',
'.flac': 'vscode-icons:file-type-audio',
'.bat': 'vscode-icons:file-type-bat',
'.cmd': 'vscode-icons:file-type-shell',
'.babelrc': 'vscode-icons:file-type-light-babel',
'.babelrc.js': 'vscode-icons:file-type-light-babel',
'.babelrc.cjs': 'vscode-icons:file-type-light-babel',
'.bazelrc': 'vscode-icons:file-type-bazel',
'.bowerrc': 'vscode-icons:file-type-bower2',
'.codeclimate.yml': 'vscode-icons:file-type-codeclimate',
'.eslintrc': 'vscode-icons:file-type-eslint',
'.eslintrc.js': 'vscode-icons:file-type-eslint',
'.eslintrc.cjs': 'vscode-icons:file-type-eslint',
'.eslintrc.yaml': 'vscode-icons:file-type-eslint',
'.eslintrc.yml': 'vscode-icons:file-type-eslint',
'.eslintrc.json': 'vscode-icons:file-type-eslint',
'.eslintignore': 'vscode-icons:file-type-eslint',
'.firebaserc': 'vscode-icons:file-type-firebase',
'.gitlab-ci.yml': 'vscode-icons:file-type-gitlab',
'.jshintrc': 'vscode-icons:file-type-jshint',
'.jscsrc': 'vscode-icons:file-type-js',
'.stylelintrc': 'vscode-icons:file-type-light-stylelint',
'.stylelintrc.json': 'vscode-icons:file-type-light-stylelint',
'.stylelintrc.yaml': 'vscode-icons:file-type-light-stylelint',
'.stylelintrc.yml': 'vscode-icons:file-type-light-stylelint',
'.stylelintrc.js': 'vscode-icons:file-type-light-stylelint',
'.stylelintignore': 'vscode-icons:file-type-light-stylelint',
'.direnv': 'vscode-icons:file-type-dotenv',
'.env': 'vscode-icons:file-type-dotenv',
'.static': 'vscode-icons:file-type-config',
'.editorconfig': 'vscode-icons:file-type-editorconfig',
'.slugignore': 'vscode-icons:file-type-config',
'.tmp': 'ph:clock-bold',
'.htaccess': 'vscode-icons:file-type-config',
'.key': 'vscode-icons:file-type-key',
'.cert': 'vscode-icons:file-type-cert',
'.cer': 'vscode-icons:file-type-cert',
'.crt': 'vscode-icons:file-type-cert',
'.pem': 'vscode-icons:file-type-cert',
'.DS_Store': 'octicon:diff-ignored-16',
},
partials: {
'Gemfile': 'vscode-icons:file-type-ruby',
'gemfile': 'vscode-icons:file-type-ruby',
'dockerfile': 'vscode-icons:file-type-docker',
'Dockerfile': 'vscode-icons:file-type-docker',
'DOCKERFILE': 'vscode-icons:file-type-docker',
'.dockerignore': 'vscode-icons:file-type-docker',
'docker-healthcheck': 'vscode-icons:file-type-docker',
'docker-compose.yml': 'vscode-icons:file-type-docker',
'docker-compose.yaml': 'vscode-icons:file-type-docker',
'docker-compose.override.yml': 'vscode-icons:file-type-docker',
'docker-compose.override.yaml': 'vscode-icons:file-type-docker',
'GULPFILE': 'vscode-icons:file-type-gulp',
'Gulpfile': 'vscode-icons:file-type-gulp',
'gulpfile': 'vscode-icons:file-type-gulp',
'gulpfile.js': 'vscode-icons:file-type-gulp',
'LICENSE': 'vscode-icons:file-type-license',
'LICENCE': 'vscode-icons:file-type-license',
'LICENSE.txt': 'vscode-icons:file-type-license',
'LICENCE.txt': 'vscode-icons:file-type-license',
'LICENSE.md': 'vscode-icons:file-type-license',
'LICENCE.md': 'vscode-icons:file-type-license',
'COPYING': 'vscode-icons:file-type-license',
'COPYING.txt': 'vscode-icons:file-type-license',
'COPYING.md': 'vscode-icons:file-type-license',
'COMPILING': 'vscode-icons:file-type-license',
'COMPILING.txt': 'vscode-icons:file-type-license',
'COMPILING.md': 'vscode-icons:file-type-license',
'CONTRIBUTING': 'vscode-icons:file-type-license',
'CONTRIBUTING.txt': 'vscode-icons:file-type-license',
'CONTRIBUTING.md': 'vscode-icons:file-type-license',
'MAKEFILE': 'vscode-icons:file-type-makefile',
'Makefile': 'vscode-icons:file-type-makefile',
'makefile': 'vscode-icons:file-type-makefile',
'QMAKEFILE': 'vscode-icons:file-type-makefile',
'QMakefile': 'vscode-icons:file-type-makefile',
'qmakefile': 'vscode-icons:file-type-makefile',
'OMAKEFILE': 'vscode-icons:file-type-makefile',
'OMakefile': 'vscode-icons:file-type-makefile',
'omakefile': 'vscode-icons:file-type-makefile',
'CMAKELISTS.TXT': 'vscode-icons:file-type-makefile',
'CMAKELISTS.txt': 'vscode-icons:file-type-makefile',
'CMakeLists.txt': 'vscode-icons:file-type-makefile',
'cmakelists.txt': 'vscode-icons:file-type-makefile',
'Procfile': 'vscode-icons:file-type-procfile',
'TODO': 'vscode-icons:file-type-light-todo',
'TODO.txt': 'vscode-icons:file-type-light-todo',
'TODO.md': 'vscode-icons:file-type-light-todo',
},
}

View File

@ -1,49 +1,18 @@
import { definitions, FileIcons } from './icons.js'
import { defaultFile, defaultFolder, definitions } from './definitions.js'
export interface FileIcon {
name: string
svg: string
}
export const defaultFileIcon: FileIcon = {
name: 'default',
svg: makeSVGIcon(FileIcons['seti:default']),
}
export const folderIcon: FileIcon = {
name: 'folder',
svg: makeSVGIcon(FileIcons['seti:folder']),
}
export function getFileIcon(fileName: string): FileIcon {
const name = getFileIconName(fileName)
export function getFileIcon(fileName: string, type: 'file' | 'folder' = 'file'): string {
const name = getFileIconName(fileName, type)
if (!name)
return defaultFileIcon
return type === 'file' ? defaultFile : defaultFolder
if (name in FileIcons) {
const path = FileIcons[name as keyof typeof FileIcons]
return {
name: name.includes(':') ? name.split(':')[1] : name,
svg: makeSVGIcon(path),
}
return name
}
function getFileIconName(fileName: string, type: 'file' | 'folder' = 'file'): string | undefined {
if (type === 'folder') {
return definitions.folders[fileName]
}
return defaultFileIcon
}
function makeSVGIcon(svg: string): string {
svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">${svg}</svg>`
.replace(/"/g, '\'')
.replace(/%/g, '%25')
.replace(/#/g, '%23')
.replace(/\{/g, '%7B')
.replace(/\}/g, '%7D')
.replace(/</g, '%3C')
.replace(/>/g, '%3E')
return `url("data:image/svg+xml,${svg}")`
}
function getFileIconName(fileName: string) {
let icon: string | undefined = definitions.files[fileName]
let icon: string | undefined = definitions.named[fileName] || definitions.files[fileName]
if (icon)
return icon
icon = getFileIconTypeFromExtension(fileName)

File diff suppressed because one or more lines are too long

View File

@ -1,9 +1,7 @@
import fs from 'node:fs'
import container from 'markdown-it-container'
import type Token from 'markdown-it/lib/token.mjs'
import type { App } from 'vuepress/core'
import type { Markdown } from 'vuepress/markdown'
import { type FileIcon, folderIcon, getFileIcon } from './findIcon.js'
import { getFileIcon } from './findIcon.js'
import { resolveTreeNodeInfo, updateInlineToken } from './resolveTreeNodeInfo.js'
const type = 'file-tree'
@ -11,10 +9,8 @@ const closeType = `container_${type}_close`
const componentName = 'FileTreeItem'
const itemOpen = 'file_tree_item_open'
const itemClose = 'file_tree_item_close'
const classPrefix = 'vp-fti-'
const styleFilepath = 'internal/md-power/file-tree.css'
export async function fileTreePlugin(app: App, md: Markdown) {
export function fileTreePlugin(md: Markdown) {
const validate = (info: string): boolean => info.trim().startsWith(type)
const render = (tokens: Token[], idx: number): string => {
if (tokens[idx].nesting === 1) {
@ -32,15 +28,14 @@ export async function fileTreePlugin(app: App, md: Markdown) {
hasRes.push(token.level)
const [info, inline] = result
const { filename, type, expanded, empty } = info
const icon = type === 'file' ? getFileIcon(filename) : folderIcon
const icon = getFileIcon(filename, type)
token.type = itemOpen
token.tag = componentName
token.attrSet('type', type)
token.attrSet(':expanded', expanded ? 'true' : 'false')
token.attrSet(':empty', empty ? 'true' : 'false')
updateInlineToken(inline, info, `${classPrefix}${icon.name}`)
addIcon(icon)
updateInlineToken(inline, info, icon)
}
else {
hasRes.push(-1)
@ -63,25 +58,5 @@ export async function fileTreePlugin(app: App, md: Markdown) {
}
}
let timer: NodeJS.Timeout | null = null
const icons: Record<string, FileIcon> = {}
function addIcon(icon: FileIcon) {
icons[icon.name] = icon
if (timer)
clearTimeout(timer)
timer = setTimeout(async () => {
let content = ''
for (const icon of Object.values(icons)) {
content += `.${classPrefix}${icon.name} { --icon: ${icon.svg}; }\n`
}
await app.writeTemp(styleFilepath, content)
}, 150)
}
md.use(container, type, { validate, render })
if (!fs.existsSync(app.dir.temp(styleFilepath)))
await app.writeTemp(styleFilepath, '')
}

View File

@ -1,5 +1,5 @@
import Token from 'markdown-it/lib/token.mjs'
import { removeLeadingSlash } from 'vuepress/shared'
import { removeEndingSlash, removeLeadingSlash } from 'vuepress/shared'
interface FileTreeNode {
filename: string
@ -42,7 +42,7 @@ export function resolveTreeNodeInfo(
const focus = children[0]?.tag === 'strong'
const type = hasChildren || filename.endsWith('/') ? 'folder' : 'file'
const info: FileTreeNode = {
filename: removeLeadingSlash(filename),
filename: removeLeadingSlash(removeEndingSlash(filename)),
type,
focus,
empty: !hasChildren,
@ -65,9 +65,9 @@ export function updateInlineToken(inline: Token, info: FileTreeNode, icon: strin
tokens.push(wrapperOpen)
if (info.filename !== '...' && info.filename !== '…') {
const iconOpen = new Token('span_open', 'span', 1)
iconOpen.attrSet('class', icon)
const iconClose = new Token('span_close', 'span', -1)
const iconOpen = new Token('vp_iconify_open', 'VPIcon', 1)
iconOpen.attrSet('name', icon)
const iconClose = new Token('vp_iconify_close', 'VPIcon', -1)
tokens.push(iconOpen, iconClose)
}

View File

@ -102,7 +102,7 @@ export function markdownPowerPlugin(options: MarkdownPowerPluginOptions = {}): P
if (options.fileTree) {
// ::: file-tree
await fileTreePlugin(app, md)
fileTreePlugin(md)
}
},
}

View File

@ -56,7 +56,6 @@ export async function prepareConfigFile(app: App, options: MarkdownPowerPluginOp
if (options.fileTree) {
imports.add(`import FileTreeItem from '${CLIENT_FOLDER}components/FileTreeItem.vue'`)
imports.add(`import '@internal/md-power/file-tree.css'`)
enhances.add(`app.component('FileTreeItem', FileTreeItem)`)
}