upwwwards 0.1.9-beta.1 → 0.1.11-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{index-Di5rQVjZ.d.ts → index-ymMzfIlh.d.ts} +60 -10
- package/dist/index.d.ts +1 -1
- package/dist/initializers/vite.d.ts +6 -3
- package/dist/initializers/vite.js +7 -3
- package/dist/initializers/vite.js.map +1 -1
- package/dist/plugins/@anime/Split.js +65 -8
- package/dist/plugins/@anime/Split.js.map +1 -1
- package/dist/plugins/Anime.d.ts +1 -1
- package/dist/plugins/Puppeteer.d.ts +1 -1
- package/dist/plugins/Scroll.d.ts +1 -1
- package/dist/plugins/Synthra.d.ts +1 -1
- package/dist/plugins/Transmitter.d.ts +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/scripts/Arrays.js.map +1 -1
- package/docs/plugins/anime.md +20 -1
- package/package.json +5 -1
|
@@ -783,11 +783,48 @@ declare abstract class Scroll extends Lazy {
|
|
|
783
783
|
static to(target: HTMLElement | number | string, options?: ScrollToOptions): void;
|
|
784
784
|
}
|
|
785
785
|
|
|
786
|
+
declare namespace Split {
|
|
787
|
+
/**
|
|
788
|
+
* Options for {@link Split.add}: GSAP `SplitText.Vars`, plus an optional `reconstruct` flag.
|
|
789
|
+
* By default, each target keeps one cached {@link Split.SPLIT}: a later `add` that only needs a
|
|
790
|
+
* **subset** of already split types (and a compatible `mask`) returns that same object; if new types
|
|
791
|
+
* or a new `mask` are required, types are **merged** and the existing `SplitText` is re-split in place.
|
|
792
|
+
* Set `reconstruct: true` to **replace** the cached types / mask with this call’s values and re-split
|
|
793
|
+
* (no merge). `reconstruct` is upwwwards-only and is not passed to GSAP.
|
|
794
|
+
*/
|
|
795
|
+
type VARS = SplitText.Vars & {
|
|
796
|
+
reconstruct?: boolean;
|
|
797
|
+
};
|
|
798
|
+
/**
|
|
799
|
+
* A split kind accepted in `vars.type` (`'chars'`, `'lines'`, or `'words'`).
|
|
800
|
+
*/
|
|
801
|
+
type TYPE = 'chars' | 'lines' | 'words';
|
|
802
|
+
/**
|
|
803
|
+
* Result of {@link Split.add}: one stable object per `target` on this helper.
|
|
804
|
+
* `chars` / `lines` / `words` / `masks` are the same array references across calls; their contents are
|
|
805
|
+
* updated in place when the underlying `SplitText` is re-split. `types` / `mask` reflect the current
|
|
806
|
+
* split definition; `splitText` is the single GSAP instance for that target.
|
|
807
|
+
*/
|
|
808
|
+
type SPLIT = {
|
|
809
|
+
types: TYPE[];
|
|
810
|
+
mask: TYPE | undefined;
|
|
811
|
+
chars: Element[];
|
|
812
|
+
lines: Element[];
|
|
813
|
+
words: Element[];
|
|
814
|
+
masks: Element[];
|
|
815
|
+
splitText: SplitText;
|
|
816
|
+
};
|
|
817
|
+
}
|
|
786
818
|
/**
|
|
787
|
-
*
|
|
788
|
-
* (
|
|
819
|
+
* Helper that owns one GSAP `SplitText` per target in a private GSAP context, reverted together by {@link Split.destroy}
|
|
820
|
+
* (restoring the original markup).
|
|
821
|
+
* On the **same target**, {@link Split.add} returns the same {@link Split.SPLIT}: subset requests reuse it as-is;
|
|
822
|
+
* wider requests (or a new `mask`) merge into the cached types and call `splitText.split(…)`. Pass
|
|
823
|
+
* `reconstruct: true` to replace the definition instead of merging. Element arrays on the `SPLIT` are kept by
|
|
824
|
+
* reference and refreshed in place after a re-split — prefer that object over holding individual node refs across
|
|
825
|
+
* a reconstruct / expand (tweens already targeting old nodes stay stale).
|
|
789
826
|
* When constructed inside an `Up.Anime.sub` callback, the instance pushes its `destroy` on the workspace's cleaning stack
|
|
790
|
-
* (
|
|
827
|
+
* (run by `Up.Anime.unsub`), so it is cleaned up automatically.
|
|
791
828
|
* @note Requires `'SplitText'` in the Anime config (`plugins: ['SplitText']`).
|
|
792
829
|
* @note Get the class from the Anime bucket (`bucket.Split`): it is only usable once Anime has loaded GSAP.
|
|
793
830
|
* @example
|
|
@@ -816,15 +853,28 @@ declare class Split {
|
|
|
816
853
|
*/
|
|
817
854
|
constructor();
|
|
818
855
|
/**
|
|
819
|
-
* Splits `target`
|
|
820
|
-
* @
|
|
821
|
-
*
|
|
822
|
-
* @
|
|
856
|
+
* Splits `target` according to `vars.type` (and optional `mask`). Work is recorded in the managed GSAP context
|
|
857
|
+
* so {@link Split.destroy} can revert it.
|
|
858
|
+
* **Same target, default:** if the cached split already covers the requested types and `mask`, returns that
|
|
859
|
+
* {@link Split.SPLIT} unchanged; otherwise merges the new types (and updates `mask` when provided), re-splits
|
|
860
|
+
* via `splitText.split(…)`, and refreshes `chars` / `lines` / `words` / `masks` in place.
|
|
861
|
+
* **`reconstruct: true`:** replaces the cached types / mask with this call’s values, re-splits, then refreshes
|
|
862
|
+
* the arrays (still the same `SPLIT` object / `splitText` instance). Unknown tokens in `type` are ignored.
|
|
863
|
+
* @param target Element(s) to split (Map key for the per-target cache).
|
|
864
|
+
* @param vars GSAP `SplitText` options; `type` is required. Optional `reconstruct` is upwwwards-only and is not passed to GSAP.
|
|
865
|
+
* @returns The cached {@link Split.SPLIT} for `target` (created on first `add`).
|
|
866
|
+
* @example
|
|
867
|
+
* ```ts
|
|
868
|
+
* const lines = split.add('.title', { type: 'lines' })
|
|
869
|
+
* const both = split.add('.title', { type: 'lines,words' }) // same object; union + re-split
|
|
870
|
+
* const words = split.add('.title', { type: 'words' }) // same object; subset → no re-split
|
|
871
|
+
* const only = split.add('.title', { type: 'words', reconstruct: true }) // same object; replace + re-split
|
|
872
|
+
* ```
|
|
823
873
|
*/
|
|
824
|
-
add(target: gsap.DOMTarget, vars
|
|
874
|
+
add(target: gsap.DOMTarget, { reconstruct, ...vars }: Split.VARS): Split.SPLIT;
|
|
825
875
|
/**
|
|
826
|
-
*
|
|
827
|
-
* The instance stays usable afterwards.
|
|
876
|
+
* Clears the per-target cache, reverts every `SplitText` owned by this helper, and starts over with an empty context.
|
|
877
|
+
* The instance stays usable afterwards (new `add` calls behave like on a fresh `Split`).
|
|
828
878
|
*/
|
|
829
879
|
destroy(): void;
|
|
830
880
|
}
|
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-5NGNyOJb.js';
|
|
4
4
|
export { b as AppCache } from './Thread-5NGNyOJb.js';
|
|
5
5
|
import { A as Adapter, a as AdapterConfig } from './index-BlwaDpQl.js';
|
|
6
|
-
import { P as Plugin } from './index-
|
|
6
|
+
import { P as Plugin } from './index-ymMzfIlh.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-
|
|
3
|
+
import { P as Plugin } from '../index-ymMzfIlh.js';
|
|
4
4
|
import { C as Classter } from '../Classter-BvYgmPAa.js';
|
|
5
5
|
import '../symbols/index.js';
|
|
6
6
|
import '../Wait-C8AD49l9.js';
|
|
@@ -219,8 +219,11 @@ 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
|
-
*
|
|
223
|
-
*
|
|
222
|
+
* That virtual module loads the class via `upwwwards/core/Up` so Nitro/Rolldown cannot collapse a self-import
|
|
223
|
+
* into `undefined[Symbol(upwwwards::construct)]` during SSR.
|
|
224
|
+
* - Sets `resolve.dedupe`, `optimizeDeps.exclude` / `ssr.optimizeDeps.exclude`, and `ssr.noExternal: ['upwwwards']`
|
|
225
|
+
* so Vite never prebundles a second copy of `Up` while plugins still import `../core/Up.js`, and so SSR keeps
|
|
226
|
+
* the virtual `construct` entry in the server graph.
|
|
224
227
|
* - Writes generated files into `<setupIn>/upwwwards/` at build start: `private/types/upwwwards.d.ts`
|
|
225
228
|
* (types of `Up.Adapter`, the enabled plugins, `AdapterConfig` / `AdapterRef` and `EventData`; rewritten when outdated),
|
|
226
229
|
* `customizable/types/config.d.ts` (created once, then yours to edit, to augment `AppCache` and plugin interfaces),
|
|
@@ -2,8 +2,9 @@ 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*`), OPTIMIZE_DEPS_EXCLUDE = [
|
|
5
|
+
const FOLDER_NAME = "upwwwards", CUSTOMIZABLE_FOLDER_NAME = "customizable", PRIVATE_FOLDER_NAME = "private", ID = "upwwwards", UP_CORE_ID = `${ID}/core/Up`, 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
6
|
ID,
|
|
7
|
+
`${ID}/core/Up`,
|
|
7
8
|
`${ID}/contexts/nuxt`,
|
|
8
9
|
`${ID}/contexts/sveltekit`,
|
|
9
10
|
`${ID}/adapters`,
|
|
@@ -334,7 +335,10 @@ function config() {
|
|
|
334
335
|
server: { watch: { ignored: [`**/${FOLDER_NAME}/${PRIVATE_FOLDER_NAME}/**`] } },
|
|
335
336
|
resolve: { dedupe: [ID] },
|
|
336
337
|
optimizeDeps: { exclude: [...OPTIMIZE_DEPS_EXCLUDE] },
|
|
337
|
-
ssr: {
|
|
338
|
+
ssr: {
|
|
339
|
+
noExternal: [ID],
|
|
340
|
+
optimizeDeps: { exclude: [...OPTIMIZE_DEPS_EXCLUDE] }
|
|
341
|
+
}
|
|
338
342
|
};
|
|
339
343
|
}
|
|
340
344
|
function configResolved(config2) {
|
|
@@ -367,7 +371,7 @@ async function resolveID(id) {
|
|
|
367
371
|
}
|
|
368
372
|
}
|
|
369
373
|
function load(id) {
|
|
370
|
-
return id.startsWith(VIRTUAL_ID) ? `import Up from '${
|
|
374
|
+
return id.startsWith(VIRTUAL_ID) ? `import Up from '${UP_CORE_ID}'; ${this.virtual}` : this.Classter && id === VIRTUAL_CLASSTER_ID ? dev ? this.Classter.get() : CLASSTER_MARK_STYLE : null;
|
|
371
375
|
}
|
|
372
376
|
function buildStart() {
|
|
373
377
|
if (this.Classter) readHTMLFiles(this);
|
|
@@ -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\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
|
+
{"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\n/**\r\n * Bare entry used by the virtual module to load the `Up` class without going through `import 'upwwwards'`\r\n * (which resolves back to the same virtual module). Nitro/Rolldown otherwise collapses that cycle into\r\n * `var Up = Up` → `undefined[Symbol(upwwwards::construct)]` on SSR.\r\n*/\r\nUP_CORE_ID = `${ID}/core/Up` as const,\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}/core/Up`,\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, keeps every `upwwwards/*` entry out of `optimizeDeps` (client + SSR) so plugins and the\r\n * virtual module share one `Up` / `Event` instance, and forces SSR to bundle `upwwwards` so Nitro\r\n * does not skip the virtual `construct` entry.\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 :\r\n {\r\n noExternal : [ID],\r\n optimizeDeps: { exclude: [...OPTIMIZE_DEPS_EXCLUDE] }\r\n }\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 * The virtual module imports `Up` from {@link UP_CORE_ID} (not the resolved package root) so SSR bundlers cannot\r\n * rewrite that import back to the virtual `upwwwards` entry and create a `var Up = Up` cycle.\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 '${UP_CORE_ID}'; ${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 * That virtual module loads the class via `upwwwards/core/Up` so Nitro/Rolldown cannot collapse a self-import\r\n * into `undefined[Symbol(upwwwards::construct)]` during SSR.\r\n * - Sets `resolve.dedupe`, `optimizeDeps.exclude` / `ssr.optimizeDeps.exclude`, and `ssr.noExternal: ['upwwwards']`\r\n * so Vite never prebundles a second copy of `Up` while plugins still import `../core/Up.js`, and so SSR keeps\r\n * the virtual `construct` entry in the server graph.\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"]}
|
|
@@ -4,12 +4,17 @@ import Logs from "../../scripts/Logs.js";
|
|
|
4
4
|
class Split {
|
|
5
5
|
// #PROPS
|
|
6
6
|
// ##STATICS
|
|
7
|
+
static #RGX_TYPE = /\s*,\s*/;
|
|
8
|
+
static #TYPES = ["chars", "lines", "words"];
|
|
9
|
+
static #PROPS = [...Split.#TYPES, "masks"];
|
|
10
|
+
static #PROPS_LENGTH = Split.#PROPS.length;
|
|
7
11
|
/**
|
|
8
12
|
* Anime bucket shared by the Anime plugin once GSAP is loaded; includes `SplitText` when it is in the Anime config.
|
|
9
13
|
* @internal
|
|
10
14
|
*/
|
|
11
15
|
static [BUCKET];
|
|
12
16
|
// ##PRIVATES
|
|
17
|
+
#CACHE = /* @__PURE__ */ new Map();
|
|
13
18
|
#ctx = Split[BUCKET].gsap.context(Up.App.void);
|
|
14
19
|
// ##PUBLICS
|
|
15
20
|
// #MANAGERS
|
|
@@ -29,23 +34,75 @@ class Split {
|
|
|
29
34
|
// ##GET
|
|
30
35
|
// ##ADD
|
|
31
36
|
/**
|
|
32
|
-
* Splits `target`
|
|
33
|
-
* @
|
|
34
|
-
*
|
|
35
|
-
* @
|
|
37
|
+
* Splits `target` according to `vars.type` (and optional `mask`). Work is recorded in the managed GSAP context
|
|
38
|
+
* so {@link Split.destroy} can revert it.
|
|
39
|
+
* **Same target, default:** if the cached split already covers the requested types and `mask`, returns that
|
|
40
|
+
* {@link Split.SPLIT} unchanged; otherwise merges the new types (and updates `mask` when provided), re-splits
|
|
41
|
+
* via `splitText.split(…)`, and refreshes `chars` / `lines` / `words` / `masks` in place.
|
|
42
|
+
* **`reconstruct: true`:** replaces the cached types / mask with this call’s values, re-splits, then refreshes
|
|
43
|
+
* the arrays (still the same `SPLIT` object / `splitText` instance). Unknown tokens in `type` are ignored.
|
|
44
|
+
* @param target Element(s) to split (Map key for the per-target cache).
|
|
45
|
+
* @param vars GSAP `SplitText` options; `type` is required. Optional `reconstruct` is upwwwards-only and is not passed to GSAP.
|
|
46
|
+
* @returns The cached {@link Split.SPLIT} for `target` (created on first `add`).
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const lines = split.add('.title', { type: 'lines' })
|
|
50
|
+
* const both = split.add('.title', { type: 'lines,words' }) // same object; union + re-split
|
|
51
|
+
* const words = split.add('.title', { type: 'words' }) // same object; subset → no re-split
|
|
52
|
+
* const only = split.add('.title', { type: 'words', reconstruct: true }) // same object; replace + re-split
|
|
53
|
+
* ```
|
|
36
54
|
*/
|
|
37
|
-
add(target, vars) {
|
|
38
|
-
return this.#ctx.add(() =>
|
|
55
|
+
add(target, { reconstruct, ...vars }) {
|
|
56
|
+
return this.#ctx.add(() => {
|
|
57
|
+
const TYPES = vars.type.trim().split(Split.#RGX_TYPE);
|
|
58
|
+
for (let i = TYPES.length - 1; i > -1; i--) if (!Split.#TYPES.includes(TYPES[i])) TYPES.splice(i, 1);
|
|
59
|
+
let split = this.#CACHE.get(target);
|
|
60
|
+
if (split) {
|
|
61
|
+
if (reconstruct) {
|
|
62
|
+
split.types = TYPES;
|
|
63
|
+
split.mask = vars.mask;
|
|
64
|
+
vars.type = TYPES.join(",");
|
|
65
|
+
} else {
|
|
66
|
+
if (Split.#isIncluded(split.types, TYPES) && (!vars.mask || split.mask === vars.mask)) return split;
|
|
67
|
+
for (let i = 0, max = TYPES.length; i < max; i++) if (!split.types.includes(TYPES[i])) split.types.push(TYPES[i]);
|
|
68
|
+
vars.type = split.types.join(",");
|
|
69
|
+
if (vars.mask) split.mask = vars.mask;
|
|
70
|
+
}
|
|
71
|
+
split.splitText.split(vars);
|
|
72
|
+
} else this.#CACHE.set(target, split = {
|
|
73
|
+
types: TYPES,
|
|
74
|
+
mask: vars.mask,
|
|
75
|
+
chars: [],
|
|
76
|
+
lines: [],
|
|
77
|
+
words: [],
|
|
78
|
+
masks: [],
|
|
79
|
+
splitText: Split[BUCKET].SplitText.create(target, vars)
|
|
80
|
+
});
|
|
81
|
+
for (let i = 0; i < Split.#PROPS_LENGTH; i++) {
|
|
82
|
+
const TARGET = split[Split.#PROPS[i]], SOURCE = split.splitText[Split.#PROPS[i]], LENGTH = SOURCE.length;
|
|
83
|
+
TARGET.length = LENGTH;
|
|
84
|
+
for (let j = 0; j < LENGTH; j++) TARGET[j] = SOURCE[j];
|
|
85
|
+
}
|
|
86
|
+
return split;
|
|
87
|
+
});
|
|
39
88
|
}
|
|
40
89
|
// ##DESTROY
|
|
41
90
|
/**
|
|
42
|
-
*
|
|
43
|
-
* The instance stays usable afterwards.
|
|
91
|
+
* Clears the per-target cache, reverts every `SplitText` owned by this helper, and starts over with an empty context.
|
|
92
|
+
* The instance stays usable afterwards (new `add` calls behave like on a fresh `Split`).
|
|
44
93
|
*/
|
|
45
94
|
destroy() {
|
|
95
|
+
if (this.#CACHE.size) this.#CACHE.clear();
|
|
46
96
|
this.#ctx.revert();
|
|
47
97
|
this.#ctx = Split[BUCKET].gsap.context(Up.App.void);
|
|
48
98
|
}
|
|
99
|
+
// ##IS
|
|
100
|
+
static #isIncluded(target, source) {
|
|
101
|
+
const LENGTH = source.length;
|
|
102
|
+
if (LENGTH > target.length) return false;
|
|
103
|
+
for (let i = 0; i < LENGTH; i++) if (!target.includes(source[i])) return false;
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
49
106
|
}
|
|
50
107
|
var Split_default = Split;
|
|
51
108
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/plugins/@anime/Split.ts"],"sourcesContent":["/* [Split] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { BUCKET } from '../../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../../core/Up.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../../scripts/Logs.js'\r\n\r\n // ##TYPES\r\nimport type SplitText from 'gsap/SplitText'\r\n\r\nimport type { AnimeBucket } from '../Anime.js'\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Collection of GSAP `SplitText` instances owned by a private GSAP context, reverted together by `destroy`\r\n * (which restores the original markup).\r\n * When constructed inside an `Up.Anime.sub` callback, the instance pushes its `destroy` on the workspace's cleaning stack\r\n * (the list of destructors run by `Up.Anime.unsub`), so it is cleaned up automatically.\r\n * @note Requires `'SplitText'` in the Anime config (`plugins: ['SplitText']`).\r\n * @note Get the class from the Anime bucket (`bucket.Split`): it is only usable once Anime has loaded GSAP.\r\n * @example\r\n * ```ts\r\n * Up.Anime.sub(KEY, (bucket: AnimeBucket): void =>\r\n * {\r\n * const SPLIT = new bucket.Split()\r\n * const TEXT = SPLIT.add('.hero__title', { type: 'lines,words' })\r\n *\r\n * bucket.gsap.from(TEXT.words, { yPercent: 100, stagger: 0.05 })\r\n * })\r\n * ```\r\n*/\r\nclass Split\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * Anime bucket shared by the Anime plugin once GSAP is loaded; includes `SplitText` when it is in the Anime config.\r\n * @internal\r\n */\r\n static [BUCKET]: AnimeBucket & { SplitText?: typeof SplitText }\r\n\r\n // ##PRIVATES\r\n #ctx: gsap.Context = Split[BUCKET].gsap.context(Up.App.void)\r\n\r\n // ##PUBLICS\r\n\r\n// #MANAGERS\r\n\r\n // ##CONSTRUCTOR\r\n /**\r\n * Creates an empty collection and, inside a `sub` callback, registers `destroy` on the workspace's cleaning stack.\r\n * @throws If `'SplitText'` is not in the Anime config.\r\n */\r\n constructor ()\r\n {\r\n if (!Split[BUCKET].SplitText) Logs.throw('SPLIT', '\"SplitText\" (GSAP PLUGIN) IS REQUIRED TO USE THIS CLASS (ADD \"SplitText\" TO THE \"Anime\" CONFIGURATION).')\r\n\r\n Split[BUCKET].workspace.cleaningStack?.push(this.destroy.bind(this))\r\n }\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n\r\n// #METHODS\r\n\r\n // ##SET\r\n\r\n // ##GET\r\n\r\n // ##ADD\r\n /**\r\n * Splits `target` with `SplitText.create` inside the managed context, so `destroy` reverts it.\r\n * @param target Element(s) to split.\r\n * @param vars `SplitText` options.\r\n * @returns The created `SplitText` instance.\r\n */\r\n add(target: gsap.DOMTarget, vars?: SplitText.Vars): SplitText { return this.#ctx.add((): SplitText => Split[BUCKET].SplitText!.create(target, vars)) }\r\n\r\n // ##DESTROY\r\n /**\r\n * Reverts every `SplitText` instance created through this helper, then starts over with an empty context.\r\n * The instance stays usable afterwards.\r\n */\r\n destroy(): void\r\n {\r\n this.#ctx.revert()\r\n\r\n this.#ctx = Split[BUCKET].gsap.context(Up.App.void)\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Split"],"mappings":"AAKA,SAAS,cAAc;AAGvB,OAAO,QAAQ;AAGf,OAAO,UAAU;AA4BjB,MAAM,MACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASI,QAAQ,MAAM;AAAA;AAAA,EAGd,OAAqB,MAAM,MAAM,EAAE,KAAK,QAAQ,GAAG,IAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW3D,cACA;AACI,QAAI,CAAC,MAAM,MAAM,EAAE,UAAW,MAAK,MAAM,SAAS,yGAAyG;AAE3J,UAAM,MAAM,EAAE,UAAU,eAAe,KAAK,KAAK,QAAQ,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,IAAI,QAAwB,MAAkC;AAAE,WAAO,KAAK,KAAK,IAAI,MAAiB,MAAM,MAAM,EAAE,UAAW,OAAO,QAAQ,IAAI,CAAC;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOrJ,UACA;AACI,SAAK,KAAK,OAAO;AAEjB,SAAK,OAAO,MAAM,MAAM,EAAE,KAAK,QAAQ,GAAG,IAAI,IAAI;AAAA,EACtD;AAEJ;AAKA,IAAO,gBAAQ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/plugins/@anime/Split.ts"],"sourcesContent":["/* [Split] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { BUCKET } from '../../symbols/index.js'\r\n\r\n // ##CORE\r\nimport Up from '../../core/Up.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../../scripts/Logs.js'\r\n\r\n // ##TYPES\r\nimport type SplitText from 'gsap/SplitText'\r\n\r\nimport type { AnimeBucket } from '../Anime.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Split\r\n{\r\n /**\r\n * Options for {@link Split.add}: GSAP `SplitText.Vars`, plus an optional `reconstruct` flag.\r\n * By default, each target keeps one cached {@link Split.SPLIT}: a later `add` that only needs a\r\n * **subset** of already split types (and a compatible `mask`) returns that same object; if new types\r\n * or a new `mask` are required, types are **merged** and the existing `SplitText` is re-split in place.\r\n * Set `reconstruct: true` to **replace** the cached types / mask with this call’s values and re-split\r\n * (no merge). `reconstruct` is upwwwards-only and is not passed to GSAP.\r\n */\r\n export type VARS = SplitText.Vars & { reconstruct?: boolean }\r\n\r\n /**\r\n * A split kind accepted in `vars.type` (`'chars'`, `'lines'`, or `'words'`).\r\n */\r\n export type TYPE = 'chars' | 'lines' | 'words'\r\n\r\n /**\r\n * Result of {@link Split.add}: one stable object per `target` on this helper.\r\n * `chars` / `lines` / `words` / `masks` are the same array references across calls; their contents are\r\n * updated in place when the underlying `SplitText` is re-split. `types` / `mask` reflect the current\r\n * split definition; `splitText` is the single GSAP instance for that target.\r\n */\r\n export type SPLIT =\r\n {\r\n types : TYPE[],\r\n mask : TYPE | undefined,\r\n chars : Element[],\r\n lines : Element[],\r\n words : Element[],\r\n masks : Element[],\r\n splitText: SplitText\r\n }\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Helper that owns one GSAP `SplitText` per target in a private GSAP context, reverted together by {@link Split.destroy}\r\n * (restoring the original markup).\r\n * On the **same target**, {@link Split.add} returns the same {@link Split.SPLIT}: subset requests reuse it as-is;\r\n * wider requests (or a new `mask`) merge into the cached types and call `splitText.split(…)`. Pass\r\n * `reconstruct: true` to replace the definition instead of merging. Element arrays on the `SPLIT` are kept by\r\n * reference and refreshed in place after a re-split — prefer that object over holding individual node refs across\r\n * a reconstruct / expand (tweens already targeting old nodes stay stale).\r\n * When constructed inside an `Up.Anime.sub` callback, the instance pushes its `destroy` on the workspace's cleaning stack\r\n * (run by `Up.Anime.unsub`), so it is cleaned up automatically.\r\n * @note Requires `'SplitText'` in the Anime config (`plugins: ['SplitText']`).\r\n * @note Get the class from the Anime bucket (`bucket.Split`): it is only usable once Anime has loaded GSAP.\r\n * @example\r\n * ```ts\r\n * Up.Anime.sub(KEY, (bucket: AnimeBucket): void =>\r\n * {\r\n * const SPLIT = new bucket.Split()\r\n * const TEXT = SPLIT.add('.hero__title', { type: 'lines,words' })\r\n *\r\n * bucket.gsap.from(TEXT.words, { yPercent: 100, stagger: 0.05 })\r\n * })\r\n * ```\r\n*/\r\nclass Split\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n static #RGX_TYPE = /\\s*,\\s*/\r\n\r\n static #TYPES: Split.TYPE[] = ['chars', 'lines', 'words']\r\n static #PROPS = [...Split.#TYPES, 'masks'] satisfies (keyof Split.SPLIT)[]\r\n\r\n static #PROPS_LENGTH = Split.#PROPS.length\r\n\r\n /**\r\n * Anime bucket shared by the Anime plugin once GSAP is loaded; includes `SplitText` when it is in the Anime config.\r\n * @internal\r\n */\r\n static [BUCKET]: AnimeBucket & { SplitText?: typeof SplitText }\r\n\r\n // ##PRIVATES\r\n #CACHE = new Map<gsap.DOMTarget, Split.SPLIT>()\r\n\r\n #ctx: gsap.Context = Split[BUCKET].gsap.context(Up.App.void)\r\n\r\n // ##PUBLICS\r\n\r\n// #MANAGERS\r\n\r\n // ##CONSTRUCTOR\r\n /**\r\n * Creates an empty collection and, inside a `sub` callback, registers `destroy` on the workspace's cleaning stack.\r\n * @throws If `'SplitText'` is not in the Anime config.\r\n */\r\n constructor ()\r\n {\r\n if (!Split[BUCKET].SplitText) Logs.throw('SPLIT', '\"SplitText\" (GSAP PLUGIN) IS REQUIRED TO USE THIS CLASS (ADD \"SplitText\" TO THE \"Anime\" CONFIGURATION).')\r\n\r\n Split[BUCKET].workspace.cleaningStack?.push(this.destroy.bind(this))\r\n }\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n\r\n// #METHODS\r\n\r\n // ##SET\r\n\r\n // ##GET\r\n\r\n // ##ADD\r\n /**\r\n * Splits `target` according to `vars.type` (and optional `mask`). Work is recorded in the managed GSAP context\r\n * so {@link Split.destroy} can revert it.\r\n * **Same target, default:** if the cached split already covers the requested types and `mask`, returns that\r\n * {@link Split.SPLIT} unchanged; otherwise merges the new types (and updates `mask` when provided), re-splits\r\n * via `splitText.split(…)`, and refreshes `chars` / `lines` / `words` / `masks` in place.\r\n * **`reconstruct: true`:** replaces the cached types / mask with this call’s values, re-splits, then refreshes\r\n * the arrays (still the same `SPLIT` object / `splitText` instance). Unknown tokens in `type` are ignored.\r\n * @param target Element(s) to split (Map key for the per-target cache).\r\n * @param vars GSAP `SplitText` options; `type` is required. Optional `reconstruct` is upwwwards-only and is not passed to GSAP.\r\n * @returns The cached {@link Split.SPLIT} for `target` (created on first `add`).\r\n * @example\r\n * ```ts\r\n * const lines = split.add('.title', { type: 'lines' })\r\n * const both = split.add('.title', { type: 'lines,words' }) // same object; union + re-split\r\n * const words = split.add('.title', { type: 'words' }) // same object; subset → no re-split\r\n * const only = split.add('.title', { type: 'words', reconstruct: true }) // same object; replace + re-split\r\n * ```\r\n */\r\n add(target: gsap.DOMTarget, {reconstruct, ...vars}: Split.VARS): Split.SPLIT\r\n {\r\n return this.#ctx.add((): Split.SPLIT =>\r\n {\r\n const TYPES = vars.type.trim().split(Split.#RGX_TYPE) as Split.TYPE[]\r\n\r\n for (let i = TYPES.length - 1; i > -1; i--) if (!Split.#TYPES.includes(TYPES[i])) TYPES.splice(i, 1)\r\n\r\n let split = this.#CACHE.get(target)\r\n\r\n if (split)\r\n {\r\n if (reconstruct)\r\n {\r\n split.types = TYPES\r\n split.mask = vars.mask\r\n vars.type = TYPES.join(',')\r\n }\r\n else\r\n {\r\n if (Split.#isIncluded(split.types, TYPES) && (!vars.mask || split.mask === vars.mask)) return split\r\n\r\n for (let i = 0, max = TYPES.length; i < max; i++) if (!split.types.includes(TYPES[i])) split.types.push(TYPES[i])\r\n\r\n vars.type = split.types.join(',')\r\n\r\n if (vars.mask) split.mask = vars.mask\r\n }\r\n\r\n split.splitText.split(vars)\r\n }\r\n else this.#CACHE.set(target, split =\r\n {\r\n types : TYPES,\r\n mask : vars.mask,\r\n chars : [],\r\n lines : [],\r\n words : [],\r\n masks : [],\r\n splitText: Split[BUCKET].SplitText!.create(target, vars)\r\n })\r\n \r\n for (let i = 0; i < Split.#PROPS_LENGTH; i++)\r\n {\r\n const\r\n TARGET = split[Split.#PROPS[i]],\r\n SOURCE = split.splitText[Split.#PROPS[i]],\r\n LENGTH = SOURCE.length\r\n\r\n TARGET.length = LENGTH\r\n\r\n for (let j = 0; j < LENGTH; j++) TARGET[j] = SOURCE[j]\r\n }\r\n\r\n return split\r\n })\r\n }\r\n\r\n // ##DESTROY\r\n /**\r\n * Clears the per-target cache, reverts every `SplitText` owned by this helper, and starts over with an empty context.\r\n * The instance stays usable afterwards (new `add` calls behave like on a fresh `Split`).\r\n */\r\n destroy(): void\r\n {\r\n if (this.#CACHE.size) this.#CACHE.clear()\r\n\r\n this.#ctx.revert()\r\n\r\n this.#ctx = Split[BUCKET].gsap.context(Up.App.void)\r\n }\r\n\r\n // ##IS\r\n static #isIncluded(target: Split.TYPE[], source: Split.TYPE[]): boolean\r\n {\r\n const LENGTH = source.length\r\n\r\n if (LENGTH > target.length) return false\r\n \r\n for (let i = 0; i < LENGTH; i++) if (!target.includes(source[i])) return false\r\n\r\n return true\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Split\r\n\r\nexport type { Split }"],"mappings":"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","names":[]}
|
package/dist/plugins/Anime.d.ts
CHANGED
|
@@ -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-
|
|
2
|
+
export { A as Anime, c as AnimeBucket, d as Split, e as Timeline, f as Tweens, A as default } from '../index-ymMzfIlh.js';
|
|
3
3
|
import 'gsap/all';
|
|
4
4
|
import '../index-BlwaDpQl.js';
|
|
5
5
|
import '../Thread-5NGNyOJb.js';
|
package/dist/plugins/Scroll.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import '../symbols/index.js';
|
|
2
|
-
export { S as Scroll, b as ScrollBucket, S as default } from '../index-
|
|
2
|
+
export { S as Scroll, b as ScrollBucket, S as default } from '../index-ymMzfIlh.js';
|
|
3
3
|
import 'lenis';
|
|
4
4
|
import '../Thread-5NGNyOJb.js';
|
|
5
5
|
import '../index-BlwaDpQl.js';
|
|
@@ -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-
|
|
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-ymMzfIlh.js';
|
|
3
3
|
import 'three';
|
|
4
4
|
import '../Thread-5NGNyOJb.js';
|
|
5
5
|
import '../index-BlwaDpQl.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import '../symbols/index.js';
|
|
2
|
-
export { T as Transmitter, a as TransmitterChannels, T as default } from '../index-
|
|
2
|
+
export { T as Transmitter, a as TransmitterChannels, T as default } from '../index-ymMzfIlh.js';
|
|
3
3
|
import '../index-BlwaDpQl.js';
|
|
4
4
|
import '../Thread-5NGNyOJb.js';
|
|
5
5
|
import 'lenis';
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -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-
|
|
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-ymMzfIlh.js';
|
|
2
2
|
import '../symbols/index.js';
|
|
3
3
|
import '../index-BlwaDpQl.js';
|
|
4
4
|
import '../Thread-5NGNyOJb.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/scripts/Arrays.ts"],"sourcesContent":["/* [Arrays] */\r\n\r\n// #IMPORTS\r\n\r\n // ##THIS\r\nimport CallStack from './@arrays/Callstack.js'\r\n\r\n // ##TYPES\r\nimport type Maths from './Maths.js'\r\nimport type Strings from './Strings.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Arrays\r\n{\r\n /**\r\n * Tuple with the same length as `T` where every element is `U` (e.g. `Fill<[1, 2, 3], 0>` is `[0, 0, 0]`).\r\n * @template T Source tuple (only its length is used).\r\n * @template U Element type to fill with.\r\n */\r\n export type Fill<T extends any[], U, V extends any[] = []> = T extends [any, ...infer W] ? Fill<W, U, [...V, U]> : V\r\n\r\n /**\r\n * String literal type obtained by joining the elements of `T` with separator `U`\r\n * (e.g. `Join<[1, 'a', true], ', '>` is `'1, a, true'`), like `Array.prototype.join` at the type level.\r\n * Elements must be stringifiable (`Strings.STRINGIFIABLE`).\r\n * @template T Tuple to join.\r\n * @template U Separator. Defaults to `','`.\r\n */\r\n export type Join<T extends any[], U extends string = ',', V extends string = ''> = T extends [infer W extends Strings.STRINGIFIABLE, ...infer X extends Strings.STRINGIFIABLE[]]\r\n ? Join<X, U, V extends '' ? `${W}` : `${V}${U}${W}`>\r\n : V\r\n\r\n /**\r\n * `true` if at least one element type of `T` is assignable to `U`, otherwise `false`\r\n * (e.g. `Includes<['a', 1], string>` is `true`, `Includes<[string], 'a'>` is `false`).\r\n * @template T Tuple or array to search (readonly accepted).\r\n * @template U Type to look for.\r\n */\r\n export type Includes<T extends Readonly<any[]>, U> = Extract<T[number], U> extends never ? false : true\r\n\r\n /**\r\n * Tuple `T` with `U` appended at the end.\r\n * @template T Source tuple.\r\n * @template U Element to append.\r\n */\r\n export type Push<T extends any[], U> = [...T, U]\r\n\r\n /**\r\n * Tuple `T` without its last element (`never` if `T` is empty).\r\n * @template T Source tuple.\r\n */\r\n export type Pop<T extends any[]> = T extends [...infer U, any] ? U : never\r\n\r\n /**\r\n * Tuple `T` with `U` inserted at the start.\r\n * @template T Source tuple.\r\n * @template U Element to prepend.\r\n */\r\n export type Unshift<T extends any[], U> = [U, ...T]\r\n\r\n /**\r\n * Tuple `T` without its first element (`never` if `T` is empty).\r\n * @template T Source tuple.\r\n */\r\n export type Shift<T extends any[]> = T extends [any, ...infer U] ? U : never\r\n\r\n /**\r\n * Tuple `T` padded with `U` until it has length `V` (e.g. `Pad<[1], 0, 3, true>` is `[1, 0, 0]`).\r\n * Tuples already at least `V` long are returned unchanged.\r\n * @template T Source tuple.\r\n * @template U Padding element.\r\n * @template V Target length.\r\n * @template W `true` to pad at the end; otherwise (default `false`) pad at the start.\r\n */\r\n export type Pad<T extends any[], U, V extends number, W extends boolean = false, X extends any[] = T, Y extends null[] = []> = V extends Y['length']\r\n ? X\r\n : T extends [unknown, ...infer Z]\r\n ? Pad<Z, U, V, W, X, [...Y, null]>\r\n : Pad<[], U, V, W, W extends true ? [...X, U] : [U, ...X], [...Y, null]>\r\n\r\n /**\r\n * Length of tuple `T` as a number literal type.\r\n * @template T Source tuple.\r\n */\r\n export type Length<T extends any[]> = T['length']\r\n\r\n /**\r\n * Tuple `T` with the element at index `U` replaced by `V` (e.g. `Set<[1, 2], 1, 'x'>` is `[1, 'x']`).\r\n * If `U` is past the end, the gap is filled with `undefined` (e.g. `Set<[1], 3, 'x'>` is `[1, undefined, undefined, 'x']`).\r\n * @template T Source tuple.\r\n * @template U Index to set.\r\n * @template V New element.\r\n */\r\n export type Set<T extends any[], U extends number, V, W extends any[] = []> = T extends [infer X, ...infer Y]\r\n ? U extends W['length']\r\n ? Set<Y, U, V, [...W, V]>\r\n : Set<Y, U, V, [...W, X]>\r\n : U extends W['length']\r\n ? [...W, V]\r\n : Maths.SmallerOrEqual<W['length'], U> extends true\r\n ? Set<T, U, V, [...W, undefined]>\r\n : W\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Array utilities: compile-time tuple helper types (`Arrays.Fill`, `Arrays.Join`, `Arrays.Pad`, ...)\r\n * and the runtime {@link CallStack} class, exposed as `Arrays.CallStack`.\r\n * @example\r\n * ```ts\r\n * import { Arrays } from 'upwwwards/scripts'\r\n *\r\n * type T = Arrays.Push<[1, 2], 3> // [1, 2, 3]\r\n *\r\n * const STACK = new Arrays.CallStack<(dt: number) => void>()\r\n *\r\n * STACK.add((dt): void => console.log(dt))\r\n * STACK.loop(16)\r\n * ```\r\n*/\r\nabstract class Arrays\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\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 * The {@link CallStack} class: an ordered list of callbacks that can be run all at once (`loop`)\r\n * or one at a time through a generator (`gen`).\r\n * @returns The `CallStack` constructor.\r\n */\r\n static get CallStack(): typeof CallStack { return CallStack }\r\n\r\n// #METHODS\r\n\r\n // ##SET\r\n\r\n // ##GET\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Arrays\r\n\r\nexport type { Arrays, CallStack }"],"mappings":"AAKA,OAAO,eAAe;AAuHtB,MAAe,OACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBI,WAAW,YAA8B;AAAE,WAAO;AAAA,EAAU;AAAA;AAAA;AAAA;AAQhE;AAKA,IAAO,iBAAQ;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/scripts/Arrays.ts"],"sourcesContent":["/* [Arrays] */\r\n\r\n// #IMPORTS\r\n\r\n // ##THIS\r\nimport CallStack from './@arrays/Callstack.js'\r\n\r\n // ##TYPES\r\nimport type Maths from './Maths.js'\r\nimport type Strings from './Strings.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Arrays\r\n{\r\n /**\r\n * Tuple with the same length as `T` where every element is `U` (e.g. `Fill<[1, 2, 3], 0>` is `[0, 0, 0]`).\r\n * @template T Source tuple (only its length is used).\r\n * @template U Element type to fill with.\r\n */\r\n export type Fill<T extends any[], U, V extends any[] = []> = T extends [any, ...infer W] ? Fill<W, U, [...V, U]> : V\r\n\r\n /**\r\n * String literal type obtained by joining the elements of `T` with separator `U`\r\n * (e.g. `Join<[1, 'a', true], ', '>` is `'1, a, true'`), like `Array.prototype.join` at the type level.\r\n * Elements must be stringifiable (`Strings.STRINGIFIABLE`).\r\n * @template T Tuple to join.\r\n * @template U Separator. Defaults to `','`.\r\n */\r\n export type Join<T extends any[], U extends string = ',', V extends string = ''> = T extends [infer W extends Strings.STRINGIFIABLE, ...infer X extends Strings.STRINGIFIABLE[]]\r\n ? Join<X, U, V extends '' ? `${W}` : `${V}${U}${W}`>\r\n : V\r\n\r\n /**\r\n * `true` if at least one element type of `T` is assignable to `U`, otherwise `false`\r\n * (e.g. `Includes<['a', 1], string>` is `true`, `Includes<[string], 'a'>` is `false`).\r\n * @template T Tuple or array to search (readonly accepted).\r\n * @template U Type to look for.\r\n */\r\n export type Includes<T extends Readonly<any[]>, U> = Extract<T[number], U> extends never ? false : true\r\n\r\n /**\r\n * Tuple `T` with `U` appended at the end.\r\n * @template T Source tuple.\r\n * @template U Element to append.\r\n */\r\n export type Push<T extends any[], U> = [...T, U]\r\n\r\n /**\r\n * Tuple `T` without its last element (`never` if `T` is empty).\r\n * @template T Source tuple.\r\n */\r\n export type Pop<T extends any[]> = T extends [...infer U, any] ? U : never\r\n\r\n /**\r\n * Tuple `T` with `U` inserted at the start.\r\n * @template T Source tuple.\r\n * @template U Element to prepend.\r\n */\r\n export type Unshift<T extends any[], U> = [U, ...T]\r\n\r\n /**\r\n * Tuple `T` without its first element (`never` if `T` is empty).\r\n * @template T Source tuple.\r\n */\r\n export type Shift<T extends any[]> = T extends [any, ...infer U] ? U : never\r\n\r\n /**\r\n * Tuple `T` padded with `U` until it has length `V` (e.g. `Pad<[1], 0, 3, true>` is `[1, 0, 0]`).\r\n * Tuples already at least `V` long are returned unchanged.\r\n * @template T Source tuple.\r\n * @template U Padding element.\r\n * @template V Target length.\r\n * @template W `true` to pad at the end; otherwise (default `false`) pad at the start.\r\n */\r\n export type Pad<T extends any[], U, V extends number, W extends boolean = false, X extends any[] = T, Y extends null[] = []> = V extends Y['length']\r\n ? X\r\n : T extends [unknown, ...infer Z]\r\n ? Pad<Z, U, V, W, X, [...Y, null]>\r\n : Pad<[], U, V, W, W extends true ? [...X, U] : [U, ...X], [...Y, null]>\r\n\r\n /**\r\n * Length of tuple `T` as a number literal type.\r\n * @template T Source tuple.\r\n */\r\n export type Length<T extends any[]> = T['length']\r\n\r\n /**\r\n * Tuple `T` with the element at index `U` replaced by `V` (e.g. `Set<[1, 2], 1, 'x'>` is `[1, 'x']`).\r\n * If `U` is past the end, the gap is filled with `undefined` (e.g. `Set<[1], 3, 'x'>` is `[1, undefined, undefined, 'x']`).\r\n * @template T Source tuple.\r\n * @template U Index to set.\r\n * @template V New element.\r\n */\r\n export type Set<T extends any[], U extends number, V, W extends any[] = []> = T extends [infer X, ...infer Y]\r\n ? U extends W['length']\r\n ? Set<Y, U, V, [...W, V]>\r\n : Set<Y, U, V, [...W, X]>\r\n : U extends W['length']\r\n ? [...W, V]\r\n : Maths.SmallerOrEqual<W['length'], U> extends true\r\n ? Set<T, U, V, [...W, undefined]>\r\n : W\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Array utilities: compile-time tuple helper types (`Arrays.Fill`, `Arrays.Join`, `Arrays.Pad`, ...)\r\n * and the runtime {@link CallStack} class, exposed as `Arrays.CallStack`.\r\n * @example\r\n * ```ts\r\n * import { Arrays } from 'upwwwards/scripts'\r\n *\r\n * type T = Arrays.Push<[1, 2], 3> // [1, 2, 3]\r\n *\r\n * const STACK = new Arrays.CallStack<(dt: number) => void>()\r\n *\r\n * STACK.add((dt): void => console.log(dt))\r\n * STACK.loop(16)\r\n * ```\r\n*/\r\nabstract class Arrays\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\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 * The {@link CallStack} class: an ordered list of callbacks that can be run all at once (`loop`)\r\n * or one at a time through a generator (`gen`).\r\n * @returns The `CallStack` constructor.\r\n */\r\n static get CallStack(): typeof CallStack { return CallStack }\r\n\r\n// #METHODS\r\n\r\n // ##SET\r\n\r\n // ##GET\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Arrays\r\n\r\nexport type { Arrays, CallStack }\r\n\r\n"],"mappings":"AAKA,OAAO,eAAe;AAuHtB,MAAe,OACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBI,WAAW,YAA8B;AAAE,WAAO;AAAA,EAAU;AAAA;AAAA;AAAA;AAQhE;AAKA,IAAO,iBAAQ;","names":[]}
|
package/docs/plugins/anime.md
CHANGED
|
@@ -116,13 +116,32 @@ Up.Anime.sub(KEY, ({ Tweens }) => {
|
|
|
116
116
|
|
|
117
117
|
### Helper: `Split`
|
|
118
118
|
|
|
119
|
-
Requires `'SplitText'` in Anime `plugins`.
|
|
119
|
+
Requires `'SplitText'` in Anime `plugins`. Owns **one** `SplitText` per target in a private GSAP context; `destroy` restores markup. Auto-cleaned inside `sub`.
|
|
120
|
+
|
|
121
|
+
`add(target, vars)` always returns a **`Split.SPLIT`** (`types`, `mask`, `chars` / `lines` / `words` / `masks`, `splitText`) — not a raw `SplitText`. On the **same target**, it is the **same object**: element arrays keep their references and are refreshed in place after a re-split.
|
|
122
|
+
|
|
123
|
+
| Call | Behavior |
|
|
124
|
+
| --- | --- |
|
|
125
|
+
| Subset of cached types (+ compatible `mask`) | Return cache, no re-split |
|
|
126
|
+
| New types and/or new `mask` | **Merge** types, `splitText.split(…)`, refresh arrays |
|
|
127
|
+
| `reconstruct: true` | **Replace** cached types / mask, re-split, refresh arrays |
|
|
128
|
+
|
|
129
|
+
`reconstruct` is upwwwards-only (not forwarded to GSAP). Tweens already targeting old DOM nodes stay stale after an expand / reconstruct — re-read `text.lines` / `text.words` (or rebuild tweens) if needed.
|
|
120
130
|
|
|
121
131
|
```ts
|
|
122
132
|
Up.Anime.sub(KEY, ({ gsap, Split }) => {
|
|
123
133
|
const split = new Split()
|
|
124
134
|
const text = split.add('.hero__title', { type: 'lines,words' })
|
|
125
135
|
gsap.from(text.words, { yPercent: 100, stagger: 0.05 })
|
|
136
|
+
|
|
137
|
+
// same object: union types + re-split in place
|
|
138
|
+
split.add('.hero__title', { type: 'lines,words,chars' })
|
|
139
|
+
|
|
140
|
+
// same object: subset → reuse, no re-split
|
|
141
|
+
split.add('.hero__title', { type: 'words' })
|
|
142
|
+
|
|
143
|
+
// same object: replace definition + re-split
|
|
144
|
+
split.add('.hero__title', { type: 'words', reconstruct: true })
|
|
126
145
|
})
|
|
127
146
|
```
|
|
128
147
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "upwwwards",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11-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>",
|
|
@@ -40,6 +40,7 @@
|
|
|
40
40
|
],
|
|
41
41
|
"exports": {
|
|
42
42
|
".": "./dist/index.js",
|
|
43
|
+
"./core/Up": "./dist/core/Up.js",
|
|
43
44
|
"./initializers/vite": "./dist/initializers/vite.js",
|
|
44
45
|
"./contexts/sveltekit": "./dist/contexts/sveltekit.js",
|
|
45
46
|
"./contexts/nuxt": "./dist/contexts/nuxt.js",
|
|
@@ -65,6 +66,9 @@
|
|
|
65
66
|
"*": [
|
|
66
67
|
"dist/index.d.ts"
|
|
67
68
|
],
|
|
69
|
+
"core/Up": [
|
|
70
|
+
"dist/core/Up.d.ts"
|
|
71
|
+
],
|
|
68
72
|
"initializers/vite": [
|
|
69
73
|
"dist/initializers/vite.d.ts"
|
|
70
74
|
],
|