diff --git a/.npmrc b/.npmrc
index 8fb0b90fe..a1ecadcef 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1,2 +1,4 @@
-shamefully-hoist=true
+# TODO: consider resolving webpack loaders to absolute path
+public-hoist-pattern[]=*-loader
+public-hoist-pattern[]=webpack-*
 shell-emulator=true
diff --git a/package.json b/package.json
index 1eb42c42a..d8f117f83 100644
--- a/package.json
+++ b/package.json
@@ -56,6 +56,8 @@
     "@types/fs-extra": "11.0.4",
     "@types/node": "20.14.2",
     "@types/semver": "7.5.8",
+    "@unhead/schema": "1.9.12",
+    "@vitejs/plugin-vue": "5.0.4",
     "@vitest/coverage-v8": "1.6.0",
     "@vue/test-utils": "2.4.6",
     "case-police": "0.6.1",
diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json
index 56bc7c16e..96c9c2696 100644
--- a/packages/nuxt/package.json
+++ b/packages/nuxt/package.json
@@ -123,6 +123,7 @@
     "@types/estree": "1.0.5",
     "@types/fs-extra": "11.0.4",
     "@vitejs/plugin-vue": "5.0.4",
+    "@vue/compiler-sfc": "3.4.27",
     "unbuild": "latest",
     "vite": "5.2.13",
     "vitest": "1.6.0"
