返回 slidev
TitleIcon.vue
根目录 / packages / client / internals / TitleIcon.vue
1 <script setup lang="ts">
2 defineProps<{
3 title: string
4 }>()
5
6 const builtinIcons: Record<string, string> = {
7 // package managers
8 'pnpm': 'i-vscode-icons:file-type-light-pnpm',
9 'npm': 'i-vscode-icons:file-type-npm',
10 'yarn': 'i-vscode-icons:file-type-yarn',
11 'bun': 'i-vscode-icons:file-type-bun',
12 'deno': 'i-vscode-icons:file-type-deno',
13 // frameworks
14 'vue': 'i-vscode-icons:file-type-vue',
15 'svelte': 'i-vscode-icons:file-type-svelte',
16 'angular': 'i-vscode-icons:file-type-angular',
17 'react': 'i-vscode-icons:file-type-reactjs',
18 'next': 'i-vscode-icons:file-type-light-next',
19 'nuxt': 'i-vscode-icons:file-type-nuxt',
20 'solid': 'logos:solidjs-icon',
21 'astro': 'i-vscode-icons:file-type-light-astro',
22 // bundlers
23 'rollup': 'i-vscode-icons:file-type-rollup',
24 'webpack': 'i-vscode-icons:file-type-webpack',
25 'vite': 'i-vscode-icons:file-type-vite',
26 'esbuild': 'i-vscode-icons:file-type-esbuild',
27 // configuration files
28 'package.json': 'i-vscode-icons:file-type-node',
29 'tsconfig.json': 'i-vscode-icons:file-type-tsconfig',
30 '.npmrc': 'i-vscode-icons:file-type-npm',
31 '.editorconfig': 'i-vscode-icons:file-type-editorconfig',
32 '.eslintrc': 'i-vscode-icons:file-type-eslint',
33 '.eslintignore': 'i-vscode-icons:file-type-eslint',
34 'eslint.config': 'i-vscode-icons:file-type-eslint',
35 '.gitignore': 'i-vscode-icons:file-type-git',
36 '.gitattributes': 'i-vscode-icons:file-type-git',
37 '.env': 'i-vscode-icons:file-type-dotenv',
38 '.env.example': 'i-vscode-icons:file-type-dotenv',
39 '.vscode': 'i-vscode-icons:file-type-vscode',
40 'tailwind.config': 'vscode-icons:file-type-tailwind',
41 'uno.config': 'i-vscode-icons:file-type-unocss',
42 'unocss.config': 'i-vscode-icons:file-type-unocss',
43 '.oxlintrc': 'i-vscode-icons:file-type-oxlint',
44 'vue.config': 'i-vscode-icons:file-type-vueconfig',
45 // filename extensions
46 '.mts': 'i-vscode-icons:file-type-typescript',
47 '.cts': 'i-vscode-icons:file-type-typescript',
48 '.ts': 'i-vscode-icons:file-type-typescript',
49 '.tsx': 'i-vscode-icons:file-type-typescript',
50 '.mjs': 'i-vscode-icons:file-type-js',
51 '.cjs': 'i-vscode-icons:file-type-js',
52 '.json': 'i-vscode-icons:file-type-json',
53 '.js': 'i-vscode-icons:file-type-js',
54 '.jsx': 'i-vscode-icons:file-type-js',
55 '.md': 'i-vscode-icons:file-type-markdown',
56 '.py': 'i-vscode-icons:file-type-python',
57 '.ico': 'i-vscode-icons:file-type-favicon',
58 '.html': 'i-vscode-icons:file-type-html',
59 '.css': 'i-vscode-icons:file-type-css',
60 '.scss': 'i-vscode-icons:file-type-scss',
61 '.yml': 'i-vscode-icons:file-type-light-yaml',
62 '.yaml': 'i-vscode-icons:file-type-light-yaml',
63 '.php': 'i-vscode-icons:file-type-php',
64 '.svg': 'i-vscode-icons:file-type-svg',
65 }
66
67 function matchIcon(title: string) {
68 const colonMatch = title.match(/~([^~]+)~/g)
69 if (colonMatch && colonMatch.length > 0) {
70 const icon = colonMatch[0].slice(1, -1)
71 return icon
72 }
73
74 const sortedKeys = Object.keys(builtinIcons).sort((a, b) => b.length - a.length)
75 for (const key of sortedKeys) {
76 if (title.toLowerCase().includes(key.toLowerCase())) {
77 return builtinIcons[key]
78 }
79 }
80 return ''
81 }
82 </script>
83
84 <template>
85 <div v-if="matchIcon(title)" class="w-3.5 h-3.5 relative" :class="matchIcon(title)" />
86 </template>
87
87 lines Plain Text