upwwwards 0.1.2-beta.1 → 0.1.4-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.
@@ -1601,6 +1601,7 @@ declare abstract class Anime extends Lazy {
1601
1601
  * @param lazy When `true`, queue the callback without starting the load (it runs once another call triggers it).
1602
1602
  * @returns The pending load promise while Anime is loading, otherwise `void`.
1603
1603
  * @throws If called on the server.
1604
+ * @warning ScrollTrigger `stagger` can break GSAP context restore on `unsub` (context / `bucket.workspace` handoff). Prefer non-staggered setups inside `sub`, or clean those triggers yourself on the cleaning stack.
1604
1605
  */
1605
1606
  static sub<T extends typeof Anime, U extends {}>(this: T, key: Anime.KEY, callback: Anime.CallBack<U>, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>;
1606
1607
  /**
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ import { W as Wait } from './Wait-C8AD49l9.js';
3
3
  import { T as Thread, a as App } from './Thread-Cvf__-O4.js';
4
4
  export { b as AppCache, u as updateScreenVars, c as updateScrollVars } from './Thread-Cvf__-O4.js';
5
5
  import { A as Adapter, a as AdapterConfig } from './index-BlwaDpQl.js';
6
- import { P as Plugin } from './index-GVYgi7Wm.js';
6
+ import { P as Plugin } from './index-CzWXovKy.js';
7
7
  import 'lenis';
8
8
  import 'gsap/SplitText';
9
9
  import 'gsap/ScrollTrigger';
@@ -1,6 +1,6 @@
1
1
  import { Plugin as Plugin$1 } from 'vite';
2
2
  import { Up } from '../index.js';
3
- import { P as Plugin } from '../index-GVYgi7Wm.js';
3
+ import { P as Plugin } from '../index-CzWXovKy.js';
4
4
  import { C as Classter } from '../Classter-BvYgmPAa.js';
5
5
  import '../symbols/index.js';
6
6
  import '../Wait-C8AD49l9.js';
@@ -219,6 +219,8 @@ declare namespace Vite {
219
219
  * The plugin:
220
220
  * - Replaces every `import Up from 'upwwwards'` with a virtual module that constructs `Up` exactly once
221
221
  * (on the server and in the browser) with the `up` config, the selected adapter and the enabled plugins.
222
+ * - Sets `resolve.dedupe` and `optimizeDeps.exclude` / `ssr.optimizeDeps.exclude` for the package surface so
223
+ * Vite never prebundles a second copy of `Up` while plugins still import `../core/Up.js` (dual-runtime hazard).
222
224
  * - Writes generated files into `<setupIn>/upwwwards/` at build start: `private/types/upwwwards.d.ts`
223
225
  * (types of `Up.Adapter`, the enabled plugins, `AdapterConfig` / `AdapterRef` and `EventData`; rewritten when outdated),
224
226
  * `customizable/types/config.d.ts` (created once, then yours to edit, to augment `AppCache` and plugin interfaces),
@@ -2,7 +2,26 @@ import fs, { readdirSync, readFileSync } from "fs";
2
2
  import { fileURLToPath } from "url";
3
3
  import path from "path";
4
4
  import Logs from "../scripts/Logs.js";
5
- const FOLDER_NAME = "upwwwards", CUSTOMIZABLE_FOLDER_NAME = "customizable", PRIVATE_FOLDER_NAME = "private", ID = "upwwwards", VIRTUAL_ID = `\0virtual::${ID}::`, CLASSTER_ID = "classter.css", VIRTUAL_CLASSTER_ID = `\0virtual::${CLASSTER_ID}`, CLASSTER_MARK = "[data-upwwwards-classter]", CLASSTER_MARK_STYLE = `${CLASSTER_MARK}{display:contents}`, CLASSTER_MARK_RGX = new RegExp(`\\${CLASSTER_MARK}\\s*{\\s*display\\s*:\\s*contents\\s*;?\\s*}\\s*`), SERVERS = [];
5
+ const FOLDER_NAME = "upwwwards", CUSTOMIZABLE_FOLDER_NAME = "customizable", PRIVATE_FOLDER_NAME = "private", ID = "upwwwards", VIRTUAL_ID = `\0virtual::${ID}::`, CLASSTER_ID = "classter.css", VIRTUAL_CLASSTER_ID = `\0virtual::${CLASSTER_ID}`, CLASSTER_MARK = "[data-upwwwards-classter]", CLASSTER_MARK_STYLE = `${CLASSTER_MARK}{display:contents}`, CLASSTER_MARK_RGX = new RegExp(`\\${CLASSTER_MARK}\\s*{\\s*display\\s*:\\s*contents\\s*;?\\s*}\\s*`), OPTIMIZE_DEPS_EXCLUDE = [
6
+ ID,
7
+ `${ID}/contexts/nuxt`,
8
+ `${ID}/contexts/sveltekit`,
9
+ `${ID}/adapters`,
10
+ `${ID}/adapters/Nuxt`,
11
+ `${ID}/adapters/Svelte`,
12
+ `${ID}/plugins`,
13
+ `${ID}/plugins/Transmitter`,
14
+ `${ID}/plugins/Scroll`,
15
+ `${ID}/plugins/Anime`,
16
+ `${ID}/plugins/Puppeteer`,
17
+ `${ID}/plugins/Synthra`,
18
+ `${ID}/scripts`,
19
+ `${ID}/scripts/Trees`,
20
+ `${ID}/scripts/Arrays`,
21
+ `${ID}/classter/Vue`,
22
+ `${ID}/classter/Svelte`,
23
+ `${ID}/symbols`
24
+ ], SERVERS = [];
6
25
  let dev = false, serversLength = 0;
7
26
  function getAdapterData(adapter) {
8
27
  switch (adapter) {
@@ -311,7 +330,12 @@ function readHTMLFiles(data) {
311
330
  }
312
331
  }
313
332
  function config() {
314
- return { server: { watch: { ignored: [`**/${FOLDER_NAME}/${PRIVATE_FOLDER_NAME}/**`] } } };
333
+ return {
334
+ server: { watch: { ignored: [`**/${FOLDER_NAME}/${PRIVATE_FOLDER_NAME}/**`] } },
335
+ resolve: { dedupe: [ID] },
336
+ optimizeDeps: { exclude: [...OPTIMIZE_DEPS_EXCLUDE] },
337
+ ssr: { optimizeDeps: { exclude: [...OPTIMIZE_DEPS_EXCLUDE] } }
338
+ };
315
339
  }
316
340
  function configResolved(config2) {
317
341
  dev = config2.command === "serve";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/initializers/vite.ts"],"sourcesContent":["/* [vite] */\r\n\r\n// #IMPORTS\r\n\r\n // ##NODE\r\nimport fs, { readdirSync, readFileSync } from 'fs'\r\nimport { fileURLToPath } from 'url'\r\nimport path from 'path'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##TYPES\r\nimport type { UserConfig, ResolvedConfig, Plugin as VitePlugin, ViteDevServer, Rolldown } from 'vite'\r\n\r\nimport type Up from '../core/Up.js'\r\n\r\nimport type Plugin from '../plugins/@/Plugin.js'\r\nimport type Screen from '../plugins/Screen.js'\r\n\r\nimport type Classter from '../classter/@/Classter.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Vite\r\n{\r\n /**\r\n * Built-in adapter presets, keyed by the value of {@link Vite.CONFIG.adapter}:\r\n * adapter module name, default `readIn` / `setupIn` directories, and component file extension analyzed by Classter.\r\n */\r\n export type ADAPTER_MAP =\r\n {\r\n svelte:\r\n {\r\n name : 'Svelte',\r\n readIn : '/src',\r\n setupIn: '/src/lib',\r\n ext : '.svelte'\r\n },\r\n nuxt:\r\n {\r\n name : 'Nuxt',\r\n readIn : '/app',\r\n setupIn: '/app',\r\n ext : '.vue'\r\n }\r\n }\r\n\r\n /**\r\n * Supported adapter keys: `'nuxt'` (Nuxt 4) or `'svelte'` (SvelteKit 2).\r\n */\r\n export type ADAPTER_KEY = keyof ADAPTER_MAP\r\n\r\n /**\r\n * Options of the `upwwwards` Vite plugin (see {@link vite}).\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Host framework: `'nuxt'` or `'svelte'`.\r\n * Selects the adapter exposed as `Up.Adapter` (`upwwwards/adapters/Nuxt` or `upwwwards/adapters/Svelte`),\r\n * the default `readIn` / `setupIn` directories, and the component extension (`.vue` / `.svelte`) analyzed by Classter.\r\n */\r\n adapter: ADAPTER_KEY,\r\n /**\r\n * Source directory scanned by Classter, as a path starting with `/` resolved against the Vite root.\r\n * Components and `.html` files under it are analyzed when Vite transforms them, and the `.html` files\r\n * directly inside it (e.g. SvelteKit `app.html`) are analyzed at build start.\r\n * Defaults to `'/app'` with Nuxt and `'/src'` with SvelteKit. Unused when Classter is disabled.\r\n */\r\n readIn?: `/${string}`,\r\n /**\r\n * Directory in which the plugin creates its `upwwwards` folder of generated files,\r\n * as a path starting with `/` resolved against the Vite root.\r\n * Defaults to `'/app'` with Nuxt and `'/src/lib'` with SvelteKit.\r\n */\r\n setupIn?: `/${string}`,\r\n /**\r\n * Core runtime configuration (`event`, `thread`) passed to `Up` at construction.\r\n * It is serialized with `JSON.stringify`, so it must only contain JSON-compatible values.\r\n * Entries of `event.enhance` are also turned into typings for the generated `EventData` interface.\r\n */\r\n up?: Up.CONFIG,\r\n /**\r\n * Plugins to enable, each given by name (e.g. `'Scroll'`) or as `{ name, config }`.\r\n * Available names: `Observer`, `Screen`, `Transmitter`, `Scroll`, `Anime`, `Puppeteer`, `Synthra`.\r\n * Configs are serialized with `JSON.stringify`, except Anime `plugins` (turned into lazy `gsap/<name>` imports)\r\n * and Synthra `pick` (turned into lazy imports of the picked Three.js exports).\r\n * A name declared more than once logs a warning and only its first declaration is kept.\r\n */\r\n plugins?: (Plugin.RAW_WRAP | Plugin.RAW_WRAP['name'])[],\r\n /**\r\n * Enables Classter, the optional atomic-CSS generator (see {@link Vite.CLASSTER_CONFIG}).\r\n * Disabled when omitted.\r\n */\r\n classter?: CLASSTER_CONFIG\r\n }\r\n\r\n /**\r\n * File generated into the project at build start.\r\n * @internal\r\n */\r\n export type FILE_DATA =\r\n {\r\n /**\r\n * `true` for files created once in the `customizable` folder and never overwritten;\r\n * `false` for files in the `private` folder, rewritten whenever their content changes.\r\n */\r\n customizable: boolean,\r\n /**\r\n * File name, including its extension.\r\n */\r\n name: string,\r\n /**\r\n * Sub-folder (`types`, `styles`, …) inside the `customizable` or `private` folder.\r\n */\r\n folder: string,\r\n /**\r\n * File content.\r\n */\r\n content: string\r\n }\r\n\r\n /**\r\n * Resolved plugin state shared by the Vite hooks.\r\n * @internal\r\n */\r\n export type DATA =\r\n {\r\n /**\r\n * Directory scanned by Classter.\r\n */\r\n readIn: string,\r\n /**\r\n * Directory of the generated `upwwwards` folder (already suffixed with `/upwwwards`).\r\n */\r\n setupIn: string,\r\n /**\r\n * Code of the virtual `upwwwards` module, appended after the import of the real runtime.\r\n */\r\n virtual: string,\r\n /**\r\n * Files to generate at build start.\r\n */\r\n files: FILE_DATA[],\r\n /**\r\n * Configured Classter analyzer, or `undefined` when Classter is disabled.\r\n */\r\n Classter?: typeof Classter\r\n }\r\n\r\n /**\r\n * Code generated from the `up` option.\r\n * @internal\r\n */\r\n export type UP_DATA =\r\n {\r\n /**\r\n * Serialized `up` config injected into the virtual module.\r\n */\r\n virtual: string,\r\n /**\r\n * `EventData` interface declaration built from `up.event.enhance` (empty when unused).\r\n */\r\n type: string\r\n }\r\n\r\n /**\r\n * Code generated from the `plugins` option.\r\n * @internal\r\n */\r\n export type PLUGINS_DATA =\r\n {\r\n /**\r\n * Virtual module code importing the plugins and pushing their configs.\r\n */\r\n virtual: string,\r\n /**\r\n * Type declarations injected into the generated type files.\r\n */\r\n types:\r\n {\r\n /**\r\n * `Up.<Plugin>` declarations for the enabled plugins.\r\n */\r\n private: string,\r\n /**\r\n * Plugin-specific module augmentations (Anime GSAP plugins, Synthra Three.js exports).\r\n */\r\n privatePlugins: string,\r\n /**\r\n * Editable augmentation stubs added to the customizable `config.d.ts`.\r\n */\r\n customizable: string\r\n },\r\n /**\r\n * Extra plugin files to generate (e.g. `_screen.scss`).\r\n */\r\n files: FILE_DATA[]\r\n }\r\n\r\n /**\r\n * Classter options. Classter compiles atomic class tokens found in templates (e.g. `pa:1rem`, `co:[#fff]:before`)\r\n * into the virtual stylesheet `classter.css`, which the app must import once.\r\n */\r\n export type CLASSTER_CONFIG =\r\n {\r\n /**\r\n * Analyzer matching the adapter: `Vue` from `upwwwards/classter/Vue` (Nuxt)\r\n * or `Svelte` from `upwwwards/classter/Svelte` (SvelteKit).\r\n */\r\n Classter: typeof Classter,\r\n /**\r\n * Disables Classter while keeping its config. Default `false`.\r\n * @warning While disabled, `classter.css` has no content provider: do not import it.\r\n */\r\n off?: boolean,\r\n /**\r\n * Silences warnings about unknown aliases and expressions that cannot be analyzed statically. Default `false`.\r\n * Warnings about invalid values and unsupported pseudo-elements are still logged.\r\n */\r\n silent?: boolean,\r\n /**\r\n * Extra attribute / prop names to scan, stored in lowercase and kebab-case.\r\n */\r\n identifiers?:\r\n {\r\n /**\r\n * Names whose values are class lists, in addition to `class` (e.g. `['innerClass']`).\r\n */\r\n class?: Classter.IDENTIFIER[],\r\n /**\r\n * Names whose object-literal values may contain class identifiers\r\n * (e.g. `attrs` for `attrs={{ class: 'pa:1rem' }}`).\r\n */\r\n attributes?: Classter.IDENTIFIER[]\r\n },\r\n /**\r\n * Custom aliases mapping a shortcut to a CSS property, e.g. `{ 'my-pa': 'padding' }` (see `Classter.addAlias`).\r\n */\r\n alias?: Record<string, string>\r\n }\r\n}\r\n\r\n// #CONSTANTS\r\n\r\n // ##THIS\r\nconst\r\nFOLDER_NAME = 'upwwwards',\r\nCUSTOMIZABLE_FOLDER_NAME = 'customizable',\r\nPRIVATE_FOLDER_NAME = 'private',\r\nID = 'upwwwards',\r\nVIRTUAL_ID = `\\0virtual::${ID}::`, // + real ID (path)\r\nCLASSTER_ID = 'classter.css',\r\nVIRTUAL_CLASSTER_ID = `\\0virtual::${CLASSTER_ID}`,\r\nCLASSTER_MARK = '[data-upwwwards-classter]',\r\nCLASSTER_MARK_STYLE = `${CLASSTER_MARK}{display:contents}`,\r\nCLASSTER_MARK_RGX = new RegExp(`\\\\${CLASSTER_MARK}\\\\s*{\\\\s*display\\\\s*:\\\\s*contents\\\\s*;?\\\\s*}\\\\s*`)\r\n,\r\nSERVERS: ViteDevServer[] = []\r\n\r\n// #VARIABLES\r\n\r\n // ##THIS\r\nlet\r\ndev = false\r\n,\r\nserversLength = 0\r\n\r\n// #FUNCTIONS\r\n\r\n // ##GET\r\n/**\r\n * Returns the preset of an adapter key; throws through `Logs.throw` when the key is unknown.\r\n*/\r\nfunction getAdapterData<T extends Vite.ADAPTER_KEY, U extends Vite.ADAPTER_MAP[T]>(adapter: T): U\r\n{\r\n switch (adapter)\r\n {\r\n case 'svelte': return {\r\n name : 'Svelte',\r\n readIn : '/src',\r\n setupIn: '/src/lib',\r\n ext : '.svelte'\r\n } as U\r\n case 'nuxt': return {\r\n name : 'Nuxt',\r\n readIn : '/app',\r\n setupIn: '/app',\r\n ext : '.vue'\r\n } as U\r\n default: Logs.throw('VITE', `THE \"${adapter}\" ADAPTER KEY IS NOT RECOGNIZED.`)\r\n }\r\n}\r\n\r\n/**\r\n * Serializes the `up` option and builds the `EventData` typings from `up.event.enhance`.\r\n*/\r\nfunction getUpData(up: Vite.CONFIG['up']): Vite.UP_DATA\r\n{\r\n return up\r\n ? {\r\n virtual: JSON.stringify(up),\r\n type : up.event?.enhance\r\n ? `interface EventData { ${up.event.enhance.reduce((acc, data): string =>\r\n {\r\n const [KEY, VALUE] = typeof data === 'string'\r\n ? [data, 'import(\\'upwwwards\\').Event.Data']\r\n : [data.key, `import('upwwwards').Event.Data<${data.on ?? 'import(\\'upwwwards\\').Event.DEFAULT_ON'}, ${data.forever ?? false}, ${'waitDelay' in data && data.waitDelay > 0 ? data.waitType === 'debounce' ? data.waitDelay : data.waitType === 'throttle' ? -data.waitDelay : 0 : 0}, ${data.threadFlag}, (...args: ${data.argsTypes ?? 'any'}) => void>`]\r\n \r\n return `${acc}${KEY}: ${VALUE}, `\r\n },\r\n '')}};`\r\n : ''\r\n }\r\n : {\r\n virtual: '{}',\r\n type : ''\r\n }\r\n}\r\n\r\n/**\r\n * Builds the plugin part of the virtual module, typings and extra files; throws when Synthra is enabled and `three` cannot be found.\r\n*/\r\nfunction getPluginsData(plugins: Vite.CONFIG['plugins']): Vite.PLUGINS_DATA\r\n{\r\n const\r\n NAMES = new Set<Plugin.RAW_WRAP['name']>(),\r\n TYPES: Vite.PLUGINS_DATA['types'] =\r\n {\r\n private : '',\r\n privatePlugins: '',\r\n customizable : ''\r\n },\r\n FILES_DATA: Vite.FILE_DATA[] = []\r\n\r\n let data = ''\r\n\r\n if (plugins) for (let i = 0, max = plugins.length, config = ''; i < max; i++, config = '')\r\n {\r\n const\r\n UNFORMATTED = plugins[i],\r\n RAW_WRAP: Plugin.RAW_WRAP = typeof UNFORMATTED === 'string' ? { name: UNFORMATTED } : UNFORMATTED\r\n\r\n if (NAMES.has(RAW_WRAP.name))\r\n {\r\n Logs.warn('VITE', `YOU HAVE DECLARED THE SAME \"${RAW_WRAP.name}\" PLUGIN MULTIPLE TIMES.`)\r\n\r\n continue\r\n }\r\n\r\n switch (RAW_WRAP.name)\r\n {\r\n case 'Screen':\r\n {\r\n const\r\n {\r\n crushedHeight: CRUSHED_HEIGHT = 435 satisfies Screen.DEFAULT_CRUSHED_HEIGHT,\r\n mobileWidth : MOBILE_WIDTH = 768 satisfies Screen.DEFAULT_MOBILE_WIDTH,\r\n tabletWidth : TABLET_WIDTH = 1440 satisfies Screen.DEFAULT_TABLET_WIDTH\r\n } = RAW_WRAP.config?.dimensions ?? {}\r\n\r\n FILES_DATA.push(\r\n {\r\n customizable: false,\r\n name : '_screen.scss',\r\n folder : 'styles',\r\n content : readFileSync(path.join(import.meta.dirname, '../styles/_screen.scss'), 'utf-8').replace('/* @__CONSTANTS__ */', `$SCREEN_CRUSHED_HEIGHT: ${CRUSHED_HEIGHT}px;\\n$SCREEN_MOBILE_WIDTH: ${MOBILE_WIDTH}px;\\n$SCREEN_TABLET_WIDTH: ${TABLET_WIDTH}px;`)\r\n })\r\n \r\n break\r\n }\r\n case 'Transmitter':\r\n {\r\n TYPES.customizable += `declare module '${ID}/plugins/${RAW_WRAP.name}'\\n{\\n\\texport interface TransmitterChannels { /* You can add channels to the Transmitter plugin here. */ }\\n}\\n\\n`\r\n \r\n break\r\n }\r\n case 'Anime':\r\n {\r\n if (!RAW_WRAP.config) break\r\n \r\n const {plugins: ANIME_PLUGINS, ...REST} = RAW_WRAP.config\r\n \r\n if (ANIME_PLUGINS)\r\n {\r\n let type = ''\r\n \r\n for (let i = 0, max = ANIME_PLUGINS.length; i < max; i++)\r\n {\r\n const PLUGIN = ANIME_PLUGINS[i]\r\n\r\n config += `${PLUGIN}: () => import('gsap/${PLUGIN}'),`\r\n type += `${PLUGIN}: typeof import('gsap/${PLUGIN}').default, `\r\n }\r\n\r\n if (config)\r\n {\r\n config = `{graph:{${config.slice(0, -1)}},${JSON.stringify(REST).substring(1)}`\r\n\r\n TYPES.privatePlugins += ` declare module '${ID}/plugins/${RAW_WRAP.name}' { export interface AnimeBucket { ${type}}; };`\r\n }\r\n else config = JSON.stringify(REST)\r\n }\r\n\r\n break\r\n }\r\n case 'Synthra':\r\n {\r\n const\r\n {pick: RAW_PICK, ...REST} = RAW_WRAP.config ?? {},\r\n PICK = new Set(['WebGLRenderer', 'Scene', 'PerspectiveCamera', ...(RAW_PICK ?? [])]),\r\n COMMENTS_RGX_1 = /\\/\\*[\\s\\S]*?\\*\\//g,\r\n COMMENTS_RGX_2 = /\\/\\/.*$/gm,\r\n ALIAS_RGX = /\\s+as\\s+/,\r\n RGX_0 = /export\\s+default\\s+(?:class|function)?\\s*([A-Za-z_$][\\w$]*)?/,\r\n RGX_1 = /export\\s+(?:class|function|const|let|var)\\s+([A-Za-z_$][\\w$]*)/g,\r\n RGX_2 = /export\\s*{\\s*([^}]+)\\s*}/g,\r\n RGX_3 = /export\\s+\\*\\s+(?:as\\s+([A-Za-z_$][\\w$]*)\\s+)?from\\s+['\"](.+)['\"]/g\r\n \r\n let\r\n dir = path.dirname(fileURLToPath(import.meta.resolve('three'))),\r\n pathPackageJSON = ''\r\n\r\n do\r\n {\r\n pathPackageJSON = path.join(dir, 'package.json')\r\n\r\n if (fs.existsSync(pathPackageJSON)) break\r\n \r\n const DIR = path.dirname(dir)\r\n\r\n if (dir === DIR || !DIR) Logs.throw('VITE', 'UNABLE TO FIND THE THREE JS PACKAGE.')\r\n\r\n dir = DIR\r\n }\r\n while (true)\r\n\r\n const\r\n MAP = new Map<string, Set<string>>(),\r\n SEEN = new Map<string, string[]>(),\r\n PACKAGE_JSON = JSON.parse(readFileSync(pathPackageJSON, 'utf-8')),\r\n PACKAGE_NAME = PACKAGE_JSON['name'],\r\n PACKAGE_EXPORTS = PACKAGE_JSON['exports']\r\n\r\n /**\r\n * Yields `[module specifier, file path]` pairs for one entry of the `three` package exports.\r\n */\r\n function* g(key: string, value: string): Generator<[module: string, path: string], void, void>\r\n {\r\n const BASE_MODULE = path.join(PACKAGE_NAME, key.endsWith('*') ? key.slice(0, -1) : key)\r\n \r\n if (value.includes('*')) // *The main path \".\" (three) does not have an asterisk \"*\"\r\n {\r\n const\r\n [PREFIX, SUFFIX] = value.split('*'),\r\n PREFIX_CLEAN = PREFIX[0] === '.' ? PREFIX.substring(1) : PREFIX,\r\n ENTRIES = readdirSync(path.join(dir, PREFIX),\r\n {\r\n recursive : true,\r\n withFileTypes: true\r\n })\r\n\r\n for (let j = 0, jMax = ENTRIES.length; j < jMax; j++)\r\n {\r\n const ENTRY = ENTRIES[j]\r\n \r\n if (!ENTRY.isFile() || !ENTRY.name.endsWith('.js')) continue\r\n\r\n const\r\n PATH = path.join(ENTRY.parentPath ?? (ENTRY as { path?: string }).path, ENTRY.name),\r\n PATH_NORMALIZED = path.sep === '/' ? PATH : PATH.replaceAll(path.sep, '/'),\r\n PREFIX_INDEX = PATH_NORMALIZED.lastIndexOf(PREFIX_CLEAN)\r\n\r\n if (PREFIX_INDEX === -1 || !PATH_NORMALIZED.endsWith(SUFFIX)) continue\r\n\r\n yield [path.join(BASE_MODULE, PATH_NORMALIZED.substring(PREFIX_INDEX + PREFIX_CLEAN.length)), PATH]\r\n }\r\n }\r\n else if (value.endsWith('.js'))\r\n {\r\n const PATH = path.join(dir, value)\r\n\r\n if (fs.existsSync(PATH)) yield [BASE_MODULE, PATH]\r\n }\r\n }\r\n\r\n /**\r\n * Returns the picked export names found in a file, following `export *` re-exports (memoized).\r\n */\r\n function r(p: string): string[]\r\n {\r\n let exported = SEEN.get(p)\r\n \r\n if (exported) return exported\r\n\r\n SEEN.set(p, exported = [])\r\n\r\n const FILE = readFileSync(p, 'utf-8').replace(COMMENTS_RGX_1, '').replace(COMMENTS_RGX_2, '')\r\n\r\n let match = RGX_0.exec(FILE)\r\n\r\n if (match)\r\n {\r\n const NAME = match[1]\r\n\r\n if (NAME && PICK.has(NAME)) exported.push(NAME)\r\n }\r\n\r\n RGX_1.lastIndex = 0\r\n\r\n while (match = RGX_1.exec(FILE))\r\n {\r\n const NAME = match[1]\r\n\r\n if (PICK.has(NAME)) exported.push(NAME)\r\n }\r\n\r\n RGX_2.lastIndex = 0\r\n \r\n while (match = RGX_2.exec(FILE))\r\n {\r\n const NAMES = match[1].split(',')\r\n\r\n for (let j = 0, jMax = NAMES.length; j < jMax; j++)\r\n {\r\n const\r\n BASE_AND_ALIAS = NAMES[j].split(ALIAS_RGX),\r\n NAME = (BASE_AND_ALIAS[1] ?? BASE_AND_ALIAS[0]).trim()\r\n\r\n if (PICK.has(NAME)) exported.push(NAME)\r\n }\r\n }\r\n\r\n RGX_3.lastIndex = 0\r\n\r\n while (match = RGX_3.exec(FILE))\r\n {\r\n const NAME = match[1]\r\n\r\n if (NAME)\r\n {\r\n if (PICK.has(NAME)) exported.push(NAME)\r\n\r\n continue\r\n }\r\n \r\n let subPath = path.resolve(path.dirname(p), match[2])\r\n \r\n if (!subPath.endsWith('.js')) subPath += '.js'\r\n\r\n if (subPath !== p && fs.existsSync(subPath)) exported.push(...r(subPath))\r\n }\r\n\r\n return exported\r\n }\r\n\r\n let\r\n value,\r\n generated: [module: string, path: string] | void\r\n\r\n for (const KEY in PACKAGE_EXPORTS)\r\n {\r\n value = PACKAGE_EXPORTS[KEY]\r\n\r\n if (typeof value !== 'string' && (typeof value !== 'object' || typeof (value = value.import ?? value.default ?? value.module) !== 'string')) continue\r\n\r\n const GEN = g(KEY, value)\r\n\r\n while (generated = GEN.next().value)\r\n {\r\n const\r\n MODULE_NORMALIZED = path.sep === '/' ? generated[0] : generated[0].replaceAll(path.sep, '/'),\r\n EXPORTED = r(generated[1])\r\n\r\n for (let k = 0, kMax = EXPORTED.length; k < kMax; k++)\r\n {\r\n const SET = MAP.get(MODULE_NORMALIZED)\r\n\r\n SET ? SET.add(EXPORTED[k]) : MAP.set(MODULE_NORMALIZED, new Set([EXPORTED[k]]))\r\n }\r\n }\r\n }\r\n\r\n const TREATED = new Set<string>()\r\n\r\n let type = ''\r\n\r\n config = '{ getThree: async () => { '\r\n\r\n for (let j = 0, jMax = MAP.size, module = '', set: Set<string> | null = null, size = 0; j < jMax; j++, module = '', set = null, size = 0)\r\n {\r\n for (const [MODULE, SET] of MAP)\r\n {\r\n for (const NAME of TREATED) if (SET.has(NAME)) SET.delete(NAME)\r\n\r\n size = SET.size\r\n\r\n switch (true)\r\n {\r\n case !size : MAP.delete(MODULE)\r\n case set && (size < set.size || size === set.size && MODULE.length > module.length): continue\r\n default :\r\n module = MODULE\r\n set = SET\r\n }\r\n }\r\n\r\n if (!set) break\r\n\r\n const\r\n NAMES = [...set],\r\n LENGTH = NAMES.length\r\n\r\n if (LENGTH === 1)\r\n {\r\n const NAME = NAMES[0]\r\n \r\n for (const [MODULE, SET] of MAP)\r\n {\r\n if (MODULE === module) continue\r\n\r\n if (SET.has(NAME))\r\n {\r\n if (MODULE === PACKAGE_NAME ||\r\n module !== PACKAGE_NAME &&\r\n (\r\n MODULE.endsWith(`${NAME}.js`) ||\r\n !module.endsWith(`${NAME}.js`) && MODULE.length < module.length\r\n )\r\n )\r\n {\r\n set.delete(NAME)\r\n \r\n module = MODULE\r\n set = SET\r\n }\r\n else SET.delete(NAME)\r\n }\r\n }\r\n }\r\n \r\n for (let k = 0; k < LENGTH; k++)\r\n {\r\n const NAME = NAMES[k]\r\n \r\n TREATED.add(NAME)\r\n\r\n type += `${NAME}: typeof import('${module}').${NAME}, `\r\n }\r\n\r\n config += `const { ${NAMES.join(',')} } = await import('${module}'); `\r\n\r\n MAP.delete(module)\r\n }\r\n\r\n config += `return { ${[...TREATED].join(',')} }; }, ${JSON.stringify(REST).slice(1, -1)} }`\r\n\r\n if (type) TYPES.privatePlugins += ` declare module '${ID}/plugins/${RAW_WRAP.name}' { export interface SynthraThree { ${type}}; };`\r\n\r\n TYPES.customizable += `declare module '${ID}/plugins/${RAW_WRAP.name}'\\n{\\n\\texport interface SynthraBucket { /* Enhance type checking for Synthra bucket here. */ }\\n\\n\\texport interface SynthraPlugins { /* Enhance type checking for Synthra plugins here. */ }\\n}\\n\\n`\r\n\r\n break\r\n }\r\n default:\r\n }\r\n \r\n data += `{plugin:${RAW_WRAP.name},config:${config || JSON.stringify(RAW_WRAP.config)}},` // *Plugin.WRAP\r\n TYPES.private += ` export const ${RAW_WRAP.name}: typeof import('upwwwards/plugins').${RAW_WRAP.name};`\r\n\r\n NAMES.add(RAW_WRAP.name)\r\n }\r\n\r\n return {\r\n virtual: `import {${[...NAMES].join(',')}} from 'upwwwards/plugins'; PLUGINS.push(${data});`,\r\n types : TYPES,\r\n files : FILES_DATA\r\n }\r\n}\r\n\r\n/**\r\n * Applies the `classter` option to the shared Classter state and returns the analyzer, or `undefined` when disabled.\r\n*/\r\nfunction getClasster(classter: Vite.CONFIG['classter'], ext: Vite.ADAPTER_MAP[Vite.ADAPTER_KEY]['ext']): typeof Classter | undefined\r\n{\r\n if (!classter) return\r\n\r\n const Classter = classter.Classter\r\n\r\n if (classter.off) return\r\n\r\n if (classter.silent) Classter.warn = false\r\n\r\n if (classter.identifiers)\r\n {\r\n if (classter.identifiers.class) Classter.addClassIdentifiers(classter.identifiers.class)\r\n if (classter.identifiers.attributes) Classter.addAttributesIdentifiers(classter.identifiers.attributes)\r\n }\r\n\r\n if (classter.alias) Classter.addAlias(classter.alias)\r\n\r\n Classter.ext = ext\r\n\r\n return Classter\r\n}\r\n\r\n/**\r\n * Resolves the plugin options into the shared hook state (virtual module code, generated files, Classter).\r\n*/\r\nfunction getData(config: Vite.CONFIG): Vite.DATA\r\n{\r\n const\r\n ADAPTER_DATA = getAdapterData(config.adapter),\r\n UP_DATA = getUpData(config.up),\r\n PLUGIN_DATA = getPluginsData(config.plugins),\r\n Classter = getClasster(config.classter, ADAPTER_DATA.ext)\r\n\r\n return {\r\n readIn : config.readIn || ADAPTER_DATA.readIn,\r\n setupIn: `${(config.setupIn || ADAPTER_DATA.setupIn)}/${FOLDER_NAME}`,\r\n virtual: `import Adapter from 'upwwwards/adapters/${ADAPTER_DATA.name}'; import { construct } from 'upwwwards/symbols'; const PLUGINS = []; ${PLUGIN_DATA.virtual} Up[construct](${UP_DATA.virtual}, Adapter, PLUGINS); export default Up;`,\r\n files :\r\n [\r\n {\r\n customizable: false,\r\n name : 'upwwwards.d.ts',\r\n folder : 'types',\r\n content : `import type { Up } from '${ID}'; import { Adapter } from 'upwwwards/adapters'; import type { ${ADAPTER_DATA.name}Config, ${ADAPTER_DATA.name}Ref } from 'upwwwards/adapters/${ADAPTER_DATA.name}'; declare module '${ID}' { namespace Up { export const Adapter: typeof import('upwwwards/adapters/${ADAPTER_DATA.name}').default;${PLUGIN_DATA.types.private} }; ${UP_DATA.type} }; declare module 'upwwwards/adapters' { export interface AdapterConfig extends ${ADAPTER_DATA.name}Config {}; export interface AdapterRef<T> extends ${ADAPTER_DATA.name}Ref<T> {}; };${PLUGIN_DATA.types.privatePlugins}`\r\n },\r\n {\r\n customizable: true,\r\n name : 'config.d.ts',\r\n folder : 'types',\r\n content : `declare module '${ID}'\\n{\\n\\texport interface AppCache\\n\\t{\\n\\t\\t/*\\n\\t\\t\\tYou can add data types to enhance the application cache.\\n\\t\\t\\tNever use dynamic keys; use only character strings (risk of memory overflow in SSR).\\n\\t\\t*/\\n\\t}\\n}\\n\\n${PLUGIN_DATA.types.customizable}export {} /* IMPORTANT: DO NOT DELETE THIS LINE. */`\r\n },\r\n ...PLUGIN_DATA.files\r\n ],\r\n Classter\r\n }\r\n}\r\n\r\n // ##UTILS\r\n/**\r\n * Joins two paths, merging the trailing segments of `a` that `b` starts with (`/proj/app` + `/app/x` gives `/proj/app/x`).\r\n*/\r\nfunction mergePaths(a: string, b: string): string\r\n{\r\n a = a.replaceAll('\\\\', '/').replace(/\\/+$/g, '')\r\n b = b.replaceAll('\\\\', '/').replace(/^\\/+/g, '')\r\n\r\n const\r\n A = a.split('/'),\r\n B = b.split('/'),\r\n AL = A.length,\r\n BL = B.length\r\n\r\n RUNNER: for (let i = AL - 1, j = 0, max = 0; i > -1; i--)\r\n {\r\n if (A[i] !== B[0]) continue RUNNER\r\n\r\n for (j = 1, max = Math.min(AL - i, BL); j < max; j++) if (A[i + j] !== B[j]) continue RUNNER\r\n\r\n return path.join(a, ...B.slice(j))\r\n }\r\n\r\n return path.join(a, b)\r\n}\r\n\r\n/**\r\n * Runs Classter on the `.html` files directly inside `readIn` (not recursive).\r\n*/\r\nfunction readHTMLFiles(data: Vite.DATA): void // TODO: non récursif mais est-ce utile ? De base c'était pour lire le fichier html de svelte (peut-être ajouter une option)\r\n{\r\n const FILES = readdirSync(data.readIn, { withFileTypes: true })\r\n\r\n for (let i = 0, max = FILES.length; i < max; i++)\r\n {\r\n const FILE = FILES[i]\r\n\r\n if (FILE.isFile() && path.extname(FILE.name) === '.html') data.Classter!.analyzeHTML(readFileSync(`${data.readIn}/${FILE.name}`, 'utf-8'), FILE.name)\r\n }\r\n}\r\n\r\n/**\r\n * Vite `config` hook: excludes the generated `private` folder from the dev server file watcher.\r\n*/\r\nfunction config(): Omit<UserConfig, 'plugins'> { return { server: { watch: { ignored: [`**/${FOLDER_NAME}/${PRIVATE_FOLDER_NAME}/**`] } } } }\r\n\r\n/**\r\n * Vite `configResolved` hook: stores the Vite root and whether the dev server is running.\r\n*/\r\nfunction configResolved(this: Vite.DATA, config: ResolvedConfig): void\r\n{\r\n dev = config.command === 'serve'\r\n this.readIn = mergePaths(config.root, this.readIn).replaceAll('\\\\', '/')\r\n this.setupIn = mergePaths(config.root, this.setupIn).replaceAll('\\\\', '/')\r\n}\r\n\r\n/**\r\n * Vite `configureServer` hook: tracks dev servers so `classter.css` can be reloaded when new classes appear.\r\n*/\r\nfunction configureServer(server: ViteDevServer): void\r\n{\r\n serversLength = SERVERS.push(server)\r\n\r\n server.httpServer?.once('close', (): void =>\r\n {\r\n const INDEX = SERVERS.indexOf(server)\r\n\r\n if (INDEX === -1) return Logs.warn('VITE', 'UNABLE TO DELETE THE SERVER.')\r\n\r\n SERVERS.splice(INDEX, 1)\r\n\r\n serversLength--\r\n })\r\n}\r\n\r\n/**\r\n * Vite `resolveId` hook: maps `upwwwards` and `classter.css` to their virtual modules; throws when `upwwwards` cannot be resolved.\r\n*/\r\nasync function resolveID(this: Rolldown.PluginContext, id: string): Promise<string | null>\r\n{\r\n switch (id)\r\n {\r\n case ID: try\r\n {\r\n const _ID = (await this.resolve(id, undefined, { skipSelf: true }))!.id\r\n\r\n return _ID.startsWith(VIRTUAL_ID) ? _ID : VIRTUAL_ID + _ID\r\n }\r\n catch { Logs.throw('VITE', 'UNABLE TO RESOLVE THE PATH TO UPWWWARDS.') }\r\n case CLASSTER_ID: return VIRTUAL_CLASSTER_ID\r\n default : return null\r\n }\r\n}\r\n\r\n/**\r\n * Vite `load` hook: serves the virtual `upwwwards` module, and `classter.css` (full CSS in dev, a placeholder rule in build).\r\n*/\r\nfunction load(this: Vite.DATA, id: string): string | null\r\n{\r\n return id.startsWith(VIRTUAL_ID)\r\n ? `import Up from '${id.substring(VIRTUAL_ID.length)}'; ${this.virtual}`\r\n : this.Classter && id === VIRTUAL_CLASSTER_ID\r\n ? dev\r\n ? this.Classter.get()\r\n : CLASSTER_MARK_STYLE\r\n : null\r\n}\r\n\r\n/**\r\n * Vite `buildStart` hook: scans `readIn` HTML files with Classter and writes the generated files into the project.\r\n*/\r\nfunction buildStart(this: Vite.DATA): void\r\n{\r\n if (this.Classter) readHTMLFiles(this)\r\n\r\n for (let i = 0, max = this.files.length; i < max; i++)\r\n {\r\n const\r\n DATA = this.files[i],\r\n PATH = path.resolve(`${this.setupIn}/${DATA.customizable ? CUSTOMIZABLE_FOLDER_NAME : PRIVATE_FOLDER_NAME}/${DATA.folder}/${DATA.name}`)\r\n\r\n if (fs.existsSync(PATH) && (DATA.customizable || fs.readFileSync(PATH, 'utf-8') === DATA.content)) continue\r\n\r\n fs.mkdirSync(path.dirname(PATH), { recursive: true })\r\n fs.writeFileSync(PATH, DATA.content)\r\n }\r\n}\r\n\r\n/**\r\n * Vite `transform` hook: analyzes components and HTML under `readIn` with Classter, then reloads `classter.css` on dev servers when it changed.\r\n * Ignores Vite style/script extracts (`?…type=style|script…`) so they are not parsed as SFCs.\r\n*/\r\nfunction transform(this: Vite.DATA, code: string, id: string): void\r\n{\r\n if (!this.Classter || /\\?(?:.*&)?type=(?:style|script)\\b/.test(id)) return\r\n\r\n const FILE = id.split('?', 1)[0]!.replaceAll('\\\\', '/')\r\n\r\n if (!FILE.startsWith(`${this.readIn}/`)) return\r\n\r\n if (FILE.endsWith(this.Classter.ext)) this.Classter.analyze(code, id)\r\n else if (FILE.endsWith('.html')) this.Classter.analyzeHTML(code, id)\r\n\r\n if (!this.Classter.updated || !serversLength) return\r\n\r\n for (let i = 0; i < serversLength; i++)\r\n {\r\n const\r\n SERVER = SERVERS[i],\r\n MOD = SERVER.moduleGraph.getModuleById(VIRTUAL_CLASSTER_ID)\r\n\r\n if (!MOD) continue\r\n\r\n SERVER.reloadModule(MOD)\r\n }\r\n\r\n this.Classter.updated = false\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\n/**\r\n * Creates the `upwwwards` Vite plugin, the entry point that sets up the runtime for Nuxt 4 or SvelteKit 2.\r\n *\r\n * The plugin:\r\n * - Replaces every `import Up from 'upwwwards'` with a virtual module that constructs `Up` exactly once\r\n * (on the server and in the browser) with the `up` config, the selected adapter and the enabled plugins.\r\n * - Writes generated files into `<setupIn>/upwwwards/` at build start: `private/types/upwwwards.d.ts`\r\n * (types of `Up.Adapter`, the enabled plugins, `AdapterConfig` / `AdapterRef` and `EventData`; rewritten when outdated),\r\n * `customizable/types/config.d.ts` (created once, then yours to edit, to augment `AppCache` and plugin interfaces),\r\n * and `private/styles/_screen.scss` (breakpoint SCSS variables) when `Screen` is enabled.\r\n * The `private` folder is excluded from the dev server file watcher.\r\n * - When `classter` is set, compiles atomic class tokens found in templates into the virtual stylesheet `classter.css`:\r\n * served live and hot-reloaded in dev, and injected into the emitted CSS bundle in build.\r\n *\r\n * After construction, the app must call `Up.set(adapterConfig)` once in the browser to start the runtime.\r\n * @param cfg Plugin options (see {@link Vite.CONFIG}).\r\n * @returns The Vite plugin (enforced `pre`).\r\n * @throws Through `Logs.throw` when `adapter` is not `'nuxt'` or `'svelte'`, or when `Synthra` is enabled and the `three` package cannot be found.\r\n * Resolving `upwwwards` also throws if the package path cannot be resolved.\r\n * @note Side effects: writes files into the project, and configures the shared Classter state (aliases, identifiers, warnings).\r\n * @note When `classter` is enabled, import `classter.css` once in the app (e.g. in `app.vue` or the root `+layout.svelte`).\r\n * @example\r\n * ```ts\r\n * // nuxt.config.ts\r\n * import upwwwards from 'upwwwards/initializers/vite'\r\n * import Vue from 'upwwwards/classter/Vue'\r\n *\r\n * export default defineNuxtConfig({\r\n * vite:\r\n * {\r\n * plugins:\r\n * [\r\n * upwwwards({\r\n * adapter : 'nuxt',\r\n * up : { thread: { flowBudget: 8 } },\r\n * plugins : ['Scroll', { name: 'Screen', config: { dimensions: { mobileWidth: 768 } } }],\r\n * classter: { Classter: Vue, alias: { 'my-pa': 'padding' } }\r\n * })\r\n * ]\r\n * }\r\n * })\r\n * ```\r\n * @example\r\n * ```ts\r\n * // vite.config.ts (SvelteKit)\r\n * import { sveltekit } from '@sveltejs/kit/vite'\r\n * import { defineConfig } from 'vite'\r\n * import upwwwards from 'upwwwards/initializers/vite'\r\n * import Svelte from 'upwwwards/classter/Svelte'\r\n *\r\n * export default defineConfig({\r\n * plugins:\r\n * [\r\n * upwwwards({\r\n * adapter : 'svelte',\r\n * plugins : ['Observer', { name: 'Anime', config: { plugins: ['ScrollTrigger'] } }],\r\n * classter: { Classter: Svelte }\r\n * }),\r\n * sveltekit()\r\n * ]\r\n * })\r\n * ```\r\n*/\r\nexport default function vite(cfg: Vite.CONFIG): VitePlugin\r\n{\r\n const DATA = getData(cfg)\r\n\r\n return {\r\n name : ID,\r\n enforce : 'pre',\r\n config,\r\n configResolved : configResolved.bind(DATA),\r\n configureServer,\r\n resolveId : resolveID,\r\n load : load.bind(DATA),\r\n buildStart : buildStart.bind(DATA),\r\n ...(DATA.Classter\r\n ? {\r\n transform : transform.bind(DATA),\r\n generateBundle: function (this: Rolldown.PluginContext, _options: Rolldown.NormalizedOutputOptions, bundle: Rolldown.OutputBundle): void\r\n {\r\n for (const KEY in bundle)\r\n {\r\n const FILE = bundle[KEY]\r\n\r\n if (FILE.type !== 'asset' || !FILE.fileName.endsWith('.css')) continue\r\n\r\n let source = typeof FILE.source === 'string' ? FILE.source : Buffer.from(FILE.source).toString('utf-8')\r\n\r\n if (!source.includes(CLASSTER_MARK)) continue\r\n\r\n const MATCH = source.match(CLASSTER_MARK_RGX)\r\n\r\n if (MATCH?.index != null) source = source.substring(0, MATCH.index) + source.substring(MATCH.index + MATCH[0].length)\r\n\r\n FILE.source = DATA.Classter!.get() + source.trim()\r\n\r\n break\r\n }\r\n }\r\n }\r\n : undefined\r\n )\r\n }\r\n}"],"mappings":"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","names":["config","i","max","r","NAMES","value"]}
1
+ {"version":3,"sources":["../../src/initializers/vite.ts"],"sourcesContent":["/* [vite] */\r\n\r\n// #IMPORTS\r\n\r\n // ##NODE\r\nimport fs, { readdirSync, readFileSync } from 'fs'\r\nimport { fileURLToPath } from 'url'\r\nimport path from 'path'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##TYPES\r\nimport type { UserConfig, ResolvedConfig, Plugin as VitePlugin, ViteDevServer, Rolldown } from 'vite'\r\n\r\nimport type Up from '../core/Up.js'\r\n\r\nimport type Plugin from '../plugins/@/Plugin.js'\r\nimport type Screen from '../plugins/Screen.js'\r\n\r\nimport type Classter from '../classter/@/Classter.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Vite\r\n{\r\n /**\r\n * Built-in adapter presets, keyed by the value of {@link Vite.CONFIG.adapter}:\r\n * adapter module name, default `readIn` / `setupIn` directories, and component file extension analyzed by Classter.\r\n */\r\n export type ADAPTER_MAP =\r\n {\r\n svelte:\r\n {\r\n name : 'Svelte',\r\n readIn : '/src',\r\n setupIn: '/src/lib',\r\n ext : '.svelte'\r\n },\r\n nuxt:\r\n {\r\n name : 'Nuxt',\r\n readIn : '/app',\r\n setupIn: '/app',\r\n ext : '.vue'\r\n }\r\n }\r\n\r\n /**\r\n * Supported adapter keys: `'nuxt'` (Nuxt 4) or `'svelte'` (SvelteKit 2).\r\n */\r\n export type ADAPTER_KEY = keyof ADAPTER_MAP\r\n\r\n /**\r\n * Options of the `upwwwards` Vite plugin (see {@link vite}).\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Host framework: `'nuxt'` or `'svelte'`.\r\n * Selects the adapter exposed as `Up.Adapter` (`upwwwards/adapters/Nuxt` or `upwwwards/adapters/Svelte`),\r\n * the default `readIn` / `setupIn` directories, and the component extension (`.vue` / `.svelte`) analyzed by Classter.\r\n */\r\n adapter: ADAPTER_KEY,\r\n /**\r\n * Source directory scanned by Classter, as a path starting with `/` resolved against the Vite root.\r\n * Components and `.html` files under it are analyzed when Vite transforms them, and the `.html` files\r\n * directly inside it (e.g. SvelteKit `app.html`) are analyzed at build start.\r\n * Defaults to `'/app'` with Nuxt and `'/src'` with SvelteKit. Unused when Classter is disabled.\r\n */\r\n readIn?: `/${string}`,\r\n /**\r\n * Directory in which the plugin creates its `upwwwards` folder of generated files,\r\n * as a path starting with `/` resolved against the Vite root.\r\n * Defaults to `'/app'` with Nuxt and `'/src/lib'` with SvelteKit.\r\n */\r\n setupIn?: `/${string}`,\r\n /**\r\n * Core runtime configuration (`event`, `thread`) passed to `Up` at construction.\r\n * It is serialized with `JSON.stringify`, so it must only contain JSON-compatible values.\r\n * Entries of `event.enhance` are also turned into typings for the generated `EventData` interface.\r\n */\r\n up?: Up.CONFIG,\r\n /**\r\n * Plugins to enable, each given by name (e.g. `'Scroll'`) or as `{ name, config }`.\r\n * Available names: `Observer`, `Screen`, `Transmitter`, `Scroll`, `Anime`, `Puppeteer`, `Synthra`.\r\n * Configs are serialized with `JSON.stringify`, except Anime `plugins` (turned into lazy `gsap/<name>` imports)\r\n * and Synthra `pick` (turned into lazy imports of the picked Three.js exports).\r\n * A name declared more than once logs a warning and only its first declaration is kept.\r\n */\r\n plugins?: (Plugin.RAW_WRAP | Plugin.RAW_WRAP['name'])[],\r\n /**\r\n * Enables Classter, the optional atomic-CSS generator (see {@link Vite.CLASSTER_CONFIG}).\r\n * Disabled when omitted.\r\n */\r\n classter?: CLASSTER_CONFIG\r\n }\r\n\r\n /**\r\n * File generated into the project at build start.\r\n * @internal\r\n */\r\n export type FILE_DATA =\r\n {\r\n /**\r\n * `true` for files created once in the `customizable` folder and never overwritten;\r\n * `false` for files in the `private` folder, rewritten whenever their content changes.\r\n */\r\n customizable: boolean,\r\n /**\r\n * File name, including its extension.\r\n */\r\n name: string,\r\n /**\r\n * Sub-folder (`types`, `styles`, …) inside the `customizable` or `private` folder.\r\n */\r\n folder: string,\r\n /**\r\n * File content.\r\n */\r\n content: string\r\n }\r\n\r\n /**\r\n * Resolved plugin state shared by the Vite hooks.\r\n * @internal\r\n */\r\n export type DATA =\r\n {\r\n /**\r\n * Directory scanned by Classter.\r\n */\r\n readIn: string,\r\n /**\r\n * Directory of the generated `upwwwards` folder (already suffixed with `/upwwwards`).\r\n */\r\n setupIn: string,\r\n /**\r\n * Code of the virtual `upwwwards` module, appended after the import of the real runtime.\r\n */\r\n virtual: string,\r\n /**\r\n * Files to generate at build start.\r\n */\r\n files: FILE_DATA[],\r\n /**\r\n * Configured Classter analyzer, or `undefined` when Classter is disabled.\r\n */\r\n Classter?: typeof Classter\r\n }\r\n\r\n /**\r\n * Code generated from the `up` option.\r\n * @internal\r\n */\r\n export type UP_DATA =\r\n {\r\n /**\r\n * Serialized `up` config injected into the virtual module.\r\n */\r\n virtual: string,\r\n /**\r\n * `EventData` interface declaration built from `up.event.enhance` (empty when unused).\r\n */\r\n type: string\r\n }\r\n\r\n /**\r\n * Code generated from the `plugins` option.\r\n * @internal\r\n */\r\n export type PLUGINS_DATA =\r\n {\r\n /**\r\n * Virtual module code importing the plugins and pushing their configs.\r\n */\r\n virtual: string,\r\n /**\r\n * Type declarations injected into the generated type files.\r\n */\r\n types:\r\n {\r\n /**\r\n * `Up.<Plugin>` declarations for the enabled plugins.\r\n */\r\n private: string,\r\n /**\r\n * Plugin-specific module augmentations (Anime GSAP plugins, Synthra Three.js exports).\r\n */\r\n privatePlugins: string,\r\n /**\r\n * Editable augmentation stubs added to the customizable `config.d.ts`.\r\n */\r\n customizable: string\r\n },\r\n /**\r\n * Extra plugin files to generate (e.g. `_screen.scss`).\r\n */\r\n files: FILE_DATA[]\r\n }\r\n\r\n /**\r\n * Classter options. Classter compiles atomic class tokens found in templates (e.g. `pa:1rem`, `co:[#fff]:before`)\r\n * into the virtual stylesheet `classter.css`, which the app must import once.\r\n */\r\n export type CLASSTER_CONFIG =\r\n {\r\n /**\r\n * Analyzer matching the adapter: `Vue` from `upwwwards/classter/Vue` (Nuxt)\r\n * or `Svelte` from `upwwwards/classter/Svelte` (SvelteKit).\r\n */\r\n Classter: typeof Classter,\r\n /**\r\n * Disables Classter while keeping its config. Default `false`.\r\n * @warning While disabled, `classter.css` has no content provider: do not import it.\r\n */\r\n off?: boolean,\r\n /**\r\n * Silences warnings about unknown aliases and expressions that cannot be analyzed statically. Default `false`.\r\n * Warnings about invalid values and unsupported pseudo-elements are still logged.\r\n */\r\n silent?: boolean,\r\n /**\r\n * Extra attribute / prop names to scan, stored in lowercase and kebab-case.\r\n */\r\n identifiers?:\r\n {\r\n /**\r\n * Names whose values are class lists, in addition to `class` (e.g. `['innerClass']`).\r\n */\r\n class?: Classter.IDENTIFIER[],\r\n /**\r\n * Names whose object-literal values may contain class identifiers\r\n * (e.g. `attrs` for `attrs={{ class: 'pa:1rem' }}`).\r\n */\r\n attributes?: Classter.IDENTIFIER[]\r\n },\r\n /**\r\n * Custom aliases mapping a shortcut to a CSS property, e.g. `{ 'my-pa': 'padding' }` (see `Classter.addAlias`).\r\n */\r\n alias?: Record<string, string>\r\n }\r\n}\r\n\r\n// #CONSTANTS\r\n\r\n // ##THIS\r\nconst\r\nFOLDER_NAME = 'upwwwards',\r\nCUSTOMIZABLE_FOLDER_NAME = 'customizable',\r\nPRIVATE_FOLDER_NAME = 'private',\r\nID = 'upwwwards',\r\nVIRTUAL_ID = `\\0virtual::${ID}::`, // + real ID (path)\r\nCLASSTER_ID = 'classter.css',\r\nVIRTUAL_CLASSTER_ID = `\\0virtual::${CLASSTER_ID}`,\r\nCLASSTER_MARK = '[data-upwwwards-classter]',\r\nCLASSTER_MARK_STYLE = `${CLASSTER_MARK}{display:contents}`,\r\nCLASSTER_MARK_RGX = new RegExp(`\\\\${CLASSTER_MARK}\\\\s*{\\\\s*display\\\\s*:\\\\s*contents\\\\s*;?\\\\s*}\\\\s*`)\r\n,\r\n/**\r\n * Package entry points that must stay out of Vite's dependency prebundle.\r\n * Prebundling `upwwwards` while plugins resolve `../core/Up.js` raw creates two `Up` / `Event`\r\n * copies: `construct` runs on one, `Scroll[set]` / `Event.sub` hit the other (`Up.Scroll` undefined).\r\n*/\r\nOPTIMIZE_DEPS_EXCLUDE =\r\n[\r\n ID,\r\n `${ID}/contexts/nuxt`,\r\n `${ID}/contexts/sveltekit`,\r\n `${ID}/adapters`,\r\n `${ID}/adapters/Nuxt`,\r\n `${ID}/adapters/Svelte`,\r\n `${ID}/plugins`,\r\n `${ID}/plugins/Transmitter`,\r\n `${ID}/plugins/Scroll`,\r\n `${ID}/plugins/Anime`,\r\n `${ID}/plugins/Puppeteer`,\r\n `${ID}/plugins/Synthra`,\r\n `${ID}/scripts`,\r\n `${ID}/scripts/Trees`,\r\n `${ID}/scripts/Arrays`,\r\n `${ID}/classter/Vue`,\r\n `${ID}/classter/Svelte`,\r\n `${ID}/symbols`\r\n] as const\r\n,\r\nSERVERS: ViteDevServer[] = []\r\n\r\n// #VARIABLES\r\n\r\n // ##THIS\r\nlet\r\ndev = false\r\n,\r\nserversLength = 0\r\n\r\n// #FUNCTIONS\r\n\r\n // ##GET\r\n/**\r\n * Returns the preset of an adapter key; throws through `Logs.throw` when the key is unknown.\r\n*/\r\nfunction getAdapterData<T extends Vite.ADAPTER_KEY, U extends Vite.ADAPTER_MAP[T]>(adapter: T): U\r\n{\r\n switch (adapter)\r\n {\r\n case 'svelte': return {\r\n name : 'Svelte',\r\n readIn : '/src',\r\n setupIn: '/src/lib',\r\n ext : '.svelte'\r\n } as U\r\n case 'nuxt': return {\r\n name : 'Nuxt',\r\n readIn : '/app',\r\n setupIn: '/app',\r\n ext : '.vue'\r\n } as U\r\n default: Logs.throw('VITE', `THE \"${adapter}\" ADAPTER KEY IS NOT RECOGNIZED.`)\r\n }\r\n}\r\n\r\n/**\r\n * Serializes the `up` option and builds the `EventData` typings from `up.event.enhance`.\r\n*/\r\nfunction getUpData(up: Vite.CONFIG['up']): Vite.UP_DATA\r\n{\r\n return up\r\n ? {\r\n virtual: JSON.stringify(up),\r\n type : up.event?.enhance\r\n ? `interface EventData { ${up.event.enhance.reduce((acc, data): string =>\r\n {\r\n const [KEY, VALUE] = typeof data === 'string'\r\n ? [data, 'import(\\'upwwwards\\').Event.Data']\r\n : [data.key, `import('upwwwards').Event.Data<${data.on ?? 'import(\\'upwwwards\\').Event.DEFAULT_ON'}, ${data.forever ?? false}, ${'waitDelay' in data && data.waitDelay > 0 ? data.waitType === 'debounce' ? data.waitDelay : data.waitType === 'throttle' ? -data.waitDelay : 0 : 0}, ${data.threadFlag}, (...args: ${data.argsTypes ?? 'any'}) => void>`]\r\n \r\n return `${acc}${KEY}: ${VALUE}, `\r\n },\r\n '')}};`\r\n : ''\r\n }\r\n : {\r\n virtual: '{}',\r\n type : ''\r\n }\r\n}\r\n\r\n/**\r\n * Builds the plugin part of the virtual module, typings and extra files; throws when Synthra is enabled and `three` cannot be found.\r\n*/\r\nfunction getPluginsData(plugins: Vite.CONFIG['plugins']): Vite.PLUGINS_DATA\r\n{\r\n const\r\n NAMES = new Set<Plugin.RAW_WRAP['name']>(),\r\n TYPES: Vite.PLUGINS_DATA['types'] =\r\n {\r\n private : '',\r\n privatePlugins: '',\r\n customizable : ''\r\n },\r\n FILES_DATA: Vite.FILE_DATA[] = []\r\n\r\n let data = ''\r\n\r\n if (plugins) for (let i = 0, max = plugins.length, config = ''; i < max; i++, config = '')\r\n {\r\n const\r\n UNFORMATTED = plugins[i],\r\n RAW_WRAP: Plugin.RAW_WRAP = typeof UNFORMATTED === 'string' ? { name: UNFORMATTED } : UNFORMATTED\r\n\r\n if (NAMES.has(RAW_WRAP.name))\r\n {\r\n Logs.warn('VITE', `YOU HAVE DECLARED THE SAME \"${RAW_WRAP.name}\" PLUGIN MULTIPLE TIMES.`)\r\n\r\n continue\r\n }\r\n\r\n switch (RAW_WRAP.name)\r\n {\r\n case 'Screen':\r\n {\r\n const\r\n {\r\n crushedHeight: CRUSHED_HEIGHT = 435 satisfies Screen.DEFAULT_CRUSHED_HEIGHT,\r\n mobileWidth : MOBILE_WIDTH = 768 satisfies Screen.DEFAULT_MOBILE_WIDTH,\r\n tabletWidth : TABLET_WIDTH = 1440 satisfies Screen.DEFAULT_TABLET_WIDTH\r\n } = RAW_WRAP.config?.dimensions ?? {}\r\n\r\n FILES_DATA.push(\r\n {\r\n customizable: false,\r\n name : '_screen.scss',\r\n folder : 'styles',\r\n content : readFileSync(path.join(import.meta.dirname, '../styles/_screen.scss'), 'utf-8').replace('/* @__CONSTANTS__ */', `$SCREEN_CRUSHED_HEIGHT: ${CRUSHED_HEIGHT}px;\\n$SCREEN_MOBILE_WIDTH: ${MOBILE_WIDTH}px;\\n$SCREEN_TABLET_WIDTH: ${TABLET_WIDTH}px;`)\r\n })\r\n \r\n break\r\n }\r\n case 'Transmitter':\r\n {\r\n TYPES.customizable += `declare module '${ID}/plugins/${RAW_WRAP.name}'\\n{\\n\\texport interface TransmitterChannels { /* You can add channels to the Transmitter plugin here. */ }\\n}\\n\\n`\r\n \r\n break\r\n }\r\n case 'Anime':\r\n {\r\n if (!RAW_WRAP.config) break\r\n \r\n const {plugins: ANIME_PLUGINS, ...REST} = RAW_WRAP.config\r\n \r\n if (ANIME_PLUGINS)\r\n {\r\n let type = ''\r\n \r\n for (let i = 0, max = ANIME_PLUGINS.length; i < max; i++)\r\n {\r\n const PLUGIN = ANIME_PLUGINS[i]\r\n\r\n config += `${PLUGIN}: () => import('gsap/${PLUGIN}'),`\r\n type += `${PLUGIN}: typeof import('gsap/${PLUGIN}').default, `\r\n }\r\n\r\n if (config)\r\n {\r\n config = `{graph:{${config.slice(0, -1)}},${JSON.stringify(REST).substring(1)}`\r\n\r\n TYPES.privatePlugins += ` declare module '${ID}/plugins/${RAW_WRAP.name}' { export interface AnimeBucket { ${type}}; };`\r\n }\r\n else config = JSON.stringify(REST)\r\n }\r\n\r\n break\r\n }\r\n case 'Synthra':\r\n {\r\n const\r\n {pick: RAW_PICK, ...REST} = RAW_WRAP.config ?? {},\r\n PICK = new Set(['WebGLRenderer', 'Scene', 'PerspectiveCamera', ...(RAW_PICK ?? [])]),\r\n COMMENTS_RGX_1 = /\\/\\*[\\s\\S]*?\\*\\//g,\r\n COMMENTS_RGX_2 = /\\/\\/.*$/gm,\r\n ALIAS_RGX = /\\s+as\\s+/,\r\n RGX_0 = /export\\s+default\\s+(?:class|function)?\\s*([A-Za-z_$][\\w$]*)?/,\r\n RGX_1 = /export\\s+(?:class|function|const|let|var)\\s+([A-Za-z_$][\\w$]*)/g,\r\n RGX_2 = /export\\s*{\\s*([^}]+)\\s*}/g,\r\n RGX_3 = /export\\s+\\*\\s+(?:as\\s+([A-Za-z_$][\\w$]*)\\s+)?from\\s+['\"](.+)['\"]/g\r\n \r\n let\r\n dir = path.dirname(fileURLToPath(import.meta.resolve('three'))),\r\n pathPackageJSON = ''\r\n\r\n do\r\n {\r\n pathPackageJSON = path.join(dir, 'package.json')\r\n\r\n if (fs.existsSync(pathPackageJSON)) break\r\n \r\n const DIR = path.dirname(dir)\r\n\r\n if (dir === DIR || !DIR) Logs.throw('VITE', 'UNABLE TO FIND THE THREE JS PACKAGE.')\r\n\r\n dir = DIR\r\n }\r\n while (true)\r\n\r\n const\r\n MAP = new Map<string, Set<string>>(),\r\n SEEN = new Map<string, string[]>(),\r\n PACKAGE_JSON = JSON.parse(readFileSync(pathPackageJSON, 'utf-8')),\r\n PACKAGE_NAME = PACKAGE_JSON['name'],\r\n PACKAGE_EXPORTS = PACKAGE_JSON['exports']\r\n\r\n /**\r\n * Yields `[module specifier, file path]` pairs for one entry of the `three` package exports.\r\n */\r\n function* g(key: string, value: string): Generator<[module: string, path: string], void, void>\r\n {\r\n const BASE_MODULE = path.join(PACKAGE_NAME, key.endsWith('*') ? key.slice(0, -1) : key)\r\n \r\n if (value.includes('*')) // *The main path \".\" (three) does not have an asterisk \"*\"\r\n {\r\n const\r\n [PREFIX, SUFFIX] = value.split('*'),\r\n PREFIX_CLEAN = PREFIX[0] === '.' ? PREFIX.substring(1) : PREFIX,\r\n ENTRIES = readdirSync(path.join(dir, PREFIX),\r\n {\r\n recursive : true,\r\n withFileTypes: true\r\n })\r\n\r\n for (let j = 0, jMax = ENTRIES.length; j < jMax; j++)\r\n {\r\n const ENTRY = ENTRIES[j]\r\n \r\n if (!ENTRY.isFile() || !ENTRY.name.endsWith('.js')) continue\r\n\r\n const\r\n PATH = path.join(ENTRY.parentPath ?? (ENTRY as { path?: string }).path, ENTRY.name),\r\n PATH_NORMALIZED = path.sep === '/' ? PATH : PATH.replaceAll(path.sep, '/'),\r\n PREFIX_INDEX = PATH_NORMALIZED.lastIndexOf(PREFIX_CLEAN)\r\n\r\n if (PREFIX_INDEX === -1 || !PATH_NORMALIZED.endsWith(SUFFIX)) continue\r\n\r\n yield [path.join(BASE_MODULE, PATH_NORMALIZED.substring(PREFIX_INDEX + PREFIX_CLEAN.length)), PATH]\r\n }\r\n }\r\n else if (value.endsWith('.js'))\r\n {\r\n const PATH = path.join(dir, value)\r\n\r\n if (fs.existsSync(PATH)) yield [BASE_MODULE, PATH]\r\n }\r\n }\r\n\r\n /**\r\n * Returns the picked export names found in a file, following `export *` re-exports (memoized).\r\n */\r\n function r(p: string): string[]\r\n {\r\n let exported = SEEN.get(p)\r\n \r\n if (exported) return exported\r\n\r\n SEEN.set(p, exported = [])\r\n\r\n const FILE = readFileSync(p, 'utf-8').replace(COMMENTS_RGX_1, '').replace(COMMENTS_RGX_2, '')\r\n\r\n let match = RGX_0.exec(FILE)\r\n\r\n if (match)\r\n {\r\n const NAME = match[1]\r\n\r\n if (NAME && PICK.has(NAME)) exported.push(NAME)\r\n }\r\n\r\n RGX_1.lastIndex = 0\r\n\r\n while (match = RGX_1.exec(FILE))\r\n {\r\n const NAME = match[1]\r\n\r\n if (PICK.has(NAME)) exported.push(NAME)\r\n }\r\n\r\n RGX_2.lastIndex = 0\r\n \r\n while (match = RGX_2.exec(FILE))\r\n {\r\n const NAMES = match[1].split(',')\r\n\r\n for (let j = 0, jMax = NAMES.length; j < jMax; j++)\r\n {\r\n const\r\n BASE_AND_ALIAS = NAMES[j].split(ALIAS_RGX),\r\n NAME = (BASE_AND_ALIAS[1] ?? BASE_AND_ALIAS[0]).trim()\r\n\r\n if (PICK.has(NAME)) exported.push(NAME)\r\n }\r\n }\r\n\r\n RGX_3.lastIndex = 0\r\n\r\n while (match = RGX_3.exec(FILE))\r\n {\r\n const NAME = match[1]\r\n\r\n if (NAME)\r\n {\r\n if (PICK.has(NAME)) exported.push(NAME)\r\n\r\n continue\r\n }\r\n \r\n let subPath = path.resolve(path.dirname(p), match[2])\r\n \r\n if (!subPath.endsWith('.js')) subPath += '.js'\r\n\r\n if (subPath !== p && fs.existsSync(subPath)) exported.push(...r(subPath))\r\n }\r\n\r\n return exported\r\n }\r\n\r\n let\r\n value,\r\n generated: [module: string, path: string] | void\r\n\r\n for (const KEY in PACKAGE_EXPORTS)\r\n {\r\n value = PACKAGE_EXPORTS[KEY]\r\n\r\n if (typeof value !== 'string' && (typeof value !== 'object' || typeof (value = value.import ?? value.default ?? value.module) !== 'string')) continue\r\n\r\n const GEN = g(KEY, value)\r\n\r\n while (generated = GEN.next().value)\r\n {\r\n const\r\n MODULE_NORMALIZED = path.sep === '/' ? generated[0] : generated[0].replaceAll(path.sep, '/'),\r\n EXPORTED = r(generated[1])\r\n\r\n for (let k = 0, kMax = EXPORTED.length; k < kMax; k++)\r\n {\r\n const SET = MAP.get(MODULE_NORMALIZED)\r\n\r\n SET ? SET.add(EXPORTED[k]) : MAP.set(MODULE_NORMALIZED, new Set([EXPORTED[k]]))\r\n }\r\n }\r\n }\r\n\r\n const TREATED = new Set<string>()\r\n\r\n let type = ''\r\n\r\n config = '{ getThree: async () => { '\r\n\r\n for (let j = 0, jMax = MAP.size, module = '', set: Set<string> | null = null, size = 0; j < jMax; j++, module = '', set = null, size = 0)\r\n {\r\n for (const [MODULE, SET] of MAP)\r\n {\r\n for (const NAME of TREATED) if (SET.has(NAME)) SET.delete(NAME)\r\n\r\n size = SET.size\r\n\r\n switch (true)\r\n {\r\n case !size : MAP.delete(MODULE)\r\n case set && (size < set.size || size === set.size && MODULE.length > module.length): continue\r\n default :\r\n module = MODULE\r\n set = SET\r\n }\r\n }\r\n\r\n if (!set) break\r\n\r\n const\r\n NAMES = [...set],\r\n LENGTH = NAMES.length\r\n\r\n if (LENGTH === 1)\r\n {\r\n const NAME = NAMES[0]\r\n \r\n for (const [MODULE, SET] of MAP)\r\n {\r\n if (MODULE === module) continue\r\n\r\n if (SET.has(NAME))\r\n {\r\n if (MODULE === PACKAGE_NAME ||\r\n module !== PACKAGE_NAME &&\r\n (\r\n MODULE.endsWith(`${NAME}.js`) ||\r\n !module.endsWith(`${NAME}.js`) && MODULE.length < module.length\r\n )\r\n )\r\n {\r\n set.delete(NAME)\r\n \r\n module = MODULE\r\n set = SET\r\n }\r\n else SET.delete(NAME)\r\n }\r\n }\r\n }\r\n \r\n for (let k = 0; k < LENGTH; k++)\r\n {\r\n const NAME = NAMES[k]\r\n \r\n TREATED.add(NAME)\r\n\r\n type += `${NAME}: typeof import('${module}').${NAME}, `\r\n }\r\n\r\n config += `const { ${NAMES.join(',')} } = await import('${module}'); `\r\n\r\n MAP.delete(module)\r\n }\r\n\r\n config += `return { ${[...TREATED].join(',')} }; }, ${JSON.stringify(REST).slice(1, -1)} }`\r\n\r\n if (type) TYPES.privatePlugins += ` declare module '${ID}/plugins/${RAW_WRAP.name}' { export interface SynthraThree { ${type}}; };`\r\n\r\n TYPES.customizable += `declare module '${ID}/plugins/${RAW_WRAP.name}'\\n{\\n\\texport interface SynthraBucket { /* Enhance type checking for Synthra bucket here. */ }\\n\\n\\texport interface SynthraPlugins { /* Enhance type checking for Synthra plugins here. */ }\\n}\\n\\n`\r\n\r\n break\r\n }\r\n default:\r\n }\r\n \r\n data += `{plugin:${RAW_WRAP.name},config:${config || JSON.stringify(RAW_WRAP.config)}},` // *Plugin.WRAP\r\n TYPES.private += ` export const ${RAW_WRAP.name}: typeof import('upwwwards/plugins').${RAW_WRAP.name};`\r\n\r\n NAMES.add(RAW_WRAP.name)\r\n }\r\n\r\n return {\r\n virtual: `import {${[...NAMES].join(',')}} from 'upwwwards/plugins'; PLUGINS.push(${data});`,\r\n types : TYPES,\r\n files : FILES_DATA\r\n }\r\n}\r\n\r\n/**\r\n * Applies the `classter` option to the shared Classter state and returns the analyzer, or `undefined` when disabled.\r\n*/\r\nfunction getClasster(classter: Vite.CONFIG['classter'], ext: Vite.ADAPTER_MAP[Vite.ADAPTER_KEY]['ext']): typeof Classter | undefined\r\n{\r\n if (!classter) return\r\n\r\n const Classter = classter.Classter\r\n\r\n if (classter.off) return\r\n\r\n if (classter.silent) Classter.warn = false\r\n\r\n if (classter.identifiers)\r\n {\r\n if (classter.identifiers.class) Classter.addClassIdentifiers(classter.identifiers.class)\r\n if (classter.identifiers.attributes) Classter.addAttributesIdentifiers(classter.identifiers.attributes)\r\n }\r\n\r\n if (classter.alias) Classter.addAlias(classter.alias)\r\n\r\n Classter.ext = ext\r\n\r\n return Classter\r\n}\r\n\r\n/**\r\n * Resolves the plugin options into the shared hook state (virtual module code, generated files, Classter).\r\n*/\r\nfunction getData(config: Vite.CONFIG): Vite.DATA\r\n{\r\n const\r\n ADAPTER_DATA = getAdapterData(config.adapter),\r\n UP_DATA = getUpData(config.up),\r\n PLUGIN_DATA = getPluginsData(config.plugins),\r\n Classter = getClasster(config.classter, ADAPTER_DATA.ext)\r\n\r\n return {\r\n readIn : config.readIn || ADAPTER_DATA.readIn,\r\n setupIn: `${(config.setupIn || ADAPTER_DATA.setupIn)}/${FOLDER_NAME}`,\r\n virtual: `import Adapter from 'upwwwards/adapters/${ADAPTER_DATA.name}'; import { construct } from 'upwwwards/symbols'; const PLUGINS = []; ${PLUGIN_DATA.virtual} Up[construct](${UP_DATA.virtual}, Adapter, PLUGINS); export default Up;`,\r\n files :\r\n [\r\n {\r\n customizable: false,\r\n name : 'upwwwards.d.ts',\r\n folder : 'types',\r\n content : `import type { Up } from '${ID}'; import { Adapter } from 'upwwwards/adapters'; import type { ${ADAPTER_DATA.name}Config, ${ADAPTER_DATA.name}Ref } from 'upwwwards/adapters/${ADAPTER_DATA.name}'; declare module '${ID}' { namespace Up { export const Adapter: typeof import('upwwwards/adapters/${ADAPTER_DATA.name}').default;${PLUGIN_DATA.types.private} }; ${UP_DATA.type} }; declare module 'upwwwards/adapters' { export interface AdapterConfig extends ${ADAPTER_DATA.name}Config {}; export interface AdapterRef<T> extends ${ADAPTER_DATA.name}Ref<T> {}; };${PLUGIN_DATA.types.privatePlugins}`\r\n },\r\n {\r\n customizable: true,\r\n name : 'config.d.ts',\r\n folder : 'types',\r\n content : `declare module '${ID}'\\n{\\n\\texport interface AppCache\\n\\t{\\n\\t\\t/*\\n\\t\\t\\tYou can add data types to enhance the application cache.\\n\\t\\t\\tNever use dynamic keys; use only character strings (risk of memory overflow in SSR).\\n\\t\\t*/\\n\\t}\\n}\\n\\n${PLUGIN_DATA.types.customizable}export {} /* IMPORTANT: DO NOT DELETE THIS LINE. */`\r\n },\r\n ...PLUGIN_DATA.files\r\n ],\r\n Classter\r\n }\r\n}\r\n\r\n // ##UTILS\r\n/**\r\n * Joins two paths, merging the trailing segments of `a` that `b` starts with (`/proj/app` + `/app/x` gives `/proj/app/x`).\r\n*/\r\nfunction mergePaths(a: string, b: string): string\r\n{\r\n a = a.replaceAll('\\\\', '/').replace(/\\/+$/g, '')\r\n b = b.replaceAll('\\\\', '/').replace(/^\\/+/g, '')\r\n\r\n const\r\n A = a.split('/'),\r\n B = b.split('/'),\r\n AL = A.length,\r\n BL = B.length\r\n\r\n RUNNER: for (let i = AL - 1, j = 0, max = 0; i > -1; i--)\r\n {\r\n if (A[i] !== B[0]) continue RUNNER\r\n\r\n for (j = 1, max = Math.min(AL - i, BL); j < max; j++) if (A[i + j] !== B[j]) continue RUNNER\r\n\r\n return path.join(a, ...B.slice(j))\r\n }\r\n\r\n return path.join(a, b)\r\n}\r\n\r\n/**\r\n * Runs Classter on the `.html` files directly inside `readIn` (not recursive).\r\n*/\r\nfunction readHTMLFiles(data: Vite.DATA): void // TODO: non récursif mais est-ce utile ? De base c'était pour lire le fichier html de svelte (peut-être ajouter une option)\r\n{\r\n const FILES = readdirSync(data.readIn, { withFileTypes: true })\r\n\r\n for (let i = 0, max = FILES.length; i < max; i++)\r\n {\r\n const FILE = FILES[i]\r\n\r\n if (FILE.isFile() && path.extname(FILE.name) === '.html') data.Classter!.analyzeHTML(readFileSync(`${data.readIn}/${FILE.name}`, 'utf-8'), FILE.name)\r\n }\r\n}\r\n\r\n/**\r\n * Vite `config` hook: excludes the generated `private` folder from the file watcher, dedupes the\r\n * package, and keeps every `upwwwards/*` entry out of `optimizeDeps` (client + SSR) so plugins and\r\n * the virtual module share one `Up` / `Event` instance.\r\n*/\r\nfunction config(): Omit<UserConfig, 'plugins'>\r\n{\r\n return {\r\n server : { watch: { ignored: [`**/${FOLDER_NAME}/${PRIVATE_FOLDER_NAME}/**`] } },\r\n resolve : { dedupe: [ID] },\r\n optimizeDeps: { exclude: [...OPTIMIZE_DEPS_EXCLUDE] },\r\n ssr : { optimizeDeps: { exclude: [...OPTIMIZE_DEPS_EXCLUDE] } }\r\n }\r\n}\r\n\r\n/**\r\n * Vite `configResolved` hook: stores the Vite root and whether the dev server is running.\r\n*/\r\nfunction configResolved(this: Vite.DATA, config: ResolvedConfig): void\r\n{\r\n dev = config.command === 'serve'\r\n this.readIn = mergePaths(config.root, this.readIn).replaceAll('\\\\', '/')\r\n this.setupIn = mergePaths(config.root, this.setupIn).replaceAll('\\\\', '/')\r\n}\r\n\r\n/**\r\n * Vite `configureServer` hook: tracks dev servers so `classter.css` can be reloaded when new classes appear.\r\n*/\r\nfunction configureServer(server: ViteDevServer): void\r\n{\r\n serversLength = SERVERS.push(server)\r\n\r\n server.httpServer?.once('close', (): void =>\r\n {\r\n const INDEX = SERVERS.indexOf(server)\r\n\r\n if (INDEX === -1) return Logs.warn('VITE', 'UNABLE TO DELETE THE SERVER.')\r\n\r\n SERVERS.splice(INDEX, 1)\r\n\r\n serversLength--\r\n })\r\n}\r\n\r\n/**\r\n * Vite `resolveId` hook: maps `upwwwards` and `classter.css` to their virtual modules; throws when `upwwwards` cannot be resolved.\r\n*/\r\nasync function resolveID(this: Rolldown.PluginContext, id: string): Promise<string | null>\r\n{\r\n switch (id)\r\n {\r\n case ID: try\r\n {\r\n const _ID = (await this.resolve(id, undefined, { skipSelf: true }))!.id\r\n\r\n return _ID.startsWith(VIRTUAL_ID) ? _ID : VIRTUAL_ID + _ID\r\n }\r\n catch { Logs.throw('VITE', 'UNABLE TO RESOLVE THE PATH TO UPWWWARDS.') }\r\n case CLASSTER_ID: return VIRTUAL_CLASSTER_ID\r\n default : return null\r\n }\r\n}\r\n\r\n/**\r\n * Vite `load` hook: serves the virtual `upwwwards` module, and `classter.css` (full CSS in dev, a placeholder rule in build).\r\n*/\r\nfunction load(this: Vite.DATA, id: string): string | null\r\n{\r\n return id.startsWith(VIRTUAL_ID)\r\n ? `import Up from '${id.substring(VIRTUAL_ID.length)}'; ${this.virtual}`\r\n : this.Classter && id === VIRTUAL_CLASSTER_ID\r\n ? dev\r\n ? this.Classter.get()\r\n : CLASSTER_MARK_STYLE\r\n : null\r\n}\r\n\r\n/**\r\n * Vite `buildStart` hook: scans `readIn` HTML files with Classter and writes the generated files into the project.\r\n*/\r\nfunction buildStart(this: Vite.DATA): void\r\n{\r\n if (this.Classter) readHTMLFiles(this)\r\n\r\n for (let i = 0, max = this.files.length; i < max; i++)\r\n {\r\n const\r\n DATA = this.files[i],\r\n PATH = path.resolve(`${this.setupIn}/${DATA.customizable ? CUSTOMIZABLE_FOLDER_NAME : PRIVATE_FOLDER_NAME}/${DATA.folder}/${DATA.name}`)\r\n\r\n if (fs.existsSync(PATH) && (DATA.customizable || fs.readFileSync(PATH, 'utf-8') === DATA.content)) continue\r\n\r\n fs.mkdirSync(path.dirname(PATH), { recursive: true })\r\n fs.writeFileSync(PATH, DATA.content)\r\n }\r\n}\r\n\r\n/**\r\n * Vite `transform` hook: analyzes components and HTML under `readIn` with Classter, then reloads `classter.css` on dev servers when it changed.\r\n * Ignores Vite style/script extracts (`?…type=style|script…`) so they are not parsed as SFCs.\r\n*/\r\nfunction transform(this: Vite.DATA, code: string, id: string): void\r\n{\r\n if (!this.Classter || /\\?(?:.*&)?type=(?:style|script)\\b/.test(id)) return\r\n\r\n const FILE = id.split('?', 1)[0]!.replaceAll('\\\\', '/')\r\n\r\n if (!FILE.startsWith(`${this.readIn}/`)) return\r\n\r\n if (FILE.endsWith(this.Classter.ext)) this.Classter.analyze(code, id)\r\n else if (FILE.endsWith('.html')) this.Classter.analyzeHTML(code, id)\r\n\r\n if (!this.Classter.updated || !serversLength) return\r\n\r\n for (let i = 0; i < serversLength; i++)\r\n {\r\n const\r\n SERVER = SERVERS[i],\r\n MOD = SERVER.moduleGraph.getModuleById(VIRTUAL_CLASSTER_ID)\r\n\r\n if (!MOD) continue\r\n\r\n SERVER.reloadModule(MOD)\r\n }\r\n\r\n this.Classter.updated = false\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\n/**\r\n * Creates the `upwwwards` Vite plugin, the entry point that sets up the runtime for Nuxt 4 or SvelteKit 2.\r\n *\r\n * The plugin:\r\n * - Replaces every `import Up from 'upwwwards'` with a virtual module that constructs `Up` exactly once\r\n * (on the server and in the browser) with the `up` config, the selected adapter and the enabled plugins.\r\n * - Sets `resolve.dedupe` and `optimizeDeps.exclude` / `ssr.optimizeDeps.exclude` for the package surface so\r\n * Vite never prebundles a second copy of `Up` while plugins still import `../core/Up.js` (dual-runtime hazard).\r\n * - Writes generated files into `<setupIn>/upwwwards/` at build start: `private/types/upwwwards.d.ts`\r\n * (types of `Up.Adapter`, the enabled plugins, `AdapterConfig` / `AdapterRef` and `EventData`; rewritten when outdated),\r\n * `customizable/types/config.d.ts` (created once, then yours to edit, to augment `AppCache` and plugin interfaces),\r\n * and `private/styles/_screen.scss` (breakpoint SCSS variables) when `Screen` is enabled.\r\n * The `private` folder is excluded from the dev server file watcher.\r\n * - When `classter` is set, compiles atomic class tokens found in templates into the virtual stylesheet `classter.css`:\r\n * served live and hot-reloaded in dev, and injected into the emitted CSS bundle in build.\r\n *\r\n * After construction, the app must call `Up.set(adapterConfig)` once in the browser to start the runtime.\r\n * @param cfg Plugin options (see {@link Vite.CONFIG}).\r\n * @returns The Vite plugin (enforced `pre`).\r\n * @throws Through `Logs.throw` when `adapter` is not `'nuxt'` or `'svelte'`, or when `Synthra` is enabled and the `three` package cannot be found.\r\n * Resolving `upwwwards` also throws if the package path cannot be resolved.\r\n * @note Side effects: writes files into the project, and configures the shared Classter state (aliases, identifiers, warnings).\r\n * @note When `classter` is enabled, import `classter.css` once in the app (e.g. in `app.vue` or the root `+layout.svelte`).\r\n * @example\r\n * ```ts\r\n * // nuxt.config.ts\r\n * import upwwwards from 'upwwwards/initializers/vite'\r\n * import Vue from 'upwwwards/classter/Vue'\r\n *\r\n * export default defineNuxtConfig({\r\n * vite:\r\n * {\r\n * plugins:\r\n * [\r\n * upwwwards({\r\n * adapter : 'nuxt',\r\n * up : { thread: { flowBudget: 8 } },\r\n * plugins : ['Scroll', { name: 'Screen', config: { dimensions: { mobileWidth: 768 } } }],\r\n * classter: { Classter: Vue, alias: { 'my-pa': 'padding' } }\r\n * })\r\n * ]\r\n * }\r\n * })\r\n * ```\r\n * @example\r\n * ```ts\r\n * // vite.config.ts (SvelteKit)\r\n * import { sveltekit } from '@sveltejs/kit/vite'\r\n * import { defineConfig } from 'vite'\r\n * import upwwwards from 'upwwwards/initializers/vite'\r\n * import Svelte from 'upwwwards/classter/Svelte'\r\n *\r\n * export default defineConfig({\r\n * plugins:\r\n * [\r\n * upwwwards({\r\n * adapter : 'svelte',\r\n * plugins : ['Observer', { name: 'Anime', config: { plugins: ['ScrollTrigger'] } }],\r\n * classter: { Classter: Svelte }\r\n * }),\r\n * sveltekit()\r\n * ]\r\n * })\r\n * ```\r\n*/\r\nexport default function vite(cfg: Vite.CONFIG): VitePlugin\r\n{\r\n const DATA = getData(cfg)\r\n\r\n return {\r\n name : ID,\r\n enforce : 'pre',\r\n config,\r\n configResolved : configResolved.bind(DATA),\r\n configureServer,\r\n resolveId : resolveID,\r\n load : load.bind(DATA),\r\n buildStart : buildStart.bind(DATA),\r\n ...(DATA.Classter\r\n ? {\r\n transform : transform.bind(DATA),\r\n generateBundle: function (this: Rolldown.PluginContext, _options: Rolldown.NormalizedOutputOptions, bundle: Rolldown.OutputBundle): void\r\n {\r\n for (const KEY in bundle)\r\n {\r\n const FILE = bundle[KEY]\r\n\r\n if (FILE.type !== 'asset' || !FILE.fileName.endsWith('.css')) continue\r\n\r\n let source = typeof FILE.source === 'string' ? FILE.source : Buffer.from(FILE.source).toString('utf-8')\r\n\r\n if (!source.includes(CLASSTER_MARK)) continue\r\n\r\n const MATCH = source.match(CLASSTER_MARK_RGX)\r\n\r\n if (MATCH?.index != null) source = source.substring(0, MATCH.index) + source.substring(MATCH.index + MATCH[0].length)\r\n\r\n FILE.source = DATA.Classter!.get() + source.trim()\r\n\r\n break\r\n }\r\n }\r\n }\r\n : undefined\r\n )\r\n }\r\n}"],"mappings":"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","names":["config","i","max","r","NAMES","value"]}
@@ -1,5 +1,5 @@
1
1
  import '../symbols/index.js';
2
- export { A as Anime, c as AnimeBucket, d as Split, e as Timeline, f as Tweens, A as default } from '../index-GVYgi7Wm.js';
2
+ export { A as Anime, c as AnimeBucket, d as Split, e as Timeline, f as Tweens, A as default } from '../index-CzWXovKy.js';
3
3
  import 'gsap/all';
4
4
  import '../index-BlwaDpQl.js';
5
5
  import '../Thread-Cvf__-O4.js';
@@ -181,12 +181,13 @@ class Anime extends Lazy {
181
181
  * @param lazy When `true`, queue the callback without starting the load (it runs once another call triggers it).
182
182
  * @returns The pending load promise while Anime is loading, otherwise `void`.
183
183
  * @throws If called on the server.
184
+ * @warning ScrollTrigger `stagger` can break GSAP context restore on `unsub` (context / `bucket.workspace` handoff). Prefer non-staggered setups inside `sub`, or clean those triggers yourself on the cleaning stack.
184
185
  */
185
186
  static sub(key, callback, $guard, lazy) {
186
187
  if (!Anime.#map.has(key)) Anime.#map.set(key, null);
187
- return Anime.workspace(
188
+ return this.workspace(
188
189
  (bucket) => {
189
- Anime.sub = (key2, callback2) => {
190
+ this.sub = (key2, callback2) => {
190
191
  let ws = Anime.#map.get(key2);
191
192
  if (!ws) Anime.#map.set(key2, ws = {
192
193
  ctx: bucket.gsap.context(Up.App.void),
@@ -199,7 +200,7 @@ class Anime extends Lazy {
199
200
  bucket.workspace = PREV;
200
201
  });
201
202
  };
202
- if (Anime.#map.has(key)) Anime.sub(key, callback);
203
+ if (Anime.#map.has(key)) this.sub(key, callback);
203
204
  },
204
205
  $guard,
205
206
  lazy
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/Anime.ts"],"sourcesContent":["/* [Anime] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { SIGN, BUCKET, set, add, destroy, apply, load } from '../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../core/Up.js'\r\n\r\n // ##PLUGINS\r\nimport Lazy from './@/Lazy.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##THIS\r\nimport Split from './@anime/Split.js'\r\nimport Tweens from './@anime/Tweens.js'\r\nimport Timeline from './@anime/Timeline.js'\r\n\r\n // ##TYPES\r\nimport type { gsap, CustomEase, ScrollTrigger, SplitText } from 'gsap/all'\r\n\r\nimport type Thread from '../core/[1]/[2]/Thread.js'\r\n\r\nimport type Parser from '../scripts/Parser.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Anime\r\n{\r\n /**\r\n * Anime configuration as written in the Vite config (`plugins: [{ name: 'Anime', config }]` of `upwwwards/initializers/vite`).\r\n * The Vite plugin rewrites `plugins` into `graph` (see {@link Anime.CONFIG}) before it reaches the runtime.\r\n */\r\n export type RAW_CONFIG =\r\n {\r\n /**\r\n * GSAP plugins to load and register on first use, by their `gsap/<Name>` module name (e.g. `'CustomEase'`, `'ScrollTrigger'`, `'SplitText'`, `'Flip'`).\r\n * Each loaded plugin is also exposed on the Anime bucket under the same name (e.g. `bucket.ScrollTrigger`).\r\n */\r\n plugins?: PLUGIN[],\r\n /**\r\n * Custom eases to create once loaded, as `name → SVG path` (passed to `CustomEase.create(name, path)`).\r\n * @note Requires `'CustomEase'` in `plugins`; ignored otherwise.\r\n */\r\n easings?: Record<string, string>\r\n }\r\n\r\n /**\r\n * Runtime Anime configuration generated by the Vite plugin: {@link Anime.RAW_CONFIG} with `plugins` replaced by `graph`,\r\n * a map of plugin name to a dynamic `import('gsap/<Name>')` loader.\r\n */\r\n export type CONFIG = Omit<RAW_CONFIG, 'plugins'> & { graph?: { [K in PLUGIN]?: () => Promise<{ default: ANIME_PLUGINS_MAP[K] }> } }\r\n\r\n /**\r\n * Name of a property of {@link AnimeBucket}.\r\n */\r\n export type BUCKET_KEY = keyof AnimeBucket\r\n\r\n /**\r\n * Union of the value types of {@link AnimeBucket} properties.\r\n */\r\n export type BUCKET_VALUE = AnimeBucket[BUCKET_KEY]\r\n\r\n /**\r\n * Name of a GSAP plugin accepted in `RAW_CONFIG.plugins` (see {@link Anime.RAW_CONFIG}).\r\n * `'CustomEase'`, `'ScrollTrigger'` and `'SplitText'` are typed; any other `gsap/<Name>` module name is accepted as a string.\r\n */\r\n export type PLUGIN = keyof ANIME_PLUGINS_MAP\r\n\r\n /**\r\n * Workspace key passed to `sub` / `unsub`: a `symbol`, usually one unique symbol per component.\r\n */\r\n export type KEY = symbol\r\n\r\n /**\r\n * Shape of custom data you may store on a workspace (e.g. a cached `Split` instance).\r\n * The keys `ctx` and `cleaningStack` are reserved by Anime.\r\n */\r\n export type TRUNK = Parser.Merge<{ [K in PropertyKey]: any },\r\n {\r\n ctx ?: never,\r\n cleaningStack?: never\r\n }>\r\n\r\n /**\r\n * A workspace: the keyed scope opened by `Anime.sub(key, …)` and closed by `Anime.unsub(key)`.\r\n * It owns a GSAP context and a cleaning stack, plus any custom data you store on it.\r\n * @template T Shape of the custom data stored on the workspace.\r\n */\r\n export type Workspace<T extends TRUNK = TRUNK> = Parser.Merge<Partial<T>,\r\n {\r\n /**\r\n * GSAP context in which `sub` callbacks run. Tweens, timelines, ScrollTriggers and nested contexts created\r\n * synchronously inside those callbacks are recorded here and reverted by `unsub`.\r\n */\r\n ctx: gsap.Context,\r\n /**\r\n * Cleaning stack: destructors run by `unsub` in reverse order, before `ctx.revert()`.\r\n * `Timeline`, `Tweens` and `Split` push their `destroy` here when constructed inside a `sub` callback; you may push your own.\r\n */\r\n cleaningStack: (() => void)[]\r\n }>\r\n\r\n /**\r\n * Callback receiving the Anime bucket, optionally typed with the workspace's custom data.\r\n * @template T Shape of the custom data stored on `bucket.workspace`.\r\n */\r\n export type CallBack<T extends TRUNK = TRUNK> = (bucket: AnimeBucket<T>) => void\r\n}\r\n\r\n/**\r\n * Anime bucket: the runtime bag passed to `Anime.workspace` / `Anime.sub` callbacks once GSAP is loaded.\r\n * Every GSAP plugin listed in the Anime config is added as an extra read-only key named after the plugin (e.g. `bucket.ScrollTrigger`);\r\n * the Vite plugin generates the matching type augmentation.\r\n * @template T Shape of the custom data stored on the current workspace.\r\n*/\r\ninterface AnimeBucket<T extends Anime.TRUNK = Anime.TRUNK>\r\n{\r\n [K: string & {}]: any,\r\n /**\r\n * Workspace of the `sub` callback currently running (see {@link Anime.Workspace}); an empty object outside any `sub` callback.\r\n */\r\n workspace: Partial<Anime.Workspace<T>>,\r\n /**\r\n * The loaded GSAP instance (default export of `gsap`).\r\n */\r\n gsap: typeof gsap,\r\n /**\r\n * {@link Split} helper class (GSAP `SplitText` wrapper with automatic cleanup).\r\n */\r\n Split: typeof Split,\r\n /**\r\n * {@link Tweens} helper class (standalone tweens with automatic cleanup).\r\n */\r\n Tweens: typeof Tweens,\r\n /**\r\n * {@link Timeline} helper class (ScrollTrigger-driven timeline with tracks and fragments).\r\n */\r\n Timeline: typeof Timeline\r\n}\r\n\r\n/**\r\n * Typed GSAP plugins that may be loaded through the Anime config, keyed by name.\r\n * @internal\r\n*/\r\ntype ANIME_PLUGINS_MAP =\r\n{\r\n [K: string & {}]: any,\r\n CustomEase : typeof CustomEase,\r\n ScrollTrigger : typeof ScrollTrigger,\r\n SplitText : typeof SplitText\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * GSAP integration plugin, exposed as `Up.Anime`.\r\n * It is a lazy plugin: GSAP and the GSAP plugins listed in its config are loaded with dynamic imports on the first\r\n * `workspace` / `sub` call; callbacks are queued until then, and later calls run synchronously.\r\n *\r\n * Once loaded, GSAP and the `Up.Thread` frame scheduler share one clock: GSAP's ticker drives the Thread or, if the Thread\r\n * is already driven by another ticker, GSAP's ticker is put to sleep and `gsap.updateRoot` runs as a Thread task on every frame.\r\n * When `ScrollTrigger` is loaded, its automatic refresh events are disabled: it is refreshed and updated by Thread modifiers\r\n * on the earthquake (`2`) and resize (`8`) flags, and updated on the scroll flag (`32`). A Thread flag is a power-of-two\r\n * priority bucket that groups work of the same kind within a frame.\r\n *\r\n * Use `sub(key, callback)` to animate inside a keyed workspace (see {@link Anime.Workspace}) and `unsub(key)` to revert everything it created.\r\n * @note Enable it with the Vite plugin `upwwwards/initializers/vite`: `plugins: [{ name: 'Anime', config: { plugins: ['ScrollTrigger', …] } }]`.\r\n * @note Client-only: `workspace` and `sub` throw on the server.\r\n * @example\r\n * ```ts\r\n * // vite.config.ts\r\n * import initializer from 'upwwwards/initializers/vite'\r\n *\r\n * initializer({ plugins: [{ name: 'Anime', config: { plugins: ['ScrollTrigger', 'SplitText'] } }] })\r\n *\r\n * // Component (client side)\r\n * import Up from 'upwwwards'\r\n * import type { AnimeBucket } from 'upwwwards/plugins'\r\n *\r\n * const KEY = Symbol('Hero')\r\n *\r\n * Up.Anime.sub(KEY, (bucket: AnimeBucket): void =>\r\n * {\r\n * bucket.gsap.from('.hero__title', { y: 40, autoAlpha: 0, duration: 1 })\r\n * })\r\n *\r\n * // On unmount: runs the cleaning stack and reverts every animation created above.\r\n * Up.Anime.unsub(KEY)\r\n * ```\r\n*/\r\nabstract class Anime extends Lazy\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n static #plugged = false\r\n\r\n static #config: Anime.CONFIG | undefined\r\n\r\n static #map: Map<Anime.KEY, Anime.Workspace | null>\r\n\r\n /**\r\n * Unique symbol identifying the Anime plugin (also stamped on its guards).\r\n * @internal\r\n */\r\n static override readonly [SIGN] = Symbol('Anime')\r\n\r\n /**\r\n * Plugin name: the key on `Up` (`Up.Anime`) and the `name` used in the Vite config.\r\n */\r\n static override readonly NAME = 'Anime'\r\n\r\n /**\r\n * Anime bucket (see {@link AnimeBucket}); `gsap` and the registered plugins are filled in during load.\r\n * @warning Receive it through `workspace` / `sub` callbacks instead: before load, `gsap` is an empty placeholder.\r\n * @internal\r\n */\r\n static override readonly [BUCKET]: AnimeBucket =\r\n {\r\n workspace: {},\r\n gsap : {} as AnimeBucket['gsap'],\r\n Split,\r\n Tweens,\r\n Timeline\r\n }\r\n\r\n // ##PRIVATES\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 static #setVars(config?: Anime.CONFIG): void\r\n {\r\n Anime.#config = config\r\n Anime.#map = new Map()\r\n }\r\n\r\n static #setTask(): void\r\n {\r\n // *GSAP animations will run at the end of the Thread.\r\n Up.Thread.markForever(Anime.#t$)\r\n Up.Thread.sub(Anime.#t$, Up.Thread.MAX_FLAG)\r\n }\r\n\r\n static #setEvent(gsap: AnimeBucket['gsap'], callback: (timestamp: number) => void): void\r\n {\r\n gsap.ticker.add(\r\n Anime.#eTick = (timestamp: number): void => { callback(timestamp * 1_000) },\r\n false, true /* *Set the Thread's priority so that animations run after tasks. */\r\n )\r\n }\r\n\r\n static #setGsap(gsap: AnimeBucket['gsap']): void\r\n {\r\n Anime[add]('gsap', gsap)\r\n\r\n const callback = Up.Thread[apply]()\r\n\r\n if (!callback)\r\n {\r\n Anime.#plugged = true\r\n \r\n gsap.ticker.remove(gsap.updateRoot)\r\n gsap.ticker.sleep()\r\n\r\n Anime.#setTask()\r\n }\r\n else Anime.#setEvent(gsap, callback)\r\n }\r\n\r\n static #setCustomEase(CustomEase: ANIME_PLUGINS_MAP['CustomEase']): void\r\n {\r\n const EASINGS = Anime.#config?.easings\r\n\r\n for (const KEY in EASINGS) CustomEase.create(KEY, EASINGS[KEY])\r\n }\r\n\r\n static #setScrollTrigger(ScrollTrigger: ANIME_PLUGINS_MAP['ScrollTrigger']): void\r\n {\r\n ScrollTrigger.config({ autoRefreshEvents: '' })\r\n\r\n Up.Thread.addModifier(ScrollTrigger.refresh, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.update, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.refresh, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.update, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.update, 32 satisfies Thread.SCROLL_FLAG)\r\n }\r\n\r\n /**\r\n * Marks the plugin as configured and stores its runtime config; GSAP is not loaded here. Called by `Up` on the client.\r\n * @param config Runtime config generated by the Vite plugin.\r\n * @throws If the plugin is already configured.\r\n * @internal\r\n */\r\n static override [set](config?: Anime.CONFIG): void\r\n {\r\n super[set]()\r\n \r\n Anime.#setVars(config)\r\n }\r\n\r\n // ##DESTROY\r\n static #destroyVars(): void\r\n {\r\n if (Anime.#map.size)\r\n {\r\n for (const [_, WORKSPACE] of Anime.#map) if (WORKSPACE) Anime.#free(WORKSPACE)\r\n\r\n Anime.#map.clear()\r\n }\r\n }\r\n\r\n static #destroyTask(): void { Up.Thread.unsub(Anime.#t$) }\r\n\r\n static #destroyEvent(): void { Anime[BUCKET].gsap.ticker.remove(Anime.#eTick) }\r\n\r\n static #destroyScrollTrigger(): void\r\n {\r\n const ScrollTrigger: ANIME_PLUGINS_MAP['ScrollTrigger'] | undefined = Anime[BUCKET].ScrollTrigger\r\n\r\n if (!ScrollTrigger) return\r\n\r\n Up.Thread.removeModifier(ScrollTrigger.refresh, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.update, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.refresh, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.update, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.update, 32 satisfies Thread.SCROLL_FLAG)\r\n }\r\n\r\n /**\r\n * Closes every open workspace, detaches GSAP from the Thread and removes the ScrollTrigger modifiers. Called by `Up.destroy`.\r\n * @throws If the plugin is already destroyed.\r\n * @internal\r\n */\r\n static override [destroy](): void\r\n {\r\n super[destroy]()\r\n \r\n Anime.#destroyVars()\r\n\r\n Anime.#plugged ? Anime.#destroyTask() : Anime.#destroyEvent()\r\n\r\n Anime.#destroyScrollTrigger()\r\n }\r\n\r\n // ##TASKS\r\n static #t$(): void { Anime[BUCKET].gsap.updateRoot(Up.Thread.timestamp / 1_000) }\r\n\r\n // ##EVENTS\r\n static #eTick = (timestamp: number): void => {}\r\n\r\n // ##LOADERS\r\n /**\r\n * Imports GSAP and links it to the Thread, then loads and registers every plugin of `graph` in parallel\r\n * (a failing plugin is logged, not thrown), creates the configured easings, wires ScrollTrigger to the Thread,\r\n * and shares the bucket with `Split`, `Tweens` and `Timeline`. Triggered by the first `workspace` / `sub` call.\r\n * @returns Resolves when loading is complete.\r\n * @throws (rejects) If the plugin is not configured, already loaded, or destroyed while loading.\r\n * @internal\r\n */\r\n static override [load](): Promise<void>\r\n {\r\n return super[load](async (): Promise<void> =>\r\n {\r\n Anime.#setGsap((await import('gsap')).default)\r\n\r\n const GRAPH = Anime.#config?.graph\r\n \r\n if (GRAPH)\r\n {\r\n const PROMISES: Promise<void>[] = []\r\n\r\n for (const KEY in GRAPH) PROMISES.push(GRAPH[KEY as Anime.PLUGIN]!().then(({default: plugin}: { default: ANIME_PLUGINS_MAP[Anime.PLUGIN] }): void =>\r\n {\r\n Anime[BUCKET].gsap.registerPlugin(plugin)\r\n \r\n Anime[add](KEY, plugin)\r\n\r\n switch (KEY)\r\n {\r\n case 'CustomEase' : return Anime.#setCustomEase(plugin)\r\n case 'ScrollTrigger': return Anime.#setScrollTrigger(plugin)\r\n default :\r\n }\r\n })\r\n .catch((): void => Logs.error('ANIME', `ANIME PLUGIN \"${KEY}\" COULD NOT BE LOADED.`)))\r\n\r\n await Promise.all(PROMISES)\r\n }\r\n\r\n Split[BUCKET] = Tweens[BUCKET] = Timeline[BUCKET] = Anime[BUCKET]\r\n })\r\n }\r\n\r\n // ##UTILS\r\n static #free(workspace: Anime.Workspace): void\r\n {\r\n for (let i = workspace.cleaningStack.length - 1; i > -1; i--) workspace.cleaningStack[i]()\r\n\r\n workspace.ctx.revert()\r\n }\r\n\r\n /**\r\n * Runs `callback` inside the workspace identified by `key`, creating the workspace on first use.\r\n * A workspace (see {@link Anime.Workspace}) owns a GSAP context and a cleaning stack: animations created synchronously\r\n * in `callback` are recorded in the context, and `Timeline` / `Tweens` / `Split` instances constructed there push their\r\n * `destroy` on the cleaning stack. While `callback` runs, `bucket.workspace` points to this workspace.\r\n * Several `sub` calls with the same key share one workspace; call `unsub(key)` to revert it.\r\n * The first call triggers the GSAP load and callbacks are queued until it completes; once the first callback has run,\r\n * `sub` becomes synchronous and ignores `$guard` and `lazy`.\r\n * @template T Anime class type (inferred from `this`).\r\n * @template U Shape of the custom data stored on `bucket.workspace`.\r\n * @param key Workspace key; pass the same value to `unsub`.\r\n * @param callback Receives the Anime bucket once GSAP is ready.\r\n * @param $guard Optional guard from `Up.Anime.getGuard()`: the callback is skipped if `$guard.value` is `false`, and setting it to `false` drops callbacks still queued during the first load.\r\n * @param lazy When `true`, queue the callback without starting the load (it runs once another call triggers it).\r\n * @returns The pending load promise while Anime is loading, otherwise `void`.\r\n * @throws If called on the server.\r\n */\r\n static override sub<T extends typeof Anime, U extends {}>(this: T, key: Anime.KEY, callback: Anime.CallBack<U>, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Anime.#map.has(key)) Anime.#map.set(key, null)\r\n\r\n return Anime.workspace((bucket: AnimeBucket): void =>\r\n {\r\n Anime.sub = (key: Anime.KEY, callback: Anime.CallBack<U>): void =>\r\n {\r\n let ws = Anime.#map.get(key)\r\n\r\n if (!ws) Anime.#map.set(key, ws =\r\n {\r\n ctx : bucket.gsap.context(Up.App.void),\r\n cleaningStack: []\r\n })\r\n\r\n ws.ctx.add((): void =>\r\n {\r\n const PREV = bucket.workspace\r\n \r\n bucket.workspace = ws\r\n\r\n callback(bucket as AnimeBucket<U>) // TODO: un stagger de ScrollTrigger cause des bugs avec la restauration du context (à tester)\r\n\r\n bucket.workspace = PREV\r\n })\r\n }\r\n\r\n if (Anime.#map.has(key)) Anime.sub(key, callback)\r\n },\r\n $guard, lazy)\r\n }\r\n\r\n /**\r\n * Closes the workspace identified by `key`: runs its cleaning stack in reverse order, reverts its GSAP context, then forgets the key.\r\n * Also cancels a `sub` still waiting for the first load, so its callback never runs.\r\n * @warning Only what was recorded in the workspace is reverted. Animations created later (asynchronously, e.g. in event handlers)\r\n * are not, unless you create them through `workspace.ctx.add()` or push a destructor on `workspace.cleaningStack`.\r\n * @param key Workspace key previously passed to `sub`.\r\n * @returns `true` if a workspace (or a pending `sub`) existed for `key`.\r\n */\r\n static override unsub(key: Anime.KEY): boolean\r\n {\r\n const WORKSPACE = Anime.#map.get(key)\r\n\r\n if (WORKSPACE) Anime.#free(WORKSPACE)\r\n \r\n return Anime.#map.delete(key)\r\n }\r\n\r\n /**\r\n * Runs `callback` with the Anime bucket, loading GSAP first if needed, without opening a keyed workspace.\r\n * Animations created here are not tracked for cleanup: use `sub` when they must be reverted later.\r\n * Triggering the first load early (e.g. in a `LIFE` subscriber registered with `Up.Event.sub`) avoids paying its cost mid-interaction.\r\n * @template T Lazy class type (inferred from `this`).\r\n * @param callback Receives the Anime bucket once GSAP is ready.\r\n * @param $guard Optional guard from `Up.Anime.getGuard()`: the callback is skipped if `$guard.value` is `false`, and setting it to `false` drops callbacks still queued during the first load.\r\n * @param lazy When `true`, queue the callback without starting the load.\r\n * @returns The pending load promise while Anime is loading, otherwise `void`.\r\n * @throws If called on the server.\r\n */\r\n static override workspace<T extends typeof Lazy>(this: T, callback: Anime.CallBack, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Up.Adapter.BROWSER) Logs.throw('ANIME', 'ANIME CAN ONLY BE USED IN THE BROWSER.')\r\n\r\n return super.workspace(callback, $guard, lazy)\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Anime\r\n\r\nexport type {\r\n Anime,\r\n AnimeBucket\r\n ,\r\n Split,\r\n Tweens,\r\n Timeline\r\n}"],"mappings":"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","names":["key","callback"]}
1
+ {"version":3,"sources":["../../src/plugins/Anime.ts"],"sourcesContent":["/* [Anime] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { SIGN, BUCKET, set, add, destroy, apply, load } from '../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../core/Up.js'\r\n\r\n // ##PLUGINS\r\nimport Lazy from './@/Lazy.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##THIS\r\nimport Split from './@anime/Split.js'\r\nimport Tweens from './@anime/Tweens.js'\r\nimport Timeline from './@anime/Timeline.js'\r\n\r\n // ##TYPES\r\nimport type { gsap, CustomEase, ScrollTrigger, SplitText } from 'gsap/all'\r\n\r\nimport type Thread from '../core/[1]/[2]/Thread.js'\r\n\r\nimport type Parser from '../scripts/Parser.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Anime\r\n{\r\n /**\r\n * Anime configuration as written in the Vite config (`plugins: [{ name: 'Anime', config }]` of `upwwwards/initializers/vite`).\r\n * The Vite plugin rewrites `plugins` into `graph` (see {@link Anime.CONFIG}) before it reaches the runtime.\r\n */\r\n export type RAW_CONFIG =\r\n {\r\n /**\r\n * GSAP plugins to load and register on first use, by their `gsap/<Name>` module name (e.g. `'CustomEase'`, `'ScrollTrigger'`, `'SplitText'`, `'Flip'`).\r\n * Each loaded plugin is also exposed on the Anime bucket under the same name (e.g. `bucket.ScrollTrigger`).\r\n */\r\n plugins?: PLUGIN[],\r\n /**\r\n * Custom eases to create once loaded, as `name → SVG path` (passed to `CustomEase.create(name, path)`).\r\n * @note Requires `'CustomEase'` in `plugins`; ignored otherwise.\r\n */\r\n easings?: Record<string, string>\r\n }\r\n\r\n /**\r\n * Runtime Anime configuration generated by the Vite plugin: {@link Anime.RAW_CONFIG} with `plugins` replaced by `graph`,\r\n * a map of plugin name to a dynamic `import('gsap/<Name>')` loader.\r\n */\r\n export type CONFIG = Omit<RAW_CONFIG, 'plugins'> & { graph?: { [K in PLUGIN]?: () => Promise<{ default: ANIME_PLUGINS_MAP[K] }> } }\r\n\r\n /**\r\n * Name of a property of {@link AnimeBucket}.\r\n */\r\n export type BUCKET_KEY = keyof AnimeBucket\r\n\r\n /**\r\n * Union of the value types of {@link AnimeBucket} properties.\r\n */\r\n export type BUCKET_VALUE = AnimeBucket[BUCKET_KEY]\r\n\r\n /**\r\n * Name of a GSAP plugin accepted in `RAW_CONFIG.plugins` (see {@link Anime.RAW_CONFIG}).\r\n * `'CustomEase'`, `'ScrollTrigger'` and `'SplitText'` are typed; any other `gsap/<Name>` module name is accepted as a string.\r\n */\r\n export type PLUGIN = keyof ANIME_PLUGINS_MAP\r\n\r\n /**\r\n * Workspace key passed to `sub` / `unsub`: a `symbol`, usually one unique symbol per component.\r\n */\r\n export type KEY = symbol\r\n\r\n /**\r\n * Shape of custom data you may store on a workspace (e.g. a cached `Split` instance).\r\n * The keys `ctx` and `cleaningStack` are reserved by Anime.\r\n */\r\n export type TRUNK = Parser.Merge<{ [K in PropertyKey]: any },\r\n {\r\n ctx ?: never,\r\n cleaningStack?: never\r\n }>\r\n\r\n /**\r\n * A workspace: the keyed scope opened by `Anime.sub(key, …)` and closed by `Anime.unsub(key)`.\r\n * It owns a GSAP context and a cleaning stack, plus any custom data you store on it.\r\n * @template T Shape of the custom data stored on the workspace.\r\n */\r\n export type Workspace<T extends TRUNK = TRUNK> = Parser.Merge<Partial<T>,\r\n {\r\n /**\r\n * GSAP context in which `sub` callbacks run. Tweens, timelines, ScrollTriggers and nested contexts created\r\n * synchronously inside those callbacks are recorded here and reverted by `unsub`.\r\n */\r\n ctx: gsap.Context,\r\n /**\r\n * Cleaning stack: destructors run by `unsub` in reverse order, before `ctx.revert()`.\r\n * `Timeline`, `Tweens` and `Split` push their `destroy` here when constructed inside a `sub` callback; you may push your own.\r\n */\r\n cleaningStack: (() => void)[]\r\n }>\r\n\r\n /**\r\n * Callback receiving the Anime bucket, optionally typed with the workspace's custom data.\r\n * @template T Shape of the custom data stored on `bucket.workspace`.\r\n */\r\n export type CallBack<T extends TRUNK = TRUNK> = (bucket: AnimeBucket<T>) => void\r\n}\r\n\r\n/**\r\n * Anime bucket: the runtime bag passed to `Anime.workspace` / `Anime.sub` callbacks once GSAP is loaded.\r\n * Every GSAP plugin listed in the Anime config is added as an extra read-only key named after the plugin (e.g. `bucket.ScrollTrigger`);\r\n * the Vite plugin generates the matching type augmentation.\r\n * @template T Shape of the custom data stored on the current workspace.\r\n*/\r\ninterface AnimeBucket<T extends Anime.TRUNK = Anime.TRUNK>\r\n{\r\n [K: string & {}]: any,\r\n /**\r\n * Workspace of the `sub` callback currently running (see {@link Anime.Workspace}); an empty object outside any `sub` callback.\r\n */\r\n workspace: Partial<Anime.Workspace<T>>,\r\n /**\r\n * The loaded GSAP instance (default export of `gsap`).\r\n */\r\n gsap: typeof gsap,\r\n /**\r\n * {@link Split} helper class (GSAP `SplitText` wrapper with automatic cleanup).\r\n */\r\n Split: typeof Split,\r\n /**\r\n * {@link Tweens} helper class (standalone tweens with automatic cleanup).\r\n */\r\n Tweens: typeof Tweens,\r\n /**\r\n * {@link Timeline} helper class (ScrollTrigger-driven timeline with tracks and fragments).\r\n */\r\n Timeline: typeof Timeline\r\n}\r\n\r\n/**\r\n * Typed GSAP plugins that may be loaded through the Anime config, keyed by name.\r\n * @internal\r\n*/\r\ntype ANIME_PLUGINS_MAP =\r\n{\r\n [K: string & {}]: any,\r\n CustomEase : typeof CustomEase,\r\n ScrollTrigger : typeof ScrollTrigger,\r\n SplitText : typeof SplitText\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * GSAP integration plugin, exposed as `Up.Anime`.\r\n * It is a lazy plugin: GSAP and the GSAP plugins listed in its config are loaded with dynamic imports on the first\r\n * `workspace` / `sub` call; callbacks are queued until then, and later calls run synchronously.\r\n *\r\n * Once loaded, GSAP and the `Up.Thread` frame scheduler share one clock: GSAP's ticker drives the Thread or, if the Thread\r\n * is already driven by another ticker, GSAP's ticker is put to sleep and `gsap.updateRoot` runs as a Thread task on every frame.\r\n * When `ScrollTrigger` is loaded, its automatic refresh events are disabled: it is refreshed and updated by Thread modifiers\r\n * on the earthquake (`2`) and resize (`8`) flags, and updated on the scroll flag (`32`). A Thread flag is a power-of-two\r\n * priority bucket that groups work of the same kind within a frame.\r\n *\r\n * Use `sub(key, callback)` to animate inside a keyed workspace (see {@link Anime.Workspace}) and `unsub(key)` to revert everything it created.\r\n * @note Enable it with the Vite plugin `upwwwards/initializers/vite`: `plugins: [{ name: 'Anime', config: { plugins: ['ScrollTrigger', …] } }]`.\r\n * @note Client-only: `workspace` and `sub` throw on the server.\r\n * @example\r\n * ```ts\r\n * // vite.config.ts\r\n * import initializer from 'upwwwards/initializers/vite'\r\n *\r\n * initializer({ plugins: [{ name: 'Anime', config: { plugins: ['ScrollTrigger', 'SplitText'] } }] })\r\n *\r\n * // Component (client side)\r\n * import Up from 'upwwwards'\r\n * import type { AnimeBucket } from 'upwwwards/plugins'\r\n *\r\n * const KEY = Symbol('Hero')\r\n *\r\n * Up.Anime.sub(KEY, (bucket: AnimeBucket): void =>\r\n * {\r\n * bucket.gsap.from('.hero__title', { y: 40, autoAlpha: 0, duration: 1 })\r\n * })\r\n *\r\n * // On unmount: runs the cleaning stack and reverts every animation created above.\r\n * Up.Anime.unsub(KEY)\r\n * ```\r\n*/\r\nabstract class Anime extends Lazy\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n static #plugged = false\r\n\r\n static #config: Anime.CONFIG | undefined\r\n\r\n static #map: Map<Anime.KEY, Anime.Workspace | null>\r\n\r\n /**\r\n * Unique symbol identifying the Anime plugin (also stamped on its guards).\r\n * @internal\r\n */\r\n static override readonly [SIGN] = Symbol('Anime')\r\n\r\n /**\r\n * Plugin name: the key on `Up` (`Up.Anime`) and the `name` used in the Vite config.\r\n */\r\n static override readonly NAME = 'Anime'\r\n\r\n /**\r\n * Anime bucket (see {@link AnimeBucket}); `gsap` and the registered plugins are filled in during load.\r\n * @warning Receive it through `workspace` / `sub` callbacks instead: before load, `gsap` is an empty placeholder.\r\n * @internal\r\n */\r\n static override readonly [BUCKET]: AnimeBucket =\r\n {\r\n workspace: {},\r\n gsap : {} as AnimeBucket['gsap'],\r\n Split,\r\n Tweens,\r\n Timeline\r\n }\r\n\r\n // ##PRIVATES\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 static #setVars(config?: Anime.CONFIG): void\r\n {\r\n Anime.#config = config\r\n Anime.#map = new Map()\r\n }\r\n\r\n static #setTask(): void\r\n {\r\n // *GSAP animations will run at the end of the Thread.\r\n Up.Thread.markForever(Anime.#t$)\r\n Up.Thread.sub(Anime.#t$, Up.Thread.MAX_FLAG)\r\n }\r\n\r\n static #setEvent(gsap: AnimeBucket['gsap'], callback: (timestamp: number) => void): void\r\n {\r\n gsap.ticker.add(\r\n Anime.#eTick = (timestamp: number): void => { callback(timestamp * 1_000) },\r\n false, true /* *Set the Thread's priority so that animations run after tasks. */\r\n )\r\n }\r\n\r\n static #setGsap(gsap: AnimeBucket['gsap']): void\r\n {\r\n Anime[add]('gsap', gsap)\r\n\r\n const callback = Up.Thread[apply]()\r\n\r\n if (!callback)\r\n {\r\n Anime.#plugged = true\r\n \r\n gsap.ticker.remove(gsap.updateRoot)\r\n gsap.ticker.sleep()\r\n\r\n Anime.#setTask()\r\n }\r\n else Anime.#setEvent(gsap, callback)\r\n }\r\n\r\n static #setCustomEase(CustomEase: ANIME_PLUGINS_MAP['CustomEase']): void\r\n {\r\n const EASINGS = Anime.#config?.easings\r\n\r\n for (const KEY in EASINGS) CustomEase.create(KEY, EASINGS[KEY])\r\n }\r\n\r\n static #setScrollTrigger(ScrollTrigger: ANIME_PLUGINS_MAP['ScrollTrigger']): void\r\n {\r\n ScrollTrigger.config({ autoRefreshEvents: '' })\r\n\r\n Up.Thread.addModifier(ScrollTrigger.refresh, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.update, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.refresh, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.update, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.addModifier(ScrollTrigger.update, 32 satisfies Thread.SCROLL_FLAG)\r\n }\r\n\r\n /**\r\n * Marks the plugin as configured and stores its runtime config; GSAP is not loaded here. Called by `Up` on the client.\r\n * @param config Runtime config generated by the Vite plugin.\r\n * @throws If the plugin is already configured.\r\n * @internal\r\n */\r\n static override [set](config?: Anime.CONFIG): void\r\n {\r\n super[set]()\r\n \r\n Anime.#setVars(config)\r\n }\r\n\r\n // ##DESTROY\r\n static #destroyVars(): void\r\n {\r\n if (Anime.#map.size)\r\n {\r\n for (const [_, WORKSPACE] of Anime.#map) if (WORKSPACE) Anime.#free(WORKSPACE)\r\n\r\n Anime.#map.clear()\r\n }\r\n }\r\n\r\n static #destroyTask(): void { Up.Thread.unsub(Anime.#t$) }\r\n\r\n static #destroyEvent(): void { Anime[BUCKET].gsap.ticker.remove(Anime.#eTick) }\r\n\r\n static #destroyScrollTrigger(): void\r\n {\r\n const ScrollTrigger: ANIME_PLUGINS_MAP['ScrollTrigger'] | undefined = Anime[BUCKET].ScrollTrigger\r\n\r\n if (!ScrollTrigger) return\r\n\r\n Up.Thread.removeModifier(ScrollTrigger.refresh, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.update, 2 satisfies Thread.EARTHQUAKE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.refresh, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.update, 8 satisfies Thread.RESIZE_FLAG)\r\n Up.Thread.removeModifier(ScrollTrigger.update, 32 satisfies Thread.SCROLL_FLAG)\r\n }\r\n\r\n /**\r\n * Closes every open workspace, detaches GSAP from the Thread and removes the ScrollTrigger modifiers. Called by `Up.destroy`.\r\n * @throws If the plugin is already destroyed.\r\n * @internal\r\n */\r\n static override [destroy](): void\r\n {\r\n super[destroy]()\r\n \r\n Anime.#destroyVars()\r\n\r\n Anime.#plugged ? Anime.#destroyTask() : Anime.#destroyEvent()\r\n\r\n Anime.#destroyScrollTrigger()\r\n }\r\n\r\n // ##TASKS\r\n static #t$(): void { Anime[BUCKET].gsap.updateRoot(Up.Thread.timestamp / 1_000) }\r\n\r\n // ##EVENTS\r\n static #eTick = (timestamp: number): void => {}\r\n\r\n // ##LOADERS\r\n /**\r\n * Imports GSAP and links it to the Thread, then loads and registers every plugin of `graph` in parallel\r\n * (a failing plugin is logged, not thrown), creates the configured easings, wires ScrollTrigger to the Thread,\r\n * and shares the bucket with `Split`, `Tweens` and `Timeline`. Triggered by the first `workspace` / `sub` call.\r\n * @returns Resolves when loading is complete.\r\n * @throws (rejects) If the plugin is not configured, already loaded, or destroyed while loading.\r\n * @internal\r\n */\r\n static override [load](): Promise<void>\r\n {\r\n return super[load](async (): Promise<void> =>\r\n {\r\n Anime.#setGsap((await import('gsap')).default)\r\n\r\n const GRAPH = Anime.#config?.graph\r\n \r\n if (GRAPH)\r\n {\r\n const PROMISES: Promise<void>[] = []\r\n\r\n for (const KEY in GRAPH) PROMISES.push(GRAPH[KEY as Anime.PLUGIN]!().then(({default: plugin}: { default: ANIME_PLUGINS_MAP[Anime.PLUGIN] }): void =>\r\n {\r\n Anime[BUCKET].gsap.registerPlugin(plugin)\r\n \r\n Anime[add](KEY, plugin)\r\n\r\n switch (KEY)\r\n {\r\n case 'CustomEase' : return Anime.#setCustomEase(plugin)\r\n case 'ScrollTrigger': return Anime.#setScrollTrigger(plugin)\r\n default :\r\n }\r\n })\r\n .catch((): void => Logs.error('ANIME', `ANIME PLUGIN \"${KEY}\" COULD NOT BE LOADED.`)))\r\n\r\n await Promise.all(PROMISES)\r\n }\r\n\r\n Split[BUCKET] = Tweens[BUCKET] = Timeline[BUCKET] = Anime[BUCKET]\r\n })\r\n }\r\n\r\n // ##UTILS\r\n static #free(workspace: Anime.Workspace): void\r\n {\r\n for (let i = workspace.cleaningStack.length - 1; i > -1; i--) workspace.cleaningStack[i]()\r\n\r\n workspace.ctx.revert()\r\n }\r\n\r\n /**\r\n * Runs `callback` inside the workspace identified by `key`, creating the workspace on first use.\r\n * A workspace (see {@link Anime.Workspace}) owns a GSAP context and a cleaning stack: animations created synchronously\r\n * in `callback` are recorded in the context, and `Timeline` / `Tweens` / `Split` instances constructed there push their\r\n * `destroy` on the cleaning stack. While `callback` runs, `bucket.workspace` points to this workspace.\r\n * Several `sub` calls with the same key share one workspace; call `unsub(key)` to revert it.\r\n * The first call triggers the GSAP load and callbacks are queued until it completes; once the first callback has run,\r\n * `sub` becomes synchronous and ignores `$guard` and `lazy`.\r\n * @template T Anime class type (inferred from `this`).\r\n * @template U Shape of the custom data stored on `bucket.workspace`.\r\n * @param key Workspace key; pass the same value to `unsub`.\r\n * @param callback Receives the Anime bucket once GSAP is ready.\r\n * @param $guard Optional guard from `Up.Anime.getGuard()`: the callback is skipped if `$guard.value` is `false`, and setting it to `false` drops callbacks still queued during the first load.\r\n * @param lazy When `true`, queue the callback without starting the load (it runs once another call triggers it).\r\n * @returns The pending load promise while Anime is loading, otherwise `void`.\r\n * @throws If called on the server.\r\n * @warning ScrollTrigger `stagger` can break GSAP context restore on `unsub` (context / `bucket.workspace` handoff). Prefer non-staggered setups inside `sub`, or clean those triggers yourself on the cleaning stack.\r\n */\r\n static override sub<T extends typeof Anime, U extends {}>(this: T, key: Anime.KEY, callback: Anime.CallBack<U>, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Anime.#map.has(key)) Anime.#map.set(key, null)\r\n\r\n // *`this.workspace` / `this.sub` keep Lazy state and the fast-path rewrite on the patched class.\r\n return this.workspace((bucket: AnimeBucket): void =>\r\n {\r\n this.sub = (key: Anime.KEY, callback: Anime.CallBack<U>): void =>\r\n {\r\n let ws = Anime.#map.get(key)\r\n\r\n if (!ws) Anime.#map.set(key, ws =\r\n {\r\n ctx : bucket.gsap.context(Up.App.void),\r\n cleaningStack: []\r\n })\r\n\r\n ws.ctx.add((): void =>\r\n {\r\n const PREV = bucket.workspace\r\n \r\n bucket.workspace = ws\r\n\r\n callback(bucket as AnimeBucket<U>) // TODO: bug stagger\r\n\r\n bucket.workspace = PREV\r\n })\r\n }\r\n\r\n if (Anime.#map.has(key)) this.sub(key, callback)\r\n },\r\n $guard, lazy)\r\n }\r\n\r\n /**\r\n * Closes the workspace identified by `key`: runs its cleaning stack in reverse order, reverts its GSAP context, then forgets the key.\r\n * Also cancels a `sub` still waiting for the first load, so its callback never runs.\r\n * @warning Only what was recorded in the workspace is reverted. Animations created later (asynchronously, e.g. in event handlers)\r\n * are not, unless you create them through `workspace.ctx.add()` or push a destructor on `workspace.cleaningStack`.\r\n * @param key Workspace key previously passed to `sub`.\r\n * @returns `true` if a workspace (or a pending `sub`) existed for `key`.\r\n */\r\n static override unsub(key: Anime.KEY): boolean\r\n {\r\n const WORKSPACE = Anime.#map.get(key)\r\n\r\n if (WORKSPACE) Anime.#free(WORKSPACE)\r\n \r\n return Anime.#map.delete(key)\r\n }\r\n\r\n /**\r\n * Runs `callback` with the Anime bucket, loading GSAP first if needed, without opening a keyed workspace.\r\n * Animations created here are not tracked for cleanup: use `sub` when they must be reverted later.\r\n * Triggering the first load early (e.g. in a `LIFE` subscriber registered with `Up.Event.sub`) avoids paying its cost mid-interaction.\r\n * @template T Lazy class type (inferred from `this`).\r\n * @param callback Receives the Anime bucket once GSAP is ready.\r\n * @param $guard Optional guard from `Up.Anime.getGuard()`: the callback is skipped if `$guard.value` is `false`, and setting it to `false` drops callbacks still queued during the first load.\r\n * @param lazy When `true`, queue the callback without starting the load.\r\n * @returns The pending load promise while Anime is loading, otherwise `void`.\r\n * @throws If called on the server.\r\n */\r\n static override workspace<T extends typeof Lazy>(this: T, callback: Anime.CallBack, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Up.Adapter.BROWSER) Logs.throw('ANIME', 'ANIME CAN ONLY BE USED IN THE BROWSER.')\r\n\r\n return super.workspace(callback, $guard, lazy)\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Anime\r\n\r\nexport type {\r\n Anime,\r\n AnimeBucket\r\n ,\r\n Split,\r\n Tweens,\r\n Timeline\r\n}"],"mappings":"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","names":["key","callback"]}
@@ -1,4 +1,4 @@
1
- export { M as Matrix4, g as Puppeteer, g as default } from '../index-GVYgi7Wm.js';
1
+ export { M as Matrix4, g as Puppeteer, g as default } from '../index-CzWXovKy.js';
2
2
  import '../index-BlwaDpQl.js';
3
3
  import '../symbols/index.js';
4
4
  import '../Thread-Cvf__-O4.js';
@@ -1,5 +1,5 @@
1
1
  import '../symbols/index.js';
2
- export { S as Scroll, b as ScrollBucket, S as default } from '../index-GVYgi7Wm.js';
2
+ export { S as Scroll, b as ScrollBucket, S as default } from '../index-CzWXovKy.js';
3
3
  import 'lenis';
4
4
  import '../Thread-Cvf__-O4.js';
5
5
  import '../index-BlwaDpQl.js';
@@ -109,9 +109,8 @@ class Scroll extends Lazy {
109
109
  * `LIFE` handler: triggers the Lenis load (no-op callback once loaded).
110
110
  */
111
111
  static #e$Life() {
112
- Scroll.workspace(Up.App.void);
112
+ Up.Scroll.workspace(Up.App.void);
113
113
  }
114
- // TODO: Make the auto set optional.
115
114
  /**
116
115
  * `LOAD` handler: starts the Lenis frame task.
117
116
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/Scroll.ts"],"sourcesContent":["/* [Scroll] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { SIGN, BUCKET, set, destroy, load } from '../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../core/Up.js'\r\n\r\n // ##PLUGINS\r\nimport Lazy from './@/Lazy.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##TYPES\r\nimport type Lenis from 'lenis'\r\nimport type { ScrollToOptions } from 'lenis'\r\n\r\nimport type Event from '../core/[1]/Event.js'\r\nimport type Thread from '../core/[1]/[2]/Thread.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Scroll\r\n{\r\n /**\r\n * Callback receiving the Scroll bucket once Lenis is loaded.\r\n */\r\n export type CALLBACK = (bucket: ScrollBucket) => void\r\n}\r\n\r\n/**\r\n * Object passed to `Up.Scroll.workspace` callbacks once Lenis is loaded.\r\n*/\r\ninterface ScrollBucket\r\n{\r\n /**\r\n * Lenis constructor, from the `lenis` package.\r\n */\r\n Lenis: typeof Lenis,\r\n /**\r\n * Shared Lenis instance, created with `autoRaf: false` and updated every frame by {@link Up.Thread}.\r\n */\r\n global: Lenis\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Smooth scrolling plugin built on [Lenis](https://github.com/darkroomengineering/lenis), loaded lazily (see {@link Lazy}).\r\n * - Lenis is dynamically imported on the first `workspace` call, which the plugin triggers itself on the first `LIFE` event (page entry) of {@link Up.Event}.\r\n * - From the `LOAD` event, a forever {@link Up.Thread} task drives Lenis every frame (`autoRaf: false`).\r\n * - `stop`, `start` and `to` can be called at any time: before Lenis is loaded they use fallbacks, afterwards they call the Lenis instance.\r\n * @note Client-only. Requires the optional peer dependency `lenis` and the plugin enabled in the Vite config.\r\n * @example\r\n * ```ts\r\n * // vite.config.ts\r\n * upwwwards({ adapter: 'Nuxt', plugins: ['Scroll'] })\r\n * ```\r\n *\r\n * ```ts\r\n * Up.Scroll.to('#contact', { offset: -80 })\r\n * Up.Scroll.stop() // e.g. while a modal is open\r\n * Up.Scroll.start()\r\n *\r\n * Up.Scroll.workspace(({ global }): void => { global.on('scroll', console.log) })\r\n * ```\r\n*/\r\nabstract class Scroll extends Lazy\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * Thread priority flag of the Lenis frame task.\r\n */\r\n static #THREAD_FLAG: Thread.SCROLL_FLAG = 32\r\n\r\n /**\r\n * Event subscriptions: `LIFE` triggers the load, `LOAD` starts the frame task.\r\n */\r\n static #EVENT_TICKETS: Event.TICKET[] =\r\n [\r\n ['LIFE', Scroll.#e$Life],\r\n ['LOAD', Scroll.#e$Load]\r\n ]\r\n\r\n /**\r\n * Whether `stop` was called before Lenis was loaded.\r\n */\r\n static #stopped = false\r\n\r\n /**\r\n * Unique identity of the Scroll plugin, stamped on its guards.\r\n * @internal\r\n */\r\n static override readonly [SIGN] = Symbol('Scroll')\r\n\r\n /**\r\n * Plugin name; the plugin is exposed as `Up.Scroll`.\r\n */\r\n static override readonly NAME = 'Scroll'\r\n\r\n /**\r\n * Runtime object passed to `workspace` callbacks (see {@link ScrollBucket}).\r\n * @warning Holds empty placeholders until Lenis is loaded; use `workspace` instead of reading it directly.\r\n * @internal\r\n */\r\n static override readonly [BUCKET]: ScrollBucket =\r\n {\r\n Lenis : {} as typeof Lenis,\r\n global: {} as Lenis\r\n }\r\n\r\n // ##PRIVATES\r\n\r\n // ##PUBLICS\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * {@link Up.Thread} priority flag of the Lenis frame task (`32`). Thread tasks with a lower flag run earlier in the frame.\r\n * @returns The scroll Thread flag.\r\n */\r\n static get THREAD_FLAG(): Thread.SCROLL_FLAG { return Scroll.#THREAD_FLAG }\r\n\r\n// #METHODS\r\n\r\n // ##SET\r\n /**\r\n * Subscribes to the `LIFE` and `LOAD` events.\r\n */\r\n static #setEvents(): void { Up.Event.sub(Scroll.#EVENT_TICKETS) }\r\n\r\n /**\r\n * Schedules the Lenis frame task as a forever Thread task.\r\n */\r\n static #setTask(): void\r\n {\r\n Up.Thread.markForever(Scroll.#t$)\r\n Up.Thread.sub(Scroll.#t$, Scroll.#THREAD_FLAG)\r\n }\r\n\r\n /**\r\n * Client-only setup hook: marks the plugin as configured and subscribes to the `LIFE` and `LOAD` events.\r\n * @throws If the plugin is already configured.\r\n * @internal\r\n */\r\n static override [set](): void\r\n {\r\n super[set]()\r\n \r\n Scroll.#setEvents()\r\n }\r\n\r\n // ##DESTROY\r\n /**\r\n * Destroys the Lenis instance.\r\n */\r\n static #destroyVars(): void { Scroll[BUCKET].global?.destroy() }\r\n\r\n /**\r\n * Unsubscribes from the `LIFE` and `LOAD` events.\r\n */\r\n static #destroyEvents(): void { Up.Event.unsub(Scroll.#EVENT_TICKETS) }\r\n\r\n /**\r\n * Unschedules the Lenis frame task.\r\n */\r\n static #destroyTask(): void { Up.Thread.unsub(Scroll.#t$) }\r\n\r\n /**\r\n * Client-only teardown hook: destroys the Lenis instance, unsubscribes from events and stops the frame task.\r\n * @throws If the plugin is already destroyed.\r\n * @internal\r\n */\r\n static override [destroy](): void\r\n {\r\n super[destroy]()\r\n\r\n Scroll.#destroyVars()\r\n Scroll.#destroyEvents()\r\n Scroll.#destroyTask()\r\n }\r\n\r\n // ##EVENTS\r\n /**\r\n * `LIFE` handler: triggers the Lenis load (no-op callback once loaded).\r\n */\r\n static #e$Life(): void { Scroll.workspace(Up.App.void) } // TODO: Make the auto set optional.\r\n\r\n /**\r\n * `LOAD` handler: starts the Lenis frame task.\r\n */\r\n static #e$Load(): void { Scroll.#setTask() }\r\n\r\n // ##TASKS\r\n /**\r\n * Frame task: advances Lenis with the Thread timestamp.\r\n */\r\n static #t$(): void { Scroll[BUCKET].global.raf(Up.Thread.timestamp) }\r\n\r\n // ##LOADERS\r\n /**\r\n * Load hook: imports `lenis`, creates the shared instance with `autoRaf: false`, and rebinds `stop`, `start` and `to` to it.\r\n * If `stop` was called before loading, Lenis starts stopped.\r\n * @throws If the plugin is not configured, already loaded, or destroyed during the import.\r\n * @internal\r\n */\r\n static override async [load](): Promise<void>\r\n {\r\n const\r\n MODULE = await super[load]((): Promise<typeof import('lenis')> => import('lenis')),\r\n LENIS = Scroll[BUCKET].global = new (Scroll[BUCKET].Lenis = MODULE!.default)({ autoRaf: false })\r\n\r\n Scroll.stop = LENIS.stop.bind(LENIS)\r\n Scroll.start = LENIS.start.bind(LENIS)\r\n Scroll.to = LENIS.scrollTo.bind(LENIS)\r\n\r\n if (Scroll.#stopped) Scroll.stop()\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Runs `callback` with the {@link ScrollBucket} (Lenis constructor and shared instance), loading Lenis first if needed.\r\n * See {@link Lazy.workspace} for the queueing and guard behavior.\r\n * @template T Lazy plugin class.\r\n * @param callback Receives the Scroll bucket.\r\n * @param $guard Optional guard from `Up.Scroll.getGuard`; the call is ignored when `guard.value` is `false`.\r\n * @param lazy When `true`, queue the callback without starting the load.\r\n * @returns The pending load promise while loading, otherwise `undefined`.\r\n * @throws If called on the server.\r\n */\r\n static override workspace<T extends typeof Lazy>(callback: Lazy.CALLBACK, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Up.Adapter.BROWSER) Logs.throw('SCROLL', 'SCROLL CAN ONLY BE USED IN THE BROWSER.')\r\n\r\n return super.workspace(callback, $guard, lazy)\r\n }\r\n\r\n /**\r\n * Stops smooth scrolling (calls `Lenis.stop`).\r\n * Before Lenis is loaded, the request is remembered and Lenis starts stopped.\r\n */\r\n static stop(): void { Scroll.#stopped = true }\r\n\r\n /**\r\n * Resumes smooth scrolling (calls `Lenis.start`).\r\n * Before Lenis is loaded, cancels a previous `stop` request.\r\n */\r\n static start(): void { Scroll.#stopped = false }\r\n\r\n /**\r\n * Scrolls the page to a target (calls `Lenis.scrollTo`).\r\n * Before Lenis is loaded, falls back to `window.scrollTo`: selectors and elements are converted to an absolute Y position, smooth unless `options.immediate` is `true`.\r\n * @param target Element, CSS selector, or absolute Y position in px.\r\n * @param options Lenis `scrollTo` options. Before Lenis is loaded, only `immediate` is used, and `offset` only for element and selector targets.\r\n * @note Before Lenis is loaded, a selector that matches nothing logs a warning and does nothing.\r\n */\r\n static to(target: HTMLElement | number | string, options?: ScrollToOptions): void\r\n {\r\n switch (typeof target)\r\n {\r\n case 'string':\r\n {\r\n const TARGET = document.querySelector<HTMLElement>(target)\r\n\r\n if (!TARGET) return Logs.warn('SCROLL', `THE \"${target}\" TARGET WAS NOT FOUND.`)\r\n\r\n target = TARGET\r\n }\r\n case 'object':\r\n {\r\n target = Up.App.y + target.getBoundingClientRect().top\r\n\r\n if (options?.offset) target += options.offset\r\n }\r\n default:\r\n }\r\n\r\n window.scrollTo(\r\n {\r\n top : target,\r\n behavior: options?.immediate ? 'instant' : 'smooth'\r\n })\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Scroll\r\n\r\nexport type {\r\n Scroll,\r\n ScrollBucket\r\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/plugins/Scroll.ts"],"sourcesContent":["/* [Scroll] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { SIGN, BUCKET, set, destroy, load } from '../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../core/Up.js'\r\n\r\n // ##PLUGINS\r\nimport Lazy from './@/Lazy.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##TYPES\r\nimport type Lenis from 'lenis'\r\nimport type { ScrollToOptions } from 'lenis'\r\n\r\nimport type Event from '../core/[1]/Event.js'\r\nimport type Thread from '../core/[1]/[2]/Thread.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Scroll\r\n{\r\n /**\r\n * Callback receiving the Scroll bucket once Lenis is loaded.\r\n */\r\n export type CALLBACK = (bucket: ScrollBucket) => void\r\n}\r\n\r\n/**\r\n * Object passed to `Up.Scroll.workspace` callbacks once Lenis is loaded.\r\n*/\r\ninterface ScrollBucket\r\n{\r\n /**\r\n * Lenis constructor, from the `lenis` package.\r\n */\r\n Lenis: typeof Lenis,\r\n /**\r\n * Shared Lenis instance, created with `autoRaf: false` and updated every frame by {@link Up.Thread}.\r\n */\r\n global: Lenis\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Smooth scrolling plugin built on [Lenis](https://github.com/darkroomengineering/lenis), loaded lazily (see {@link Lazy}).\r\n * - Lenis is dynamically imported on the first `workspace` call, which the plugin triggers itself on the first `LIFE` event (page entry) of {@link Up.Event}.\r\n * - From the `LOAD` event, a forever {@link Up.Thread} task drives Lenis every frame (`autoRaf: false`).\r\n * - `stop`, `start` and `to` can be called at any time: before Lenis is loaded they use fallbacks, afterwards they call the Lenis instance.\r\n * @note Client-only. Requires the optional peer dependency `lenis` and the plugin enabled in the Vite config.\r\n * @example\r\n * ```ts\r\n * // vite.config.ts\r\n * upwwwards({ adapter: 'Nuxt', plugins: ['Scroll'] })\r\n * ```\r\n *\r\n * ```ts\r\n * Up.Scroll.to('#contact', { offset: -80 })\r\n * Up.Scroll.stop() // e.g. while a modal is open\r\n * Up.Scroll.start()\r\n *\r\n * Up.Scroll.workspace(({ global }): void => { global.on('scroll', console.log) })\r\n * ```\r\n*/\r\nabstract class Scroll extends Lazy\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * Thread priority flag of the Lenis frame task.\r\n */\r\n static #THREAD_FLAG: Thread.SCROLL_FLAG = 32\r\n\r\n /**\r\n * Event subscriptions: `LIFE` triggers the load, `LOAD` starts the frame task.\r\n */\r\n static #EVENT_TICKETS: Event.TICKET[] =\r\n [\r\n ['LIFE', Scroll.#e$Life],\r\n ['LOAD', Scroll.#e$Load]\r\n ]\r\n\r\n /**\r\n * Whether `stop` was called before Lenis was loaded.\r\n */\r\n static #stopped = false\r\n\r\n /**\r\n * Unique identity of the Scroll plugin, stamped on its guards.\r\n * @internal\r\n */\r\n static override readonly [SIGN] = Symbol('Scroll')\r\n\r\n /**\r\n * Plugin name; the plugin is exposed as `Up.Scroll`.\r\n */\r\n static override readonly NAME = 'Scroll'\r\n\r\n /**\r\n * Runtime object passed to `workspace` callbacks (see {@link ScrollBucket}).\r\n * @warning Holds empty placeholders until Lenis is loaded; use `workspace` instead of reading it directly.\r\n * @internal\r\n */\r\n static override readonly [BUCKET]: ScrollBucket =\r\n {\r\n Lenis : {} as typeof Lenis,\r\n global: {} as Lenis\r\n }\r\n\r\n // ##PRIVATES\r\n\r\n // ##PUBLICS\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * {@link Up.Thread} priority flag of the Lenis frame task (`32`). Thread tasks with a lower flag run earlier in the frame.\r\n * @returns The scroll Thread flag.\r\n */\r\n static get THREAD_FLAG(): Thread.SCROLL_FLAG { return Scroll.#THREAD_FLAG }\r\n\r\n// #METHODS\r\n\r\n // ##SET\r\n /**\r\n * Subscribes to the `LIFE` and `LOAD` events.\r\n */\r\n static #setEvents(): void { Up.Event.sub(Scroll.#EVENT_TICKETS) }\r\n\r\n /**\r\n * Schedules the Lenis frame task as a forever Thread task.\r\n */\r\n static #setTask(): void\r\n {\r\n Up.Thread.markForever(Scroll.#t$)\r\n Up.Thread.sub(Scroll.#t$, Scroll.#THREAD_FLAG)\r\n }\r\n\r\n /**\r\n * Client-only setup hook: marks the plugin as configured and subscribes to the `LIFE` and `LOAD` events.\r\n * @throws If the plugin is already configured.\r\n * @internal\r\n */\r\n static override [set](): void\r\n {\r\n super[set]()\r\n \r\n Scroll.#setEvents()\r\n }\r\n\r\n // ##DESTROY\r\n /**\r\n * Destroys the Lenis instance.\r\n */\r\n static #destroyVars(): void { Scroll[BUCKET].global?.destroy() }\r\n\r\n /**\r\n * Unsubscribes from the `LIFE` and `LOAD` events.\r\n */\r\n static #destroyEvents(): void { Up.Event.unsub(Scroll.#EVENT_TICKETS) }\r\n\r\n /**\r\n * Unschedules the Lenis frame task.\r\n */\r\n static #destroyTask(): void { Up.Thread.unsub(Scroll.#t$) }\r\n\r\n /**\r\n * Client-only teardown hook: destroys the Lenis instance, unsubscribes from events and stops the frame task.\r\n * @throws If the plugin is already destroyed.\r\n * @internal\r\n */\r\n static override [destroy](): void\r\n {\r\n super[destroy]()\r\n\r\n Scroll.#destroyVars()\r\n Scroll.#destroyEvents()\r\n Scroll.#destroyTask()\r\n }\r\n\r\n // ##EVENTS\r\n /**\r\n * `LIFE` handler: triggers the Lenis load (no-op callback once loaded).\r\n */\r\n static #e$Life(): void\r\n {\r\n /*\r\n *Go through `Up.Scroll` so `Up.patch` subclasses keep Lazy STATUS/QUEUE on the live class.\r\n \r\n TODO: Make the auto set optional.\r\n */\r\n\r\n (Up as typeof Up & { Scroll: typeof Scroll }).Scroll.workspace(Up.App.void)\r\n }\r\n\r\n /**\r\n * `LOAD` handler: starts the Lenis frame task.\r\n */\r\n static #e$Load(): void { Scroll.#setTask() }\r\n\r\n // ##TASKS\r\n /**\r\n * Frame task: advances Lenis with the Thread timestamp.\r\n */\r\n static #t$(): void { Scroll[BUCKET].global.raf(Up.Thread.timestamp) }\r\n\r\n // ##LOADERS\r\n /**\r\n * Load hook: imports `lenis`, creates the shared instance with `autoRaf: false`, and rebinds `stop`, `start` and `to` to it.\r\n * If `stop` was called before loading, Lenis starts stopped.\r\n * @throws If the plugin is not configured, already loaded, or destroyed during the import.\r\n * @internal\r\n */\r\n static override async [load](): Promise<void>\r\n {\r\n const\r\n MODULE = await super[load]((): Promise<typeof import('lenis')> => import('lenis')),\r\n LENIS = Scroll[BUCKET].global = new (Scroll[BUCKET].Lenis = MODULE!.default)({ autoRaf: false })\r\n\r\n Scroll.stop = LENIS.stop.bind(LENIS)\r\n Scroll.start = LENIS.start.bind(LENIS)\r\n Scroll.to = LENIS.scrollTo.bind(LENIS)\r\n\r\n if (Scroll.#stopped) Scroll.stop()\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Runs `callback` with the {@link ScrollBucket} (Lenis constructor and shared instance), loading Lenis first if needed.\r\n * See {@link Lazy.workspace} for the queueing and guard behavior.\r\n * @template T Lazy plugin class.\r\n * @param callback Receives the Scroll bucket.\r\n * @param $guard Optional guard from `Up.Scroll.getGuard`; the call is ignored when `guard.value` is `false`.\r\n * @param lazy When `true`, queue the callback without starting the load.\r\n * @returns The pending load promise while loading, otherwise `undefined`.\r\n * @throws If called on the server.\r\n */\r\n static override workspace<T extends typeof Lazy>(callback: Lazy.CALLBACK, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Up.Adapter.BROWSER) Logs.throw('SCROLL', 'SCROLL CAN ONLY BE USED IN THE BROWSER.')\r\n\r\n return super.workspace(callback, $guard, lazy)\r\n }\r\n\r\n /**\r\n * Stops smooth scrolling (calls `Lenis.stop`).\r\n * Before Lenis is loaded, the request is remembered and Lenis starts stopped.\r\n */\r\n static stop(): void { Scroll.#stopped = true }\r\n\r\n /**\r\n * Resumes smooth scrolling (calls `Lenis.start`).\r\n * Before Lenis is loaded, cancels a previous `stop` request.\r\n */\r\n static start(): void { Scroll.#stopped = false }\r\n\r\n /**\r\n * Scrolls the page to a target (calls `Lenis.scrollTo`).\r\n * Before Lenis is loaded, falls back to `window.scrollTo`: selectors and elements are converted to an absolute Y position, smooth unless `options.immediate` is `true`.\r\n * @param target Element, CSS selector, or absolute Y position in px.\r\n * @param options Lenis `scrollTo` options. Before Lenis is loaded, only `immediate` is used, and `offset` only for element and selector targets.\r\n * @note Before Lenis is loaded, a selector that matches nothing logs a warning and does nothing.\r\n */\r\n static to(target: HTMLElement | number | string, options?: ScrollToOptions): void\r\n {\r\n switch (typeof target)\r\n {\r\n case 'string':\r\n {\r\n const TARGET = document.querySelector<HTMLElement>(target)\r\n\r\n if (!TARGET) return Logs.warn('SCROLL', `THE \"${target}\" TARGET WAS NOT FOUND.`)\r\n\r\n target = TARGET\r\n }\r\n case 'object':\r\n {\r\n target = Up.App.y + target.getBoundingClientRect().top\r\n\r\n if (options?.offset) target += options.offset\r\n }\r\n default:\r\n }\r\n\r\n window.scrollTo(\r\n {\r\n top : target,\r\n behavior: options?.immediate ? 'instant' : 'smooth'\r\n })\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Scroll\r\n\r\nexport type {\r\n Scroll,\r\n ScrollBucket\r\n}"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import '../symbols/index.js';
2
- export { B as Basic, h as Package, i as Plugin, j as Spider, k as Synthra, l as SynthraBucket, m as SynthraPlugins, n as SynthraThree, X as X3D, k as default } from '../index-GVYgi7Wm.js';
2
+ export { B as Basic, h as Package, i as Plugin, j as Spider, k as Synthra, l as SynthraBucket, m as SynthraPlugins, n as SynthraThree, X as X3D, k as default } from '../index-CzWXovKy.js';
3
3
  import 'three';
4
4
  import '../Thread-Cvf__-O4.js';
5
5
  import '../index-BlwaDpQl.js';
@@ -64,7 +64,7 @@ class Synthra extends Lazy {
64
64
  * Stores the runtime config.
65
65
  */
66
66
  static #setVars(config) {
67
- this.#config = config;
67
+ Synthra.#config = config;
68
68
  }
69
69
  /**
70
70
  * Subscribes the frame task as a forever `Up.Thread` task.
@@ -81,7 +81,7 @@ class Synthra extends Lazy {
81
81
  */
82
82
  static [set](config) {
83
83
  super[set]();
84
- this.#setVars(config);
84
+ Synthra.#setVars(config);
85
85
  }
86
86
  // ##GET
87
87
  // ##ADD
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/plugins/Synthra.ts"],"sourcesContent":["/* [Synthra] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { SIGN, BUCKET, set, destroy, load, update } from '../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../core/Up.js'\r\n\r\n // ##PLUGINS\r\nimport Lazy from './@/Lazy.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##THIS\r\nimport Spider from './@synthra/Spider.js'\r\nimport Package from './@synthra/Package.js'\r\nimport X3D from './@synthra/X3D.js'\r\nimport Plugin from './@synthra/plugins/@/Plugin.js'\r\nimport Basic from './@synthra/plugins/Basic.js'\r\n\r\n // ##TYPES\r\nimport type * as THREE from 'three'\r\n\r\nimport type Thread from '../core/[1]/[2]/Thread.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Synthra\r\n{\r\n /**\r\n * Synthra config as written by the user in the Vite plugin (`upwwwards/initializers/vite`).\r\n * At build time the initializer turns `pick` into a generated `getThree` loader and forwards the\r\n * remaining keys unchanged, producing the runtime {@link Synthra.CONFIG}.\r\n */\r\n export type RAW_CONFIG =\r\n {\r\n /**\r\n * Names of extra `three` exports to load (e.g. `'Mesh'`, `'BoxGeometry'`).\r\n * `WebGLRenderer`, `Scene` and `PerspectiveCamera` are always included; picked names are\r\n * dynamically imported on first load and typed on `SynthraThree` / `bucket.three`.\r\n */\r\n pick?: (keyof typeof THREE | string & {})[],\r\n /**\r\n * Optional renderer / camera setup for {@link Spider}, forwarded as-is to the runtime config.\r\n */\r\n spider?: Spider.CONFIG\r\n }\r\n\r\n /**\r\n * Runtime Synthra config, generated by the Vite initializer from {@link Synthra.RAW_CONFIG}.\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Generated async loader returning the picked Three.js constructors (`SynthraThree`).\r\n */\r\n getThree: () => Promise<SynthraThree>,\r\n /**\r\n * Optional renderer / camera setup passed to {@link Spider} during Synthra `[load]`.\r\n */\r\n spider?: Spider.CONFIG\r\n }\r\n\r\n /**\r\n * Bucket keys reserved by Synthra; {@link Synthra.add} and {@link Synthra.remove} throw when given one of them.\r\n */\r\n export type BUCKET_PROTECTED_KEYS = 'Spider' | 'Package' | 'X3D' | 'Plugin' | 'three'\r\n\r\n /**\r\n * Synchronous callback receiving the shared Synthra bucket (used by `workspace` and plugin tick callbacks).\r\n * @param bucket The shared {@link SynthraBucket}.\r\n */\r\n export type CALLBACK = (bucket: SynthraBucket) => void\r\n}\r\n\r\n/**\r\n * Three.js constructors loaded by Synthra and exposed as `bucket.three`.\r\n * Only the three classes required by {@link Spider} are declared here; the Vite initializer\r\n * augments this interface with every name listed in `pick`.\r\n*/\r\ninterface SynthraThree\r\n{\r\n WebGLRenderer : typeof THREE.WebGLRenderer,\r\n Scene : typeof THREE.Scene,\r\n PerspectiveCamera: typeof THREE.PerspectiveCamera\r\n}\r\n\r\n/**\r\n * Shared Synthra runtime object (the \"bucket\") passed to `workspace` callbacks and plugin hooks.\r\n * It is fully populated during Synthra `[load]`. Custom keys can be added with {@link Synthra.add};\r\n * augment this interface (generated `customizable` typings) to type them.\r\n*/\r\ninterface SynthraBucket\r\n{\r\n [K: string & {}]: any,\r\n /**\r\n * {@link Spider}: owner of the renderer, scene and camera, and driver of the X3D update pipeline.\r\n */\r\n Spider: typeof Spider,\r\n /**\r\n * {@link Package}: groups Three.js objects, X3D nodes and plugin instances added to the scene.\r\n */\r\n Package: typeof Package,\r\n /**\r\n * {@link X3D}: animated wrapper around a Three.js `Object3D`.\r\n */\r\n X3D: typeof X3D,\r\n /**\r\n * {@link Plugin}: base class of Synthra sub-plugins and registry of per-frame tick callbacks.\r\n */\r\n Plugin: typeof Plugin,\r\n /**\r\n * Three.js constructors returned by `getThree` (core classes plus `pick`).\r\n */\r\n three: SynthraThree\r\n}\r\n\r\n/**\r\n * Registry mapping Synthra sub-plugin `NAME`s to their classes (e.g. `'BASIC'` → {@link Basic}).\r\n * Augment this interface to type custom plugins retrieved with `Plugin.get`.\r\n*/\r\ninterface SynthraPlugins\r\n{\r\n [K: string & {}]: any,\r\n 'BASIC' : typeof Basic\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Lazy Three.js plugin for `upwwwards`, exposed as `Up.Synthra`.\r\n *\r\n * Nothing is loaded until the first {@link Synthra.workspace} call: Synthra then imports only the\r\n * Three.js classes declared in `pick`, creates the shared renderer / scene / camera ({@link Spider}),\r\n * registers the built-in {@link Basic} plugin, and subscribes a forever task to `Up.Thread`\r\n * (the frame scheduler, whose tasks are ordered by power-of-two flags; Synthra uses {@link Synthra.THREAD_FLAG}).\r\n * Each frame, that task runs the {@link X3D} pipeline (evaluate → fixed → animate), then the plugin\r\n * tick callbacks, then renders the scene.\r\n *\r\n * Concepts:\r\n * - **X3D node**: an {@link X3D} wraps an `Object3D` and smoothly animates its position / rotation / scale.\r\n * - **Package**: a {@link Package} groups objects, X3D nodes and plugin instances and adds them to the scene.\r\n * - **Plugin**: a {@link Plugin} subclass adds per-frame behavior (e.g. {@link Basic}).\r\n *\r\n * @note Client-only: `workspace` throws outside the browser.\r\n * @example\r\n * ```ts\r\n * // vite.config.ts\r\n * upwwwards({\r\n * adapter: 'Nuxt',\r\n * plugins: [{ name: 'Synthra', config: { pick: ['Mesh', 'BoxGeometry', 'MeshNormalMaterial'], spider: { renderer: { canvas: '#webgl' } } } }]\r\n * })\r\n *\r\n * // In a component (client side): `three` holds the core classes plus the picked ones\r\n * Up.Synthra.workspace(({ three, X3D, Package, Plugin }) =>\r\n * {\r\n * const cube = new X3D({ root: new three.Mesh(new three.BoxGeometry(), new three.MeshNormalMaterial()) })\r\n *\r\n * cube.setPosition(0, 0, -3)\r\n *\r\n * new Package(cube, new (Plugin.get('BASIC'))({ eTick: () => cube.setRotation(cube.rX, cube.rY + .01, cube.rZ) }))\r\n * })\r\n * ```\r\n*/\r\nabstract class Synthra extends Lazy\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * `Up.Thread` flag of the frame task.\r\n */\r\n static #THREAD_FLAG: Thread.SYNTHRA_FLAG = 2_048\r\n\r\n /**\r\n * Bucket keys rejected by `add` / `remove`.\r\n */\r\n static #BUCKET_PROTECTED_KEYS: Synthra.BUCKET_PROTECTED_KEYS[] = ['Spider', 'Package', 'X3D', 'Plugin', 'three']\r\n\r\n /**\r\n * Runtime config stored by `[set]`, read by `[load]`.\r\n */\r\n static #config: Synthra.CONFIG | undefined\r\n\r\n /**\r\n * Unique identity of Synthra among lazy plugins (stamped on its `workspace` guards).\r\n * @internal\r\n */\r\n static override readonly [SIGN] = Symbol('Synthra')\r\n\r\n /**\r\n * Plugin name; Synthra is exposed as `Up.Synthra` once `Up` is constructed.\r\n */\r\n static override readonly NAME = 'Synthra'\r\n\r\n /**\r\n * Shared runtime bucket ({@link SynthraBucket}), populated during `[load]`.\r\n * Use {@link Synthra.workspace} instead of reading it directly, as it is empty before load.\r\n * @internal\r\n */\r\n static override [BUCKET]: SynthraBucket = {} as SynthraBucket\r\n\r\n // ##PRIVATES\r\n\r\n // ##PUBLICS\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * Base class for Synthra sub-plugins, available before load (e.g. to declare and `register` a subclass).\r\n * @returns The {@link Plugin} class (also exposed as `bucket.Plugin`).\r\n */\r\n static get Plugin(): typeof Plugin { return Plugin }\r\n\r\n /**\r\n * `Up.Thread` flag of Synthra's per-frame task (`2048`).\r\n * Thread flags are powers of two; higher flags run later within a frame.\r\n * @returns `2048`.\r\n */\r\n static get THREAD_FLAG(): Thread.SYNTHRA_FLAG { return Synthra.#THREAD_FLAG }\r\n\r\n// #METHODS\r\n\r\n // ##HYDRATE\r\n\r\n // ##SET\r\n /**\r\n * Stores the runtime config.\r\n */\r\n static #setVars(config?: Synthra.CONFIG): void { this.#config = config }\r\n\r\n /**\r\n * Subscribes the frame task as a forever `Up.Thread` task.\r\n */\r\n static #setTask(): void\r\n {\r\n Up.Thread.markForever(Synthra.#t$)\r\n Up.Thread.sub(Synthra.#t$, Synthra.#THREAD_FLAG)\r\n }\r\n\r\n /**\r\n * Client-side setup called by `Up`: marks the plugin as configured and stores its runtime config.\r\n * @param config Runtime config (`getThree`, optional `spider`).\r\n * @throws If the plugin is already configured.\r\n * @internal\r\n */\r\n static override [set](config?: Synthra.CONFIG): void\r\n {\r\n super[set]()\r\n \r\n this.#setVars(config)\r\n }\r\n\r\n // ##GET\r\n\r\n // ##ADD\r\n /**\r\n * Adds (or overwrites) a custom entry on the shared bucket, making it available to every `workspace` callback.\r\n * @template T Bucket key (type it by augmenting {@link SynthraBucket}).\r\n * @param key Bucket property name.\r\n * @param value Value to store.\r\n * @throws If `key` is a protected key (`Spider`, `Package`, `X3D`, `Plugin`, `three`).\r\n * @note Entries added before load are kept: the bucket is merged during `[load]`.\r\n */\r\n static add<T extends keyof Omit<SynthraBucket, Synthra.BUCKET_PROTECTED_KEYS>>(key: T, value: SynthraBucket[T]): void\r\n {\r\n Synthra.#gateBucketKey(key)\r\n \r\n Synthra[BUCKET][key] = value\r\n }\r\n\r\n // ##REMOVE\r\n /**\r\n * Deletes a custom entry from the shared bucket.\r\n * @param key Bucket property name.\r\n * @throws If `key` is a protected key (`Spider`, `Package`, `X3D`, `Plugin`, `three`).\r\n */\r\n static remove(key: keyof Omit<SynthraBucket, Synthra.BUCKET_PROTECTED_KEYS>): void\r\n {\r\n Synthra.#gateBucketKey(key)\r\n \r\n delete Synthra[BUCKET][key]\r\n }\r\n\r\n // ##DESTROY\r\n /**\r\n * Unsubscribes the frame task from `Up.Thread`.\r\n */\r\n static #destroyTask(): void { Up.Thread.unsub(Synthra.#t$) }\r\n\r\n /**\r\n * Tears Synthra down: unsubscribes the frame task, disposes the {@link Spider} renderer and\r\n * calls `static destroy` on every registered {@link Plugin} class.\r\n * @note `Package` instances created by the application are not cleared automatically.\r\n * @internal\r\n */\r\n static override [destroy](): void\r\n {\r\n super[destroy]()\r\n\r\n Synthra.#destroyTask()\r\n\r\n Spider[destroy]()\r\n Plugin[destroy]()\r\n }\r\n\r\n // ##TASKS\r\n /**\r\n * Frame task: Spider X3D pipeline, then plugin tick callbacks (yielding between steps), then render.\r\n */\r\n static *#t$(): Thread.GENERATOR\r\n {\r\n let\r\n run = true,\r\n gen = Spider[update]()\r\n \r\n do\r\n {\r\n while (!gen.next().done) yield\r\n\r\n if (!run) break\r\n\r\n run = false\r\n gen = Plugin[update]()\r\n }\r\n while (true)\r\n\r\n Spider.render()\r\n }\r\n\r\n // ##LOADERS\r\n /**\r\n * First load (triggered by `workspace`): imports Three.js via `getThree`, builds the shared bucket\r\n * (also assigned to Spider / Package / X3D / Plugin), registers {@link Basic}, creates the renderer,\r\n * scene and camera, runs the `static set` hooks of registered plugins, and starts the frame task.\r\n * @throws If Synthra has not been configured, is already loaded, or was destroyed during loading.\r\n * @internal\r\n */\r\n static override async [load](): Promise<void>\r\n {\r\n const CONFIG = Synthra.#config\r\n\r\n if (!CONFIG) Logs.throw('SYNTHRA', 'SYNTHRA HAS NOT BEEN CONFIGURED.')\r\n \r\n Spider[BUCKET] = Package[BUCKET] = X3D[BUCKET] = Plugin[BUCKET] = Synthra[BUCKET] =\r\n {\r\n ...Synthra[BUCKET],\r\n Spider : Spider,\r\n Package: Package,\r\n X3D : X3D,\r\n Plugin : Plugin,\r\n three : (await super[load]((): Promise<SynthraThree> => CONFIG.getThree()))!\r\n }\r\n\r\n Basic.register()\r\n\r\n Spider[set](CONFIG.spider)\r\n Plugin[set]()\r\n\r\n Synthra.#setTask()\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Throws if `key` is a protected bucket key.\r\n */\r\n static #gateBucketKey(key: string): void { if (Synthra.#BUCKET_PROTECTED_KEYS.includes(key as Synthra.BUCKET_PROTECTED_KEYS)) Logs.throw('SYNTHRA', `THE KEY \"${key}\" IS PROTECTED.`) }\r\n\r\n // static sub(pkg: Package): void { Synthra.#PACKAGES.add(pkg) }\r\n\r\n // static unsub(pkg: Package): void { Synthra.#PACKAGES.delete(pkg) }\r\n\r\n /**\r\n * Runs `callback` with the shared bucket once Synthra is loaded, triggering the load on first use.\r\n * Before the first load completes, callbacks are queued and flushed afterwards; once loaded, they run synchronously.\r\n * @template T Lazy subclass (inferred).\r\n * @param callback Receives the {@link SynthraBucket} (`three`, `X3D`, `Package`, `Plugin`, `Spider`, custom keys).\r\n * @param $guard Optional guard from `Synthra.getGuard` to cancel the callback (set its `value` to `false`).\r\n * @param lazy When `true`, queues the callback without starting the load.\r\n * @returns The pending load promise while loading (or after load), otherwise `void`.\r\n * @throws If called outside the browser.\r\n * @note The returned promise resolves even if loading fails (errors are logged).\r\n */\r\n static override workspace<T extends typeof Lazy>(this: T, callback: Synthra.CALLBACK, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Up.Adapter.BROWSER) Logs.throw('SYNTHRA', 'SYNTHRA CAN ONLY BE USED IN THE BROWSER.')\r\n\r\n return super.workspace(callback, $guard, lazy)\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Synthra\r\n\r\nexport type {\r\n Synthra,\r\n SynthraThree,\r\n SynthraBucket,\r\n SynthraPlugins\r\n ,\r\n Spider,\r\n Package,\r\n X3D,\r\n Plugin,\r\n Basic\r\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/plugins/Synthra.ts"],"sourcesContent":["/* [Synthra] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { SIGN, BUCKET, set, destroy, load, update } from '../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../core/Up.js'\r\n\r\n // ##PLUGINS\r\nimport Lazy from './@/Lazy.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##THIS\r\nimport Spider from './@synthra/Spider.js'\r\nimport Package from './@synthra/Package.js'\r\nimport X3D from './@synthra/X3D.js'\r\nimport Plugin from './@synthra/plugins/@/Plugin.js'\r\nimport Basic from './@synthra/plugins/Basic.js'\r\n\r\n // ##TYPES\r\nimport type * as THREE from 'three'\r\n\r\nimport type Thread from '../core/[1]/[2]/Thread.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Synthra\r\n{\r\n /**\r\n * Synthra config as written by the user in the Vite plugin (`upwwwards/initializers/vite`).\r\n * At build time the initializer turns `pick` into a generated `getThree` loader and forwards the\r\n * remaining keys unchanged, producing the runtime {@link Synthra.CONFIG}.\r\n */\r\n export type RAW_CONFIG =\r\n {\r\n /**\r\n * Names of extra `three` exports to load (e.g. `'Mesh'`, `'BoxGeometry'`).\r\n * `WebGLRenderer`, `Scene` and `PerspectiveCamera` are always included; picked names are\r\n * dynamically imported on first load and typed on `SynthraThree` / `bucket.three`.\r\n */\r\n pick?: (keyof typeof THREE | string & {})[],\r\n /**\r\n * Optional renderer / camera setup for {@link Spider}, forwarded as-is to the runtime config.\r\n */\r\n spider?: Spider.CONFIG\r\n }\r\n\r\n /**\r\n * Runtime Synthra config, generated by the Vite initializer from {@link Synthra.RAW_CONFIG}.\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Generated async loader returning the picked Three.js constructors (`SynthraThree`).\r\n */\r\n getThree: () => Promise<SynthraThree>,\r\n /**\r\n * Optional renderer / camera setup passed to {@link Spider} during Synthra `[load]`.\r\n */\r\n spider?: Spider.CONFIG\r\n }\r\n\r\n /**\r\n * Bucket keys reserved by Synthra; {@link Synthra.add} and {@link Synthra.remove} throw when given one of them.\r\n */\r\n export type BUCKET_PROTECTED_KEYS = 'Spider' | 'Package' | 'X3D' | 'Plugin' | 'three'\r\n\r\n /**\r\n * Synchronous callback receiving the shared Synthra bucket (used by `workspace` and plugin tick callbacks).\r\n * @param bucket The shared {@link SynthraBucket}.\r\n */\r\n export type CALLBACK = (bucket: SynthraBucket) => void\r\n}\r\n\r\n/**\r\n * Three.js constructors loaded by Synthra and exposed as `bucket.three`.\r\n * Only the three classes required by {@link Spider} are declared here; the Vite initializer\r\n * augments this interface with every name listed in `pick`.\r\n*/\r\ninterface SynthraThree\r\n{\r\n WebGLRenderer : typeof THREE.WebGLRenderer,\r\n Scene : typeof THREE.Scene,\r\n PerspectiveCamera: typeof THREE.PerspectiveCamera\r\n}\r\n\r\n/**\r\n * Shared Synthra runtime object (the \"bucket\") passed to `workspace` callbacks and plugin hooks.\r\n * It is fully populated during Synthra `[load]`. Custom keys can be added with {@link Synthra.add};\r\n * augment this interface (generated `customizable` typings) to type them.\r\n*/\r\ninterface SynthraBucket\r\n{\r\n [K: string & {}]: any,\r\n /**\r\n * {@link Spider}: owner of the renderer, scene and camera, and driver of the X3D update pipeline.\r\n */\r\n Spider: typeof Spider,\r\n /**\r\n * {@link Package}: groups Three.js objects, X3D nodes and plugin instances added to the scene.\r\n */\r\n Package: typeof Package,\r\n /**\r\n * {@link X3D}: animated wrapper around a Three.js `Object3D`.\r\n */\r\n X3D: typeof X3D,\r\n /**\r\n * {@link Plugin}: base class of Synthra sub-plugins and registry of per-frame tick callbacks.\r\n */\r\n Plugin: typeof Plugin,\r\n /**\r\n * Three.js constructors returned by `getThree` (core classes plus `pick`).\r\n */\r\n three: SynthraThree\r\n}\r\n\r\n/**\r\n * Registry mapping Synthra sub-plugin `NAME`s to their classes (e.g. `'BASIC'` → {@link Basic}).\r\n * Augment this interface to type custom plugins retrieved with `Plugin.get`.\r\n*/\r\ninterface SynthraPlugins\r\n{\r\n [K: string & {}]: any,\r\n 'BASIC' : typeof Basic\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Lazy Three.js plugin for `upwwwards`, exposed as `Up.Synthra`.\r\n *\r\n * Nothing is loaded until the first {@link Synthra.workspace} call: Synthra then imports only the\r\n * Three.js classes declared in `pick`, creates the shared renderer / scene / camera ({@link Spider}),\r\n * registers the built-in {@link Basic} plugin, and subscribes a forever task to `Up.Thread`\r\n * (the frame scheduler, whose tasks are ordered by power-of-two flags; Synthra uses {@link Synthra.THREAD_FLAG}).\r\n * Each frame, that task runs the {@link X3D} pipeline (evaluate → fixed → animate), then the plugin\r\n * tick callbacks, then renders the scene.\r\n *\r\n * Concepts:\r\n * - **X3D node**: an {@link X3D} wraps an `Object3D` and smoothly animates its position / rotation / scale.\r\n * - **Package**: a {@link Package} groups objects, X3D nodes and plugin instances and adds them to the scene.\r\n * - **Plugin**: a {@link Plugin} subclass adds per-frame behavior (e.g. {@link Basic}).\r\n *\r\n * @note Client-only: `workspace` throws outside the browser.\r\n * @example\r\n * ```ts\r\n * // vite.config.ts\r\n * upwwwards({\r\n * adapter: 'Nuxt',\r\n * plugins: [{ name: 'Synthra', config: { pick: ['Mesh', 'BoxGeometry', 'MeshNormalMaterial'], spider: { renderer: { canvas: '#webgl' } } } }]\r\n * })\r\n *\r\n * // In a component (client side): `three` holds the core classes plus the picked ones\r\n * Up.Synthra.workspace(({ three, X3D, Package, Plugin }) =>\r\n * {\r\n * const cube = new X3D({ root: new three.Mesh(new three.BoxGeometry(), new three.MeshNormalMaterial()) })\r\n *\r\n * cube.setPosition(0, 0, -3)\r\n *\r\n * new Package(cube, new (Plugin.get('BASIC'))({ eTick: () => cube.setRotation(cube.rX, cube.rY + .01, cube.rZ) }))\r\n * })\r\n * ```\r\n*/\r\nabstract class Synthra extends Lazy\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * `Up.Thread` flag of the frame task.\r\n */\r\n static #THREAD_FLAG: Thread.SYNTHRA_FLAG = 2_048\r\n\r\n /**\r\n * Bucket keys rejected by `add` / `remove`.\r\n */\r\n static #BUCKET_PROTECTED_KEYS: Synthra.BUCKET_PROTECTED_KEYS[] = ['Spider', 'Package', 'X3D', 'Plugin', 'three']\r\n\r\n /**\r\n * Runtime config stored by `[set]`, read by `[load]`.\r\n */\r\n static #config: Synthra.CONFIG | undefined\r\n\r\n /**\r\n * Unique identity of Synthra among lazy plugins (stamped on its `workspace` guards).\r\n * @internal\r\n */\r\n static override readonly [SIGN] = Symbol('Synthra')\r\n\r\n /**\r\n * Plugin name; Synthra is exposed as `Up.Synthra` once `Up` is constructed.\r\n */\r\n static override readonly NAME = 'Synthra'\r\n\r\n /**\r\n * Shared runtime bucket ({@link SynthraBucket}), populated during `[load]`.\r\n * Use {@link Synthra.workspace} instead of reading it directly, as it is empty before load.\r\n * @internal\r\n */\r\n static override [BUCKET]: SynthraBucket = {} as SynthraBucket\r\n\r\n // ##PRIVATES\r\n\r\n // ##PUBLICS\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * Base class for Synthra sub-plugins, available before load (e.g. to declare and `register` a subclass).\r\n * @returns The {@link Plugin} class (also exposed as `bucket.Plugin`).\r\n */\r\n static get Plugin(): typeof Plugin { return Plugin }\r\n\r\n /**\r\n * `Up.Thread` flag of Synthra's per-frame task (`2048`).\r\n * Thread flags are powers of two; higher flags run later within a frame.\r\n * @returns `2048`.\r\n */\r\n static get THREAD_FLAG(): Thread.SYNTHRA_FLAG { return Synthra.#THREAD_FLAG }\r\n\r\n// #METHODS\r\n\r\n // ##HYDRATE\r\n\r\n // ##SET\r\n /**\r\n * Stores the runtime config.\r\n */\r\n static #setVars(config?: Synthra.CONFIG): void { Synthra.#config = config }\r\n\r\n /**\r\n * Subscribes the frame task as a forever `Up.Thread` task.\r\n */\r\n static #setTask(): void\r\n {\r\n Up.Thread.markForever(Synthra.#t$)\r\n Up.Thread.sub(Synthra.#t$, Synthra.#THREAD_FLAG)\r\n }\r\n\r\n /**\r\n * Client-side setup called by `Up`: marks the plugin as configured and stores its runtime config.\r\n * @param config Runtime config (`getThree`, optional `spider`).\r\n * @throws If the plugin is already configured.\r\n * @internal\r\n */\r\n static override [set](config?: Synthra.CONFIG): void\r\n {\r\n super[set]()\r\n \r\n Synthra.#setVars(config)\r\n }\r\n\r\n // ##GET\r\n\r\n // ##ADD\r\n /**\r\n * Adds (or overwrites) a custom entry on the shared bucket, making it available to every `workspace` callback.\r\n * @template T Bucket key (type it by augmenting {@link SynthraBucket}).\r\n * @param key Bucket property name.\r\n * @param value Value to store.\r\n * @throws If `key` is a protected key (`Spider`, `Package`, `X3D`, `Plugin`, `three`).\r\n * @note Entries added before load are kept: the bucket is merged during `[load]`.\r\n */\r\n static add<T extends keyof Omit<SynthraBucket, Synthra.BUCKET_PROTECTED_KEYS>>(key: T, value: SynthraBucket[T]): void\r\n {\r\n Synthra.#gateBucketKey(key)\r\n \r\n Synthra[BUCKET][key] = value\r\n }\r\n\r\n // ##REMOVE\r\n /**\r\n * Deletes a custom entry from the shared bucket.\r\n * @param key Bucket property name.\r\n * @throws If `key` is a protected key (`Spider`, `Package`, `X3D`, `Plugin`, `three`).\r\n */\r\n static remove(key: keyof Omit<SynthraBucket, Synthra.BUCKET_PROTECTED_KEYS>): void\r\n {\r\n Synthra.#gateBucketKey(key)\r\n \r\n delete Synthra[BUCKET][key]\r\n }\r\n\r\n // ##DESTROY\r\n /**\r\n * Unsubscribes the frame task from `Up.Thread`.\r\n */\r\n static #destroyTask(): void { Up.Thread.unsub(Synthra.#t$) }\r\n\r\n /**\r\n * Tears Synthra down: unsubscribes the frame task, disposes the {@link Spider} renderer and\r\n * calls `static destroy` on every registered {@link Plugin} class.\r\n * @note `Package` instances created by the application are not cleared automatically.\r\n * @internal\r\n */\r\n static override [destroy](): void\r\n {\r\n super[destroy]()\r\n\r\n Synthra.#destroyTask()\r\n\r\n Spider[destroy]()\r\n Plugin[destroy]()\r\n }\r\n\r\n // ##TASKS\r\n /**\r\n * Frame task: Spider X3D pipeline, then plugin tick callbacks (yielding between steps), then render.\r\n */\r\n static *#t$(): Thread.GENERATOR\r\n {\r\n let\r\n run = true,\r\n gen = Spider[update]()\r\n \r\n do\r\n {\r\n while (!gen.next().done) yield\r\n\r\n if (!run) break\r\n\r\n run = false\r\n gen = Plugin[update]()\r\n }\r\n while (true)\r\n\r\n Spider.render()\r\n }\r\n\r\n // ##LOADERS\r\n /**\r\n * First load (triggered by `workspace`): imports Three.js via `getThree`, builds the shared bucket\r\n * (also assigned to Spider / Package / X3D / Plugin), registers {@link Basic}, creates the renderer,\r\n * scene and camera, runs the `static set` hooks of registered plugins, and starts the frame task.\r\n * @throws If Synthra has not been configured, is already loaded, or was destroyed during loading.\r\n * @internal\r\n */\r\n static override async [load](): Promise<void>\r\n {\r\n const CONFIG = Synthra.#config\r\n\r\n if (!CONFIG) Logs.throw('SYNTHRA', 'SYNTHRA HAS NOT BEEN CONFIGURED.')\r\n \r\n Spider[BUCKET] = Package[BUCKET] = X3D[BUCKET] = Plugin[BUCKET] = Synthra[BUCKET] =\r\n {\r\n ...Synthra[BUCKET],\r\n Spider : Spider,\r\n Package: Package,\r\n X3D : X3D,\r\n Plugin : Plugin,\r\n three : (await super[load]((): Promise<SynthraThree> => CONFIG.getThree()))!\r\n }\r\n\r\n Basic.register()\r\n\r\n Spider[set](CONFIG.spider)\r\n Plugin[set]()\r\n\r\n Synthra.#setTask()\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Throws if `key` is a protected bucket key.\r\n */\r\n static #gateBucketKey(key: string): void { if (Synthra.#BUCKET_PROTECTED_KEYS.includes(key as Synthra.BUCKET_PROTECTED_KEYS)) Logs.throw('SYNTHRA', `THE KEY \"${key}\" IS PROTECTED.`) }\r\n\r\n // static sub(pkg: Package): void { Synthra.#PACKAGES.add(pkg) }\r\n\r\n // static unsub(pkg: Package): void { Synthra.#PACKAGES.delete(pkg) }\r\n\r\n /**\r\n * Runs `callback` with the shared bucket once Synthra is loaded, triggering the load on first use.\r\n * Before the first load completes, callbacks are queued and flushed afterwards; once loaded, they run synchronously.\r\n * @template T Lazy subclass (inferred).\r\n * @param callback Receives the {@link SynthraBucket} (`three`, `X3D`, `Package`, `Plugin`, `Spider`, custom keys).\r\n * @param $guard Optional guard from `Synthra.getGuard` to cancel the callback (set its `value` to `false`).\r\n * @param lazy When `true`, queues the callback without starting the load.\r\n * @returns The pending load promise while loading (or after load), otherwise `void`.\r\n * @throws If called outside the browser.\r\n * @note The returned promise resolves even if loading fails (errors are logged).\r\n */\r\n static override workspace<T extends typeof Lazy>(this: T, callback: Synthra.CALLBACK, $guard?: Lazy.Guard<T> | null, lazy?: boolean): void | Promise<void>\r\n {\r\n if (!Up.Adapter.BROWSER) Logs.throw('SYNTHRA', 'SYNTHRA CAN ONLY BE USED IN THE BROWSER.')\r\n\r\n return super.workspace(callback, $guard, lazy)\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Synthra\r\n\r\nexport type {\r\n Synthra,\r\n SynthraThree,\r\n SynthraBucket,\r\n SynthraPlugins\r\n ,\r\n Spider,\r\n Package,\r\n X3D,\r\n Plugin,\r\n Basic\r\n}"],"mappings":"AAKA,SAAS,MAAM,QAAQ,KAAK,SAAS,MAAM,cAAc;AAGzD,OAAO,QAAQ;AAGf,OAAO,UAAU;AAGjB,OAAO,UAAU;AAGjB,OAAO,YAAa;AACpB,OAAO,aAAa;AACpB,OAAO,SAAa;AACpB,OAAO,YAAa;AACpB,OAAO,WAAa;AAoJpB,MAAe,gBAAgB,KAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQI,OAAO,eAAoC;AAAA;AAAA;AAAA;AAAA,EAK3C,OAAO,yBAA0D,CAAC,UAAU,WAAW,OAAO,UAAU,OAAO;AAAA;AAAA;AAAA;AAAA,EAK/G,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,EAMP,QAA0B,IAAI,IAAI,uBAAO,SAAS;AAAA;AAAA;AAAA;AAAA,EAKlD,OAAyB,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,QAAiB,MAAM,IAAmB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe3C,WAAW,SAAwB;AAAE,WAAO;AAAA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnD,WAAW,cAAmC;AAAE,WAAO,QAAQ;AAAA,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU5E,OAAO,SAAS,QAA+B;AAAE,YAAQ,UAAU;AAAA,EAAO;AAAA;AAAA;AAAA;AAAA,EAK1E,OAAO,WACP;AACI,OAAG,OAAO,YAAY,QAAQ,GAAG;AACjC,OAAG,OAAO,IAAI,QAAQ,KAAK,QAAQ,YAAY;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAiB,GAAG,EAAE,QACtB;AACI,UAAM,GAAG,EAAE;AAEX,YAAQ,SAAS,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,IAAwE,KAAQ,OACvF;AACI,YAAQ,eAAe,GAAG;AAE1B,YAAQ,MAAM,EAAE,GAAG,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAO,KACd;AACI,YAAQ,eAAe,GAAG;AAE1B,WAAO,QAAQ,MAAM,EAAE,GAAG;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,eAAqB;AAAE,OAAG,OAAO,MAAM,QAAQ,GAAG;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3D,QAAiB,OAAO,IACxB;AACI,UAAM,OAAO,EAAE;AAEf,YAAQ,aAAa;AAErB,WAAO,OAAO,EAAE;AAChB,WAAO,OAAO,EAAE;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MACR;AACI,QACA,MAAM,MACN,MAAM,OAAO,MAAM,EAAE;AAErB,OACA;AACI,aAAO,CAAC,IAAI,KAAK,EAAE,KAAM;AAEzB,UAAI,CAAC,IAAK;AAEV,YAAM;AACN,YAAM,OAAO,MAAM,EAAE;AAAA,IACzB,SACO;AAEP,WAAO,OAAO;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,cAAuB,IAAI,IAC3B;AACI,UAAM,SAAS,QAAQ;AAEvB,QAAI,CAAC,OAAQ,MAAK,MAAM,WAAW,kCAAkC;AAErE,WAAO,MAAM,IAAI,QAAQ,MAAM,IAAI,IAAI,MAAM,IAAI,OAAO,MAAM,IAAI,QAAQ,MAAM,IAChF;AAAA,MACI,GAAG,QAAQ,MAAM;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAU,MAAM,MAAM,IAAI,EAAE,MAA6B,OAAO,SAAS,CAAC;AAAA,IAC9E;AAEA,UAAM,SAAS;AAEf,WAAO,GAAG,EAAE,OAAO,MAAM;AACzB,WAAO,GAAG,EAAE;AAEZ,YAAQ,SAAS;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,eAAe,KAAmB;AAAE,QAAI,QAAQ,uBAAuB,SAAS,GAAoC,EAAG,MAAK,MAAM,WAAW,YAAY,GAAG,iBAAiB;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBtL,OAAgB,UAA0C,UAA4B,QAA+B,MACrH;AACI,QAAI,CAAC,GAAG,QAAQ,QAAS,MAAK,MAAM,WAAW,0CAA0C;AAEzF,WAAO,MAAM,UAAU,UAAU,QAAQ,IAAI;AAAA,EACjD;AAEJ;AAKA,IAAO,kBAAQ;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import '../symbols/index.js';
2
- export { T as Transmitter, a as TransmitterChannels, T as default } from '../index-GVYgi7Wm.js';
2
+ export { T as Transmitter, a as TransmitterChannels, T as default } from '../index-CzWXovKy.js';
3
3
  import '../index-BlwaDpQl.js';
4
4
  import '../Thread-Cvf__-O4.js';
5
5
  import 'lenis';
@@ -1,4 +1,4 @@
1
- export { A as Anime, L as Lazy, O as Observer, P as Plugin, g as Puppeteer, o as Screen, S as Scroll, k as Synthra, T as Transmitter } from '../index-GVYgi7Wm.js';
1
+ export { A as Anime, L as Lazy, O as Observer, P as Plugin, g as Puppeteer, o as Screen, S as Scroll, k as Synthra, T as Transmitter } from '../index-CzWXovKy.js';
2
2
  import '../symbols/index.js';
3
3
  import '../index-BlwaDpQl.js';
4
4
  import '../Thread-Cvf__-O4.js';
@@ -1,4 +1,4 @@
1
- const INHERITANCE = /* @__PURE__ */ Symbol.for("upwwwwards::INHERITANCE"), SIGN = /* @__PURE__ */ Symbol.for("upwwwwards::SIGN"), STATUS = /* @__PURE__ */ Symbol.for("upwwwwards::STATUS"), QUEUE = /* @__PURE__ */ Symbol.for("upwwwwards::QUEUE"), CACHE = /* @__PURE__ */ Symbol.for("upwwwwards::CACHE"), WAIT = /* @__PURE__ */ Symbol.for("upwwwwards::WAIT"), BUCKET = /* @__PURE__ */ Symbol.for("upwwwwards::BUCKET"), construct = /* @__PURE__ */ Symbol.for("upwwwwards::construct"), hydrate = /* @__PURE__ */ Symbol.for("upwwwwards::hydrate"), set = /* @__PURE__ */ Symbol.for("upwwwwards::set"), get = /* @__PURE__ */ Symbol.for("upwwwwards::get"), add = /* @__PURE__ */ Symbol.for("upwwwwards::add"), remove = /* @__PURE__ */ Symbol.for("upwwwwards::remove"), update = /* @__PURE__ */ Symbol.for("upwwwwards::update"), destroy = /* @__PURE__ */ Symbol.for("upwwwwards::destroy"), apply = /* @__PURE__ */ Symbol.for("upwwwwards::apply"), start = /* @__PURE__ */ Symbol.for("upwwwwards::start"), stop = /* @__PURE__ */ Symbol.for("upwwwwards::stop"), load = /* @__PURE__ */ Symbol.for("upwwwwards::load");
1
+ const INHERITANCE = /* @__PURE__ */ Symbol.for("upwwwards::INHERITANCE"), SIGN = /* @__PURE__ */ Symbol.for("upwwwards::SIGN"), STATUS = /* @__PURE__ */ Symbol.for("upwwwards::STATUS"), QUEUE = /* @__PURE__ */ Symbol.for("upwwwards::QUEUE"), CACHE = /* @__PURE__ */ Symbol.for("upwwwards::CACHE"), WAIT = /* @__PURE__ */ Symbol.for("upwwwards::WAIT"), BUCKET = /* @__PURE__ */ Symbol.for("upwwwards::BUCKET"), construct = /* @__PURE__ */ Symbol.for("upwwwards::construct"), hydrate = /* @__PURE__ */ Symbol.for("upwwwards::hydrate"), set = /* @__PURE__ */ Symbol.for("upwwwards::set"), get = /* @__PURE__ */ Symbol.for("upwwwards::get"), add = /* @__PURE__ */ Symbol.for("upwwwards::add"), remove = /* @__PURE__ */ Symbol.for("upwwwards::remove"), update = /* @__PURE__ */ Symbol.for("upwwwards::update"), destroy = /* @__PURE__ */ Symbol.for("upwwwards::destroy"), apply = /* @__PURE__ */ Symbol.for("upwwwards::apply"), start = /* @__PURE__ */ Symbol.for("upwwwards::start"), stop = /* @__PURE__ */ Symbol.for("upwwwards::stop"), load = /* @__PURE__ */ Symbol.for("upwwwards::load");
2
2
  export {
3
3
  BUCKET,
4
4
  CACHE,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/symbols/index.ts"],"sourcesContent":["/* [index] */\r\n\r\n// #IMPORTS\r\n\r\n// #TYPES\r\n\r\n// #CONSTANTS\r\n\r\n// #VARIABLES\r\n\r\n// #FUNCTIONS\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport const\r\n/**\r\n * Key of the shared HRT inheritance stack (`[Adapter, App, Thread, Event]` once the core is loaded).\r\n * Used on the `Hrt` instance and as each core module's static typed view of that same array\r\n * (each module hydrates its predecessor, so the field never contains the class that holds it).\r\n * @internal\r\n*/\r\nINHERITANCE = Symbol.for('upwwwwards::INHERITANCE'),\r\n/**\r\n * Key of a lazy plugin's identity symbol.\r\n * @internal\r\n*/\r\nSIGN = Symbol.for('upwwwwards::SIGN'),\r\n/**\r\n * Key of a run state (Thread: stopped / pending / started; lazy plugins: destroyed / set up / loaded).\r\n * @internal\r\n*/\r\nSTATUS = Symbol.for('upwwwwards::STATUS'),\r\n/**\r\n * Key of the callbacks a lazy plugin queues until it is loaded.\r\n * @internal\r\n*/\r\nQUEUE = Symbol.for('upwwwwards::QUEUE'),\r\n/**\r\n * Key of a lazy plugin's guard-to-callbacks cache.\r\n * @internal\r\n*/\r\nCACHE = Symbol.for('upwwwwards::CACHE'),\r\n/**\r\n * Key of a lazy plugin's pending load promise.\r\n * @internal\r\n*/\r\nWAIT = Symbol.for('upwwwwards::WAIT'),\r\n/**\r\n * Key of a plugin's storage for loaded modules and instances.\r\n * @internal\r\n*/\r\nBUCKET = Symbol.for('upwwwwards::BUCKET')\r\n,\r\n/**\r\n * Lifecycle method run once at startup, on server and client (`Up[construct]`, plugin `[construct]`).\r\n * @internal\r\n*/\r\nconstruct = Symbol.for('upwwwwards::construct'),\r\n/**\r\n * Reserved lifecycle key (currently unused; startup uses {@link construct}).\r\n * @internal\r\n*/\r\nhydrate = Symbol.for('upwwwwards::hydrate'),\r\n/**\r\n * Lifecycle method run in the browser by `Up.set`.\r\n * @internal\r\n*/\r\nset = Symbol.for('upwwwwards::set'),\r\n/**\r\n * Reserved internal accessor key (currently unused).\r\n * @internal\r\n*/\r\nget = Symbol.for('upwwwwards::get'),\r\n/**\r\n * Internal method registering a value (e.g. a loaded module) in a plugin's storage.\r\n * @internal\r\n*/\r\nadd = Symbol.for('upwwwwards::add'),\r\n/**\r\n * Reserved internal removal key (currently unused).\r\n * @internal\r\n*/\r\nremove = Symbol.for('upwwwwards::remove'),\r\n/**\r\n * Internal update method (used by the Synthra plugin).\r\n * @internal\r\n*/\r\nupdate = Symbol.for('upwwwwards::update'),\r\n/**\r\n * Lifecycle method run in the browser by `Up.destroy`.\r\n * @internal\r\n*/\r\ndestroy = Symbol.for('upwwwwards::destroy'),\r\n/**\r\n * Internal method handing the Thread frame loop to an external ticker (e.g. GSAP).\r\n * @internal\r\n*/\r\napply = Symbol.for('upwwwwards::apply'),\r\n/**\r\n * Internal method resuming a paused module (Thread).\r\n * @internal\r\n*/\r\nstart = Symbol.for('upwwwwards::start'),\r\n/**\r\n * Internal method pausing a module (Thread).\r\n * @internal\r\n*/\r\nstop = Symbol.for('upwwwwards::stop'),\r\n/**\r\n * Lifecycle method lazily loading a plugin's dependencies on first use.\r\n * @internal\r\n*/\r\nload = Symbol.for('upwwwwards::load')"],"mappings":"AAeO,MAOP,cAAc,uBAAO,IAAI,yBAAyB,GAKlD,OAAO,uBAAO,IAAI,kBAAkB,GAKpC,SAAS,uBAAO,IAAI,oBAAoB,GAKxC,QAAQ,uBAAO,IAAI,mBAAmB,GAKtC,QAAQ,uBAAO,IAAI,mBAAmB,GAKtC,OAAO,uBAAO,IAAI,kBAAkB,GAKpC,SAAS,uBAAO,IAAI,oBAAoB,GAMxC,YAAY,uBAAO,IAAI,uBAAuB,GAK9C,UAAU,uBAAO,IAAI,qBAAqB,GAK1C,MAAM,uBAAO,IAAI,iBAAiB,GAKlC,MAAM,uBAAO,IAAI,iBAAiB,GAKlC,MAAM,uBAAO,IAAI,iBAAiB,GAKlC,SAAS,uBAAO,IAAI,oBAAoB,GAKxC,SAAS,uBAAO,IAAI,oBAAoB,GAKxC,UAAU,uBAAO,IAAI,qBAAqB,GAK1C,QAAQ,uBAAO,IAAI,mBAAmB,GAKtC,QAAQ,uBAAO,IAAI,mBAAmB,GAKtC,OAAO,uBAAO,IAAI,kBAAkB,GAKpC,OAAO,uBAAO,IAAI,kBAAkB;","names":[]}
1
+ {"version":3,"sources":["../../src/symbols/index.ts"],"sourcesContent":["/* [index] */\r\n\r\n// #IMPORTS\r\n\r\n// #TYPES\r\n\r\n// #CONSTANTS\r\n\r\n// #VARIABLES\r\n\r\n// #FUNCTIONS\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport const\r\n/**\r\n * Key of the shared HRT inheritance stack (`[Adapter, App, Thread, Event]` once the core is loaded).\r\n * Used on the `Hrt` instance and as each core module's static typed view of that same array\r\n * (each module hydrates its predecessor, so the field never contains the class that holds it).\r\n * @internal\r\n*/\r\nINHERITANCE = Symbol.for('upwwwards::INHERITANCE'),\r\n/**\r\n * Key of a lazy plugin's identity symbol.\r\n * @internal\r\n*/\r\nSIGN = Symbol.for('upwwwards::SIGN'),\r\n/**\r\n * Key of a run state (Thread: stopped / pending / started; lazy plugins: destroyed / set up / loaded).\r\n * @internal\r\n*/\r\nSTATUS = Symbol.for('upwwwards::STATUS'),\r\n/**\r\n * Key of the callbacks a lazy plugin queues until it is loaded.\r\n * @internal\r\n*/\r\nQUEUE = Symbol.for('upwwwards::QUEUE'),\r\n/**\r\n * Key of a lazy plugin's guard-to-callbacks cache.\r\n * @internal\r\n*/\r\nCACHE = Symbol.for('upwwwards::CACHE'),\r\n/**\r\n * Key of a lazy plugin's pending load promise.\r\n * @internal\r\n*/\r\nWAIT = Symbol.for('upwwwards::WAIT'),\r\n/**\r\n * Key of a plugin's storage for loaded modules and instances.\r\n * @internal\r\n*/\r\nBUCKET = Symbol.for('upwwwards::BUCKET')\r\n,\r\n/**\r\n * Lifecycle method run once at startup, on server and client (`Up[construct]`, plugin `[construct]`).\r\n * @internal\r\n*/\r\nconstruct = Symbol.for('upwwwards::construct'),\r\n/**\r\n * Reserved lifecycle key (currently unused; startup uses {@link construct}).\r\n * @internal\r\n*/\r\nhydrate = Symbol.for('upwwwards::hydrate'),\r\n/**\r\n * Lifecycle method run in the browser by `Up.set`.\r\n * @internal\r\n*/\r\nset = Symbol.for('upwwwards::set'),\r\n/**\r\n * Reserved internal accessor key (currently unused).\r\n * @internal\r\n*/\r\nget = Symbol.for('upwwwards::get'),\r\n/**\r\n * Internal method registering a value (e.g. a loaded module) in a plugin's storage.\r\n * @internal\r\n*/\r\nadd = Symbol.for('upwwwards::add'),\r\n/**\r\n * Reserved internal removal key (currently unused).\r\n * @internal\r\n*/\r\nremove = Symbol.for('upwwwards::remove'),\r\n/**\r\n * Internal update method (used by the Synthra plugin).\r\n * @internal\r\n*/\r\nupdate = Symbol.for('upwwwards::update'),\r\n/**\r\n * Lifecycle method run in the browser by `Up.destroy`.\r\n * @internal\r\n*/\r\ndestroy = Symbol.for('upwwwards::destroy'),\r\n/**\r\n * Internal method handing the Thread frame loop to an external ticker (e.g. GSAP).\r\n * @internal\r\n*/\r\napply = Symbol.for('upwwwards::apply'),\r\n/**\r\n * Internal method resuming a paused module (Thread).\r\n * @internal\r\n*/\r\nstart = Symbol.for('upwwwards::start'),\r\n/**\r\n * Internal method pausing a module (Thread).\r\n * @internal\r\n*/\r\nstop = Symbol.for('upwwwards::stop'),\r\n/**\r\n * Lifecycle method lazily loading a plugin's dependencies on first use.\r\n * @internal\r\n*/\r\nload = Symbol.for('upwwwards::load')"],"mappings":"AAeO,MAOP,cAAc,uBAAO,IAAI,wBAAwB,GAKjD,OAAO,uBAAO,IAAI,iBAAiB,GAKnC,SAAS,uBAAO,IAAI,mBAAmB,GAKvC,QAAQ,uBAAO,IAAI,kBAAkB,GAKrC,QAAQ,uBAAO,IAAI,kBAAkB,GAKrC,OAAO,uBAAO,IAAI,iBAAiB,GAKnC,SAAS,uBAAO,IAAI,mBAAmB,GAMvC,YAAY,uBAAO,IAAI,sBAAsB,GAK7C,UAAU,uBAAO,IAAI,oBAAoB,GAKzC,MAAM,uBAAO,IAAI,gBAAgB,GAKjC,MAAM,uBAAO,IAAI,gBAAgB,GAKjC,MAAM,uBAAO,IAAI,gBAAgB,GAKjC,SAAS,uBAAO,IAAI,mBAAmB,GAKvC,SAAS,uBAAO,IAAI,mBAAmB,GAKvC,UAAU,uBAAO,IAAI,oBAAoB,GAKzC,QAAQ,uBAAO,IAAI,kBAAkB,GAKrC,QAAQ,uBAAO,IAAI,kBAAkB,GAKrC,OAAO,uBAAO,IAAI,iBAAiB,GAKnC,OAAO,uBAAO,IAAI,iBAAiB;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name" : "upwwwards",
3
- "version" : "0.1.2-beta.1",
3
+ "version" : "0.1.4-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>",