@depup/nuxt 4.2.2-depup.0 → 4.3.0-depup.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +4 -2
  2. package/app.d.ts +1 -1
  3. package/dist/app/compat/capi.d.ts +1 -1
  4. package/dist/app/compat/interval.d.ts +1 -1
  5. package/dist/app/compat/interval.js +3 -3
  6. package/dist/app/components/client-fallback.client.js +5 -1
  7. package/dist/app/components/client-fallback.server.js +5 -1
  8. package/dist/app/components/error-404.d.vue.ts +6 -6
  9. package/dist/app/components/error-404.vue +4 -4
  10. package/dist/app/components/error-404.vue.d.ts +6 -6
  11. package/dist/app/components/error-500.d.vue.ts +6 -6
  12. package/dist/app/components/error-500.vue +4 -4
  13. package/dist/app/components/error-500.vue.d.ts +6 -6
  14. package/dist/app/components/island-renderer.js +2 -2
  15. package/dist/app/components/nuxt-error-page.vue +4 -4
  16. package/dist/app/components/nuxt-island.js +1 -1
  17. package/dist/app/components/nuxt-layout.js +6 -3
  18. package/dist/app/components/nuxt-link.js +1 -1
  19. package/dist/app/components/nuxt-stubs.d.ts +2 -2
  20. package/dist/app/components/nuxt-stubs.js +2 -2
  21. package/dist/app/components/welcome.vue +1 -1
  22. package/dist/app/composables/asyncData.d.ts +6 -1
  23. package/dist/app/composables/asyncData.js +8 -3
  24. package/dist/app/composables/component.js +1 -2
  25. package/dist/app/composables/cookie.js +8 -1
  26. package/dist/app/composables/error.d.ts +8 -5
  27. package/dist/app/composables/error.js +3 -0
  28. package/dist/app/composables/manifest.d.ts +3 -5
  29. package/dist/app/composables/manifest.js +6 -21
  30. package/dist/app/composables/payload.d.ts +4 -0
  31. package/dist/app/composables/payload.js +32 -14
  32. package/dist/app/composables/router.d.ts +7 -3
  33. package/dist/app/composables/router.js +7 -3
  34. package/dist/app/composables/script-stubs.js +2 -2
  35. package/dist/app/composables/ssr.d.ts +1 -1
  36. package/dist/app/entry.async.d.ts +2 -2
  37. package/dist/app/entry.d.ts +3 -2
  38. package/dist/app/entry.js +2 -2
  39. package/dist/app/index.d.ts +1 -1
  40. package/dist/app/middleware/{manifest-route-rule.js → route-rules.js} +2 -2
  41. package/dist/app/nuxt.d.ts +12 -9
  42. package/dist/app/plugins/dev-server-logs.js +1 -1
  43. package/dist/app/plugins/payload.client.js +0 -3
  44. package/dist/app/plugins/preload.server.js +3 -1
  45. package/dist/app/plugins/router.js +15 -16
  46. package/dist/app/types.d.ts +1 -1
  47. package/dist/app/utils.d.ts +6 -9
  48. package/dist/components/runtime/lazy-hydrated-component.js +2 -1
  49. package/dist/components/runtime/server-component.js +0 -1
  50. package/dist/head/runtime/components.js +70 -26
  51. package/dist/index.d.mts +1 -1
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.mjs +1004 -644
  54. package/dist/pages/runtime/composables.d.ts +10 -1
  55. package/dist/pages/runtime/index.d.ts +1 -1
  56. package/dist/pages/runtime/page.js +13 -3
  57. package/dist/pages/runtime/plugins/prerender.server.js +5 -10
  58. package/dist/pages/runtime/plugins/router.js +15 -18
  59. package/dist/pages/runtime/utils.d.ts +7 -0
  60. package/dist/pages/runtime/validate.js +4 -2
  61. package/meta.d.ts +1 -0
  62. package/meta.js +18 -0
  63. package/package.json +34 -49
  64. package/types.d.ts +1 -1
  65. /package/dist/app/middleware/{manifest-route-rule.d.ts → route-rules.d.ts} +0 -0
package/README.md CHANGED
@@ -6,9 +6,11 @@
6
6
  <a href="https://www.npmjs.com/package/nuxt"><img src="https://img.shields.io/npm/v/nuxt.svg?style=flat&colorA=18181B&colorB=28CF8D" alt="Version"></a>
7
7
  <a href="https://www.npmjs.com/package/nuxt"><img src="https://img.shields.io/npm/dm/nuxt.svg?style=flat&colorA=18181B&colorB=28CF8D" alt="Downloads"></a>
8
8
  <a href="https://github.com/nuxt/nuxt/blob/main/LICENSE"><img src="https://img.shields.io/github/license/nuxt/nuxt.svg?style=flat&colorA=18181B&colorB=28CF8D" alt="License"></a>
9
+ <a href="https://nuxt.com/modules"><img src="https://img.shields.io/badge/dynamic/json?url=https://nuxt.com/api/v1/modules&query=$.stats.modules&label=Modules&style=flat&colorA=18181B&colorB=28CF8D" alt="Modules"></a>
9
10
  <a href="https://nuxt.com"><img src="https://img.shields.io/badge/Nuxt%20Docs-18181B?logo=nuxt" alt="Website"></a>
10
11
  <a href="https://chat.nuxt.dev"><img src="https://img.shields.io/badge/Nuxt%20Discord-18181B?logo=discord" alt="Discord"></a>
11
12
  <a href="https://securityscorecards.dev/"><img src="https://api.securityscorecards.dev/projects/github.com/nuxt/nuxt/badge" alt="Nuxt openssf scorecard score"></a>
13
+ <a href="https://deepwiki.com/nuxt/nuxt"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
12
14
  </p>
13
15
 
14
16
  Nuxt is a free and open-source framework with an intuitive and extendable way to create type-safe, performant and production-grade full-stack web applications and websites with Vue.js.
@@ -21,14 +23,14 @@ It provides a number of features that make it easy to build fast, SEO-friendly,
21
23
  - Auto imports of components, composables and utils
22
24
  - TypeScript with zero configuration
23
25
  - Go full-stack with our server/ directory