diff --git a/packages/nuxt/src/app/components/nuxt-teleport-island-component.ts b/packages/nuxt/src/app/components/nuxt-teleport-island-component.ts
index 31b2c0718..e459781dd 100644
--- a/packages/nuxt/src/app/components/nuxt-teleport-island-component.ts
+++ b/packages/nuxt/src/app/components/nuxt-teleport-island-component.ts
@@ -43,7 +43,7 @@ export default defineComponent({
       const name = (slotType.__name || slotType.name) as string
 
       islandContext.components[props.to] = {
-        chunk: import.meta.dev ? '_nuxt/' + paths[name] : paths[name],
+        chunk: import.meta.dev ? nuxtApp.$config.app.buildAssetsDir + paths[name] : paths[name],
         props: slot.props || {},
       }
 
diff --git a/packages/ui-templates/lib/render.ts b/packages/ui-templates/lib/render.ts
index 27f0c3bf4..c9d5986c4 100644
--- a/packages/ui-templates/lib/render.ts
+++ b/packages/ui-templates/lib/render.ts
@@ -27,7 +27,11 @@ export const RenderPlugin = () => {
       const critters = new Critters({ path: outputDir })
       const htmlFiles = await globby(resolve(outputDir, 'templates/**/*.html'), { absolute: true })
 
-      const templateExports = []
+      const templateExports: Array<{
+        exportName: string
+        templateName: string
+        types: string
+      }> = []
 
       for (const fileName of htmlFiles) {
         // Infer template name
@@ -48,9 +52,13 @@ export const RenderPlugin = () => {
         html = html.replace(/<link[^>]*>/g, '')
 
         // Inline SVGs
-        const svgSources = Array.from(html.matchAll(/src="([^"]+)"|url([^)]+)/g))
-          .map(m => m[1])
-          .filter(src => src?.match(/\.svg$/))
+        const svgSources: string[] = []
+
+        for (const [_, src] of html.matchAll(/src="([^"]+)"|url([^)]+)/g)) {
+          if (src?.match(/\.svg$/)) {
+            svgSources.push(src)
+          }
+        }
 
         for (const src of svgSources) {
           const svg = readFileSync(join(outputDir, src), 'utf-8')
@@ -59,8 +67,13 @@ export const RenderPlugin = () => {
         }
 
         // Inline our scripts
-        const scriptSources = Array.from(html.matchAll(/<script[^>]*src="([^"]*)"[^>]*>[\s\S]*?<\/script>/g))
-          .filter(([_block, src]) => src?.match(/^\/.*\.js$/))
+        const scriptSources: [string, string][] = []
+
+        for (const [block, src] of html.matchAll(/<script[^>]*src="([^"]*)"[^>]*>[\s\S]*?<\/script>/g)) {
+          if (src?.match(/^\/.*\.js$/)) {
+            scriptSources.push([block, src])
+          }
+        }
 
         for (const [scriptBlock, src] of scriptSources) {
           let contents = readFileSync(join(outputDir, src), 'utf-8')
@@ -83,8 +96,10 @@ export const RenderPlugin = () => {
         const chunks = html.split(/\{{2,3}[^{}]+\}{2,3}/g).map(chunk => JSON.stringify(chunk))
         const hasMessages = chunks.length > 1
         let templateString = chunks.shift()
-        for (const expression of html.matchAll(/\{{2,3}([^{}]+)\}{2,3}/g)) {
-          templateString += ` + (${expression[1].trim()}) + ${chunks.shift()}`
+        for (const [_, expression] of html.matchAll(/\{{2,3}([^{}]+)\}{2,3}/g)) {
+          if (expression) {
+            templateString += ` + (${expression.trim()}) + ${chunks.shift()}`
+          }
         }
         if (chunks.length > 0) {
           templateString += ' + ' + chunks.join(' + ')
@@ -110,7 +125,7 @@ export const RenderPlugin = () => {
           .replace(/>\{\{\{\s*(\w+)\s*\}\}\}<\/[\w-]*>/g, ' v-html="$1" />')
         // We are not matching <link> <script> and <meta> tags as these aren't used yet in nuxt/ui
         // and should be taken care of wherever this SFC is used
-        const title = html.match(/<title[^>]*>([\s\S]*)<\/title>/)?.[1].replace(/\{\{([\s\S]+?)\}\}/g, (r) => {
+        const title = html.match(/<title[^>]*>([\s\S]*)<\/title>/)?.[1]?.replace(/\{\{([\s\S]+?)\}\}/g, (r) => {
           return `\${${r.slice(2, -2)}}`.replace(/messages\./g, 'props.')
         })
         const styleContent = Array.from(html.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/g)).map(block => block[1]).join('\n')
@@ -119,7 +134,7 @@ export const RenderPlugin = () => {
           if (lastChar && !['}', '.', '@', '*', ':'].includes(lastChar)) {
             return ';' + lastChar
           }
-          return lastChar
+          return lastChar || ''
         }).replace(/@media[^{]*\{\}/g, '')
         const inlineScripts = Array.from(html.matchAll(/<script>([\s\S]*?)<\/script>/g))
           .map(block => block[1])
diff --git a/packages/ui-templates/package.json b/packages/ui-templates/package.json
index 2869453cd..68db032be 100644
--- a/packages/ui-templates/package.json
+++ b/packages/ui-templates/package.json
@@ -20,6 +20,7 @@
   },
   "devDependencies": {
     "@types/html-minifier": "4.0.5",
+    "@types/lodash-es": "4.17.12",
     "@unocss/reset": "0.60.4",
     "critters": "0.0.22",
     "execa": "9.2.0",
@@ -27,6 +28,7 @@
     "html-minifier": "4.0.0",
     "jiti": "1.21.0",
     "knitwork": "1.1.0",
+    "lodash-es": "4.17.21",
     "pathe": "1.1.2",
     "prettier": "3.3.1",
     "scule": "1.3.0",
diff --git a/packages/webpack/package.json b/packages/webpack/package.json
index 2e4722188..d4c67588e 100644
--- a/packages/webpack/package.json
+++ b/packages/webpack/package.json
@@ -73,6 +73,7 @@
     "@nuxt/schema": "workspace:*",
     "@types/fs-extra": "11.0.4",
     "@types/hash-sum": "1.0.2",
+    "@types/lodash-es": "4.17.12",
     "@types/pify": "5.0.4",
     "@types/webpack-bundle-analyzer": "4.7.0",
     "@types/webpack-hot-middleware": "2.25.9",
diff --git a/packages/webpack/src/plugins/vue/client.ts b/packages/webpack/src/plugins/vue/client.ts
index 761ef1c40..14c0c184e 100644
--- a/packages/webpack/src/plugins/vue/client.ts
+++ b/packages/webpack/src/plugins/vue/client.ts
@@ -17,10 +17,6 @@ interface PluginOptions {
   nuxt: Nuxt
 }
 
-function uniq<T> (items: T[]) {
-  return [...new Set(items)]
-}
-
 export default class VueSSRClientPlugin {
   options: PluginOptions
 
@@ -34,38 +30,45 @@ export default class VueSSRClientPlugin {
     compiler.hooks.afterEmit.tap('VueSSRClientPlugin', async (compilation: Compilation) => {
       const stats = compilation.getStats().toJson()
 
-      const allFiles = uniq(stats.assets!
-        .map(a => a.name))
-        .filter(file => !isHotUpdate(file))
+      const initialFiles = new Set<string>()
+      for (const name in stats.entrypoints!) {
+        const entryAssets = stats.entrypoints![name]!.assets!
+        for (const asset of entryAssets) {
+          const file = asset.name
+          if ((isJS(file) || isCSS(file)) && !isHotUpdate(file)) {
+            initialFiles.add(file)
+          }
+        }
+      }
 
-      const initialFiles = uniq(Object.keys(stats.entrypoints!)
-        .map(name => stats.entrypoints![name].assets!)
-        .reduce((files, entryAssets) => files.concat(entryAssets.map(entryAsset => entryAsset.name)), [] as string[])
-        .filter(file => isJS(file) || isCSS(file)))
-        .filter(file => !isHotUpdate(file))
+      const allFiles = new Set<string>()
+      const asyncFiles = new Set<string>()
 
-      const asyncFiles = allFiles
-        .filter(file => isJS(file) || isCSS(file))
-        .filter(file => !initialFiles.includes(file))
-        .filter(file => !isHotUpdate(file))
+      for (const asset of stats.assets!) {
+        const file = asset.name
+        if (!isHotUpdate(file)) {
+          allFiles.add(file)
+          if (initialFiles.has(file)) { continue }
+          if (isJS(file) || isCSS(file)) {
+            asyncFiles.add(file)
+          }
+        }
+      }
 
       const assetsMapping: Record<string, string[]> = {}
-      stats.assets!
-        .filter(({ name }) => isJS(name))
-        .filter(({ name }) => !isHotUpdate(name))
-        .forEach(({ name, chunkNames = [] }) => {
+      for (const { name, chunkNames = [] } of stats.assets!) {
+        if (isJS(name) && !isHotUpdate(name)) {
           const componentHash = hash(chunkNames.join('|'))
-          if (!assetsMapping[componentHash]) {
-            assetsMapping[componentHash] = []
-          }
-          assetsMapping[componentHash].push(name)
-        })
+          const map = assetsMapping[componentHash] ||= []
+          map.push(name)
+        }
+      }
 
       const webpackManifest = {
         publicPath: stats.publicPath,
-        all: allFiles,
-        initial: initialFiles,
-        async: asyncFiles,
+        all: [...allFiles],
+        initial: [...initialFiles],
+        async: [...asyncFiles],
         modules: { /* [identifier: string]: Array<index: number> */ } as Record<string, number[]>,
         assetsMapping,
       }
@@ -78,7 +81,7 @@ export default class VueSSRClientPlugin {
         if (m.chunks!.length === 1) {
           const [cid] = m.chunks!
           const chunk = stats.chunks!.find(c => c.id === cid)
-          if (!chunk || !chunk.files) {
+          if (!chunk || !chunk.files || !cid) {
             return
           }
           const id = m.identifier!.replace(/\s\w+$/, '') // remove appended hash
diff --git a/packages/webpack/src/plugins/vue/server.ts b/packages/webpack/src/plugins/vue/server.ts
index 172990875..646589c60 100644
--- a/packages/webpack/src/plugins/vue/server.ts
+++ b/packages/webpack/src/plugins/vue/server.ts
@@ -26,7 +26,7 @@ export default class VueSSRServerPlugin {
       }, (assets: any, cb: any) => {
         const stats = compilation.getStats().toJson()
         const [entryName] = Object.keys(stats.entrypoints!)
-        const entryInfo = stats.entrypoints![entryName]
+        const entryInfo = stats.entrypoints![entryName!]
 
         if (!entryInfo) {
           // #5553
diff --git a/packages/webpack/src/plugins/vue/util.ts b/packages/webpack/src/plugins/vue/util.ts
index 7d2788dac..58ad48d38 100644
--- a/packages/webpack/src/plugins/vue/util.ts
+++ b/packages/webpack/src/plugins/vue/util.ts
@@ -13,8 +13,7 @@ export const validate = (compiler: Compiler) => {
 
   if (!compiler.options.externals) {
     logger.info(
-      'It is recommended to externalize dependencies in the server build for ' +
-      'better build performance.',
+      'It is recommended to externalize dependencies in the server build for better build performance.',
     )
   }
 }
diff --git a/packages/webpack/src/presets/esbuild.ts b/packages/webpack/src/presets/esbuild.ts
index e85926462..6a778cd02 100644
--- a/packages/webpack/src/presets/esbuild.ts
+++ b/packages/webpack/src/presets/esbuild.ts
@@ -16,10 +16,10 @@ export function esbuild (ctx: WebpackConfigContext) {
       loader: 'esbuild-loader',
       exclude: (file) => {
         // Not exclude files outside node_modules
-        file = file.split('node_modules', 2)[1]
-        if (!file) { return false }
+        const lastSegment = file.split('node_modules', 2)[1]
+        if (!lastSegment) { return false }
 
-        return !ctx.transpile.some(module => module.test(file))
+        return !ctx.transpile.some(module => module.test(lastSegment))
       },
       resolve: {
         fullySpecified: false,
diff --git a/packages/webpack/src/presets/style.ts b/packages/webpack/src/presets/style.ts
index 5c0a14ab2..c9fa4be78 100644
--- a/packages/webpack/src/presets/style.ts
+++ b/packages/webpack/src/presets/style.ts
@@ -21,14 +21,15 @@ function minimizer (ctx: WebpackConfigContext) {
 }
 
 function extractCSS (ctx: WebpackConfigContext) {
+  const config = ctx.userConfig.extractCSS
+  if (!config) { return }
   // CSS extraction
-  if (ctx.userConfig.extractCSS) {
-    ctx.config.plugins!.push(new MiniCssExtractPlugin({
-      filename: fileName(ctx, 'css'),
-      chunkFilename: fileName(ctx, 'css'),
-      ...ctx.userConfig.extractCSS === true ? {} : ctx.userConfig.extractCSS,
-    }))
-  }
+  const filename = fileName(ctx, 'css')
+  ctx.config.plugins!.push(new MiniCssExtractPlugin({
+    filename,
+    chunkFilename: filename,
+    ...config === true ? {} : config,
+  }))
 }
 
 function loaders (ctx: WebpackConfigContext) {
diff --git a/packages/webpack/src/utils/postcss.ts b/packages/webpack/src/utils/postcss.ts
index da7365072..89d089f07 100644
--- a/packages/webpack/src/utils/postcss.ts
+++ b/packages/webpack/src/utils/postcss.ts
@@ -6,21 +6,18 @@ import { defu } from 'defu'
 
 const isPureObject = (obj: unknown): obj is Object => obj !== null && !Array.isArray(obj) && typeof obj === 'object'
 
+const ensureItemIsLast = (item: string) => (arr: string[]) => {
+  const index = arr.indexOf(item)
+  if (index !== -1) {
+    arr.splice(index, 1)
+    arr.push(item)
+  }
+  return arr
+}
+
 const orderPresets = {
-  cssnanoLast (names: string[]) {
-    const nanoIndex = names.indexOf('cssnano')
-    if (nanoIndex !== names.length - 1) {
-      names.push(names.splice(nanoIndex, 1)[0])
-    }
-    return names
-  },
-  autoprefixerLast (names: string[]) {
-    const nanoIndex = names.indexOf('autoprefixer')
-    if (nanoIndex !== names.length - 1) {
-      names.push(names.splice(nanoIndex, 1)[0])
-    }
-    return names
-  },
+  cssnanoLast: ensureItemIsLast('cssnano'),
+  autoprefixerLast: ensureItemIsLast('autoprefixer'),
   autoprefixerAndCssnanoLast (names: string[]) {
     return orderPresets.cssnanoLast(orderPresets.autoprefixerLast(names))
   },
diff --git a/packages/webpack/src/virtual-modules.ts b/packages/webpack/src/virtual-modules.ts
index c9a05db44..8c117756d 100644
--- a/packages/webpack/src/virtual-modules.ts
+++ b/packages/webpack/src/virtual-modules.ts
@@ -8,7 +8,7 @@ export function registerVirtualModules () {
   const virtualModules = new VirtualModulesPlugin(nuxt.vfs)
   const writeFiles = () => {
     for (const filePath in nuxt.vfs) {
-      virtualModules.writeModule(filePath, nuxt.vfs[filePath])
+      virtualModules.writeModule(filePath, nuxt.vfs[filePath] || '')
     }
   }
 
diff --git a/playground/package.json b/playground/package.json
index a53a6e612..7e71518f9 100644
--- a/playground/package.json
+++ b/playground/package.json
@@ -7,7 +7,11 @@
     "start": "nuxi preview"
   },
   "dependencies": {
+    "@unhead/shared": "latest",
+    "@vue/devtools-api": "latest",
+    "@vue/shared": "latest",
     "nuxt": "workspace:*",
+    "unhead": "latest",
     "vue": "latest"
   }
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 36c7955aa..7e1fd0a09 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -50,6 +50,12 @@ importers:
       '@types/semver':
         specifier: 7.5.8
         version: 7.5.8
+      '@unhead/schema':
+        specifier: 1.9.12
+        version: 1.9.12
+      '@vitejs/plugin-vue':
+        specifier: 5.0.4
+        version: 5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
       '@vitest/coverage-v8':
         specifier: 1.6.0
         version: 1.6.0(vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0))
@@ -251,7 +257,7 @@ importers:
         version: 2.0.2
       '@nuxt/devtools':
         specifier: ^1.3.3
-        version: 1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
+        version: 1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
       '@nuxt/kit':
         specifier: workspace:*
         version: link:../kit
@@ -266,7 +272,7 @@ importers:
         version: link:../vite
       '@types/node':
         specifier: ^14.18.0 || >=16.10.0
-        version: 20.12.12
+        version: 20.14.2
       '@unhead/dom':
         specifier: ^1.9.12
         version: 1.9.12
@@ -435,16 +441,19 @@ importers:
         version: 11.0.4
       '@vitejs/plugin-vue':
         specifier: 5.0.4
-        version: 5.0.4(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
+        version: 5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
+      '@vue/compiler-sfc':
+        specifier: 3.4.27
+        version: 3.4.27
       unbuild:
         specifier: latest
         version: 2.0.0(sass@1.69.4)(typescript@5.4.5)
       vite:
         specifier: 5.2.13
-        version: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
+        version: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)
       vitest:
         specifier: 1.6.0
-        version: 1.6.0(@types/node@20.12.12)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0)
+        version: 1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0)
 
   packages/schema:
     dependencies:
@@ -569,6 +578,9 @@ importers:
       '@types/html-minifier':
         specifier: 4.0.5
         version: 4.0.5
+      '@types/lodash-es':
+        specifier: 4.17.12
+        version: 4.17.12
       '@unocss/reset':
         specifier: 0.60.4
         version: 0.60.4
@@ -590,6 +602,9 @@ importers:
       knitwork:
         specifier: 1.1.0
         version: 1.1.0
+      lodash-es:
+        specifier: 4.17.21
+        version: 4.17.21
       pathe:
         specifier: 1.1.2
         version: 1.1.2
@@ -871,6 +886,9 @@ importers:
       '@types/hash-sum':
         specifier: 1.0.2
         version: 1.0.2
+      '@types/lodash-es':
+        specifier: 4.17.12
+        version: 4.17.12
       '@types/pify':
         specifier: 5.0.4
         version: 5.0.4
@@ -892,9 +910,21 @@ importers:
 
   playground:
     dependencies:
+      '@unhead/shared':
+        specifier: latest
+        version: 1.9.12
+      '@vue/devtools-api':
+        specifier: latest
+        version: 6.6.3
+      '@vue/shared':
+        specifier: latest
+        version: 3.4.27
       nuxt:
         specifier: workspace:*
         version: link:../packages/nuxt
+      unhead:
+        specifier: latest
+        version: 1.9.12
       vue:
         specifier: 3.4.27
         version: 3.4.27(typescript@5.4.5)
@@ -908,9 +938,27 @@ importers:
         specifier: workspace:*
         version: link:../../../packages/nuxt
     devDependencies:
+      '@unhead/dom':
+        specifier: latest
+        version: 1.9.12
+      '@unhead/shared':
+        specifier: latest
+        version: 1.9.12
+      '@vue/devtools-api':
+        specifier: latest
+        version: 6.6.3
+      '@vue/shared':
+        specifier: latest
+        version: 3.4.27
+      iron-webcrypto:
+        specifier: latest
+        version: 1.2.1
       ufo:
         specifier: latest
         version: 1.5.3
+      unhead:
+        specifier: latest
+        version: 1.9.12
       unplugin:
         specifier: latest
         version: 1.10.1
@@ -927,6 +975,9 @@ importers:
       ofetch:
         specifier: latest
         version: 1.3.4
+      unplugin-vue-router:
+        specifier: ^0.7.0
+        version: 0.7.0(rollup@4.18.0)(vue-router@4.3.2(vue@3.4.27(typescript@5.4.5)))(vue@3.4.27(typescript@5.4.5))
       vitest:
         specifier: 1.5.3
         version: 1.5.3(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0)
@@ -960,6 +1011,19 @@ importers:
       nuxt:
         specifier: workspace:*
         version: link:../../../packages/nuxt
+    devDependencies:
+      '@unhead/shared':
+        specifier: latest
+        version: 1.9.12
+      '@vue/devtools-api':
+        specifier: latest
+        version: 6.6.3
+      '@vue/shared':
+        specifier: latest
+        version: 3.4.27
+      unhead:
+        specifier: latest
+        version: 1.9.12
 
   test/fixtures/suspense:
     dependencies:
@@ -970,9 +1034,21 @@ importers:
         specifier: 3.4.27
         version: 3.4.27(typescript@5.4.5)
     devDependencies:
+      '@unhead/shared':
+        specifier: latest
+        version: 1.9.12
+      '@vue/devtools-api':
+        specifier: latest
+        version: 6.6.3
+      '@vue/shared':
+        specifier: latest
+        version: 3.4.27
       typescript:
         specifier: latest
         version: 5.4.5
+      unhead:
+        specifier: latest
+        version: 1.9.12
 
 packages:
 
@@ -2887,6 +2963,9 @@ packages:
   '@vue/devtools-api@6.5.1':
     resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==}
 
+  '@vue/devtools-api@6.6.3':
+    resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==}
+
   '@vue/devtools-applet@7.1.3':
     resolution: {integrity: sha512-525h17FzUF7ssko/U+yeP5jv0HaGm3eI4dVqncWPRCLTDtOy1V+srjoxYqr5qnzx6AdIU2icPQF2KNomd9FGZw==}
     peerDependencies:
@@ -4659,6 +4738,9 @@ packages:
   iron-webcrypto@1.0.0:
     resolution: {integrity: sha512-anOK1Mktt8U1Xi7fCM3RELTuYbnFikQY5VtrDj7kPgpejV7d43tWKhzgioO0zpkazLEL/j/iayRqnJhrGfqUsg==}
 
+  iron-webcrypto@1.2.1:
+    resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
   is-absolute-url@4.0.1:
     resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -8470,13 +8552,13 @@ snapshots:
 
   '@nuxt/devalue@2.0.2': {}
 
-  '@nuxt/devtools-kit@1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))':
+  '@nuxt/devtools-kit@1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))':
     dependencies:
       '@nuxt/kit': link:packages/kit
       '@nuxt/schema': link:packages/schema
       execa: 7.2.0
       nuxt: link:packages/nuxt
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
+      vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)
 
   '@nuxt/devtools-wizard@1.3.3':
     dependencies:
@@ -8491,14 +8573,14 @@ snapshots:
       rc9: 2.1.2
       semver: 7.6.2
 
-  '@nuxt/devtools@1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
+  '@nuxt/devtools@1.3.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(nuxt@packages+nuxt)(rollup@4.18.0)(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
     dependencies:
       '@antfu/utils': 0.7.8
-      '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
+      '@nuxt/devtools-kit': 1.3.3(nuxt@packages+nuxt)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))
       '@nuxt/devtools-wizard': 1.3.3
       '@nuxt/kit': link:packages/kit
-      '@vue/devtools-applet': 7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
-      '@vue/devtools-core': 7.1.3(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
+      '@vue/devtools-applet': 7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
+      '@vue/devtools-core': 7.1.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
       '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.4.5))
       birpc: 0.2.17
       consola: 3.2.3
@@ -8528,9 +8610,9 @@ snapshots:
       simple-git: 3.24.0
       sirv: 2.0.4
       unimport: 3.7.2(rollup@4.18.0)
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-      vite-plugin-inspect: 0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
-      vite-plugin-vue-inspector: 5.1.0(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
+      vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)
+      vite-plugin-inspect: 0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))
+      vite-plugin-vue-inspector: 5.1.0(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))
       which: 3.0.1
       ws: 8.17.0
     transitivePeerDependencies:
@@ -9333,16 +9415,6 @@ snapshots:
       unhead: 1.9.12
       vue: 3.4.27(typescript@5.4.5)
 
-  '@unocss/astro@0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))':
-    dependencies:
-      '@unocss/core': 0.60.4
-      '@unocss/reset': 0.60.4
-      '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
-    optionalDependencies:
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-    transitivePeerDependencies:
-      - rollup
-
   '@unocss/astro@0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))':
     dependencies:
       '@unocss/core': 0.60.4
@@ -9480,22 +9552,6 @@ snapshots:
     dependencies:
       '@unocss/core': 0.60.4
 
-  '@unocss/vite@0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))':
-    dependencies:
-      '@ampproject/remapping': 2.3.0
-      '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
-      '@unocss/config': 0.60.4
-      '@unocss/core': 0.60.4
-      '@unocss/inspector': 0.60.4
-      '@unocss/scope': 0.60.4
-      '@unocss/transformer-directives': 0.60.4
-      chokidar: 3.6.0
-      fast-glob: 3.3.2
-      magic-string: 0.30.10
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-    transitivePeerDependencies:
-      - rollup
-
   '@unocss/vite@0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))':
     dependencies:
       '@ampproject/remapping': 2.3.0
@@ -9540,11 +9596,6 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
-  '@vitejs/plugin-vue@5.0.4(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
-    dependencies:
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-      vue: 3.4.27(typescript@5.4.5)
-
   '@vitejs/plugin-vue@5.0.4(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
     dependencies:
       vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)
@@ -9705,7 +9756,7 @@ snapshots:
 
   '@vue/compiler-sfc@3.4.27':
     dependencies:
-      '@babel/parser': 7.24.5
+      '@babel/parser': 7.24.7
       '@vue/compiler-core': 3.4.27
       '@vue/compiler-dom': 3.4.27
       '@vue/compiler-ssr': 3.4.27
@@ -9722,12 +9773,14 @@ snapshots:
 
   '@vue/devtools-api@6.5.1': {}
 
-  '@vue/devtools-applet@7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
+  '@vue/devtools-api@6.6.3': {}
+
+  '@vue/devtools-applet@7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
     dependencies:
-      '@vue/devtools-core': 7.1.3(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
+      '@vue/devtools-core': 7.1.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))
       '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.4.5))
       '@vue/devtools-shared': 7.1.3
-      '@vue/devtools-ui': 7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5))
+      '@vue/devtools-ui': 7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5))
       lodash-es: 4.17.21
       perfect-debounce: 1.0.0
       shiki: 1.3.0
@@ -9752,14 +9805,14 @@ snapshots:
       - unocss
       - vite
 
-  '@vue/devtools-core@7.1.3(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
+  '@vue/devtools-core@7.1.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))(vue@3.4.27(typescript@5.4.5))':
     dependencies:
       '@vue/devtools-kit': 7.1.3(vue@3.4.27(typescript@5.4.5))
       '@vue/devtools-shared': 7.1.3
       mitt: 3.0.1
       nanoid: 3.3.7
       pathe: 1.1.2
-      vite-hot-client: 0.2.3(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
+      vite-hot-client: 0.2.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))
     transitivePeerDependencies:
       - vite
       - vue
@@ -9777,7 +9830,7 @@ snapshots:
     dependencies:
       rfdc: 1.3.1
 
-  '@vue/devtools-ui@7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5))':
+  '@vue/devtools-ui@7.1.3(@unocss/reset@0.60.4)(floating-vue@5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5)))(unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)))(vue@3.4.27(typescript@5.4.5))':
     dependencies:
       '@unocss/reset': 0.60.4
       '@vue/devtools-shared': 7.1.3
@@ -9787,7 +9840,7 @@ snapshots:
       colord: 2.9.3
       floating-vue: 5.2.2(@nuxt/kit@packages+kit)(vue@3.4.27(typescript@5.4.5))
       focus-trap: 7.5.4
-      unocss: 0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
+      unocss: 0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))
       vue: 3.4.27(typescript@5.4.5)
     transitivePeerDependencies:
       - '@vue/composition-api'
@@ -10125,7 +10178,7 @@ snapshots:
 
   ast-kit@0.11.3(rollup@4.18.0):
     dependencies:
-      '@babel/parser': 7.24.5
+      '@babel/parser': 7.24.7
       '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
       pathe: 1.1.2
     transitivePeerDependencies:
@@ -11827,6 +11880,8 @@ snapshots:
 
   iron-webcrypto@1.0.0: {}
 
+  iron-webcrypto@1.2.1: {}
+
   is-absolute-url@4.0.1: {}
 
   is-alphabetical@2.0.1: {}
@@ -14535,35 +14590,6 @@ snapshots:
 
   universalify@2.0.0: {}
 
-  unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)):
-    dependencies:
-      '@unocss/astro': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
-      '@unocss/cli': 0.60.4(rollup@4.18.0)
-      '@unocss/core': 0.60.4
-      '@unocss/extractor-arbitrary-variants': 0.60.4
-      '@unocss/postcss': 0.60.4(postcss@8.4.38)
-      '@unocss/preset-attributify': 0.60.4
-      '@unocss/preset-icons': 0.60.4
-      '@unocss/preset-mini': 0.60.4
-      '@unocss/preset-tagify': 0.60.4
-      '@unocss/preset-typography': 0.60.4
-      '@unocss/preset-uno': 0.60.4
-      '@unocss/preset-web-fonts': 0.60.4
-      '@unocss/preset-wind': 0.60.4
-      '@unocss/reset': 0.60.4
-      '@unocss/transformer-attributify-jsx': 0.60.4
-      '@unocss/transformer-attributify-jsx-babel': 0.60.4
-      '@unocss/transformer-compile-class': 0.60.4
-      '@unocss/transformer-directives': 0.60.4
-      '@unocss/transformer-variant-group': 0.60.4
-      '@unocss/vite': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0))
-    optionalDependencies:
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-    transitivePeerDependencies:
-      - postcss
-      - rollup
-      - supports-color
-
   unocss@0.60.4(postcss@8.4.38)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)):
     dependencies:
       '@unocss/astro': 0.60.4(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0))
