upwwwards 0.1.5-beta.1 → 0.1.6-beta.1
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.
- package/README.md +1 -1
- package/dist/adapters/Nuxt.d.ts +10 -4
- package/dist/adapters/Nuxt.js +4 -5
- package/dist/adapters/Nuxt.js.map +1 -1
- package/docs/adapters.md +4 -4
- package/docs/faq.md +1 -1
- package/docs/getting-started.md +2 -2
- package/docs/recipes.md +1 -1
- package/llms.txt +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/adapters/Nuxt.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Ref, isRef, nextTick } from 'vue';
|
|
2
2
|
import { STATUS, set } from '../symbols/index.js';
|
|
3
3
|
import { A as Adapter } from '../index-BlwaDpQl.js';
|
|
4
|
+
import { NuxtApp } from 'nuxt/app';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Configuration passed to `Up.set` when using the Nuxt adapter.
|
|
@@ -11,6 +12,11 @@ interface NuxtConfig {
|
|
|
11
12
|
* Falls back to `document.body` when omitted or when no element matches.
|
|
12
13
|
*/
|
|
13
14
|
rootSelector?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Nuxt app instance from `useNuxtApp()` in a setup context (root layout).
|
|
17
|
+
* Used for page hooks and transition-aware `AFTER_NAVIGATE`.
|
|
18
|
+
*/
|
|
19
|
+
nuxtApp: NuxtApp;
|
|
14
20
|
}
|
|
15
21
|
/**
|
|
16
22
|
* Vue reactive ref produced by the Nuxt adapter ({@link Nuxt.getRef} / {@link Nuxt.setRef}).
|
|
@@ -33,8 +39,8 @@ interface NuxtRef<T> extends Ref<T> {
|
|
|
33
39
|
* (guard `return false`, cancelled navigation, …). Not emitted for aborts that happen in middleware
|
|
34
40
|
* registered before this adapter's `beforeEach` (those never start the Adapter cycle).
|
|
35
41
|
*
|
|
36
|
-
* Pass `
|
|
37
|
-
* Call `Up.set` synchronously during a Nuxt setup (e.g. root layout)
|
|
42
|
+
* Pass `nuxtApp` from `useNuxtApp()` into `Up.set` (optional `rootSelector`).
|
|
43
|
+
* Call `Up.set` synchronously during a Nuxt setup (e.g. root layout).
|
|
38
44
|
*/
|
|
39
45
|
declare abstract class Nuxt extends Adapter {
|
|
40
46
|
#private;
|
|
@@ -48,8 +54,8 @@ declare abstract class Nuxt extends Adapter {
|
|
|
48
54
|
static [STATUS]: -1 | 0 | 1;
|
|
49
55
|
/**
|
|
50
56
|
* Sets `root` and registers the router guards and `page:finish`. Called by `Up.set` in the browser.
|
|
51
|
-
*
|
|
52
|
-
* @param config
|
|
57
|
+
* Uses `config.nuxtApp` for page hooks / transition wait; resolves the router via `useRouter()`.
|
|
58
|
+
* @param config `nuxtApp` plus optional `rootSelector`.
|
|
53
59
|
* @internal
|
|
54
60
|
*/
|
|
55
61
|
static [set](config: NuxtConfig): void;
|
package/dist/adapters/Nuxt.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ref, isRef, nextTick } from "vue";
|
|
2
2
|
import { useRouter } from "vue-router";
|
|
3
|
-
import { useNuxtApp } from "nuxt/app";
|
|
4
3
|
import { STATUS, set } from "../symbols/index.js";
|
|
5
4
|
import Adapter, { adapterCaller } from "./@/Adapter.js";
|
|
6
5
|
class Nuxt extends Adapter {
|
|
@@ -34,16 +33,16 @@ class Nuxt extends Adapter {
|
|
|
34
33
|
}
|
|
35
34
|
/**
|
|
36
35
|
* Sets `root` and registers the router guards and `page:finish`. Called by `Up.set` in the browser.
|
|
37
|
-
*
|
|
38
|
-
* @param config
|
|
36
|
+
* Uses `config.nuxtApp` for page hooks / transition wait; resolves the router via `useRouter()`.
|
|
37
|
+
* @param config `nuxtApp` plus optional `rootSelector`.
|
|
39
38
|
* @internal
|
|
40
39
|
*/
|
|
41
40
|
static [set](config) {
|
|
42
|
-
const
|
|
41
|
+
const ROUTER = useRouter();
|
|
43
42
|
Nuxt.#setVars(config);
|
|
44
43
|
ROUTER.beforeEach(Nuxt.#eBeforeEach);
|
|
45
44
|
ROUTER.afterEach(Nuxt.#eAfterEach);
|
|
46
|
-
|
|
45
|
+
config.nuxtApp.hook("page:finish", Nuxt.#ePageFinish.bind(null, config.nuxtApp));
|
|
47
46
|
}
|
|
48
47
|
/**
|
|
49
48
|
* Assigns `value` to a Vue ref (`ref.value = value`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/Nuxt.ts"],"sourcesContent":["/* [Nuxt] */\r\n\r\n// #IMPORTS\r\n\r\n // ##VUE\r\nimport { ref, isRef, nextTick } from 'vue'\r\nimport { useRouter } from 'vue-router'\r\n\r\n // ##
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/Nuxt.ts"],"sourcesContent":["/* [Nuxt] */\r\n\r\n// #IMPORTS\r\n\r\n // ##VUE\r\nimport { ref, isRef, nextTick } from 'vue'\r\nimport { useRouter } from 'vue-router'\r\n\r\n // ##SYMBOLS\r\nimport { STATUS, set } from '../symbols/index.js'\r\n\r\n // ##ADAPTERS\r\nimport Adapter, { adapterCaller } from './@/Adapter.js'\r\n\r\n // ##TYPES\r\nimport type { Ref } from 'vue'\r\nimport type { RouteLocationNormalized, NavigationFailure } from 'vue-router'\r\nimport type { NuxtApp } from 'nuxt/app'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\n/**\r\n * Configuration passed to `Up.set` when using the Nuxt adapter.\r\n*/\r\ninterface NuxtConfig\r\n{\r\n /**\r\n * Optional CSS selector of the application root element (`Up.Adapter.root`).\r\n * Falls back to `document.body` when omitted or when no element matches.\r\n */\r\n rootSelector?: string,\r\n /**\r\n * Nuxt app instance from `useNuxtApp()` in a setup context (root layout).\r\n * Used for page hooks and transition-aware `AFTER_NAVIGATE`.\r\n */\r\n nuxtApp: NuxtApp\r\n}\r\n\r\n/**\r\n * Vue reactive ref produced by the Nuxt adapter ({@link Nuxt.getRef} / {@link Nuxt.setRef}).\r\n * @template T Wrapped value type.\r\n*/\r\ninterface NuxtRef<T> extends Ref<T> {}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Nuxt 4 / Vue adapter: maps Vue Router and Nuxt page hooks to navigation phases, and uses Vue refs and `nextTick`.\r\n * Selected by the Vite plugin with `adapter: 'nuxt'` and exposed as `Up.Adapter`.\r\n *\r\n * Navigation phases (subscribe with `Up.Adapter.sub`):\r\n * - `BEFORE_NAVIGATE` then `ON_NAVIGATE` — together in `router.beforeEach` when the path changes.\r\n * - `AFTER_NAVIGATE` — once per successful navigation via `page:finish`. When `NuxtPage` has a page\r\n * transition (`app.pageTransition`, page meta, or `NuxtPage` prop), Suspense can resolve (and\r\n * `page:finish` can fire) before the new page's `onMounted` under modes like `out-in`. In that case\r\n * the adapter also awaits Nuxt's internal `~transitionPromise` (resolved on Transition `onAfterLeave`,\r\n * same gate as Nuxt scroll + `page:transition:finish`) so `AFTER` lands after the leave and a Vue flush.\r\n * - `ABORTED` — when Vue Router reports a navigation failure after `BEFORE`/`ON` already ran\r\n * (guard `return false`, cancelled navigation, …). Not emitted for aborts that happen in middleware\r\n * registered before this adapter's `beforeEach` (those never start the Adapter cycle).\r\n *\r\n * Pass `nuxtApp` from `useNuxtApp()` into `Up.set` (optional `rootSelector`).\r\n * Call `Up.set` synchronously during a Nuxt setup (e.g. root layout).\r\n*/\r\nabstract class Nuxt extends Adapter\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * `true` after a client path change (`beforeEach`) until `AFTER_NAVIGATE` / `ABORTED`.\r\n * Skips awaiting `~transitionPromise` on the first load (that promise can be created while\r\n * `hasTransition` is set even when no leave/`onAfterLeave` will run).\r\n */\r\n static #clientNav = false\r\n\r\n /**\r\n * Navigation cycle flag for the current route change:\r\n * `0` = in progress (waiting for `AFTER_NAVIGATE` or `ABORTED`),\r\n * `1` = `AFTER_NAVIGATE` already fired,\r\n * `-1` = `ABORTED`.\r\n * @internal\r\n */\r\n static [STATUS]: -1 | 0 | 1 = 0\r\n\r\n // ##PUBLICS\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n\r\n// #METHODS\r\n\r\n // ##SET\r\n /**\r\n * Sets `root` from `rootSelector`, falling back to `document.body`.\r\n */\r\n static #setVars(config: NuxtConfig): void { Nuxt.root = (config.rootSelector && document.querySelector(config.rootSelector)) || document.body }\r\n\r\n /**\r\n * Sets `root` and registers the router guards and `page:finish`. Called by `Up.set` in the browser.\r\n * Uses `config.nuxtApp` for page hooks / transition wait; resolves the router via `useRouter()`.\r\n * @param config `nuxtApp` plus optional `rootSelector`.\r\n * @internal\r\n */\r\n static override [set](config: NuxtConfig): void\r\n {\r\n const ROUTER = useRouter()\r\n\r\n Nuxt.#setVars(config)\r\n\r\n ROUTER.beforeEach(Nuxt.#eBeforeEach)\r\n ROUTER.afterEach(Nuxt.#eAfterEach)\r\n config.nuxtApp.hook('page:finish', Nuxt.#ePageFinish.bind(null, config.nuxtApp))\r\n }\r\n\r\n /**\r\n * Assigns `value` to a Vue ref (`ref.value = value`).\r\n * @template T Wrapped value type.\r\n * @param ref Vue ref created by {@link Nuxt.getRef}.\r\n * @param value New value.\r\n */\r\n static override setRef<T>(ref: NuxtRef<T>, value: T): void { ref.value = value }\r\n\r\n // ##GET\r\n /**\r\n * Creates a Vue `ref` wrapping `value`.\r\n * @template T Wrapped value type.\r\n * @param value Initial value.\r\n * @returns Vue ref.\r\n */\r\n static override getRef<T>(value: T): NuxtRef<T> { return ref(value) as NuxtRef<T> }\r\n\r\n // ##IS\r\n /**\r\n * Vue `isRef`: returns whether a value is a Vue ref.\r\n */\r\n static override isRef = isRef\r\n\r\n // ##EVENTS\r\n /**\r\n * `router.beforeEach`: starts a navigation cycle when the path changes (`STATUS = 0`),\r\n * then fires `BEFORE_NAVIGATE` and `ON_NAVIGATE`.\r\n */\r\n static #eBeforeEach(to: RouteLocationNormalized, from: RouteLocationNormalized): void\r\n {\r\n if (to.path === from.path) return\r\n\r\n Nuxt.#clientNav = true\r\n Nuxt[STATUS] = 0\r\n\r\n Adapter[adapterCaller]('BEFORE_NAVIGATE')\r\n Adapter[adapterCaller]('ON_NAVIGATE') // ?No equivalent to SvelteKit `onNavigate`\r\n }\r\n\r\n /**\r\n * `router.afterEach`: fires `ABORTED` when the navigation failed and a cycle was in progress (`STATUS === 0`).\r\n */\r\n static #eAfterEach(_to: RouteLocationNormalized, _from: RouteLocationNormalized, failure?: NavigationFailure | void): void\r\n {\r\n if (!failure || Nuxt[STATUS]) return\r\n\r\n Nuxt.#clientNav = false\r\n Nuxt[STATUS] = -1\r\n\r\n Nuxt[adapterCaller]('ABORTED')\r\n }\r\n\r\n /**\r\n * Nuxt `page:finish` handler: fires `AFTER_NAVIGATE` once per successful cycle.\r\n *\r\n * Hook argument is vue-router's page VNode fed as a **prop** into `RouteProvider` — that object never gets\r\n * `.component`, so it cannot be used to wait on `onMounted`. When a page transition is active, `NuxtPage`\r\n * sets `nuxtApp['~transitionPromise']` in Suspense `onPending` and resolves it in Transition `onAfterLeave`\r\n * (alongside `page:transition:finish`). Awaiting that promise on client navigations mirrors Nuxt scroll and\r\n * avoids emitting `AFTER` on a too-early `page:finish` (common with `mode: 'out-in'`).\r\n */\r\n static async #ePageFinish(nuxtApp: NuxtApp): Promise<void>\r\n {\r\n if (Nuxt.#clientNav)\r\n {\r\n await nuxtApp['~transitionPromise']\r\n\r\n Nuxt.#clientNav = false\r\n }\r\n\r\n if (Nuxt[STATUS]) return\r\n\r\n Nuxt[STATUS] = 1\r\n\r\n await nextTick()\r\n\r\n Adapter[adapterCaller]('AFTER_NAVIGATE')\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Vue `nextTick`: returns a promise resolved once Vue has flushed pending DOM updates.\r\n */\r\n static override tick = nextTick\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Nuxt\r\n\r\nexport type {\r\n NuxtConfig,\r\n NuxtRef\r\n}"],"mappings":"AAKA,SAAS,KAAK,OAAO,gBAAgB;AACrC,SAAS,iBAA4B;AAGrC,SAAS,QAAQ,WAAW;AAG5B,OAAO,WAAW,qBAAqB;AAsDvC,MAAe,aAAa,QAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUI,OAAO,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpB,QAAQ,MAAM,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgB9B,OAAO,SAAS,QAA0B;AAAE,SAAK,OAAQ,OAAO,gBAAgB,SAAS,cAAc,OAAO,YAAY,KAAM,SAAS;AAAA,EAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9I,QAAiB,GAAG,EAAE,QACtB;AACI,UAAM,SAAS,UAAU;AAEzB,SAAK,SAAS,MAAM;AAEpB,WAAO,WAAW,KAAK,YAAY;AACnC,WAAO,UAAU,KAAK,WAAW;AACjC,WAAO,QAAQ,KAAK,eAAe,KAAK,aAAa,KAAK,MAAM,OAAO,OAAO,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAgB,OAAUA,MAAiB,OAAgB;AAAE,IAAAA,KAAI,QAAQ;AAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS/E,OAAgB,OAAU,OAAsB;AAAE,WAAO,IAAI,KAAK;AAAA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMlF,OAAgB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,OAAO,aAAa,IAA6B,MACjD;AACI,QAAI,GAAG,SAAS,KAAK,KAAM;AAE3B,SAAK,aAAa;AAClB,SAAK,MAAM,IAAO;AAElB,YAAQ,aAAa,EAAE,iBAAiB;AACxC,YAAQ,aAAa,EAAE,aAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY,KAA8B,OAAgC,SACjF;AACI,QAAI,CAAC,WAAW,KAAK,MAAM,EAAG;AAE9B,SAAK,aAAa;AAClB,SAAK,MAAM,IAAO;AAElB,SAAK,aAAa,EAAE,SAAS;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,aAAa,aAAa,SAC1B;AACI,QAAI,KAAK,YACT;AACI,YAAM,QAAQ,oBAAoB;AAElC,WAAK,aAAa;AAAA,IACtB;AAEA,QAAI,KAAK,MAAM,EAAG;AAElB,SAAK,MAAM,IAAI;AAEf,UAAM,SAAS;AAEf,YAAQ,aAAa,EAAE,gBAAgB;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAgB,OAAO;AAE3B;AAKA,IAAO,eAAQ;","names":["ref"]}
|
package/docs/adapters.md
CHANGED
|
@@ -36,11 +36,11 @@ Event lifecycle: [core — Essentials](core.md#essentials).
|
|
|
36
36
|
|
|
37
37
|
### `Up.set` config by host
|
|
38
38
|
|
|
39
|
-
**Nuxt** —
|
|
39
|
+
**Nuxt** — `{ nuxtApp, rootSelector? }` once in a root layout `<script setup>`.
|
|
40
40
|
|
|
41
41
|
```ts
|
|
42
|
-
Up.set()
|
|
43
|
-
// or: Up.set({ rootSelector: '#app' })
|
|
42
|
+
Up.set({ nuxtApp: useNuxtApp() })
|
|
43
|
+
// or: Up.set({ nuxtApp: useNuxtApp(), rootSelector: '#app' })
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
**SvelteKit** — `{ beforeNavigate, onNavigate, afterNavigate, rootSelector? }`
|
|
@@ -107,7 +107,7 @@ Up.Adapter.destroyCookie('theme', { path: '/' })
|
|
|
107
107
|
|
|
108
108
|
### Host caveats
|
|
109
109
|
|
|
110
|
-
**Nuxt:** call `Up.set` in a layout/setup context. Route middleware that aborts **before** the adapter has wired navigation never starts the Adapter cycle (no `BEFORE` / `ABORTED`). Guards registered *after* `Up.set` can abort after `BEFORE`/`ON`.
|
|
110
|
+
**Nuxt:** call `Up.set({ nuxtApp: useNuxtApp() })` in a layout/setup context. Route middleware that aborts **before** the adapter has wired navigation never starts the Adapter cycle (no `BEFORE` / `ABORTED`). Guards registered *after* `Up.set` can abort after `BEFORE`/`ON`.
|
|
111
111
|
|
|
112
112
|
**Nuxt + `pageTransition`:** `AFTER_NAVIGATE` / `LIFE` wait until the new page is ready for work — including when you use page transitions (e.g. `out-in`). No extra app code required.
|
|
113
113
|
|
package/docs/faq.md
CHANGED
|
@@ -66,7 +66,7 @@ If middleware calls `abortNavigation()` **before** the adapter has wired navigat
|
|
|
66
66
|
|
|
67
67
|
### Nuxt: `AFTER_NAVIGATE` timing with page transitions
|
|
68
68
|
|
|
69
|
-
With `app.pageTransition` (including `out-in`), `AFTER` / `LIFE` still wait until the new page is ready — nothing extra to configure. Call `Up.set` once in a root layout setup.
|
|
69
|
+
With `app.pageTransition` (including `out-in`), `AFTER` / `LIFE` still wait until the new page is ready — nothing extra to configure. Call `Up.set({ nuxtApp: useNuxtApp() })` once in a root layout setup.
|
|
70
70
|
|
|
71
71
|
### SvelteKit: when do I pass `beforeNavigate` / `onNavigate` / `afterNavigate`?
|
|
72
72
|
|
package/docs/getting-started.md
CHANGED
|
@@ -73,13 +73,13 @@ Call it once in the browser. A second call is a no-op.
|
|
|
73
73
|
|
|
74
74
|
### Nuxt — e.g. `app/layouts/default.vue`
|
|
75
75
|
|
|
76
|
-
Call once in the layout’s `<script setup
|
|
76
|
+
Call once in the layout’s `<script setup>`. Pass the Nuxt app from `useNuxtApp()` (optional `rootSelector` for a custom app root).
|
|
77
77
|
|
|
78
78
|
```vue
|
|
79
79
|
<script lang="ts" setup>
|
|
80
80
|
import Up from 'upwwwards'
|
|
81
81
|
|
|
82
|
-
Up.set()
|
|
82
|
+
Up.set({ nuxtApp: useNuxtApp() })
|
|
83
83
|
</script>
|
|
84
84
|
|
|
85
85
|
<template>
|
package/docs/recipes.md
CHANGED
|
@@ -174,7 +174,7 @@ Also: [README showcase](../README.md#showcase-anime) · [Anime](plugins/anime.md
|
|
|
174
174
|
|
|
175
175
|
### Nuxt `pageTransition` + lifecycle
|
|
176
176
|
|
|
177
|
-
With `app.pageTransition` (or page meta / `NuxtPage` transition), `AFTER_NAVIGATE` / `LIFE` still run when the new page is ready — including under `out-in`. No extra wiring beyond
|
|
177
|
+
With `app.pageTransition` (or page meta / `NuxtPage` transition), `AFTER_NAVIGATE` / `LIFE` still run when the new page is ready — including under `out-in`. No extra wiring beyond `Up.set({ nuxtApp: useNuxtApp() })` in the root layout.
|
|
178
178
|
|
|
179
179
|
```ts
|
|
180
180
|
Up.Event.sub([
|
package/llms.txt
CHANGED
|
@@ -21,7 +21,7 @@ Documentation lives in this repo for now (`docs/`, README.md, this file). A chan
|
|
|
21
21
|
|
|
22
22
|
1. Install with any package manager: `npm install upwwwards` (or pnpm / yarn / bun) (+ peers for plugins you enable: `gsap`, `lenis`, `three`, …). Do not runtime-import those peers in app code (except `import type`); use Up.Anime / Up.Scroll / Up.Synthra only.
|
|
23
23
|
2. Vite: `import initializer from 'upwwwards/initializers/vite'` with `adapter: 'nuxt' | 'svelte'`
|
|
24
|
-
3. Browser root layout: `Up.set()` once (Nuxt) or `Up.set({ beforeNavigate, onNavigate, afterNavigate })` (SvelteKit), then immediately `Up.Event.sub` (smoke: log DEATH/LIFE/LOAD)
|
|
24
|
+
3. Browser root layout: `Up.set({ nuxtApp: useNuxtApp() })` once (Nuxt) or `Up.set({ beforeNavigate, onNavigate, afterNavigate })` (SvelteKit), then immediately `Up.Event.sub` (smoke: log DEATH/LIFE/LOAD)
|
|
25
25
|
4. Optional SSR: `upwwwards/contexts/nuxt` or `upwwwards/contexts/sveltekit`
|
|
26
26
|
5. Expect LIFE then LOAD on first paint; DEATH → LIFE → LOAD on later client navigations
|
|
27
27
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "upwwwards",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6-beta.1",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"description": "Shared page lifecycle, frame loop, and opt-in plugins (GSAP, Lenis, Three.js) for Nuxt 4 and SvelteKit 2.",
|
|
6
6
|
"author": "Morgan LE THUAUT <morgan@upwwwards.com>",
|