@ssgoi/vue

Native app-like page transitions for Vue and Nuxt. Make a web app, PWA or WebView app feel native.
9,389 1,011
Install
npm install @ssgoi/vue
Latest Version:7.4.1
Vue:3
License:MIT
Last Updated:Oct 12, 2026
Links: GitHub  ·  npm
Maintainer: anseotmd555

@ssgoi/vue

Native app-like page transitions for Vue and Nuxt. Make a web app, PWA or WebView app (Capacitor, Tauri, Ionic) feel like a native app without replacing your router.

SSGOI live showcase

Live demos · Hero, Zoom, Film, and Sheet in motion

npm install @ssgoi/vue

Agent setup guide: https://ssgoi.dev/llms/vue.txt

Router helpers

Install this framework package once; router helpers are optional subpaths. These router helpers are experimental APIs and may change.

Router Import API
Vue Router @ssgoi/vue/vue-router SsgoiRouteBoundary
Nuxt @ssgoi/vue/nuxt SsgoiRouteBoundary

See the framework guide for wiring and limits.

Root

<script setup lang="ts">
import { Ssgoi } from "@ssgoi/vue";
import { drill } from "@ssgoi/vue/view-transitions";

const config = {
  transitions: [{ on: "/posts/**", except: "/posts", transition: drill() }],
};
</script>

<template>
  <main class="ssgoi-shell">
    <Ssgoi :config="config">
      <NuxtPage />
    </Ssgoi>
  </main>
</template>

<style>
.ssgoi-shell {
  position: relative;
  z-index: 0;
  min-height: 100dvh;
  overflow-x: clip;
}
</style>

Route boundary

Mark page roots:

<template>
  <section data-ssgoi-transition="/posts">Posts</section>
</template>

Dynamic route:

<section :data-ssgoi-transition="`/posts/${route.params.id}`">
  ...
</section>

Persistent layouts

Use the parent page/layout as the outer boundary and child page roots as inner boundaries:

<template>
  <section :data-ssgoi-transition="route.path">
    <ProductTabs />
    <NuxtPage />
  </section>
</template>

Nuxt keeps the parent during child navigation. Leaving the parent uses the outer boundary; changing a child route uses the child boundary.

If a Vue Router layout reuses the same component where a fresh DOM boundary is required, use a resolved key:

<section :key="resolveKey(route.path)" :data-ssgoi-transition="route.path">
  <RouterView />
</section>

Config

import { drill, slide, zoom } from "@ssgoi/vue/view-transitions";

const config = {
  transitions: [
    {
      on: "/posts/**",
      except: "/posts",
      transition: drill(),
    },
    {
      from: "/gallery",
      to: "/gallery/*",
      transition: zoom(),
    },
    {
      ordered: ["/tabs/a", "/tabs/b"],
      transition: slide(),
    },
  ],
};

Scroll is automatic: on and from/to restore from and reset to; ordered restores both. Override with preserveScroll: { from: boolean, to: boolean }, or share one position across the rule's pages with preserveScroll: "shared".

Effect index

  • fade: unrelated pages.
  • drill: list → detail.
  • slide or axis: ordered tabs.
  • sheet: modal-like routes.
  • zoom or hero: shared-element details.
  • scroll: vertical sequences.

All effects: https://ssgoi.dev/llms.txt#7-transition-index

SsgoiTransition is deprecated. Use the data attribute directly.

License

MIT

Related Packages

@lemoncloud/vue-page-transition

iOS/Android style page transitions for Vue using View Transitions API

1,706 2
vue-extend-layout

Extend the default layout or create custom layouts for your SPA Vue.js

110,412 128
theme-switch-animation

Theme switch animation library built on the View Transitions API. Works with Rea...

967 7
vue-cli-plugin-layouts

vue-cli 3 plugin Multiple layouts in your SPA with vue-extend-layout

23,424 10
@vite-pwa/nuxt

Zero-config PWA for Nuxt 3

4,997,749 581

Version History

Version Released License
7.4.1 MIT
7.4.0 MIT
7.3.2 MIT
7.3.1 MIT
7.3.0 MIT
Pre-releases (19)
Version Released License
7.4.0-beta.3 MIT
7.4.0-beta.2 MIT
7.4.0-beta.1 MIT
7.3.0-beta.4 MIT
7.3.0-beta.3 MIT