@@ -14719,9 +14745,9 @@ snapshots:
       unist-util-stringify-position: 4.0.0
       vfile-message: 4.0.2
 
-  vite-hot-client@0.2.3(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)):
+  vite-hot-client@0.2.3(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)):
     dependencies:
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
+      vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)
 
   vite-node@1.5.3(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0):
     dependencies:
@@ -14740,23 +14766,6 @@ snapshots:
       - supports-color
       - terser
 
-  vite-node@1.6.0(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0):
-    dependencies:
-      cac: 6.7.14
-      debug: 4.3.4
-      pathe: 1.1.2
-      picocolors: 1.0.0
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-    transitivePeerDependencies:
-      - '@types/node'
-      - less
-      - lightningcss
-      - sass
-      - stylus
-      - sugarss
-      - supports-color
-      - terser
-
   vite-node@1.6.0(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0):
     dependencies:
       cac: 6.7.14
@@ -14798,7 +14807,7 @@ snapshots:
       typescript: 5.4.5
       vue-tsc: 2.0.19(typescript@5.4.5)
 
-  vite-plugin-inspect@0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)):
+  vite-plugin-inspect@0.8.4(@nuxt/kit@packages+kit)(rollup@4.18.0)(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)):
     dependencies:
       '@antfu/utils': 0.7.8
       '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
