diff --git a/packages/nuxt/src/app/plugins/view-transitions-safe.client.ts b/packages/nuxt/src/app/plugins/view-transitions-safe.client.ts new file mode 100644 index 000000000000..0ff80f9da562 --- /dev/null +++ b/packages/nuxt/src/app/plugins/view-transitions-safe.client.ts @@ -0,0 +1,8 @@ +import { defineNuxtPlugin } from '#app/nuxt' +import plugin from '#app/plugins/view-transitions.client' + +export default defineNuxtPlugin((nuxtApp) => { + if (!document.startViewTransition || window.matchMedia('(prefers-reduced-motion: reduce)').matches) { return } + + plugin(nuxtApp) +}) diff --git a/packages/nuxt/src/app/plugins/view-transitions.client.ts b/packages/nuxt/src/app/plugins/view-transitions.client.ts index 2494d3c8f35a..f0f75fcd2b72 100644 --- a/packages/nuxt/src/app/plugins/view-transitions.client.ts +++ b/packages/nuxt/src/app/plugins/view-transitions.client.ts @@ -2,7 +2,7 @@ import { useRouter } from '#app/composables/router' import { defineNuxtPlugin } from '#app/nuxt' export default defineNuxtPlugin((nuxtApp) => { - if (!document.startViewTransition || window.matchMedia('(prefers-reduced-motion: reduce)').matches) { return } + if (!document.startViewTransition) { return } let finishTransition: undefined | (() => void) let abortTransition: undefined | (() => void) diff --git a/packages/nuxt/src/core/nuxt.ts b/packages/nuxt/src/core/nuxt.ts index 7073d8099d4a..4e3e2776ceb1 100644 --- a/packages/nuxt/src/core/nuxt.ts +++ b/packages/nuxt/src/core/nuxt.ts @@ -287,7 +287,11 @@ async function initNuxt (nuxt: Nuxt) { // Add experimental automatic view transition api support if (nuxt.options.experimental.viewTransition) { - addPlugin(resolve(nuxt.options.appDir, 'plugins/view-transitions.client')) + if (nuxt.options.experimental.viewTransition === 'always') { + addPlugin(resolve(nuxt.options.appDir, 'plugins/view-transitions.client')) + } else { + addPlugin(resolve(nuxt.options.appDir, 'plugins/view-transitions-safe.client')) + } } // Add experimental support for custom types in JSON payload diff --git a/packages/schema/src/config/experimental.ts b/packages/schema/src/config/experimental.ts index 17507c8f4eca..b19e68d15358 100644 --- a/packages/schema/src/config/experimental.ts +++ b/packages/schema/src/config/experimental.ts @@ -125,6 +125,7 @@ export default defineUntypedSchema({ * Enable View Transition API integration with client-side router. * * @see https://developer.chrome.com/docs/web-platform/view-transitions + * @type {boolean | 'always'} */ viewTransition: false,