diff --git a/web/package.json b/web/package.json
index 8d1c3b11b..207f5057b 100644
--- a/web/package.json
+++ b/web/package.json
@@ -18,12 +18,14 @@
"test": "vitest"
},
"dependencies": {
+ "@iconify/vue": "^4.2.0",
"@intlify/unplugin-vue-i18n": "^6.0.0",
"@kyvg/vue3-notification": "^3.2.1",
"@mdi/js": "^7.4.47",
"@vueuse/core": "^12.0.0",
"ansi_up": "^6.0.2",
"devicon": "^2.16.0",
+ "devicons": "^1.8.0",
"dompurify": "^3.2.0",
"fuse.js": "^7.0.0",
"js-base64": "^3.7.7",
@@ -34,6 +36,7 @@
"prismjs": "^1.29.0",
"semver": "^7.6.3",
"simple-icons": "^13.5.0",
+ "unplugin-icons": "^0.22.0",
"vue": "^3.4.38",
"vue-i18n": "^10.0.3",
"vue-router": "^4.4.3"
@@ -42,6 +45,7 @@
"@antfu/eslint-config": "^3.3.2",
"@eslint/js": "^9.9.0",
"@ianvs/prettier-plugin-sort-imports": "^4.3.1",
+ "@iconify-json/devicon": "^1.2.9",
"@intlify/eslint-plugin-vue-i18n": "3.1.0",
"@types/eslint__js": "^8.42.3",
"@types/lodash": "^4.17.7",
diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml
index baa4c6049..8427e150a 100644
--- a/web/pnpm-lock.yaml
+++ b/web/pnpm-lock.yaml
@@ -11,6 +11,9 @@ importers:
.:
dependencies:
+ '@iconify/vue':
+ specifier: ^4.2.0
+ version: 4.2.0(vue@3.5.13(typescript@5.6.3))
'@intlify/unplugin-vue-i18n':
specifier: ^6.0.0
version: 6.0.0(@vue/compiler-dom@3.5.13)(eslint@9.16.0(jiti@1.21.6))(rollup@4.28.0)(typescript@5.6.3)(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3))
@@ -29,6 +32,9 @@ importers:
devicon:
specifier: ^2.16.0
version: 2.16.0
+ devicons:
+ specifier: ^1.8.0
+ version: 1.8.0
dompurify:
specifier: ^3.2.0
version: 3.2.2
@@ -59,6 +65,9 @@ importers:
simple-icons:
specifier: ^13.5.0
version: 13.19.0
+ unplugin-icons:
+ specifier: ^0.22.0
+ version: 0.22.0(@vue/compiler-sfc@3.5.13)
vue:
specifier: ^3.4.38
version: 3.5.13(typescript@5.6.3)
@@ -78,6 +87,9 @@ importers:
'@ianvs/prettier-plugin-sort-imports':
specifier: ^4.3.1
version: 4.4.0(@vue/compiler-sfc@3.5.13)(prettier@3.4.1)
+ '@iconify-json/devicon':
+ specifier: ^1.2.9
+ version: 1.2.9
'@intlify/eslint-plugin-vue-i18n':
specifier: 3.1.0
version: 3.1.0(eslint@9.16.0(jiti@1.21.6))
@@ -203,6 +215,9 @@ packages:
svelte-eslint-parser:
optional: true
+ '@antfu/install-pkg@0.4.1':
+ resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==}
+
'@antfu/install-pkg@0.5.0':
resolution: {integrity: sha512-dKnk2xlAyC7rvTkpkHmu+Qy/2Zc3Vm/l8PtNyIOGDBtXPY3kThfU4ORNEp3V7SXw5XSOb+tOJaUYpfquPzL/Tg==}
@@ -516,6 +531,20 @@ packages:
'@vue/compiler-sfc':
optional: true
+ '@iconify-json/devicon@1.2.9':
+ resolution: {integrity: sha512-YwjF7z+ni9jxlDCa5nbivn+CJv1t/NEk1OpVIbF4ehGCtOvJq5zDIkeH3IJJPtD5k+8WmsW8BwWlnapLxehPSg==}
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+ '@iconify/utils@2.2.1':
+ resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==}
+
+ '@iconify/vue@4.2.0':
+ resolution: {integrity: sha512-CMynoz9BDWugDO2B7LU/s8L99dHCiqDGCjCki6bhVx5etZhw9x0BTV7wWRdj82jtl1yQTc+QQRcHQmSvUY6R+g==}
+ peerDependencies:
+ vue: '>=3'
+
'@intlify/bundle-utils@10.0.0':
resolution: {integrity: sha512-BR5yLOkF2dzrARTbAg7RGAIPcx9Aark7p1K/0O285F7rfzso9j2dsa+S4dA67clZ0rToZ10NSSTfbyUptVu7Bg==}
engines: {node: '>= 18'}
@@ -1229,6 +1258,15 @@ packages:
supports-color:
optional: true
+ debug@4.4.0:
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
decimal.js@10.4.3:
resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
@@ -1257,6 +1295,10 @@ packages:
devicon@2.16.0:
resolution: {integrity: sha512-PE5a2HBNeN4av+Iu975OiiWEwS8LJPw5HAvlv0JUHb62jZTdYxTpz4ga+cQyvdtb3x1side2P9Sr1mmOmUkO/g==}
+ devicons@1.8.0:
+ resolution: {integrity: sha512-tRS3bNxy9mbDVK0g4/+t5PlwMjjOteuh5LAhjMgimAPUgiKB+wCUCf7+uugufZ1vC9AKMRn5Pljbi210qCbmkQ==}
+ engines: {node: '>=0.10.3'}
+
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
@@ -2548,10 +2590,37 @@ packages:
unist-util-visit@5.0.0:
resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+ unplugin-icons@0.22.0:
+ resolution: {integrity: sha512-CP+iZq5U7doOifer5bcM0jQ9t3Is7EGybIYt3myVxceI8Zuk8EZEpe1NPtJvh7iqMs1VdbK0L41t9+um9VuuLw==}
+ peerDependencies:
+ '@svgr/core': '>=7.0.0'
+ '@svgx/core': ^1.0.1
+ '@vue/compiler-sfc': ^3.0.2 || ^2.7.0
+ svelte: ^3.0.0 || ^4.0.0 || ^5.0.0
+ vue-template-compiler: ^2.6.12
+ vue-template-es2015-compiler: ^1.9.0
+ peerDependenciesMeta:
+ '@svgr/core':
+ optional: true
+ '@svgx/core':
+ optional: true
+ '@vue/compiler-sfc':
+ optional: true
+ svelte:
+ optional: true
+ vue-template-compiler:
+ optional: true
+ vue-template-es2015-compiler:
+ optional: true
+
unplugin@1.16.0:
resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==}
engines: {node: '>=14.0.0'}
+ unplugin@2.1.0:
+ resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==}
+ engines: {node: '>=18.12.0'}
+
update-browserslist-db@1.1.1:
resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
hasBin: true
@@ -2859,6 +2928,11 @@ snapshots:
- typescript
- vitest
+ '@antfu/install-pkg@0.4.1':
+ dependencies:
+ package-manager-detector: 0.2.6
+ tinyexec: 0.3.1
+
'@antfu/install-pkg@0.5.0':
dependencies:
package-manager-detector: 0.2.6
@@ -3147,6 +3221,30 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@iconify-json/devicon@1.2.9':
+ dependencies:
+ '@iconify/types': 2.0.0
+
+ '@iconify/types@2.0.0': {}
+
+ '@iconify/utils@2.2.1':
+ dependencies:
+ '@antfu/install-pkg': 0.4.1
+ '@antfu/utils': 0.7.10
+ '@iconify/types': 2.0.0
+ debug: 4.4.0
+ globals: 15.13.0
+ kolorist: 1.8.0
+ local-pkg: 0.5.1
+ mlly: 1.7.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@iconify/vue@4.2.0(vue@3.5.13(typescript@5.6.3))':
+ dependencies:
+ '@iconify/types': 2.0.0
+ vue: 3.5.13(typescript@5.6.3)
+
'@intlify/bundle-utils@10.0.0(vue-i18n@10.0.5(vue@3.5.13(typescript@5.6.3)))':
dependencies:
'@intlify/message-compiler': 11.0.0-beta.2
@@ -3893,6 +3991,10 @@ snapshots:
dependencies:
ms: 2.1.3
+ debug@4.4.0:
+ dependencies:
+ ms: 2.1.3
+
decimal.js@10.4.3: {}
decode-named-character-reference@1.0.2:
@@ -3911,6 +4013,8 @@ snapshots:
devicon@2.16.0: {}
+ devicons@1.8.0: {}
+
devlop@1.1.0:
dependencies:
dequal: 2.0.3
@@ -5448,11 +5552,30 @@ snapshots:
unist-util-is: 6.0.0
unist-util-visit-parents: 6.0.1
+ unplugin-icons@0.22.0(@vue/compiler-sfc@3.5.13):
+ dependencies:
+ '@antfu/install-pkg': 0.5.0
+ '@antfu/utils': 0.7.10
+ '@iconify/utils': 2.2.1
+ debug: 4.4.0
+ kolorist: 1.8.0
+ local-pkg: 0.5.1
+ unplugin: 2.1.0
+ optionalDependencies:
+ '@vue/compiler-sfc': 3.5.13
+ transitivePeerDependencies:
+ - supports-color
+
unplugin@1.16.0:
dependencies:
acorn: 8.14.0
webpack-virtual-modules: 0.6.2
+ unplugin@2.1.0:
+ dependencies:
+ acorn: 8.14.0
+ webpack-virtual-modules: 0.6.2
+
update-browserslist-db@1.1.1(browserslist@4.24.2):
dependencies:
browserslist: 4.24.2
diff --git a/web/src/components/atomic/Icon.vue b/web/src/components/atomic/Icon.vue
index b96915fe8..868784bd2 100644
--- a/web/src/components/atomic/Icon.vue
+++ b/web/src/components/atomic/Icon.vue
@@ -10,7 +10,6 @@
-
@@ -34,7 +33,6 @@
-
@@ -55,7 +53,9 @@
-
+
+
+