@@ -14809,14 +14818,14 @@ snapshots:
       perfect-debounce: 1.0.0
       picocolors: 1.0.0
       sirv: 2.0.4
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
+      vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)
     optionalDependencies:
       '@nuxt/kit': link:packages/kit
     transitivePeerDependencies:
       - rollup
       - supports-color
 
-  vite-plugin-vue-inspector@5.1.0(vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)):
+  vite-plugin-vue-inspector@5.1.0(vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)):
     dependencies:
       '@babel/core': 7.24.7
       '@babel/plugin-proposal-decorators': 7.23.2(@babel/core@7.24.7)
@@ -14827,21 +14836,10 @@ snapshots:
       '@vue/compiler-dom': 3.4.27
       kolorist: 1.8.0
       magic-string: 0.30.10
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
+      vite: 5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0)
     transitivePeerDependencies:
       - supports-color
 
-  vite@5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0):
-    dependencies:
-      esbuild: 0.20.2
-      postcss: 8.4.38
-      rollup: 4.18.0
-    optionalDependencies:
-      '@types/node': 20.12.12
-      fsevents: 2.3.3
-      sass: 1.69.4
-      terser: 5.27.0
-
   vite@5.2.13(@types/node@20.14.2)(sass@1.69.4)(terser@5.27.0):
     dependencies:
       esbuild: 0.20.2