24
- - Extensible with [200+ modules](https://nuxt.com/modules)
26
+ - Extensible with [300+ modules](https://nuxt.com/modules)
25
27
  - Deployment to a variety of [hosting platforms](https://nuxt.com/deploy)
26
28
  - ...[and much more](https://nuxt.com) 🚀
27
29
 
28
30
  ### Table of Contents
29
31
 
30
32
  - 🚀 [Getting Started](#getting-started)
31
- - 💻 [ Vue Development](#vue-development)
33
+ - 💻 [Vue Development](#vue-development)
32
34
  - 📖 [Documentation](#documentation)
33
35
  - 🧩 [Modules](#modules)
34
36
  - ❤️ [Contribute](#contribute)
package/app.d.ts CHANGED
@@ -1 +1 @@
1
- export * from './dist/app/index'
1
+ export * from './dist/app/index.ts'
@@ -1,4 +1,4 @@
1
1
  export * from 'vue';
2
2
  export declare const install: () => void;
3
- export declare function set(target: any, key: string | number | symbol, val: any): any;
3
+ export declare function set<T>(target: any, key: string | number | symbol, val: T): T;
4
4
  export declare function del(target: any, key: string | number | symbol): void;
@@ -1 +1 @@
1
- export declare const setInterval: typeof globalThis.setInterval | (() => void);
1
+ export declare const setInterval: typeof globalThis.setInterval;
@@ -1,11 +1,11 @@
1
1
  import { createError } from "../composables/error.js";
2
2
  const intervalError = "[nuxt] `setInterval` should not be used on the server. Consider wrapping it with an `onNuxtReady`, `onBeforeMount` or `onMounted` lifecycle hook, or ensure you only call it in the browser by checking `import.meta.client`.";
3
- export const setInterval = import.meta.client ? globalThis.setInterval : () => {
3
+ export const setInterval = import.meta.client ? globalThis.setInterval : (() => {
4
4
  if (import.meta.dev) {
5
5
  throw createError({
6
- statusCode: 500,
6
+ status: 500,
7
7
  message: intervalError
8
8
  });
9
9
  }
10
10
  console.error(intervalError);
11
- };
11
+ });
@@ -1,5 +1,9 @@
1
1
  import { createElementBlock, defineComponent, onMounted, shallowRef, useId } from "vue";
2
2
  import { useState } from "../composables/state.js";
3
+ const VALID_TAG_RE = /^[a-z][a-z0-9-]*$/i;
4
+ function sanitizeTag(tag, fallback) {
5
+ return VALID_TAG_RE.test(tag) ? tag : fallback;
6
+ }
3
7
  export default defineComponent({
4
8
  name: "NuxtClientFallback",
5
9
  inheritAttrs: false,
@@ -40,7 +44,7 @@ export default defineComponent({
40
44
  return slot();
41
45
  }
42
46
  const fallbackStr = props.placeholder || props.fallback;
43
- const fallbackTag = props.placeholderTag || props.fallbackTag;
47
+ const fallbackTag = sanitizeTag(props.placeholderTag || props.fallbackTag, "div");
44
48
  return createElementBlock(fallbackTag, null, fallbackStr);
45
49
  }
46
50
  }
@@ -3,6 +3,10 @@ import { ssrRenderAttrs, ssrRenderSlot, ssrRenderVNode } from "vue/server-render
3
3
  import { isPromise } from "@vue/shared";
4
4
  import { useState } from "../composables/state.js";
5
5
  import { createBuffer } from "./utils.js";
6
+ const VALID_TAG_RE = /^[a-z][a-z0-9-]*$/i;
7
+ function sanitizeTag(tag, fallback) {
8
+ return VALID_TAG_RE.test(tag) ? tag : fallback;
9
+ }
6
10
  const NuxtClientFallbackServer = defineComponent({
7
11
  name: "NuxtClientFallback",
8
12
  inheritAttrs: false,
@@ -67,7 +71,7 @@ const NuxtClientFallbackServer = defineComponent({
67
71
  ssrRenderSlot(ctx.$slots, fallback ? "fallback" : "placeholder", {}, null, push, parent);
68
72
  } else {
69
73
  const content = ctx.placeholder || ctx.fallback;
70
- const tag = ctx.placeholderTag || ctx.fallbackTag;
74
+ const tag = sanitizeTag(ctx.placeholderTag || ctx.fallbackTag, "div");
71
75
  push(`<${tag}${ssrRenderAttrs(ctx.$attrs)}>${content}</${tag}>`);
72
76
  }
73
77
  } else {
@@ -5,11 +5,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
5
5
  type: StringConstructor;
6
6
  default: string;
7
7
  };
8
- statusCode: {
8
+ status: {
9
9
  type: NumberConstructor;
10
10
  default: number;
11
11
  };
12
- statusMessage: {
12
+ statusText: {
13
13
  type: StringConstructor;
14
14
  default: string;
15
15
  };
@@ -26,11 +26,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
26
26
  type: StringConstructor;
27
27
  default: string;
28
28
  };
29
- statusCode: {
29
+ status: {
30
30
  type: NumberConstructor;
31
31
  default: number;
32
32
  };
33
- statusMessage: {
33
+ statusText: {
34
34
  type: StringConstructor;
35
35
  default: string;
36
36
  };
@@ -44,8 +44,8 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
44
44
  };
45
45
  }>> & Readonly<{}>, {
46
46
  appName: string;
47
- statusCode: number;
48
- statusMessage: string;
47
+ status: number;
48
+ statusText: string;
49
49
  description: string;
50
50
  backHome: string;
51
51
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -5,11 +5,11 @@ const props = defineProps({
5
5
  type: String,
6
6
  default: "Nuxt"
7
7
  },
8
- statusCode: {
8
+ status: {
9
9
  type: Number,
10
10
  default: 404
11
11
  },
12
- statusMessage: {
12
+ statusText: {
13
13
  type: String,
14
14
  default: "Page not found"
15
15
  },
@@ -23,7 +23,7 @@ const props = defineProps({
23
23
  }
24
24
  });
25
25
  useHead({
26
- title: `${props.statusCode} - ${props.statusMessage} | ${props.appName}`,
26
+ title: `${props.status} - ${props.statusText} | ${props.appName}`,
27
27
  script: [
28
28
  {
29
29
  innerHTML: `!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`
@@ -38,7 +38,7 @@ useHead({
38
38
  </script>
39
39
 
40
40
  <template>
41
- <div class="antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"><div class="max-w-520px text-center"><h1 class="font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]" v-text="statusCode" /><h2 class="font-semibold mb-2 sm:text-3xl text-2xl" v-text="statusMessage" /><p class="mb-4 px-2 text-[#64748B] text-md" v-text="description" /><div class="flex items-center justify-center w-full"><NuxtLink to="/" class="font-medium hover:text-[#00DC82] text-sm underline underline-offset-3">
41
+ <div class="antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"><div class="max-w-520px text-center"><h1 class="font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]" v-text="status" /><h2 class="font-semibold mb-2 sm:text-3xl text-2xl" v-text="statusText" /><p class="mb-4 px-2 text-[#64748B] text-md" v-text="description" /><div class="flex items-center justify-center w-full"><NuxtLink to="/" class="font-medium hover:text-[#00DC82] text-sm underline underline-offset-3">
42
42
  {{ backHome }}
43
43
  </NuxtLink></div></div></div>
44
44
  </template>
@@ -5,11 +5,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
5
5
  type: StringConstructor;
6
6
  default: string;
7
7
  };
8
- statusCode: {
8
+ status: {
9
9
  type: NumberConstructor;
10
10
  default: number;
11
11
  };
12
- statusMessage: {
12
+ statusText: {
13
13
  type: StringConstructor;
14
14
  default: string;
15
15
  };
@@ -26,11 +26,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
26
26
  type: StringConstructor;
27
27
  default: string;
28
28
  };
29
- statusCode: {
29
+ status: {
30
30
  type: NumberConstructor;
31
31
  default: number;
32
32
  };
33
- statusMessage: {
33
+ statusText: {
34
34
  type: StringConstructor;
35
35
  default: string;
36
36
  };
@@ -44,8 +44,8 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
44
44
  };
45
45
  }>> & Readonly<{}>, {
46
46
  appName: string;
47
- statusCode: number;
48
- statusMessage: string;
47
+ status: number;
48
+ statusText: string;
49
49
  description: string;
50
50
  backHome: string;
51
51
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -5,11 +5,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
5
5
  type: StringConstructor;
6
6
  default: string;
7
7
  };
8
- statusCode: {
8
+ status: {
9
9
  type: NumberConstructor;
10
10
  default: number;
11
11
  };
12
- statusMessage: {
12
+ statusText: {
13
13
  type: StringConstructor;
14
14
  default: string;
15
15
  };
@@ -26,11 +26,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
26
26
  type: StringConstructor;
27
27
  default: string;
28
28
  };
29
- statusCode: {
29
+ status: {
30
30
  type: NumberConstructor;
31
31
  default: number;
32
32
  };
33
- statusMessage: {
33
+ statusText: {
34
34
  type: StringConstructor;
35
35
  default: string;
36
36
  };
@@ -44,8 +44,8 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
44
44
  };
45
45
  }>> & Readonly<{}>, {
46
46
  appName: string;
47
- statusCode: number;
48
- statusMessage: string;
47
+ status: number;
48
+ statusText: string;
49
49
  description: string;
50
50
  refresh: string;
51
51
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -5,11 +5,11 @@ const props = defineProps({
5
5
  type: String,
6
6
  default: "Nuxt"
7
7
  },
8
- statusCode: {
8
+ status: {
9
9
  type: Number,
10
10
  default: 500
11
11
  },
12
- statusMessage: {
12
+ statusText: {
13
13
  type: String,
14
14
  default: "Internal server error"
15
15
  },
@@ -23,7 +23,7 @@ const props = defineProps({
23
23
  }
24
24
  });
25
25
  useHead({
26
- title: `${props.statusCode} - ${props.statusMessage} | ${props.appName}`,
26
+ title: `${props.status} - ${props.statusText} | ${props.appName}`,
27
27
  script: [
28
28
  {
29
29
  innerHTML: `!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`
@@ -38,7 +38,7 @@ useHead({
38
38
  </script>
39
39
 
40
40
  <template>
41
- <div class="antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"><div class="max-w-520px text-center"><h1 class="font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]" v-text="statusCode" /><h2 class="font-semibold mb-2 sm:text-3xl text-2xl" v-text="statusMessage" /><p class="mb-4 px-2 text-[#64748B] text-md" v-text="description" /></div></div>
41
+ <div class="antialiased bg-white dark:bg-[#020420] dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-[#020420] tracking-wide"><div class="max-w-520px text-center"><h1 class="font-semibold leading-none mb-4 sm:text-[110px] tabular-nums text-[80px]" v-text="status" /><h2 class="font-semibold mb-2 sm:text-3xl text-2xl" v-text="statusText" /><p class="mb-4 px-2 text-[#64748B] text-md" v-text="description" /></div></div>
42
42
  </template>
43
43
 
44
44
  <style scoped>
@@ -5,11 +5,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
5
5
  type: StringConstructor;
6
6
  default: string;
7
7
  };
8
- statusCode: {
8
+ status: {
9
9
  type: NumberConstructor;
10
10
  default: number;
11
11
  };
12
- statusMessage: {
12
+ statusText: {
13
13
  type: StringConstructor;
14
14
  default: string;
15
15
  };
@@ -26,11 +26,11 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
26
26
  type: StringConstructor;
27
27
  default: string;
28
28
  };
29
- statusCode: {
29
+ status: {
30
30
  type: NumberConstructor;
31
31
  default: number;
32
32
  };
33
- statusMessage: {
33
+ statusText: {
34
34
  type: StringConstructor;
35
35
  default: string;
36
36
  };
@@ -44,8 +44,8 @@ declare const __VLS_export: import("vue").DefineComponent<import("vue").ExtractP
44
44
  };
45
45
  }>> & Readonly<{}>, {
46
46
  appName: string;
47
- statusCode: number;
48
- statusMessage: string;
47
+ status: number;
48
+ statusText: string;
49
49
  description: string;
50
50
  refresh: string;
51
51
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -16,8 +16,8 @@ export default defineComponent({
16
16
  const component = islandComponents[props.context.name];
17
17
  if (!component) {
18
18
  throw createError({
19
- statusCode: 404,
20
- statusMessage: `Island component not found: ${props.context.name}`
19
+ status: 404,
20
+ statusText: `Island component not found: ${props.context.name}`
21
21
  });
22
22
  }
23
23
  onErrorCaptured((e) => {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <ErrorTemplate v-bind="{ statusCode, statusMessage, description, stack }" />
2
+ <ErrorTemplate v-bind="{ status, statusText, statusCode: status, statusMessage: statusText, description, stack }" />
3
3
  </template>
4
4
 
5
5
  <script setup>
@@ -16,9 +16,9 @@ const stacktrace = import.meta.dev && _error.stack ? _error.stack.split("\n").sp
16
16
  internal: line.includes("node_modules") && !line.includes(".cache") || line.includes("internal") || line.includes("new Promise")
17
17
  };
18
18
  }).map((i) => `<span class="stack${i.internal ? " internal" : ""}">${escapeHtml(i.text)}</span>`).join("\n") : "";
19
- const statusCode = Number(_error.statusCode || 500);
20
- const is404 = statusCode === 404;
21
- const statusMessage = _error.statusMessage ?? (is404 ? "Page Not Found" : "Internal Server Error");
19
+ const status = Number(_error.statusCode || 500);
20
+ const is404 = status === 404;
21
+ const statusText = _error.statusMessage ?? (is404 ? "Page Not Found" : "Internal Server Error");
22
22
  const description = _error.message || _error.toString();
23
23
  const stack = import.meta.dev && !is404 ? _error.description || `<pre>${stacktrace}</pre>` : void 0;
24
24
  const _Error404 = defineAsyncComponent(() => import("./error-404.vue"));
@@ -195,7 +195,7 @@ export default defineComponent({
195
195
  props: props.props ? JSON.stringify(props.props) : void 0
196
196
  }));
197
197
  if (!r.ok) {
198
- throw createError({ statusCode: r.status, statusMessage: r.statusText });
198
+ throw createError({ status: r.status, statusText: r.statusText });
199
199
  }
200
200
  try {
201
201
  const result = await r.json();
@@ -6,6 +6,8 @@ import { LayoutMetaSymbol, PageRouteSymbol } from "./injections.js";
6
6
  import { useRoute as useVueRouterRoute } from "#build/pages";
7
7
  import layouts from "#build/layouts";
8
8
  import { appLayoutTransition as defaultLayoutTransition } from "#build/nuxt.config.mjs";
9
+ import _routeRulesMatcher from "#build/route-rules.mjs";
10
+ const routeRulesMatcher = _routeRulesMatcher;
9
11
  const LayoutLoader = defineComponent({
10
12
  name: "LayoutLoader",
11
13
  inheritAttrs: false,
@@ -37,7 +39,7 @@ export default defineComponent({
37
39
  const shouldUseEagerRoute = !injectedRoute || injectedRoute === useRoute();
38
40
  const route = shouldUseEagerRoute ? useVueRouterRoute() : injectedRoute;
39
41
  const layout = computed(() => {
40
- let layout2 = unref(props.name) ?? route?.meta.layout ?? "default";
42
+ let layout2 = unref(props.name) ?? route?.meta.layout ?? routeRulesMatcher(route?.path).appLayout ?? "default";
41
43
  if (layout2 && !(layout2 in layouts)) {
42
44
  if (import.meta.dev && layout2 !== "default") {
43
45
  console.warn(`Invalid layout \`${layout2}\` selected.`);
@@ -71,7 +73,7 @@ export default defineComponent({
71
73
  default: () => h(
72
74
  LayoutProvider,
73
75
  {
74
- layoutProps: mergeProps(context.attrs, { ref: layoutRef }),
76
+ layoutProps: mergeProps(context.attrs, route.meta.layoutProps ?? {}, { ref: layoutRef }),
75
77
  key: layout.value || void 0,
76
78
  name: layout.value,
77
79
  shouldProvide: !props.name,
@@ -112,7 +114,8 @@ const LayoutProvider = defineComponent({
112
114
  const name = props.name;
113
115
  if (props.shouldProvide) {
114
116
  provide(LayoutMetaSymbol, {
115
- isCurrent: (route) => name === (route.meta.layout ?? "default")
117
+ // When name=false, always return true so NuxtPage doesn't skip rendering
118
+ isCurrent: (route) => name === false || name === (route.meta.layout ?? routeRulesMatcher(route.path).appLayout ?? "default")
116
119
  });
117
120
  }
118
121
  const injectedRoute = inject(PageRouteSymbol);
@@ -6,7 +6,7 @@ import { navigateTo, resolveRouteObject, useRouter } from "../composables/router
6
6
  import { useNuxtApp, useRuntimeConfig } from "../nuxt.js";
7
7
  import { cancelIdleCallback, requestIdleCallback } from "../compat/idle-callback.js";
8
8
  import { nuxtLinkDefaults } from "#build/nuxt.config.mjs";
9
- import { hashMode } from "#build/router.options";
9
+ import { hashMode } from "#build/router.options.mjs";
10
10
  const firstNonUndefined = (...args) => args.find((arg) => arg !== void 0);
11
11
  const NuxtLinkDevKeySymbol = Symbol("nuxt-link-dev-key");
12
12
  // @__NO_SIDE_EFFECTS__
@@ -1,6 +1,6 @@
1
1
  export declare const NuxtImg: {
2
- setup: () => void;
2
+ setup: () => never;
3
3
  };
4
4
  export declare const NuxtPicture: {
5
- setup: () => void;
5
+ setup: () => never;
6
6
  };
@@ -2,8 +2,8 @@ import { createError } from "../composables/error.js";
2
2
  function renderStubMessage(name) {
3
3
  throw createError({
4
4
  fatal: true,
5
- statusCode: 500,
6
- statusMessage: `${name} is provided by @nuxt/image. Check your console to install it or run 'npx nuxt module add @nuxt/image'`
5
+ status: 500,
6
+ statusText: `${name} is provided by @nuxt/image. Check your console to install it or run 'npx nuxt module add @nuxt/image'`
7
7
  });
8
8
  }
9
9
  export const NuxtImg = {
@@ -26,7 +26,7 @@ useHead({
26
26
  </script>
27
27
 
28
28
  <template>
29
- <div class="antialiased bg-white dark:bg-[#020420] dark:text-white flex flex-col items-center justify-center min-h-screen place-content-center sm:text-base text-[#020420] text-sm"><div class="flex flex-col mt-6 sm:mt-0"><h1 class="flex flex-col gap-y-4 items-center justify-center"><a href="https://nuxt.com?utm_source=nuxt-welcome" target="_blank" class="gap-4 inline-flex items-end"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" aria-label="Nuxt" class="h-8 sm:h-12" viewBox="0 0 800 200"><path fill="#00dc82" d="M168.303 200h111.522c3.543 0 7.022-.924 10.09-2.679A20.1 20.1 0 0 0 297.3 190a19.86 19.86 0 0 0 2.7-10.001 19.86 19.86 0 0 0-2.709-9.998L222.396 41.429a20.1 20.1 0 0 0-7.384-7.32 20.3 20.3 0 0 0-10.088-2.679c-3.541 0-7.02.925-10.087 2.68a20.1 20.1 0 0 0-7.384 7.32l-19.15 32.896L130.86 9.998a20.1 20.1 0 0 0-7.387-7.32A20.3 20.3 0 0 0 113.384 0c-3.542 0-7.022.924-10.09 2.679a20.1 20.1 0 0 0-7.387 7.319L2.709 170A19.85 19.85 0 0 0 0 179.999c-.002 3.511.93 6.96 2.7 10.001a20.1 20.1 0 0 0 7.385 7.321A20.3 20.3 0 0 0 20.175 200h70.004c27.737 0 48.192-12.075 62.266-35.633l34.171-58.652 18.303-31.389 54.93 94.285h-73.233zm-79.265-31.421-48.854-.011 73.232-125.706 36.541 62.853-24.466 42.01c-9.347 15.285-19.965 20.854-36.453 20.854"/><path fill="currentColor" d="M377 200a4 4 0 0 0 4-4v-93s5.244 8.286 15 25l38.707 66.961c1.789 3.119 5.084 5.039 8.649 5.039H470V50h-27a4 4 0 0 0-4 4v94l-17-30-36.588-62.98c-1.792-3.108-5.081-5.02-8.639-5.02H350v150zm299.203-56.143L710.551 92h-25.73a9.97 9.97 0 0 0-8.333 4.522L660.757 120.5l-15.731-23.978A9.97 9.97 0 0 0 636.693 92h-25.527l34.348 51.643L608.524 200h24.966a9.97 9.97 0 0 0 8.29-4.458l19.18-28.756 18.981 28.72a9.97 9.97 0 0 0 8.313 4.494h24.736zM724.598 92h19.714V60.071h28.251V92H800v24.857h-27.437V159.5c0 10.5 5.284 15.429 14.43 15.429H800V200h-16.869c-23.576 0-38.819-14.143-38.819-39.214v-43.929h-19.714zM590 92h-15c-3.489 0-6.218.145-8.5 2.523-2.282 2.246-2.5 3.63-2.5 7.066v52.486c0 8.058-.376 12.962-4 16.925-3.624 3.831-8.619 5-16 5-7.247 0-12.376-1.169-16-5-3.624-3.963-4-8.867-4-16.925v-52.486c0-3.435-.218-4.82-2.5-7.066C519.218 92.145 516.489 92 513 92h-15v62.422q0 21.006 11.676 33.292C517.594 195.905 529.103 200 544 200s26.204-4.095 34.123-12.286Q590 175.428 590 154.422z"/></svg> <span class="bg-[#00DC42]/10 border border-[#00DC42]/50 font-mono font-semibold group-hover:bg-[#00DC42]/15 group-hover:border-[#00DC42] inline-block leading-none px-2 py-1 rounded sm:px-2.5 sm:py-1.5 sm:text-[14px] text-[#00DC82] text-[12px]">4.2.2</span> </a></h1><div class="gap-4 grid grid-cols-1 max-w-[980px] mt-6 px-4 sm:gap-6 sm:grid-cols-3 sm:mt-10 w-full"><div class="bg-gray-50/10 border border-[#00DC42]/50 dark:bg-white/5 flex flex-col gap-1 p-6 rounded-lg sm:col-span-2"><div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/80 dark:text-[#00DC82] flex h-[32px] items-center justify-center rounded text-[#00DC82] w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-[18px]" viewBox="0 0 256 256"><path fill="currentColor" d="m228.1 121.2-143.9-88A8 8 0 0 0 72 40v176a8 8 0 0 0 12.2 6.8l143.9-88a7.9 7.9 0 0 0 0-13.6" opacity=".2"/><path fill="currentColor" d="M80 232a15.5 15.5 0 0 1-7.8-2.1A15.8 15.8 0 0 1 64 216V40a15.8 15.8 0 0 1 8.2-13.9 15.5 15.5 0 0 1 16.1.3l144 87.9a16 16 0 0 1 0 27.4l-144 87.9A15.4 15.4 0 0 1 80 232m0-192v176l144-88Z"/></svg></div><h2 class="font-semibold mt-1 text-base">Get started</h2><p class="dark:text-gray-200 text-gray-700 text-sm">Remove this welcome page by replacing <a class="bg-green-50 border border-green-600/10 dark:bg-[#020420] dark:border-white/10 dark:text-[#00DC82] font-bold font-mono p-1 rounded text-green-700">&lt;NuxtWelcome/&gt;</a> in <a href="https://nuxt.com/docs/4.x/directory-structure/app" target="_blank" rel="noopener" class="bg-green-50 border border-green-600/20 dark:bg-[#020420] dark:border-white/20 dark:text-[#00DC82] font-bold font-mono hover:border-[#00DC82] p-1 rounded text-green-700">app.vue</a> with your own code.</p></div><a href="https://nuxt.com/docs?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"> <div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 256 256"><path fill="currentColor" d="M136 48v128H88V80H40V48a8 8 0 0 1 8-8h32a8 8 0 0 1 8 8 8 8 0 0 1 8-8h32a8 8 0 0 1 8 8m89.9 149.6-8.3-30.9-46.4 12.5 8.3 30.9a8 8 0 0 0 9.8 5.6l30.9-8.3a8 8 0 0 0 5.7-9.8M184.5 43.1a8.1 8.1 0 0 0-9.8-5.7l-30.9 8.3a8.1 8.1 0 0 0-5.7 9.8l8.3 30.9L192.8 74Z" opacity=".2"/><path fill="currentColor" d="M233.6 195.6 192.2 41a16 16 0 0 0-19.6-11.3L141.7 38l-1 .3A16 16 0 0 0 128 32H96a15.8 15.8 0 0 0-8 2.2 15.8 15.8 0 0 0-8-2.2H48a16 16 0 0 0-16 16v160a16 16 0 0 0 16 16h32a15.8 15.8 0 0 0 8-2.2 15.8 15.8 0 0 0 8 2.2h32a16 16 0 0 0 16-16v-99.6l27.8 103.7a16 16 0 0 0 15.5 11.9 20 20 0 0 0 4.1-.5l30.9-8.3a16 16 0 0 0 11.3-19.6M156.2 92.1l30.9-8.3 20.7 77.3-30.9 8.3Zm20.5-46.9 6.3 23.1-30.9 8.3-6.3-23.1ZM128 48v120H96V48Zm-48 0v24H48V48ZM48 208V88h32v120Zm80 0H96v-24h32zm90.2-8.3-30.9 8.3-6.3-23.2 31-8.3z"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Documentation</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">We highly recommend you take a look at the Nuxt documentation to level up.</p> </a></div><div class="gap-4 grid grid-cols-1 max-w-[980px] mt-4 px-4 sm:gap-6 sm:grid-cols-3 sm:mt-6 w-full"><a href="https://nuxt.com/modules?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"> <div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 256 256"><path fill="currentColor" d="M64 216a8 8 0 0 1-8-8v-42.7a27.6 27.6 0 0 1-14.1 2.6A28 28 0 1 1 56 114.7V72a8 8 0 0 1 8-8h46.7a27.6 27.6 0 0 1-2.6-14.1A28 28 0 1 1 161.3 64H208a8 8 0 0 1 8 8v42.7a27.6 27.6 0 0 0-14.1-2.6 28 28 0 1 0 14.1 53.2V208a8 8 0 0 1-8 8Z" opacity=".2"/><path fill="currentColor" d="M220.3 158.5a8.1 8.1 0 0 0-7.7-.4 20.2 20.2 0 0 1-23.2-4.4 20 20 0 0 1 13.1-33.6 19.6 19.6 0 0 1 10.1 1.8 8.1 8.1 0 0 0 7.7-.4 8.2 8.2 0 0 0 3.7-6.8V72a16 16 0 0 0-16-16h-36.2c.1-1.3.2-2.7.2-4a36.1 36.1 0 0 0-38.3-35.9 36 36 0 0 0-33.6 33.3 36.4 36.4 0 0 0 .1 6.6H64a16 16 0 0 0-16 16v32.2l-4-.2a35.6 35.6 0 0 0-26.2 11.4 35.3 35.3 0 0 0-9.7 26.9 36 36 0 0 0 33.3 33.6 36.4 36.4 0 0 0 6.6-.1V208a16 16 0 0 0 16 16h144a16 16 0 0 0 16-16v-42.7a8.2 8.2 0 0 0-3.7-6.8M208 208H64v-42.7a8.2 8.2 0 0 0-3.7-6.8 8.1 8.1 0 0 0-7.7-.4 19.6 19.6 0 0 1-10.1 1.8 20 20 0 0 1-13.1-33.6 20.2 20.2 0 0 1 23.2-4.4 8.1 8.1 0 0 0 7.7-.4 8.2 8.2 0 0 0 3.7-6.8V72h46.7a8.2 8.2 0 0 0 6.8-3.7 8.1 8.1 0 0 0 .4-7.7 19.6 19.6 0 0 1-1.8-10.1 20 20 0 0 1 33.6-13.1 20.2 20.2 0 0 1 4.4 23.2 8.1 8.1 0 0 0 .4 7.7 8.2 8.2 0 0 0 6.8 3.7H208v32.2a36.4 36.4 0 0 0-6.6-.1 36 36 0 0 0-33.3 33.6A36.1 36.1 0 0 0 204 176l4-.2Z"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Modules</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">Discover our list of modules to supercharge your Nuxt project.</p> </a> <a href="https://nuxt.com/docs/4.x/examples?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"><div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 256 256"><path fill="currentColor" d="M224 56v144a8 8 0 0 1-8 8H40a8 8 0 0 1-8-8V56a8 8 0 0 1 8-8h176a8 8 0 0 1 8 8" opacity=".2"/><path fill="currentColor" d="M216 40H40a16 16 0 0 0-16 16v144a16 16 0 0 0 16 16h176a16 16 0 0 0 16-16V56a16 16 0 0 0-16-16m0 160H40V56h176zM80 84a12 12 0 1 1-12-12 12 12 0 0 1 12 12m40 0a12 12 0 1 1-12-12 12 12 0 0 1 12 12"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Examples</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">Explore different way of using Nuxt features and get inspired.</p> </a> <a href="https://nuxt.com/deploy?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"><div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256"><path fill="currentColor" d="M94.1 184.6c-11.4 33.9-56.6 33.9-56.6 33.9s0-45.2 33.9-56.6Zm90.5-67.9v64.6a8 8 0 0 1-2.4 5.6l-32.3 32.4a8 8 0 0 1-13.5-4.1l-8.4-41.9Zm-45.3-45.3H74.7a8 8 0 0 0-5.6 2.4l-32.4 32.3a8 8 0 0 0 4.1 13.5l41.9 8.4Z" opacity=".2"/><path fill="currentColor" d="M96.6 177a7.9 7.9 0 0 0-10.1 5c-6.6 19.7-27.9 25.8-40.2 27.7 1.9-12.3 8-33.6 27.7-40.2a8 8 0 1 0-5.1-15.1c-16.4 5.4-28.4 18.4-34.8 37.5a91.8 91.8 0 0 0-4.6 26.6 8 8 0 0 0 8 8 91.8 91.8 0 0 0 26.6-4.6c19.1-6.4 32.1-18.4 37.5-34.8a7.9 7.9 0 0 0-5-10.1"/><path fill="currentColor" d="M227.6 41.8a15.7 15.7 0 0 0-13.4-13.4c-11.3-1.7-40.6-2.5-69.2 26.1l-9 8.9H74.7a16.2 16.2 0 0 0-11.3 4.7l-32.3 32.4a15.9 15.9 0 0 0-4 15.9 16 16 0 0 0 12.2 11.1l39.5 7.9 41.8 41.8 7.9 39.5a16 16 0 0 0 11.1 12.2 14.7 14.7 0 0 0 4.6.7 15.6 15.6 0 0 0 11.3-4.7l32.4-32.3a16.2 16.2 0 0 0 4.7-11.3V120l8.9-9c28.6-28.6 27.8-57.9 26.1-69.2M74.7 79.4H120l-39.9 39.9-37.7-7.5Zm81.6-13.6c7.8-7.8 28.8-25.6 55.5-21.6 4 26.7-13.8 47.7-21.6 55.5L128 161.9 94.1 128Zm20.3 115.5-32.4 32.3-7.5-37.7 39.9-39.9Z"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Deploy</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">Learn how to deploy your Nuxt project on different providers.</p> </a></div><footer class="lg:px-8 mb-6 mt-6 mx-auto px-4 sm:mb-0 sm:mt-10 sm:px-6 w-full"><ul class="flex gap-4 items-center justify-center"><li><a href="https://go.nuxt.com/github" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt GitHub Repository</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> </a></li><li><a href="https://go.nuxt.com/discord" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt Discord Server</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M20.317 4.37a19.8 19.8 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.3 18.3 0 0 0-5.487 0 13 13 0 0 0-.617-1.25.08.08 0 0 0-.079-.037A19.7 19.7 0 0 0 3.677 4.37a.1.1 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.08.08 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.08.08 0 0 0 .084-.028 14 14 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13 13 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10 10 0 0 0 .372-.292.07.07 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.07.07 0 0 1 .078.01q.181.149.373.292a.077.077 0 0 1-.006.127 12.3 12.3 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.08.08 0 0 0 .084.028 19.8 19.8 0 0 0 6.002-3.03.08.08 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.06.06 0 0 0-.031-.03M8.02 15.33c-1.182 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418m7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418"/></svg> </a></li><li><a href="https://go.nuxt.com/x" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt on X</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"/></svg> </a></li><li><a href="https://go.nuxt.com/bluesky" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt Bluesky</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479.815 2.736 3.713 3.66 6.383 3.364q.204-.03.415-.056-.207.033-.415.056c-3.912.58-7.387 2.005-2.83 7.078 5.013 5.19 6.87-1.113 7.823-4.308.953 3.195 2.05 9.271 7.733 4.308 4.267-4.308 1.172-6.498-2.74-7.078a9 9 0 0 1-.415-.056q.21.026.415.056c2.67.297 5.568-.628 6.383-3.364.246-.828.624-5.79.624-6.478 0-.69-.139-1.861-.902-2.206-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8"/></svg> </a></li><li><a href="https://go.nuxt.com/linkedin" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt Linkedin</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z"/></svg> </a></li></ul></footer></div></div>
29
+ <div class="antialiased bg-white dark:bg-[#020420] dark:text-white flex flex-col items-center justify-center min-h-screen place-content-center sm:text-base text-[#020420] text-sm"><div class="flex flex-col mt-6 sm:mt-0"><h1 class="flex flex-col gap-y-4 items-center justify-center"><a href="https://nuxt.com?utm_source=nuxt-welcome" target="_blank" class="gap-4 inline-flex items-end"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" aria-label="Nuxt" class="h-8 sm:h-12" viewBox="0 0 800 200"><path fill="#00dc82" d="M168.303 200h111.522c3.543 0 7.022-.924 10.09-2.679A20.1 20.1 0 0 0 297.3 190a19.86 19.86 0 0 0 2.7-10.001 19.86 19.86 0 0 0-2.709-9.998L222.396 41.429a20.1 20.1 0 0 0-7.384-7.32 20.3 20.3 0 0 0-10.088-2.679c-3.541 0-7.02.925-10.087 2.68a20.1 20.1 0 0 0-7.384 7.32l-19.15 32.896L130.86 9.998a20.1 20.1 0 0 0-7.387-7.32A20.3 20.3 0 0 0 113.384 0c-3.542 0-7.022.924-10.09 2.679a20.1 20.1 0 0 0-7.387 7.319L2.709 170A19.85 19.85 0 0 0 0 179.999c-.002 3.511.93 6.96 2.7 10.001a20.1 20.1 0 0 0 7.385 7.321A20.3 20.3 0 0 0 20.175 200h70.004c27.737 0 48.192-12.075 62.266-35.633l34.171-58.652 18.303-31.389 54.93 94.285h-73.233zm-79.265-31.421-48.854-.011 73.232-125.706 36.541 62.853-24.466 42.01c-9.347 15.285-19.965 20.854-36.453 20.854"/><path fill="currentColor" d="M377 200a4 4 0 0 0 4-4v-93s5.244 8.286 15 25l38.707 66.961c1.789 3.119 5.084 5.039 8.649 5.039H470V50h-27a4 4 0 0 0-4 4v94l-17-30-36.588-62.98c-1.792-3.108-5.081-5.02-8.639-5.02H350v150zm299.203-56.143L710.551 92h-25.73a9.97 9.97 0 0 0-8.333 4.522L660.757 120.5l-15.731-23.978A9.97 9.97 0 0 0 636.693 92h-25.527l34.348 51.643L608.524 200h24.966a9.97 9.97 0 0 0 8.29-4.458l19.18-28.756 18.981 28.72a9.97 9.97 0 0 0 8.313 4.494h24.736zM724.598 92h19.714V60.071h28.251V92H800v24.857h-27.437V159.5c0 10.5 5.284 15.429 14.43 15.429H800V200h-16.869c-23.576 0-38.819-14.143-38.819-39.214v-43.929h-19.714zM590 92h-15c-3.489 0-6.218.145-8.5 2.523-2.282 2.246-2.5 3.63-2.5 7.066v52.486c0 8.058-.376 12.962-4 16.925-3.624 3.831-8.619 5-16 5-7.247 0-12.376-1.169-16-5-3.624-3.963-4-8.867-4-16.925v-52.486c0-3.435-.218-4.82-2.5-7.066C519.218 92.145 516.489 92 513 92h-15v62.422q0 21.006 11.676 33.292C517.594 195.905 529.103 200 544 200s26.204-4.095 34.123-12.286Q590 175.428 590 154.422z"/></svg> <span class="bg-[#00DC42]/10 border border-[#00DC42]/50 font-mono font-semibold group-hover:bg-[#00DC42]/15 group-hover:border-[#00DC42] inline-block leading-none px-2 py-1 rounded sm:px-2.5 sm:py-1.5 sm:text-[14px] text-[#00DC82] text-[12px]">4.3.0</span> </a></h1><div class="gap-4 grid grid-cols-1 max-w-[980px] mt-6 px-4 sm:gap-6 sm:grid-cols-3 sm:mt-10 w-full"><div class="bg-gray-50/10 border border-[#00DC42]/50 dark:bg-white/5 flex flex-col gap-1 p-6 rounded-lg sm:col-span-2"><div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/80 dark:text-[#00DC82] flex h-[32px] items-center justify-center rounded text-[#00DC82] w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-[18px]" viewBox="0 0 256 256"><path fill="currentColor" d="m228.1 121.2-143.9-88A8 8 0 0 0 72 40v176a8 8 0 0 0 12.2 6.8l143.9-88a7.9 7.9 0 0 0 0-13.6" opacity=".2"/><path fill="currentColor" d="M80 232a15.5 15.5 0 0 1-7.8-2.1A15.8 15.8 0 0 1 64 216V40a15.8 15.8 0 0 1 8.2-13.9 15.5 15.5 0 0 1 16.1.3l144 87.9a16 16 0 0 1 0 27.4l-144 87.9A15.4 15.4 0 0 1 80 232m0-192v176l144-88Z"/></svg></div><h2 class="font-semibold mt-1 text-base">Get started</h2><p class="dark:text-gray-200 text-gray-700 text-sm">Remove this welcome page by replacing <a class="bg-green-50 border border-green-600/10 dark:bg-[#020420] dark:border-white/10 dark:text-[#00DC82] font-bold font-mono p-1 rounded text-green-700">&lt;NuxtWelcome/&gt;</a> in <a href="https://nuxt.com/docs/4.x/directory-structure/app" target="_blank" rel="noopener" class="bg-green-50 border border-green-600/20 dark:bg-[#020420] dark:border-white/20 dark:text-[#00DC82] font-bold font-mono hover:border-[#00DC82] p-1 rounded text-green-700">app.vue</a> with your own code.</p></div><a href="https://nuxt.com/docs?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"> <div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 256 256"><path fill="currentColor" d="M136 48v128H88V80H40V48a8 8 0 0 1 8-8h32a8 8 0 0 1 8 8 8 8 0 0 1 8-8h32a8 8 0 0 1 8 8m89.9 149.6-8.3-30.9-46.4 12.5 8.3 30.9a8 8 0 0 0 9.8 5.6l30.9-8.3a8 8 0 0 0 5.7-9.8M184.5 43.1a8.1 8.1 0 0 0-9.8-5.7l-30.9 8.3a8.1 8.1 0 0 0-5.7 9.8l8.3 30.9L192.8 74Z" opacity=".2"/><path fill="currentColor" d="M233.6 195.6 192.2 41a16 16 0 0 0-19.6-11.3L141.7 38l-1 .3A16 16 0 0 0 128 32H96a15.8 15.8 0 0 0-8 2.2 15.8 15.8 0 0 0-8-2.2H48a16 16 0 0 0-16 16v160a16 16 0 0 0 16 16h32a15.8 15.8 0 0 0 8-2.2 15.8 15.8 0 0 0 8 2.2h32a16 16 0 0 0 16-16v-99.6l27.8 103.7a16 16 0 0 0 15.5 11.9 20 20 0 0 0 4.1-.5l30.9-8.3a16 16 0 0 0 11.3-19.6M156.2 92.1l30.9-8.3 20.7 77.3-30.9 8.3Zm20.5-46.9 6.3 23.1-30.9 8.3-6.3-23.1ZM128 48v120H96V48Zm-48 0v24H48V48ZM48 208V88h32v120Zm80 0H96v-24h32zm90.2-8.3-30.9 8.3-6.3-23.2 31-8.3z"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Documentation</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">We highly recommend you take a look at the Nuxt documentation to level up.</p> </a></div><div class="gap-4 grid grid-cols-1 max-w-[980px] mt-4 px-4 sm:gap-6 sm:grid-cols-3 sm:mt-6 w-full"><a href="https://nuxt.com/modules?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"> <div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 256 256"><path fill="currentColor" d="M64 216a8 8 0 0 1-8-8v-42.7a27.6 27.6 0 0 1-14.1 2.6A28 28 0 1 1 56 114.7V72a8 8 0 0 1 8-8h46.7a27.6 27.6 0 0 1-2.6-14.1A28 28 0 1 1 161.3 64H208a8 8 0 0 1 8 8v42.7a27.6 27.6 0 0 0-14.1-2.6 28 28 0 1 0 14.1 53.2V208a8 8 0 0 1-8 8Z" opacity=".2"/><path fill="currentColor" d="M220.3 158.5a8.1 8.1 0 0 0-7.7-.4 20.2 20.2 0 0 1-23.2-4.4 20 20 0 0 1 13.1-33.6 19.6 19.6 0 0 1 10.1 1.8 8.1 8.1 0 0 0 7.7-.4 8.2 8.2 0 0 0 3.7-6.8V72a16 16 0 0 0-16-16h-36.2c.1-1.3.2-2.7.2-4a36.1 36.1 0 0 0-38.3-35.9 36 36 0 0 0-33.6 33.3 36.4 36.4 0 0 0 .1 6.6H64a16 16 0 0 0-16 16v32.2l-4-.2a35.6 35.6 0 0 0-26.2 11.4 35.3 35.3 0 0 0-9.7 26.9 36 36 0 0 0 33.3 33.6 36.4 36.4 0 0 0 6.6-.1V208a16 16 0 0 0 16 16h144a16 16 0 0 0 16-16v-42.7a8.2 8.2 0 0 0-3.7-6.8M208 208H64v-42.7a8.2 8.2 0 0 0-3.7-6.8 8.1 8.1 0 0 0-7.7-.4 19.6 19.6 0 0 1-10.1 1.8 20 20 0 0 1-13.1-33.6 20.2 20.2 0 0 1 23.2-4.4 8.1 8.1 0 0 0 7.7-.4 8.2 8.2 0 0 0 3.7-6.8V72h46.7a8.2 8.2 0 0 0 6.8-3.7 8.1 8.1 0 0 0 .4-7.7 19.6 19.6 0 0 1-1.8-10.1 20 20 0 0 1 33.6-13.1 20.2 20.2 0 0 1 4.4 23.2 8.1 8.1 0 0 0 .4 7.7 8.2 8.2 0 0 0 6.8 3.7H208v32.2a36.4 36.4 0 0 0-6.6-.1 36 36 0 0 0-33.3 33.6A36.1 36.1 0 0 0 204 176l4-.2Z"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Modules</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">Discover our list of modules to supercharge your Nuxt project.</p> </a> <a href="https://nuxt.com/docs/4.x/examples?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"><div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" class="size-5" viewBox="0 0 256 256"><path fill="currentColor" d="M224 56v144a8 8 0 0 1-8 8H40a8 8 0 0 1-8-8V56a8 8 0 0 1 8-8h176a8 8 0 0 1 8 8" opacity=".2"/><path fill="currentColor" d="M216 40H40a16 16 0 0 0-16 16v144a16 16 0 0 0 16 16h176a16 16 0 0 0 16-16V56a16 16 0 0 0-16-16m0 160H40V56h176zM80 84a12 12 0 1 1-12-12 12 12 0 0 1 12 12m40 0a12 12 0 1 1-12-12 12 12 0 0 1 12 12"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Examples</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">Explore different way of using Nuxt features and get inspired.</p> </a> <a href="https://nuxt.com/deploy?utm_source=nuxt-welcome" target="_blank" class="bg-gray-50/10 border border-gray-200 dark:bg-white/5 dark:border-white/10 flex flex-col gap-1 group hover:border-[#00DC82] hover:dark:border-[#00DC82] p-6 relative rounded-lg transition-all"><div class="bg-[#00DC82]/5 border border-[#00DC82] dark:bg-[#020420] dark:border-[#00DC82]/50 dark:text-[#00DC82] flex group-hover:dark:border-[#00DC82]/80 h-[32px] items-center justify-center rounded text-[#00DC82] transition-all w-[32px]"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256"><path fill="currentColor" d="M94.1 184.6c-11.4 33.9-56.6 33.9-56.6 33.9s0-45.2 33.9-56.6Zm90.5-67.9v64.6a8 8 0 0 1-2.4 5.6l-32.3 32.4a8 8 0 0 1-13.5-4.1l-8.4-41.9Zm-45.3-45.3H74.7a8 8 0 0 0-5.6 2.4l-32.4 32.3a8 8 0 0 0 4.1 13.5l41.9 8.4Z" opacity=".2"/><path fill="currentColor" d="M96.6 177a7.9 7.9 0 0 0-10.1 5c-6.6 19.7-27.9 25.8-40.2 27.7 1.9-12.3 8-33.6 27.7-40.2a8 8 0 1 0-5.1-15.1c-16.4 5.4-28.4 18.4-34.8 37.5a91.8 91.8 0 0 0-4.6 26.6 8 8 0 0 0 8 8 91.8 91.8 0 0 0 26.6-4.6c19.1-6.4 32.1-18.4 37.5-34.8a7.9 7.9 0 0 0-5-10.1"/><path fill="currentColor" d="M227.6 41.8a15.7 15.7 0 0 0-13.4-13.4c-11.3-1.7-40.6-2.5-69.2 26.1l-9 8.9H74.7a16.2 16.2 0 0 0-11.3 4.7l-32.3 32.4a15.9 15.9 0 0 0-4 15.9 16 16 0 0 0 12.2 11.1l39.5 7.9 41.8 41.8 7.9 39.5a16 16 0 0 0 11.1 12.2 14.7 14.7 0 0 0 4.6.7 15.6 15.6 0 0 0 11.3-4.7l32.4-32.3a16.2 16.2 0 0 0 4.7-11.3V120l8.9-9c28.6-28.6 27.8-57.9 26.1-69.2M74.7 79.4H120l-39.9 39.9-37.7-7.5Zm81.6-13.6c7.8-7.8 28.8-25.6 55.5-21.6 4 26.7-13.8 47.7-21.6 55.5L128 161.9 94.1 128Zm20.3 115.5-32.4 32.3-7.5-37.7 39.9-39.9Z"/></svg></div> <svg xmlns="http://www.w3.org/2000/svg" class="absolute dark:text-white/40 group-hover:size-5 group-hover:text-[#00DC82] right-4 size-4 text-[#020420]/20 top-4 transition-all" viewBox="0 0 256 256"><path fill="currentColor" d="M200 64v104a8 8 0 0 1-16 0V83.3L69.7 197.7a8.2 8.2 0 0 1-11.4 0 8.1 8.1 0 0 1 0-11.4L172.7 72H88a8 8 0 0 1 0-16h104a8 8 0 0 1 8 8"/></svg> <h2 class="font-semibold mt-1 text-base">Deploy</h2> <p class="dark:text-gray-200 group-hover:dark:text-gray-100 text-gray-700 text-sm">Learn how to deploy your Nuxt project on different providers.</p> </a></div><footer class="lg:px-8 mb-6 mt-6 mx-auto px-4 sm:mb-0 sm:mt-10 sm:px-6 w-full"><ul class="flex gap-4 items-center justify-center"><li><a href="https://go.nuxt.com/github" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt GitHub Repository</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg> </a></li><li><a href="https://go.nuxt.com/discord" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt Discord Server</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M20.317 4.37a19.8 19.8 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.3 18.3 0 0 0-5.487 0 13 13 0 0 0-.617-1.25.08.08 0 0 0-.079-.037A19.7 19.7 0 0 0 3.677 4.37a.1.1 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.08.08 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.08.08 0 0 0 .084-.028 14 14 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13 13 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10 10 0 0 0 .372-.292.07.07 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.07.07 0 0 1 .078.01q.181.149.373.292a.077.077 0 0 1-.006.127 12.3 12.3 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.08.08 0 0 0 .084.028 19.8 19.8 0 0 0 6.002-3.03.08.08 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.06.06 0 0 0-.031-.03M8.02 15.33c-1.182 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418m7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418"/></svg> </a></li><li><a href="https://go.nuxt.com/x" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt on X</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z"/></svg> </a></li><li><a href="https://go.nuxt.com/bluesky" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt Bluesky</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M12 10.8c-1.087-2.114-4.046-6.053-6.798-7.995C2.566.944 1.561 1.266.902 1.565.139 1.908 0 3.08 0 3.768c0 .69.378 5.65.624 6.479.815 2.736 3.713 3.66 6.383 3.364q.204-.03.415-.056-.207.033-.415.056c-3.912.58-7.387 2.005-2.83 7.078 5.013 5.19 6.87-1.113 7.823-4.308.953 3.195 2.05 9.271 7.733 4.308 4.267-4.308 1.172-6.498-2.74-7.078a9 9 0 0 1-.415-.056q.21.026.415.056c2.67.297 5.568-.628 6.383-3.364.246-.828.624-5.79.624-6.478 0-.69-.139-1.861-.902-2.206-.659-.298-1.664-.62-4.3 1.24C16.046 4.748 13.087 8.687 12 10.8"/></svg> </a></li><li><a href="https://go.nuxt.com/linkedin" target="_blank" class="dark:hover:text-white dark:text-gray-400 focus-visible:ring-2 hover:text-[#020420] text-gray-500"> <span class="sr-only">Nuxt Linkedin</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="currentColor" d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z"/></svg> </a></li></ul></footer></div></div>
30
30
  </template>
31
31
 
32
32
  <style scoped>
@@ -135,12 +135,17 @@ export declare function useNuxtData<DataT = any>(key: string): {
135
135
  export declare function refreshNuxtData(keys?: string | string[]): Promise<void>;
136
136
  /** @since 3.0.0 */
137
137
  export declare function clearNuxtData(keys?: string | string[] | ((key: string) => boolean)): void;
138
+ export type DebouncedReturn<ArgumentsT extends unknown[], ReturnT> = ((...args: ArgumentsT) => Promise<ReturnT>) & {
139
+ cancel: () => void;
140
+ flush: () => Promise<ReturnT> | undefined;
141
+ isPending: () => boolean;
142
+ };
138
143
  export type CreatedAsyncData<ResT, NuxtErrorDataT = unknown, DataT = ResT, DefaultT = undefined> = Omit<_AsyncData<DataT | DefaultT, (NuxtErrorDataT extends Error | NuxtError ? NuxtErrorDataT : NuxtError<NuxtErrorDataT>)>, 'clear' | 'refresh'> & {
139
144
  _off: () => void;
140
145
  _hash?: Record<string, string | undefined>;
141
146
  _default: () => unknown;
142
147
  _init: boolean;
143
148
  _deps: number;
144
- _execute: (opts?: AsyncDataExecuteOptions) => Promise<void>;
149
+ _execute: DebouncedReturn<[opts?: AsyncDataExecuteOptions | undefined], void>;
145
150
  _abortController?: AbortController;
146
151
  };
@@ -150,6 +150,11 @@ You can use a different key or move the call to a composable to ensure the optio
150
150
  if (keyChanging) {
151
151
  return;
152
152
  }
153
+ if (nuxtApp._asyncData[key.value]?._execute.isPending()) {
154
+ queuePostFlushCb(() => {
155
+ nuxtApp._asyncData[key.value]?._execute.flush();
156
+ });
157
+ }
153
158
  nuxtApp._asyncData[key.value]?._execute({ cause: "watch", dedupe: options.dedupe });
154
159
  }) : () => {
155
160
  };
@@ -303,13 +308,13 @@ function pick(obj, keys) {
303
308
  function createAsyncData(nuxtApp, key, _handler, options, initialCachedData) {
304
309
  nuxtApp.payload._errors[key] ??= void 0;
305
310
  const hasCustomGetCachedData = options.getCachedData !== getDefaultCachedData;
306
- const handler = import.meta.client || !import.meta.prerender || !nuxtApp.ssrContext?._sharedPrerenderCache ? _handler : (nuxtApp2, options2) => {
307
- const value = nuxtApp2.ssrContext._sharedPrerenderCache.get(key);
311
+ const handler = import.meta.client || !import.meta.prerender || !nuxtApp.ssrContext?.["~sharedPrerenderCache"] ? _handler : (nuxtApp2, options2) => {
312
+ const value = nuxtApp2.ssrContext["~sharedPrerenderCache"].get(key);
308
313
  if (value) {
309
314
  return value;
310
315
  }
311
316
  const promise = Promise.resolve().then(() => nuxtApp2.runWithContext(() => _handler(nuxtApp2, options2)));
312
- nuxtApp2.ssrContext._sharedPrerenderCache.set(key, promise);
317
+ nuxtApp2.ssrContext["~sharedPrerenderCache"].set(key, promise);
313
318
  return promise;
314
319
  };
315
320
  const _ref = options.deep ? ref : shallowRef;
@@ -32,8 +32,7 @@ async function runLegacyAsyncData(res, fn) {
32
32
  _res[key2] = computed({
33
33
  get: () => data.value?.[key2],
34
34
  set(v) {
35
- data.value ||= {};
36
- data.value[key2] = v;
35
+ data.value = data.value ? { ...data.value, [key2]: v } : { [key2]: v };
37
36
  }
38
37
  });
39
38
  }
@@ -10,7 +10,14 @@ import { cookieStore } from "#build/nuxt.config.mjs";
10
10
  const CookieDefaults = {
11
11
  path: "/",
12
12
  watch: true,
13
- decode: (val) => destr(decodeURIComponent(val)),
13
+ decode: (val) => {
14
+ const decoded = decodeURIComponent(val);
15
+ const parsed = destr(decoded);
16
+ if (typeof parsed === "number" && (!Number.isFinite(parsed) || String(parsed) !== decoded)) {
17
+ return decoded;
18
+ }
19
+ return parsed;
20
+ },
14
21
  encode: (val) => encodeURIComponent(typeof val === "string" ? val : JSON.stringify(val))
15
22
  };
16
23
  const store = import.meta.client && cookieStore ? globalThis.cookieStore : void 0;