]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
docs: enhance code block & code group (#2521)
authorLeo <38490578+yuyinws@users.noreply.github.com>
Thu, 9 Oct 2025 15:23:42 +0000 (23:23 +0800)
committerGitHub <noreply@github.com>
Thu, 9 Oct 2025 15:23:42 +0000 (17:23 +0200)
18 files changed:
packages/docs/.vitepress/config/shared.ts
packages/docs/.vitepress/theme/index.ts
packages/docs/guide/advanced/lazy-loading.md
packages/docs/guide/advanced/navigation-guards.md
packages/docs/guide/essentials/history-mode.md
packages/docs/guide/essentials/named-views.md
packages/docs/guide/essentials/nested-routes.md
packages/docs/guide/essentials/passing-props.md
packages/docs/guide/index.md
packages/docs/package.json
packages/docs/zh/guide/advanced/lazy-loading.md
packages/docs/zh/guide/advanced/navigation-guards.md
packages/docs/zh/guide/essentials/history-mode.md
packages/docs/zh/guide/essentials/named-views.md
packages/docs/zh/guide/essentials/nested-routes.md
packages/docs/zh/guide/essentials/passing-props.md
packages/docs/zh/guide/index.md
pnpm-lock.yaml

index 606048c7acb0002e59aa553968378dcc9a3a1ba4..1d1eff06951e2b69c7da748e273253b566b89f7a 100644 (file)
@@ -1,5 +1,9 @@
 import { defineConfig, HeadConfig } from 'vitepress'
 import { zhSearch } from './zh'
+import {
+  groupIconMdPlugin,
+  groupIconVitePlugin,
+} from 'vitepress-plugin-group-icons'
 
 // TODO:
 // export const META_IMAGE = 'https://router.vuejs.org/social.png'
@@ -60,6 +64,9 @@ export const sharedConfig = defineConfig({
     anchor: {
       slugify,
     },
+    config: md => {
+      md.use(groupIconMdPlugin)
+    },
   },
 
   head: [
@@ -161,4 +168,7 @@ export const sharedConfig = defineConfig({
       placement: 'routervuejsorg',
     },
   },
+  vite: {
+    plugins: [groupIconVitePlugin()],
+  },
 })
index c2797c6bf9a6f9edfce605af78783c75e28afda2..81d8d20c1161dd5cfb2a2e4ae3fd61b27e74067a 100644 (file)
@@ -9,6 +9,7 @@ import VueSchoolLink from './components/VueSchoolLink.vue'
 import VueMasteryLogoLink from './components/VueMasteryLogoLink.vue'
 import status from '../translation-status.json'
 import RuleKitLink from './components/RuleKitLink.vue'
+import 'virtual:group-icons.css'
 
 const i18nLabels = {
   zh: '该翻译已同步到了 ${date} 的版本,其对应的 commit hash 是 <code>${hash}</code>。',
index 7cbb183fdd58e678e239152d42ec4524e9cfdd7d..d1ca69d70bb0007e64b88867dcb34ffa0196fb7e 100644 (file)
@@ -67,8 +67,7 @@ webpack will group any async module with the same chunk name into the same async
 
 In Vite you can define the chunks under the [`rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions):
 
-```js
-// vite.config.js
+```js [vite.config.js]
 export default defineConfig({
   build: {
     rollupOptions: {
index 271add59f9248727710cf8309d4e0c1e77dd1dd4..17a5f826c0e3a1ef73e6b410bf7d9faea7ea2225 100644 (file)
@@ -140,8 +140,7 @@ Learn more about navigation failures on [its guide](./navigation-failures.md).
 
 Since Vue 3.3, it is possible to use `inject()` within navigation guards. This is useful for injecting global properties like the [pinia stores](https://pinia.vuejs.org). Anything that is provided with `app.provide()` is also accessible within `router.beforeEach()`, `router.beforeResolve()`, `router.afterEach()`:
 
-```ts
-// main.ts
+```ts [main.ts]
 const app = createApp(App)
 app.provide('global', 'hello injections')
 
index 0bbdba94c99ae400efcffb0fcccf5b227b859c95..641fb9797bcdefaf060f65e42ee8e6a4f0e2b1bc 100644 (file)
@@ -128,7 +128,7 @@ For Node.js/Express, consider using [connect-history-api-fallback middleware](ht
 1. Install [IIS UrlRewrite](https://www.iis.net/downloads/microsoft/url-rewrite)
 2. Create a `web.config` file in the root directory of your site with the following:
 
-```xml
+```xml [web.config ~vscode-icons:file-type-xml~]
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
   <system.webServer>
@@ -167,7 +167,7 @@ rewrite {
 
 Add this to your `firebase.json`:
 
-```json
+```json [firebase.json ~vscode-icons:file-type-firebase~]
 {
   "hosting": {
     "public": "dist",
@@ -185,7 +185,7 @@ Add this to your `firebase.json`:
 
 Create a `_redirects` file that is included with your deployed files:
 
-```
+``` [_redirects ~vscode-icons:file-type-light-netlify~]
 /* /index.html 200
 ```
 
@@ -197,7 +197,7 @@ You can read more about the syntax on [Netlify documentation](https://docs.netli
 
 Create a `vercel.json` file under the root directory of your project with the following:
 
-```json
+```json [vercel.json ~vscode-icons:file-type-light-vercel~]
 {
   "rewrites": [{ "source": "/:path*", "destination": "/index.html" }]
 }
index 03ca222ec5b16275d85c5c8cce6365b5641b3a33..ba5738849b8ea5c20c0e04f980f12ae25f3517a6 100644 (file)
@@ -61,8 +61,7 @@ It is possible to create complex layouts using named views with nested views. Wh
 
 The `<template>` section for `UserSettings` component in the above layout would look something like this:
 
-```vue-html
-<!-- UserSettings.vue -->
+```vue-html [UserSettings.vue]
 <div>
   <h1>User Settings</h1>
   <NavBar />
index e966da5353da387c4fae7bd37fa503b8041a25c6..dea080b9539b5eec6aa0b9819653a619fc6988e8 100644 (file)
@@ -22,15 +22,13 @@ With Vue Router, you can express this relationship using nested route configurat
 
 Given the app we created in the last chapter:
 
-```vue
-<!-- App.vue -->
+```vue [App.vue]
 <template>
   <router-view />
 </template>
 ```
 
-```vue
-<!-- User.vue -->
+```vue [User.vue]
 <template>
   <div>
     User {{ $route.params.id }}
@@ -47,8 +45,7 @@ const routes = [{ path: '/user/:id', component: User }]
 
 The `<router-view>` here is a top-level `router-view`. It renders the component matched by a top level route. Similarly, a rendered component can also contain its own, nested `<router-view>`. For example, if we add one inside the `User` component's template:
 
-```vue
-<!-- User.vue -->
+```vue [User.vue]
 <template>
   <div class="user">
     <h2>User {{ $route.params.id }}</h2>
index 88c473baa2c10ca88a9e8624a7ce39983a4e32a1..d743ed2a2039d1b76384d7240a6db1ab966def65 100644 (file)
@@ -9,8 +9,7 @@ Using `$route` or `useRoute()` in your component creates a tight coupling with t
 
 Let's return to our earlier example:
 
-```vue
-<!-- User.vue -->
+```vue [User.vue]
 <template>
   <div>
     User {{ $route.params.id }}
index 23ceab347553b24ae7768cf9bb61a10221e2ae41..5eb46c0921b5c66bba5f939ea3b2bfd6980eb9bf 100644 (file)
@@ -24,7 +24,7 @@ Let's start by looking at the root component, `App.vue`.
 
 ### App.vue
 
-```vue
+```vue [App.vue]
 <template>
   <h1>Hello App!</h1>
   <p><strong>Current route path:</strong> {{ $route.fullPath }}</p>
index 43913aefed8708e0f7d06b73929ec41ce5c90112..bdec87d7c7cd0b05b27fc8ee26edfcc47609357f 100644 (file)
@@ -17,6 +17,7 @@
     "typedoc-vitepress-theme": "^1.1.2",
     "vitepress": "1.6.4",
     "vitepress-translation-helper": "^0.2.2",
+    "vitepress-plugin-group-icons": "^1.6.1",
     "vue-router": "workspace:*"
   }
 }
index 25990345ea4b6c8e10ea341e173f90209b75a657..7be3c429a65bbdda52b2024b776fe0a597d3846b 100644 (file)
@@ -67,8 +67,7 @@ webpack 会将任何一个异步模块与相同的块名称组合到相同的异
 
 在Vite中,你可以在[`rollupOptions`](https://cn.vite.dev/config/build-options.html#build-rollupoptions)下定义分块:
 
-```js
-// vite.config.js
+```js [vite.config.js]
 export default defineConfig({
   build: {
     rollupOptions: {
index d1d6e625984a3295eede7a45eecdcd954a8ca10b..4bf2357a2354e5cffb5ceb8a9be8b25d6a98939d 100644 (file)
@@ -141,8 +141,7 @@ router.afterEach((to, from, failure) => {
 
 从 Vue 3.3 开始,你可以在导航守卫内使用 `inject()` 方法。这在注入像 [pinia stores](https://pinia.vuejs.org) 这样的全局属性时很有用。在 `app.provide()` 中提供的所有内容都可以在 `router.beforeEach()`、`router.beforeResolve()`、`router.afterEach()` 内获取到:
 
-```ts
-// main.ts
+```ts [main.ts]
 const app = createApp(App)
 app.provide('global', 'hello injections')
 
index be426ed21b625c2fd669e2d1f6450cba104d3370..d0aa99e22594a91468a7430225fe31157f8e9209 100644 (file)
@@ -127,7 +127,7 @@ http
 1. 安装 [IIS UrlRewrite](https://www.iis.net/downloads/microsoft/url-rewrite)
 2. 在网站的根目录下创建一个 `web.config` 文件,内容如下:
 
-```xml
+```xml  [web.config ~vscode-icons:file-type-xml~]
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
   <system.webServer>
@@ -166,7 +166,7 @@ rewrite {
 
 将此添加到你的 `firebase.json` 中:
 
-```json
+```json [firebase.json ~vscode-icons:file-type-firebase~]
 {
   "hosting": {
     "public": "dist",
@@ -184,7 +184,7 @@ rewrite {
 
 创建一个 `_redirects` 文件,包含在你的部署文件中:
 
-```
+``` [_redirects ~vscode-icons:file-type-light-netlify~]
 /* /index.html 200
 ```
 
@@ -196,7 +196,7 @@ rewrite {
 
 在项目根目录创建一个`vercel.json`文件,内容如下:
 
-```json
+```json [vercel.json ~vscode-icons:file-type-json~]
 {
   "rewrites": [{ "source": "/:path*", "destination": "/index.html" }]
 }
index 36adc8e4b972ffaf1015f5b8dace89f544080538..ff057e43edfbbc899ec4c1aef9f135a06e9f8cc5 100644 (file)
@@ -59,8 +59,7 @@ const router = createRouter({
 
 `UserSettings` 组件的 `<template>` 部分应该是类似下面的这段代码:
 
-```html
-<!-- UserSettings.vue -->
+```vue-html [UserSettings.vue]
 <div>
   <h1>User Settings</h1>
   <NavBar />
index 40fd5481b933f728705fd8203691ac6405b2a29b..0fbbdeb966600c057653d8ac2ce1bbe5ce8a0684 100644 (file)
 
 接着上节创建的 app :
 
-```vue
-<!-- App.vue -->
+```vue [App.vue]
 <template>
   <router-view />
 </template>
 ```
 
-```vue
-<!-- User.vue -->
+```vue [User.vue]
 <template>
   <div>
     User {{ $route.params.id }}
@@ -47,8 +45,7 @@ const routes = [{ path: '/user/:id', component: User }]
 
 这里的 `<router-view>` 是一个顶层的 `router-view`。它渲染顶层路由匹配的组件。同样地,一个被渲染的组件也可以包含自己嵌套的 `<router-view>`。例如,如果我们在 `User` 组件的模板内添加一个 `<router-view>`:
 
-```vue
-<!-- User.vue -->
+```vue [User.vue]
 <template>
   <div class="user">
     <h2>User {{ $route.params.id }}</h2>
index 8349dd6c3d9a4a82d3e3bbc3a502537bca33af90..9e259cd2eea75ebec66cc88baae92a2f3524ef2c 100644 (file)
@@ -9,8 +9,7 @@
 
 回到我们之前的示例:
 
-```vue
-<!-- User.vue -->
+```vue [User.vue]
 <template>
   <div>
     User {{ $route.params.id }}
index ef68b15c889fa1d3e67763736a4c20cc54e7c2e7..04cd8c41519ff593edcb49a43566e2a62e7d815c 100644 (file)
@@ -25,8 +25,7 @@ Vue Router 基于 Vue 的组件系统构建,你可以通过配置**路由**来
 让我们首先来看根组件, `App.vue`。
 
 ### App.vue
-
-```vue
+```vue [App.vue]
 <template>
   <h1>Hello App!</h1>
   <p><strong>Current route path:</strong> {{ $route.fullPath }}</p>
index 2e37660b35ab95dcdb48db75a0943377ea216a0d..2f8d9ee105a82ced3573112f6af1308256c80a04 100644 (file)
@@ -71,6 +71,9 @@ importers:
       vitepress:
         specifier: 1.6.4
         version: 1.6.4(@algolia/client-search@5.37.0)(@types/node@24.3.0)(axios@1.10.0)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.43.1)(typescript@5.8.3)
+      vitepress-plugin-group-icons:
+        specifier: ^1.6.1
+        version: 1.6.1(markdown-it@14.1.0)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.1))
       vitepress-translation-helper:
         specifier: ^0.2.2
         version: 0.2.2(vitepress@1.6.4(@algolia/client-search@5.37.0)(@types/node@24.3.0)(axios@1.10.0)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.43.1)(typescript@5.8.3))(vue@3.5.21(typescript@5.8.3))
@@ -313,9 +316,15 @@ packages:
     resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
     engines: {node: '>=6.0.0'}
 
+  '@antfu/install-pkg@1.1.0':
+    resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
+
   '@antfu/utils@0.7.10':
     resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==}
 
+  '@antfu/utils@8.1.1':
+    resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
+
   '@asamuzakjp/css-color@3.2.0':
     resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
 
@@ -853,12 +862,21 @@ packages:
     resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==}
     engines: {node: '>=6.9.0'}
 
+  '@iconify-json/logos@1.2.4':
+    resolution: {integrity: sha512-XC4If5D/hbaZvUkTV8iaZuGlQCyG6CNOlaAaJaGa13V5QMYwYjgtKk3vPP8wz3wtTVNVEVk3LRx1fOJz+YnSMw==}
+
   '@iconify-json/simple-icons@1.2.52':
     resolution: {integrity: sha512-c41YOMzBhl3hp58WJLxT+Qq3UhBd8GZAMkbS8ddlCuIGLW0COGe2YSfOA2+poA8/bxLhUQODRNjAy3KhiAOtzA==}
 
+  '@iconify-json/vscode-icons@1.2.23':
+    resolution: {integrity: sha512-gFTcKecKra2/b5SbGDgHGI/l8CuikHyBPmqGlK+YCmS8AK72dtDQbUekdoACsju/3TYS37QvdPoOQwnyx2LdYg==}
+
   '@iconify/types@2.0.0':
     resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
 
+  '@iconify/utils@2.3.0':
+    resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
+
   '@isaacs/balanced-match@4.0.1':
     resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==}
     engines: {node: 20 || >=22}
@@ -2278,6 +2296,9 @@ packages:
   confbox@0.1.8:
     resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
 
+  confbox@0.2.2:
+    resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==}
+
   config-chain@1.1.13:
     resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
 
@@ -2710,6 +2731,9 @@ packages:
     resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
     engines: {node: '>=12.0.0'}
 
+  exsolve@1.0.7:
+    resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
+
   extract-zip@2.0.1:
     resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
     engines: {node: '>= 10.17.0'}
@@ -2941,6 +2965,10 @@ packages:
     engines: {node: '>=12'}
     deprecated: Glob versions prior to v9 are no longer supported
 
+  globals@15.15.0:
+    resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+    engines: {node: '>=18'}
+
   globby@14.1.0:
     resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==}
     engines: {node: '>=18'}
@@ -3374,6 +3402,10 @@ packages:
     resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
+  local-pkg@1.1.1:
+    resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
+    engines: {node: '>=14'}
+
   locate-path@2.0.0:
     resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
     engines: {node: '>=4'}
@@ -3832,6 +3864,9 @@ packages:
   package-json-from-dist@1.0.0:
     resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
 
+  package-manager-detector@1.3.0:
+    resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==}
+
   pako@1.0.11:
     resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
 
@@ -3956,6 +3991,9 @@ packages:
   pkg-types@1.3.1:
     resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
 
+  pkg-types@2.2.0:
+    resolution: {integrity: sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==}
+
   postcss-load-config@6.0.1:
     resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
     engines: {node: '>= 18'}
@@ -4030,7 +4068,6 @@ packages:
     engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
     deprecated: |-
       You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.
-
       (For a CapTP with native promises, see @endo/eventual-send and @endo/captp)
 
   quansync@0.2.10:
@@ -4937,6 +4974,12 @@ packages:
       yaml:
         optional: true
 
+  vitepress-plugin-group-icons@1.6.1:
+    resolution: {integrity: sha512-eoFlFAhAy/yTZDbaIgA/nMbjVYXkf8pz8rr75MN2VCw7yH60I3cw6bW5EuwddAeafZtBqbo8OsEGU7TIWFiAjg==}
+    peerDependencies:
+      markdown-it: '>=14'
+      vite: '>=3'
+
   vitepress-translation-helper@0.2.2:
     resolution: {integrity: sha512-xqE4p1iUmsADKyA8W/02POtEwL0ZMcY2Ogj4Shuh70392UslB5JhrgCdF1j61NIQhgy/wgAGhn33QZdksN6IqQ==}
     hasBin: true
@@ -5306,8 +5349,15 @@ snapshots:
       '@jridgewell/gen-mapping': 0.3.12
       '@jridgewell/trace-mapping': 0.3.29
 
+  '@antfu/install-pkg@1.1.0':
+    dependencies:
+      package-manager-detector: 1.3.0
+      tinyexec: 1.0.1
+
   '@antfu/utils@0.7.10': {}
 
+  '@antfu/utils@8.1.1': {}
+
   '@asamuzakjp/css-color@3.2.0':
     dependencies:
       '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
@@ -5764,12 +5814,33 @@ snapshots:
 
   '@hutson/parse-repository-url@3.0.2': {}
 
+  '@iconify-json/logos@1.2.4':
+    dependencies:
+      '@iconify/types': 2.0.0
+
   '@iconify-json/simple-icons@1.2.52':
     dependencies:
       '@iconify/types': 2.0.0
 
+  '@iconify-json/vscode-icons@1.2.23':
+    dependencies:
+      '@iconify/types': 2.0.0
+
   '@iconify/types@2.0.0': {}
 
+  '@iconify/utils@2.3.0':
+    dependencies:
+      '@antfu/install-pkg': 1.1.0
+      '@antfu/utils': 8.1.1
+      '@iconify/types': 2.0.0
+      debug: 4.4.1
+      globals: 15.15.0
+      kolorist: 1.8.0
+      local-pkg: 1.1.1
+      mlly: 1.7.4
+    transitivePeerDependencies:
+      - supports-color
+
   '@isaacs/balanced-match@4.0.1':
     optional: true
 
@@ -7195,6 +7266,8 @@ snapshots:
 
   confbox@0.1.8: {}
 
+  confbox@0.2.2: {}
+
   config-chain@1.1.13:
     dependencies:
       ini: 1.3.8
@@ -7652,6 +7725,8 @@ snapshots:
 
   expect-type@1.1.0: {}
 
+  exsolve@1.0.7: {}
+
   extract-zip@2.0.1:
     dependencies:
       debug: 4.4.1
@@ -7933,6 +8008,8 @@ snapshots:
       minimatch: 5.1.6
       once: 1.4.0
 
+  globals@15.15.0: {}
+
   globby@14.1.0:
     dependencies:
       '@sindresorhus/merge-streams': 2.3.0
@@ -8397,6 +8474,12 @@ snapshots:
 
   load-tsconfig@0.2.5: {}
 
+  local-pkg@1.1.1:
+    dependencies:
+      mlly: 1.7.4
+      pkg-types: 2.2.0
+      quansync: 0.2.10
+
   locate-path@2.0.0:
     dependencies:
       p-locate: 2.0.0
@@ -8913,6 +8996,8 @@ snapshots:
 
   package-json-from-dist@1.0.0: {}
 
+  package-manager-detector@1.3.0: {}
+
   pako@1.0.11: {}
 
   parse-json@4.0.0:
@@ -9007,6 +9092,12 @@ snapshots:
       mlly: 1.7.4
       pathe: 2.0.3
 
+  pkg-types@2.2.0:
+    dependencies:
+      confbox: 0.2.2
+      exsolve: 1.0.7
+      pathe: 2.0.3
+
   postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.6)(yaml@2.8.1):
     dependencies:
       lilconfig: 3.1.3
@@ -10070,6 +10161,16 @@ snapshots:
       terser: 5.43.1
       yaml: 2.8.1
 
+  vitepress-plugin-group-icons@1.6.1(markdown-it@14.1.0)(vite@7.1.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.1)):
+    dependencies:
+      '@iconify-json/logos': 1.2.4
+      '@iconify-json/vscode-icons': 1.2.23
+      '@iconify/utils': 2.3.0
+      markdown-it: 14.1.0
+      vite: 7.1.3(@types/node@24.3.0)(jiti@2.4.2)(terser@5.43.1)(yaml@2.8.1)
+    transitivePeerDependencies:
+      - supports-color
+
   vitepress-translation-helper@0.2.2(vitepress@1.6.4(@algolia/client-search@5.37.0)(@types/node@24.3.0)(axios@1.10.0)(postcss@8.5.6)(search-insights@2.17.3)(terser@5.43.1)(typescript@5.8.3))(vue@3.5.21(typescript@5.8.3)):
     dependencies:
       minimist: 1.2.8