@@ -14907,40 +14905,6 @@ snapshots:
       - supports-color
       - terser
 
-  vitest@1.6.0(@types/node@20.12.12)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0):
-    dependencies:
-      '@vitest/expect': 1.6.0
-      '@vitest/runner': 1.6.0
-      '@vitest/snapshot': 1.6.0
-      '@vitest/spy': 1.6.0
-      '@vitest/utils': 1.6.0
-      acorn-walk: 8.3.2
-      chai: 4.3.10
-      debug: 4.3.4
-      execa: 8.0.1
-      local-pkg: 0.5.0
-      magic-string: 0.30.10
-      pathe: 1.1.2
-      picocolors: 1.0.0
-      std-env: 3.7.0
-      strip-literal: 2.1.0
-      tinybench: 2.5.1
-      tinypool: 0.8.4
-      vite: 5.2.13(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-      vite-node: 1.6.0(@types/node@20.12.12)(sass@1.69.4)(terser@5.27.0)
-      why-is-node-running: 2.2.2
-    optionalDependencies:
-      '@types/node': 20.12.12
-      happy-dom: 14.12.0
-    transitivePeerDependencies:
-      - less
-      - lightningcss
-      - sass
-      - stylus
-      - sugarss
-      - supports-color
-      - terser
-
   vitest@1.6.0(@types/node@20.14.2)(happy-dom@14.12.0)(sass@1.69.4)(terser@5.27.0):
     dependencies:
       '@vitest/expect': 1.6.0
diff --git a/test/bundle.test.ts b/test/bundle.test.ts
index 04b0663a3..b536e3a69 100644
--- a/test/bundle.test.ts
+++ b/test/bundle.test.ts
@@ -72,7 +72,7 @@ describe.skipIf(process.env.SKIP_BUNDLE_SIZE === 'true' || process.env.ECOSYSTEM
     const serverDir = join(rootDir, '.output-inline/server')
 
     const serverStats = await analyzeSizes(['**/*.mjs', '!node_modules'], serverDir)
-    expect.soft(roundToKilobytes(serverStats.totalBytes)).toMatchInlineSnapshot(`"527k"`)
+    expect.soft(roundToKilobytes(serverStats.totalBytes)).toMatchInlineSnapshot(`"528k"`)
 
     const modules = await analyzeSizes('node_modules/**/*', serverDir)
     expect.soft(roundToKilobytes(modules.totalBytes)).toMatchInlineSnapshot(`"76.2k"`)
diff --git a/test/fixtures/basic-types/package.json b/test/fixtures/basic-types/package.json
index b837c1b95..94a09218c 100644
--- a/test/fixtures/basic-types/package.json
+++ b/test/fixtures/basic-types/package.json
@@ -10,6 +10,7 @@
   },
   "devDependencies": {
     "ofetch": "latest",
+    "unplugin-vue-router": "^0.7.0",
     "vitest": "1.5.3",
     "vue": "latest",
     "vue-router": "latest"
diff --git a/test/fixtures/basic/package.json b/test/fixtures/basic/package.json
index 2e5bcfabb..fe04eb4e5 100644
--- a/test/fixtures/basic/package.json
+++ b/test/fixtures/basic/package.json
@@ -9,7 +9,13 @@
     "nuxt": "workspace:*"
   },
   "devDependencies": {
+    "@unhead/dom": "latest",
+    "@unhead/shared": "latest",
+    "@vue/devtools-api": "latest",
+    "@vue/shared": "latest",
+    "iron-webcrypto": "latest",
     "ufo": "latest",
+    "unhead": "latest",
     "unplugin": "latest",
     "vue": "latest"
   }
diff --git a/test/fixtures/runtime-compiler/package.json b/test/fixtures/runtime-compiler/package.json
index cf133dcd9..0ee7c1d0a 100644
--- a/test/fixtures/runtime-compiler/package.json
+++ b/test/fixtures/runtime-compiler/package.json
@@ -6,5 +6,11 @@
   },
   "dependencies": {
     "nuxt": "workspace:*"
+  },
+  "devDependencies": {
+    "@unhead/shared": "latest",
+    "@vue/devtools-api": "latest",
+    "@vue/shared": "latest",
+    "unhead": "latest"
   }
 }
diff --git a/test/fixtures/suspense/package.json b/test/fixtures/suspense/package.json
index 3c3155c57..85cc733b0 100644
--- a/test/fixtures/suspense/package.json
+++ b/test/fixtures/suspense/package.json
@@ -9,6 +9,10 @@
     "vue": "latest"
   },
   "devDependencies": {
-    "typescript": "latest"
+    "@unhead/shared": "latest",
+    "@vue/devtools-api": "latest",
+    "@vue/shared": "latest",
+    "typescript": "latest",
+    "unhead": "latest"
   }
 }