upwwwards 0.1.0-beta.1 → 0.1.2-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.
@@ -1,5 +1,5 @@
1
1
  import { INHERITANCE, set, destroy, STATUS, construct, apply, start, stop } from './symbols/index.js';
2
- import { S as Strings, M as Maths, A as Adapter } from './index-CFDGHuDd.js';
2
+ import { S as Strings, M as Maths, A as Adapter } from './index-BlwaDpQl.js';
3
3
 
4
4
  declare namespace CallStack {
5
5
  /**
@@ -213,13 +213,16 @@ declare namespace Hrt {
213
213
  * Hydratable runtime inheritance ("HRT"): a shared, ordered stack of classes that lets static classes
214
214
  * reach each other without circular imports.
215
215
  *
216
- * The core owns a single instance (`App.HRT`). Each core class appends itself with `hydrate` and keeps the
217
- * returned stack, so the chain grows as `Adapter`, `App`, `Thread`, `Event`, `Up`, and every class reads
218
- * its predecessors by index (e.g. `stack[0]` is the adapter). Because all classes hold the same array,
219
- * `update` can swap an entry for all of them at once (used to replace the base `Adapter` with the
220
- * Nuxt or SvelteKit adapter at startup).
216
+ * The core owns a single instance (`App.HRT`). The stack lives on that instance under the `INHERITANCE`
217
+ * symbol. Each core module calls `hydrate` with its **predecessor** (not itself), so the shared array
218
+ * grows as `[Adapter, App, Thread, Event]` and each module's own static `[INHERITANCE]` is that same
219
+ * array typed up to the predecessor — never containing the class that holds it (avoids Rollup
220
+ * `ClassExpression.deoptimizePath` overflows). Module getters read predecessors from the previous
221
+ * module's `[INHERITANCE]` (or `App.HRT[INHERITANCE]`) by index; the current module is exposed with a
222
+ * direct `return Class` getter. `update` swaps an entry for every reader at once (used to replace the
223
+ * base `Adapter` with the Nuxt or SvelteKit adapter at startup).
221
224
  * @internal
222
- * @warning Framework-internal: mutating the stack changes the inheritance seen by every class that holds it.
225
+ * @warning Framework-internal: mutating the stack changes the inheritance seen by every getter that reads it.
223
226
  */
224
227
  declare class Hrt {
225
228
  #private;
@@ -229,10 +232,10 @@ declare class Hrt {
229
232
  */
230
233
  IS: true;
231
234
  /**
232
- * The shared inheritance stack, in hydration order.
235
+ * The shared inheritance stack, in hydration order (`[Adapter, App, Thread, Event]` once the core is loaded).
233
236
  * @internal
234
237
  */
235
- stack: HRT_STACK;
238
+ [INHERITANCE]: HRT_STACK;
236
239
  /**
237
240
  * Creates an empty inheritance stack.
238
241
  * @internal
@@ -245,7 +248,7 @@ declare class Hrt {
245
248
  * @param children Entries to append, in order.
246
249
  * @returns The stack itself (not a copy), typed as `[...T, ...U]`.
247
250
  * @internal
248
- * @warning Mutates the shared stack: every class holding it sees the new entries.
251
+ * @warning Mutates the shared stack: every getter reading it sees the new entries.
249
252
  */
250
253
  hydrate<T extends Readonly<HRT_STACK>, U extends HRT_CHILD[], V = Readonly<[...T, ...U]>>(...children: U): V;
251
254
  /**
@@ -255,7 +258,7 @@ declare class Hrt {
255
258
  * @param child New entry; must have the type of the entry it replaces.
256
259
  * @param index Position to replace.
257
260
  * @internal
258
- * @warning Mutates the shared stack: every class holding it sees the new entry.
261
+ * @warning Mutates the shared stack: every getter reading it sees the new entry.
259
262
  */
260
263
  update<T extends Readonly<HRT_STACK>, U extends number>(child: T[U], index: U): void;
261
264
  /**
@@ -335,12 +338,13 @@ declare namespace App {
335
338
  declare abstract class App {
336
339
  #private;
337
340
  /**
338
- * Shared inheritance stack (starts with `[Adapter, App]`) used by the module getters.
341
+ * Shared HRT stack after hydrating `Adapter` (`[Adapter]` here; later modules append `App`, `Thread`, `Event`).
342
+ * Same array reference as `App.#HRT[INHERITANCE]` — does not include `App` itself.
339
343
  * @internal
340
344
  */
341
- private static [INHERITANCE];
345
+ static [INHERITANCE]: readonly [typeof Adapter];
342
346
  /**
343
- * Inheritance helper holding the stack shared by the core modules (`[Adapter, App, Thread, Event, Up]`).
347
+ * Inheritance helper holding the stack shared by the core modules (`[Adapter, App, Thread, Event]`).
344
348
  * @internal
345
349
  * @returns The shared {@link Hrt} instance.
346
350
  */
@@ -607,10 +611,11 @@ declare namespace Thread {
607
611
  declare abstract class Thread {
608
612
  #private;
609
613
  /**
610
- * Shared inheritance stack (starts with `[Adapter, App, Thread]`) used by the module getters.
614
+ * Shared HRT stack after hydrating `App` (`[Adapter, App]`); later modules append `Thread`, `Event`.
615
+ * Same array as `App[INHERITANCE]` — does not include `Thread` itself.
611
616
  * @internal
612
617
  */
613
- private static [INHERITANCE];
618
+ static [INHERITANCE]: readonly [typeof Adapter, typeof App];
614
619
  /**
615
620
  * Scheduler run state: `-1` stopped (paused), `0` pending (the next frame only reseeds `timestamp` from the driver), `1` started.
616
621
  * @internal
@@ -1,4 +1,4 @@
1
- import { M as Maths, P as Parser } from './index-CFDGHuDd.js';
1
+ import { M as Maths, P as Parser } from './index-BlwaDpQl.js';
2
2
 
3
3
  declare const IMMEDIATE: unique symbol;
4
4
  declare const PENDING: unique symbol;
@@ -1,6 +1,6 @@
1
1
  import { Ref, isRef, nextTick } from 'vue';
2
2
  import { STATUS, set } from '../symbols/index.js';
3
- import { A as Adapter } from '../index-CFDGHuDd.js';
3
+ import { A as Adapter } from '../index-BlwaDpQl.js';
4
4
  import { Router } from 'vue-router';
5
5
  import { NuxtApp } from 'nuxt/app';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { tick } from 'svelte';
2
2
  import { set } from '../symbols/index.js';
3
- import { A as Adapter } from '../index-CFDGHuDd.js';
3
+ import { A as Adapter } from '../index-BlwaDpQl.js';
4
4
  import { Writable } from 'svelte/store';
5
5
  import { BeforeNavigate, OnNavigate, AfterNavigate } from '@sveltejs/kit';
6
6
 
@@ -1,2 +1,2 @@
1
- export { A as Adapter, a as AdapterConfig, b as AdapterRef, c as adapterCaller } from '../index-CFDGHuDd.js';
1
+ export { A as Adapter, a as AdapterConfig, b as AdapterRef, c as adapterCaller } from '../index-BlwaDpQl.js';
2
2
  import '../symbols/index.js';
package/dist/core/Up.js CHANGED
@@ -5,10 +5,11 @@ class Up {
5
5
  // #PROPS
6
6
  // ##STATICS
7
7
  /**
8
- * Shared inheritance stack `[Adapter, App, Thread, Event, Up]` used by the module getters.
8
+ * Shared HRT stack after hydrating `Event` (`[Adapter, App, Thread, Event]`).
9
+ * Same array as `Event[INHERITANCE]` — does not include `Up` itself; `Up.Event` returns `Event` directly.
9
10
  * @internal
10
11
  */
11
- static [INHERITANCE] = Event.App.HRT.hydrate(Up);
12
+ static [INHERITANCE] = Event.App.HRT.hydrate(Event);
12
13
  /**
13
14
  * Registered plugin wraps, in registration order.
14
15
  */
@@ -22,14 +23,14 @@ class Up {
22
23
  * @returns The adapter class.
23
24
  */
24
25
  static get Adapter() {
25
- return Up[INHERITANCE][0];
26
+ return Event[INHERITANCE][0];
26
27
  }
27
28
  /**
28
29
  * Application runtime: viewport and scroll metrics, device detection, application cache and the LOAD wait queue.
29
30
  * @returns The {@link App} class.
30
31
  */
31
32
  static get App() {
32
- return Up[INHERITANCE][1];
33
+ return Event[INHERITANCE][1];
33
34
  }
34
35
  /**
35
36
  * Frame scheduler running tasks on `requestAnimationFrame` under a per-frame time budget,
@@ -37,14 +38,14 @@ class Up {
37
38
  * @returns The {@link Thread} class.
38
39
  */
39
40
  static get Thread() {
40
- return Up[INHERITANCE][2];
41
+ return Event[INHERITANCE][2];
41
42
  }
42
43
  /**
43
44
  * Event manager: page lifecycle events (`DEATH`, `LIFE`, `LOAD`), frame ticks and throttled DOM events (`resize`, `scroll`, …).
44
45
  * @returns The {@link Event} class.
45
46
  */
46
47
  static get Event() {
47
- return Up[INHERITANCE][3];
48
+ return Event;
48
49
  }
49
50
  // #METHODS
50
51
  // ##CONSTRUCT
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/Up.ts"],"sourcesContent":["/* [Up] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { INHERITANCE, construct, set, destroy } from '../symbols/index.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##THIS\r\nimport Event from './[1]/Event.js'\r\n\r\n // ##TYPES\r\nimport type Adapter from '../adapters/@/Adapter.js'\r\nimport type { AdapterConfig } from '../adapters/@/Adapter.js'\r\n\r\nimport type App from './[1]/[2]/[3]/App.js'\r\nimport type Thread from './[1]/[2]/Thread.js'\r\n\r\nimport type Plugin from '../plugins/@/Plugin.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Up\r\n{\r\n /**\r\n * Root runtime configuration, declared in the `up` option of the `upwwwards/initializers/vite` plugin.\r\n * The generated virtual module forwards it to `Up[construct]` once at startup.\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Event module options (custom events, static-file readiness before LOAD).\r\n * @see {@link Event.CONFIG}\r\n */\r\n event?: Event.CONFIG,\r\n /**\r\n * Thread scheduler options (per-frame time budgets).\r\n * @see {@link Thread.CONFIG}\r\n */\r\n thread?: Thread.CONFIG\r\n }\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Static entry point of the `upwwwards` runtime. Exposes the core modules ({@link Up.Adapter}, {@link Up.App},\r\n * {@link Up.Thread}, {@link Up.Event}) and every registered plugin (e.g. `Up.Screen`, `Up.Scroll`, `Up.Anime`).\r\n * Lifecycle: `Up[construct]` runs once from the Vite-generated module (server and client), the app calls\r\n * {@link Up.set} once in the browser, and {@link Up.destroy} optionally tears everything down.\r\n * @example\r\n * ```ts\r\n * import Up from 'upwwwards'\r\n *\r\n * Up.Event.sub(['resize', () => console.log(Up.App.w, Up.App.h)])\r\n * ```\r\n*/\r\nabstract class Up\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * Shared inheritance stack `[Adapter, App, Thread, Event, Up]` used by the module getters.\r\n * @internal\r\n */\r\n private static [INHERITANCE] = Event.App.HRT.hydrate<(typeof Event)[typeof INHERITANCE], [typeof Up]>(Up)\r\n\r\n /**\r\n * Registered plugin wraps, in registration order.\r\n */\r\n static #plugins: Plugin.WRAP[] = []\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * Framework adapter registered by the Vite initializer (Nuxt or SvelteKit).\r\n * Bridges navigation hooks, reactive refs, cookies and the framework update tick.\r\n * @returns The adapter class.\r\n */\r\n static get Adapter(): typeof Adapter { return Up[INHERITANCE][0] }\r\n /**\r\n * Application runtime: viewport and scroll metrics, device detection, application cache and the LOAD wait queue.\r\n * @returns The {@link App} class.\r\n */\r\n static get App(): typeof App { return Up[INHERITANCE][1] }\r\n /**\r\n * Frame scheduler running tasks on `requestAnimationFrame` under a per-frame time budget,\r\n * ordered by priority flags (powers of 2).\r\n * @returns The {@link Thread} class.\r\n */\r\n static get Thread(): typeof Thread { return Up[INHERITANCE][2] }\r\n /**\r\n * Event manager: page lifecycle events (`DEATH`, `LIFE`, `LOAD`), frame ticks and throttled DOM events (`resize`, `scroll`, …).\r\n * @returns The {@link Event} class.\r\n */\r\n static get Event(): typeof Event { return Up[INHERITANCE][3] }\r\n\r\n// #METHODS\r\n\r\n // ##CONSTRUCT\r\n /**\r\n * Runs each plugin's `[construct]` and defines its read-only `Up.<NAME>` getter.\r\n */\r\n static #constructPlugins(): void\r\n {\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++)\r\n {\r\n const PLUGIN = Up.#plugins[i]\r\n\r\n ;(PLUGIN.plugin[construct] as (config: typeof PLUGIN.config) => void)(PLUGIN.config)\r\n\r\n Object.defineProperty(Up, PLUGIN.plugin.NAME,\r\n {\r\n configurable: false,\r\n enumerable : true,\r\n get : (): typeof Plugin => PLUGIN.plugin\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Registers the adapter, constructs Thread and Event (browser only), then runs each plugin's `[construct]`\r\n * and exposes the plugin as a read-only property on `Up` (e.g. `Up.Anime`).\r\n * Called by the virtual module generated by `upwwwards/initializers/vite`, on both server and client.\r\n * @internal\r\n * @note Runs once; later calls are no-ops.\r\n * @param config Runtime configuration ({@link Up.CONFIG}).\r\n * @param Adapter Adapter class that replaces the base adapter in the inheritance chain.\r\n * @param plugins Plugin wraps (`{ plugin, config }`) to construct and expose on `Up`.\r\n */\r\n static [construct](config: Up.CONFIG, Adapter: (typeof Up)['Adapter'], plugins: Plugin.WRAP[]): void\r\n {\r\n Up.#plugins = plugins\r\n \r\n Up.App.HRT.update<(typeof Up)[typeof INHERITANCE], 0>(Adapter, 0)\r\n\r\n Up.Thread[construct](config.thread)\r\n Up.Event[construct](config.event)\r\n Up.#constructPlugins()\r\n \r\n Up[construct] = Up.App.void\r\n }\r\n\r\n // ##SET\r\n /**\r\n * Runs each plugin's `[set]`, registers returned promises with `App.addWait` and logs failures without stopping.\r\n */\r\n static #setPlugins(): void\r\n {\r\n const BROWSER = Up.Adapter.BROWSER\r\n\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++) try\r\n {\r\n const\r\n PLUGIN = Up.#plugins[i],\r\n PROMISE = (PLUGIN.plugin[set] as (config: typeof PLUGIN.config) => void | Promise<void>)(PLUGIN.config)\r\n\r\n if (BROWSER && PROMISE) Up.App.addWait(PROMISE)\r\n }\r\n catch (error) { Logs.error('UP', 'PLUGIN CONFIGURATION FAILED.', error) }\r\n }\r\n\r\n /**\r\n * Starts the browser runtime: sets up the adapter, App, Thread (frame loop), Event (listeners and observers),\r\n * then each plugin's `[set]`. Promises returned by plugins are added to {@link App.addWait}, so `LOAD` waits for them.\r\n * On the server this method does nothing.\r\n * @note Call once, as early as possible (typically in the root layout). Later calls are no-ops.\r\n * @param adapterConfig Adapter-specific setup payload (its shape depends on the active adapter).\r\n * @example\r\n * ```ts\r\n * import Up from 'upwwwards'\r\n *\r\n * // Root layout, client side\r\n * Up.set(adapterConfig)\r\n * ```\r\n */\r\n static set(adapterConfig: AdapterConfig): void\r\n {\r\n if (Up.Adapter.BROWSER)\r\n {\r\n Up.Adapter[set](adapterConfig)\r\n Up.App[set]()\r\n Up.Thread[set]()\r\n Up.Event[set]()\r\n Up.#setPlugins()\r\n }\r\n\r\n Up.set = Up.App.void\r\n }\r\n\r\n // ##GET\r\n\r\n // ##DESTROY\r\n /**\r\n * Runs each plugin's `[destroy]` and logs failures without stopping.\r\n */\r\n static #destroyPlugins(): void\r\n {\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++) try\r\n {\r\n const PLUGIN = Up.#plugins[i]\r\n\r\n ;(PLUGIN.plugin[destroy] as (config: typeof PLUGIN.config) => void)(PLUGIN.config)\r\n }\r\n catch (error) { Logs.error('UP', 'PLUGIN DESTRUCTION FAILED.', error) }\r\n }\r\n\r\n /**\r\n * Tears down the browser runtime: plugins first, then Event, Thread and App (listeners, frame loop, tasks, cache).\r\n * On the server this method does nothing.\r\n * @note Call once; later calls are no-ops.\r\n * @warning Irreversible: `Up.set` cannot be called again afterwards, so the runtime cannot be restarted.\r\n */\r\n static destroy(): void // TODO: détruit entièrement Up sans possibilité de reconstruction (est-ce utile ? puisque c'est à l'utilisateur de l'appeler)\r\n {\r\n if (Up.Adapter.BROWSER)\r\n {\r\n Up.#destroyPlugins()\r\n Up.Event[destroy]()\r\n Up.Thread[destroy]()\r\n Up.App[destroy]()\r\n }\r\n\r\n Up.destroy = Up.App.void\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Replaces a registered plugin with a direct subclass of it, so `Up.<NAME>` and later lifecycle calls use the subclass.\r\n * Logs a warning and does nothing if `Plugin` does not directly extend a registered plugin.\r\n * @note The subclass's `[construct]` is not run. Call before `Up.set` if the subclass overrides `[set]`.\r\n * @param Plugin Class that directly extends an already registered plugin class.\r\n * @example\r\n * ```ts\r\n * import Scroll from 'upwwwards/plugins/Scroll'\r\n *\r\n * class MyScroll extends Scroll {}\r\n *\r\n * Up.patch(MyScroll)\r\n * Up.set(adapterConfig)\r\n * ```\r\n */\r\n static patch(Plugin: Plugin.WRAP['plugin']): void\r\n {\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++) if (Object.getPrototypeOf(Plugin) === Up.#plugins[i].plugin)\r\n {\r\n Up.#plugins[i].plugin = Plugin\r\n\r\n return\r\n }\r\n\r\n Logs.warn('UP', `UNABLE TO PATCH THE \"${Plugin.NAME}\" PLUGIN. HAVE YOU CREATED A SUBCLASS OF A REGISTERED PLUGIN?`)\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Up\r\n\r\nexport type { Up }"],"mappings":"AAKA,SAAS,aAAa,WAAW,KAAK,eAAe;AAGrD,OAAO,UAAU;AAGjB,OAAO,WAAW;AAkDlB,MAAe,GACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASI,QAAgB,WAAW,IAAI,MAAM,IAAI,IAAI,QAAyD,EAAE;AAAA;AAAA;AAAA;AAAA,EAKxG,OAAO,WAA0B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYlC,WAAW,UAA0B;AAAE,WAAO,GAAG,WAAW,EAAE,CAAC;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjE,WAAW,MAAkB;AAAE,WAAO,GAAG,WAAW,EAAE,CAAC;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzD,WAAW,SAAwB;AAAE,WAAO,GAAG,WAAW,EAAE,CAAC;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/D,WAAW,QAAsB;AAAE,WAAO,GAAG,WAAW,EAAE,CAAC;AAAA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7D,OAAO,oBACP;AACI,aAAS,IAAI,GAAG,MAAM,GAAG,SAAS,QAAQ,IAAI,KAAK,KACnD;AACI,YAAM,SAAS,GAAG,SAAS,CAAC;AAE3B,MAAC,OAAO,OAAO,SAAS,EAA6C,OAAO,MAAM;AAEnF,aAAO;AAAA,QAAe;AAAA,QAAI,OAAO,OAAO;AAAA,QACxC;AAAA,UACI,cAAc;AAAA,UACd,YAAc;AAAA,UACd,KAAc,MAAqB,OAAO;AAAA,QAC9C;AAAA,MAAC;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,QAAQ,SAAS,EAAE,QAAmB,SAAiC,SACvE;AACI,OAAG,WAAW;AAEd,OAAG,IAAI,IAAI,OAA2C,SAAS,CAAC;AAEhE,OAAG,OAAO,SAAS,EAAE,OAAO,MAAM;AAClC,OAAG,MAAM,SAAS,EAAE,OAAO,KAAK;AAChC,OAAG,kBAAkB;AAErB,OAAG,SAAS,IAAI,GAAG,IAAI;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cACP;AACI,UAAM,UAAU,GAAG,QAAQ;AAE3B,aAAS,IAAI,GAAG,MAAM,GAAG,SAAS,QAAQ,IAAI,KAAK,IAAK,KACxD;AACI,YACA,SAAU,GAAG,SAAS,CAAC,GACvB,UAAW,OAAO,OAAO,GAAG,EAA6D,OAAO,MAAM;AAEtG,UAAI,WAAW,QAAS,IAAG,IAAI,QAAQ,OAAO;AAAA,IAClD,SACO,OAAO;AAAE,WAAK,MAAM,MAAM,gCAAgC,KAAK;AAAA,IAAE;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,OAAO,IAAI,eACX;AACI,QAAI,GAAG,QAAQ,SACf;AACI,SAAG,QAAQ,GAAG,EAAE,aAAa;AAC7B,SAAG,IAAI,GAAG,EAAE;AACZ,SAAG,OAAO,GAAG,EAAE;AACf,SAAG,MAAM,GAAG,EAAE;AACd,SAAG,YAAY;AAAA,IACnB;AAEA,OAAG,MAAM,GAAG,IAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,kBACP;AACI,aAAS,IAAI,GAAG,MAAM,GAAG,SAAS,QAAQ,IAAI,KAAK,IAAK,KACxD;AACI,YAAM,SAAS,GAAG,SAAS,CAAC;AAE3B,MAAC,OAAO,OAAO,OAAO,EAA6C,OAAO,MAAM;AAAA,IACrF,SACO,OAAO;AAAE,WAAK,MAAM,MAAM,8BAA8B,KAAK;AAAA,IAAE;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,UACP;AACI,QAAI,GAAG,QAAQ,SACf;AACI,SAAG,gBAAgB;AACnB,SAAG,MAAM,OAAO,EAAE;AAClB,SAAG,OAAO,OAAO,EAAE;AACnB,SAAG,IAAI,OAAO,EAAE;AAAA,IACpB;AAEA,OAAG,UAAU,GAAG,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAO,MAAM,QACb;AACI,aAAS,IAAI,GAAG,MAAM,GAAG,SAAS,QAAQ,IAAI,KAAK,IAAK,KAAI,OAAO,eAAe,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,QAC7G;AACI,SAAG,SAAS,CAAC,EAAE,SAAS;AAExB;AAAA,IACJ;AAEA,SAAK,KAAK,MAAM,wBAAwB,OAAO,IAAI,+DAA+D;AAAA,EACtH;AAEJ;AAKA,IAAO,aAAQ;","names":[]}
1
+ {"version":3,"sources":["../../src/core/Up.ts"],"sourcesContent":["/* [Up] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { INHERITANCE, construct, set, destroy } from '../symbols/index.js'\r\n\r\n // ##SCRIPTS\r\nimport Logs from '../scripts/Logs.js'\r\n\r\n // ##THIS\r\nimport Event from './[1]/Event.js'\r\n\r\n // ##TYPES\r\nimport type Adapter from '../adapters/@/Adapter.js'\r\nimport type { AdapterConfig } from '../adapters/@/Adapter.js'\r\n\r\nimport type App from './[1]/[2]/[3]/App.js'\r\nimport type Thread from './[1]/[2]/Thread.js'\r\n\r\nimport type Plugin from '../plugins/@/Plugin.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Up\r\n{\r\n /**\r\n * Root runtime configuration, declared in the `up` option of the `upwwwards/initializers/vite` plugin.\r\n * The generated virtual module forwards it to `Up[construct]` once at startup.\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Event module options (custom events, static-file readiness before LOAD).\r\n * @see {@link Event.CONFIG}\r\n */\r\n event?: Event.CONFIG,\r\n /**\r\n * Thread scheduler options (per-frame time budgets).\r\n * @see {@link Thread.CONFIG}\r\n */\r\n thread?: Thread.CONFIG\r\n }\r\n}\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Static entry point of the `upwwwards` runtime. Exposes the core modules ({@link Up.Adapter}, {@link Up.App},\r\n * {@link Up.Thread}, {@link Up.Event}) and every registered plugin (e.g. `Up.Screen`, `Up.Scroll`, `Up.Anime`).\r\n * Lifecycle: `Up[construct]` runs once from the Vite-generated module (server and client), the app calls\r\n * {@link Up.set} once in the browser, and {@link Up.destroy} optionally tears everything down.\r\n * @example\r\n * ```ts\r\n * import Up from 'upwwwards'\r\n *\r\n * Up.Event.sub(['resize', () => console.log(Up.App.w, Up.App.h)])\r\n * ```\r\n*/\r\nabstract class Up\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * Shared HRT stack after hydrating `Event` (`[Adapter, App, Thread, Event]`).\r\n * Same array as `Event[INHERITANCE]` — does not include `Up` itself; `Up.Event` returns `Event` directly.\r\n * @internal\r\n */\r\n static [INHERITANCE] = Event.App.HRT.hydrate<(typeof Event)[typeof INHERITANCE], [typeof Event]>(Event)\r\n\r\n /**\r\n * Registered plugin wraps, in registration order.\r\n */\r\n static #plugins: Plugin.WRAP[] = []\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * Framework adapter registered by the Vite initializer (Nuxt or SvelteKit).\r\n * Bridges navigation hooks, reactive refs, cookies and the framework update tick.\r\n * @returns The adapter class.\r\n */\r\n static get Adapter(): typeof Adapter { return Event[INHERITANCE][0] }\r\n /**\r\n * Application runtime: viewport and scroll metrics, device detection, application cache and the LOAD wait queue.\r\n * @returns The {@link App} class.\r\n */\r\n static get App(): typeof App { return Event[INHERITANCE][1] }\r\n /**\r\n * Frame scheduler running tasks on `requestAnimationFrame` under a per-frame time budget,\r\n * ordered by priority flags (powers of 2).\r\n * @returns The {@link Thread} class.\r\n */\r\n static get Thread(): typeof Thread { return Event[INHERITANCE][2] }\r\n /**\r\n * Event manager: page lifecycle events (`DEATH`, `LIFE`, `LOAD`), frame ticks and throttled DOM events (`resize`, `scroll`, …).\r\n * @returns The {@link Event} class.\r\n */\r\n static get Event(): typeof Event { return Event }\r\n\r\n// #METHODS\r\n\r\n // ##CONSTRUCT\r\n /**\r\n * Runs each plugin's `[construct]` and defines its read-only `Up.<NAME>` getter.\r\n */\r\n static #constructPlugins(): void\r\n {\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++)\r\n {\r\n const PLUGIN = Up.#plugins[i]\r\n\r\n ;(PLUGIN.plugin[construct] as (config: typeof PLUGIN.config) => void)(PLUGIN.config)\r\n\r\n Object.defineProperty(Up, PLUGIN.plugin.NAME,\r\n {\r\n configurable: false,\r\n enumerable : true,\r\n get : (): typeof Plugin => PLUGIN.plugin\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Registers the adapter, constructs Thread and Event (browser only), then runs each plugin's `[construct]`\r\n * and exposes the plugin as a read-only property on `Up` (e.g. `Up.Anime`).\r\n * Called by the virtual module generated by `upwwwards/initializers/vite`, on both server and client.\r\n * @internal\r\n * @note Runs once; later calls are no-ops.\r\n * @param config Runtime configuration ({@link Up.CONFIG}).\r\n * @param Adapter Adapter class that replaces the base adapter in the inheritance chain.\r\n * @param plugins Plugin wraps (`{ plugin, config }`) to construct and expose on `Up`.\r\n */\r\n static [construct](config: Up.CONFIG, Adapter: (typeof Up)['Adapter'], plugins: Plugin.WRAP[]): void\r\n {\r\n Up.#plugins = plugins\r\n \r\n Up.App.HRT.update<(typeof Up)[typeof INHERITANCE], 0>(Adapter, 0)\r\n\r\n Up.Thread[construct](config.thread)\r\n Up.Event[construct](config.event)\r\n Up.#constructPlugins()\r\n \r\n Up[construct] = Up.App.void\r\n }\r\n\r\n // ##SET\r\n /**\r\n * Runs each plugin's `[set]`, registers returned promises with `App.addWait` and logs failures without stopping.\r\n */\r\n static #setPlugins(): void\r\n {\r\n const BROWSER = Up.Adapter.BROWSER\r\n\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++) try\r\n {\r\n const\r\n PLUGIN = Up.#plugins[i],\r\n PROMISE = (PLUGIN.plugin[set] as (config: typeof PLUGIN.config) => void | Promise<void>)(PLUGIN.config)\r\n\r\n if (BROWSER && PROMISE) Up.App.addWait(PROMISE)\r\n }\r\n catch (error) { Logs.error('UP', 'PLUGIN CONFIGURATION FAILED.', error) }\r\n }\r\n\r\n /**\r\n * Starts the browser runtime: sets up the adapter, App, Thread (frame loop), Event (listeners and observers),\r\n * then each plugin's `[set]`. Promises returned by plugins are added to {@link App.addWait}, so `LOAD` waits for them.\r\n * On the server this method does nothing.\r\n * @note Call once, as early as possible (typically in the root layout). Later calls are no-ops.\r\n * @param adapterConfig Adapter-specific setup payload (its shape depends on the active adapter).\r\n * @example\r\n * ```ts\r\n * import Up from 'upwwwards'\r\n *\r\n * // Root layout, client side\r\n * Up.set(adapterConfig)\r\n * ```\r\n */\r\n static set(adapterConfig: AdapterConfig): void\r\n {\r\n if (Up.Adapter.BROWSER)\r\n {\r\n Up.Adapter[set](adapterConfig)\r\n Up.App[set]()\r\n Up.Thread[set]()\r\n Up.Event[set]()\r\n Up.#setPlugins()\r\n }\r\n\r\n Up.set = Up.App.void\r\n }\r\n\r\n // ##GET\r\n\r\n // ##DESTROY\r\n /**\r\n * Runs each plugin's `[destroy]` and logs failures without stopping.\r\n */\r\n static #destroyPlugins(): void\r\n {\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++) try\r\n {\r\n const PLUGIN = Up.#plugins[i]\r\n\r\n ;(PLUGIN.plugin[destroy] as (config: typeof PLUGIN.config) => void)(PLUGIN.config)\r\n }\r\n catch (error) { Logs.error('UP', 'PLUGIN DESTRUCTION FAILED.', error) }\r\n }\r\n\r\n /**\r\n * Tears down the browser runtime: plugins first, then Event, Thread and App (listeners, frame loop, tasks, cache).\r\n * On the server this method does nothing.\r\n * @note Call once; later calls are no-ops.\r\n * @warning Irreversible: `Up.set` cannot be called again afterwards, so the runtime cannot be restarted.\r\n */\r\n static destroy(): void // TODO: détruit entièrement Up sans possibilité de reconstruction (est-ce utile ? puisque c'est à l'utilisateur de l'appeler)\r\n {\r\n if (Up.Adapter.BROWSER)\r\n {\r\n Up.#destroyPlugins()\r\n Up.Event[destroy]()\r\n Up.Thread[destroy]()\r\n Up.App[destroy]()\r\n }\r\n\r\n Up.destroy = Up.App.void\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Replaces a registered plugin with a direct subclass of it, so `Up.<NAME>` and later lifecycle calls use the subclass.\r\n * Logs a warning and does nothing if `Plugin` does not directly extend a registered plugin.\r\n * @note The subclass's `[construct]` is not run. Call before `Up.set` if the subclass overrides `[set]`.\r\n * @param Plugin Class that directly extends an already registered plugin class.\r\n * @example\r\n * ```ts\r\n * import Scroll from 'upwwwards/plugins/Scroll'\r\n *\r\n * class MyScroll extends Scroll {}\r\n *\r\n * Up.patch(MyScroll)\r\n * Up.set(adapterConfig)\r\n * ```\r\n */\r\n static patch(Plugin: Plugin.WRAP['plugin']): void\r\n {\r\n for (let i = 0, max = Up.#plugins.length; i < max; i++) if (Object.getPrototypeOf(Plugin) === Up.#plugins[i].plugin)\r\n {\r\n Up.#plugins[i].plugin = Plugin\r\n\r\n return\r\n }\r\n\r\n Logs.warn('UP', `UNABLE TO PATCH THE \"${Plugin.NAME}\" PLUGIN. HAVE YOU CREATED A SUBCLASS OF A REGISTERED PLUGIN?`)\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Up\r\n\r\nexport type { Up }"],"mappings":"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","names":[]}
@@ -6,11 +6,6 @@ const eTick = /* @__PURE__ */ Symbol("eTick"), eLife = /* @__PURE__ */ Symbol("e
6
6
  class Event {
7
7
  // #PROPS
8
8
  // ##STATICS
9
- /**
10
- * Shared inheritance stack (starts with `[Adapter, App, Thread, Event]`) used by the module getters.
11
- * @internal
12
- */
13
- static [INHERITANCE] = Thread.App.HRT.hydrate(Event);
14
9
  static #PRE_DEATH = 1;
15
10
  static #AFTER_DEATH = 2;
16
11
  static #PRE_LIFE = 4;
@@ -130,6 +125,12 @@ class Event {
130
125
  );
131
126
  static #THREAD_TICKETS = /* @__PURE__ */ new Map();
132
127
  static #MANAGER = /* @__PURE__ */ new Map();
128
+ /**
129
+ * Shared HRT stack after hydrating `Thread` (`[Adapter, App, Thread]`); `Up` later appends `Event`.
130
+ * Same array as `Thread[INHERITANCE]` — does not include `Event` itself.
131
+ * @internal
132
+ */
133
+ static [INHERITANCE] = Thread.App.HRT.hydrate(Thread);
133
134
  static #status = 0;
134
135
  static #lifeIn = -1;
135
136
  static #deathIn = -1;
@@ -142,21 +143,21 @@ class Event {
142
143
  * @returns The adapter class.
143
144
  */
144
145
  static get Adapter() {
145
- return Event[INHERITANCE][0];
146
+ return Thread[INHERITANCE][0];
146
147
  }
147
148
  /**
148
149
  * Application runtime (same as {@link Up.App}).
149
150
  * @returns The {@link App} class.
150
151
  */
151
152
  static get App() {
152
- return Event[INHERITANCE][1];
153
+ return Thread[INHERITANCE][1];
153
154
  }
154
155
  /**
155
156
  * Frame scheduler (same as {@link Up.Thread}).
156
157
  * @returns The {@link Thread} class.
157
158
  */
158
159
  static get Thread() {
159
- return Event[INHERITANCE][2];
160
+ return Thread;
160
161
  }
161
162
  /**
162
163
  * Status bit set when the `DEATH` phase starts ({@link Event.PRE_DEATH}).
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/%5B1%5D/Event.ts"],"sourcesContent":["/* [Event] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { INHERITANCE, construct, set, destroy, start, stop } from '../../symbols/index.js'\r\n\r\n // ##SCRIPTS\r\nimport Parser from '../../scripts/Parser.js'\r\nimport Wait from '../../scripts/Wait.js'\r\n\r\n // ##THIS\r\nimport Thread from './[2]/Thread.js'\r\n\r\n // ##TYPES\r\nimport type Adapter from '../../adapters/@/Adapter.js'\r\n\r\nimport type App from './[2]/[3]/App.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Event\r\n{\r\n /**\r\n * Event module configuration, declared in `up.event` of the Vite initializer and applied by `Up[construct]`.\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Extra events to register alongside the built-ins, so they can be used with {@link Event.sub}.\r\n * A string registers a DOM event on `window`, with no wait and the default Thread flag ({@link Event.THREAD_FLAG}).\r\n * An object allows customization:\r\n * - `key`: real DOM event name (e.g. `\"click\"`, `\"mousemove\"`).\r\n * - `on`: `\"window\"` (default), `\"document\"` or `\"independent\"` (no DOM listener).\r\n * - `forever`: run subscribers every frame as a Thread forever task.\r\n * - `waitType` + `waitDelay`: debounce or throttle the event by `waitDelay` ms.\r\n * - `threadFlag`: Thread priority flag; `0` runs subscribers inline instead of through the Thread (not allowed with `forever`).\r\n * - `argsTypes`: TypeScript tuple, as a string, typing subscriber arguments in the generated declarations (e.g. `\"[e: MouseEvent]\"`).\r\n * @note DOM listeners are always registered as passive.\r\n */\r\n enhance?: (CUSTOM_KEY |\r\n {\r\n forever : true,\r\n key : CUSTOM_KEY,\r\n on ?: ON,\r\n waitType ?: never, // *Wait.frame or forever task\r\n threadFlag?: Thread.FLAG,\r\n argsTypes ?: `[${string}]`\r\n } |\r\n {\r\n forever ?: false,\r\n key : CUSTOM_KEY,\r\n on ?: ON,\r\n waitType ?: never, // *Wait.frame or forever task\r\n threadFlag?: 0 | Thread.FLAG,\r\n argsTypes ?: `[${string}]`\r\n } |\r\n {\r\n forever ?: false,\r\n key : CUSTOM_KEY,\r\n on ?: ON,\r\n waitType : 'debounce' | 'throttle',\r\n waitDelay : number,\r\n threadFlag?: 0 | Thread.FLAG,\r\n argsTypes ?: `[${string}]`\r\n }\r\n )[],\r\n /**\r\n * Options for the static-file wait (images, media, …) performed before each `LOAD` event.\r\n * Shallow-merged onto the defaults, where `eagerOnly`, `viewportOnly` and `emptySizeOnly` are `true`.\r\n * `limiter` cannot be set: it is set at runtime to `Adapter.root` (falls back to `document.body` when `null`).\r\n * @see {@link Wait.STATIC_FILES_CONFIG}\r\n */\r\n staticFilesConfig?: Omit<Wait.STATIC_FILES_CONFIG, 'limiter'>\r\n }\r\n\r\n /**\r\n * Status bit (`1`): the `DEATH` phase has started (the app is about to navigate away from the current page).\r\n * Setting it clears all other status bits.\r\n */\r\n export type PRE_DEATH = 1\r\n\r\n /**\r\n * Status bit (`2`): all `DEATH` subscribers have run.\r\n */\r\n export type AFTER_DEATH = 2\r\n\r\n /**\r\n * Status bit (`4`): the `LIFE` phase has started (navigation to a new page has completed).\r\n * Setting it clears all other status bits.\r\n */\r\n export type PRE_LIFE = 4\r\n\r\n /**\r\n * Status bit (`8`): all `LIFE` subscribers have run.\r\n */\r\n export type AFTER_LIFE = 8\r\n\r\n /**\r\n * Status bit (`16`): the `LOAD` phase has started (static files and `App.wait` have resolved).\r\n */\r\n export type PRE_LOAD = 16\r\n\r\n /**\r\n * Status bit (`32`): all `LOAD` subscribers have run.\r\n */\r\n export type AFTER_LOAD = 32\r\n\r\n /**\r\n * Default listener target for enhanced events (`\"window\"`).\r\n */\r\n export type DEFAULT_ON = 'window'\r\n\r\n /**\r\n * Where an event listener is attached: `\"window\"`, `\"document\"`, or `\"independent\"` (no DOM listener, triggered by the runtime itself).\r\n */\r\n export type ON = DEFAULT_ON | 'document' | 'independent'\r\n\r\n /**\r\n * Name of an event known to the Event manager: a built-in key ({@link EventData}) or an enhanced one from {@link Event.CONFIG.enhance}.\r\n */\r\n export type KEY = keyof EventData\r\n\r\n /**\r\n * DOM event name (or any string) used by enhanced events and custom subscribers.\r\n */\r\n export type CUSTOM_KEY = keyof GlobalEventHandlersEventMap | string & {}\r\n\r\n /**\r\n * Subscriber callback stored in an event callstack.\r\n */\r\n export type CALLBACK = (...args: any) => any\r\n\r\n /**\r\n * Function that returns a generator calling every subscriber of an event with the given arguments, one per `next()`.\r\n * Built-in runners that need custom argument handling (`TICK`, `DEATH`, `visibilitychange`) receive it as first parameter.\r\n */\r\n export type CALLER = (...args: any) => Thread.GENERATOR\r\n\r\n /**\r\n * Subscription tuple `[key, callback]` for an event known to the Event manager; callback arguments are inferred from the key.\r\n */\r\n export type TICKET = Ticket<KEY>\r\n\r\n /**\r\n * Subscription tuple `[key, callback, options?]` forwarded as is to `addEventListener` / `removeEventListener` on a custom subscriber.\r\n */\r\n export type TICKET_CUSTOM = [key: CUSTOM_KEY, callback: (e: any) => any, options?: AddEventListenerOptions]\r\n\r\n /**\r\n * Any object exposing `addEventListener` / `removeEventListener` (`window`, `document`, an `Element`, …).\r\n */\r\n export type SUBSCRIBER =\r\n {\r\n addEventListener : (key: string, callback: CALLBACK, ...args: any) => any,\r\n removeEventListener: (key: string, callback: CALLBACK, ...args: any) => any\r\n }\r\n\r\n /**\r\n * Runtime descriptor of any registered event (built-in or enhanced).\r\n */\r\n export type DATA = Data<ON, boolean, number, 0 | Thread.FLAG | null, (keyof typeof Event & symbol) | Thread.TASK | null>\r\n\r\n /**\r\n * Typed descriptor of one event entry: listener target, scheduling mode, wait state, Thread flag and runner.\r\n * A \"crushed\" event calls its subscribers directly with the runner's arguments; a non-crushed one goes through\r\n * a built-in runner that receives a {@link Event.CALLER} and decides how subscribers are called.\r\n * @template T Listener target ({@link Event.ON}).\r\n * @template U `true` for a forever event (runs every frame).\r\n * @template V Wait state: `0` (none), `> 0` (debounce delay in ms) or `< 0` (throttle delay in ms). Always `0` for forever events.\r\n * @template W Thread flag: `null` / `undefined` (default {@link Thread.EVENT_FLAG}), `0` (run inline, not allowed for forever events) or a {@link Thread.FLAG}.\r\n * @template X Runner: a symbol-keyed method of `Event`, a task signature, or `null` (generic callback).\r\n */\r\n export type Data<\r\n T extends ON = DEFAULT_ON,\r\n U extends boolean = false,\r\n V extends U extends true ? 0 : number = 0,\r\n W extends U extends true ? Thread.FLAG | null | undefined : 0 | Thread.FLAG | null | undefined = null,\r\n X extends (keyof typeof Event & symbol) | Thread.TASK | null | undefined = null\r\n >\r\n = X extends symbol\r\n ? X extends keyof typeof Event\r\n ? (typeof Event)[X] extends Thread.TASK\r\n ? _Data<T, U, V, W, (typeof Event)[X], X>\r\n : never\r\n : never\r\n : X extends Thread.TASK\r\n ? _Data<T, U, V, W, X, null>\r\n : _Data<T, U, V, W, (...args: any) => void, null>\r\n\r\n type _Data<\r\n T extends ON,\r\n U extends boolean,\r\n V extends number,\r\n W extends 0 | Thread.FLAG | null | undefined,\r\n X extends Thread.TASK,\r\n Y extends symbol | null\r\n >\r\n = boolean extends U\r\n ? __Data<T, true, 0, W, X, Y> | __Data<T, false, V, W, X, Y>\r\n : __Data<T, U, V, W, X, Y>\r\n\r\n type __Data<\r\n T extends ON,\r\n U extends true | false,\r\n V extends number,\r\n W extends 0 | Thread.FLAG | null | undefined,\r\n X extends Thread.TASK,\r\n Y extends symbol | null\r\n >\r\n = Y extends symbol\r\n ? U extends true\r\n ? {\r\n method : Y,\r\n forever : true,\r\n crushed : IsCrushed<X>,\r\n on : T,\r\n threadFlag: W extends 0 | null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n : {\r\n method : Y,\r\n forever : false,\r\n crushed : IsCrushed<X>,\r\n on : T,\r\n waitState : V,\r\n threadFlag: W extends null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n : U extends true\r\n ? {\r\n forever : true,\r\n crushed : true,\r\n on : T,\r\n threadFlag: W extends 0 | null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n : {\r\n forever : false,\r\n crushed : true,\r\n on : T,\r\n waitState : V,\r\n threadFlag: W extends null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n\r\n /**\r\n * Tuple `[key, callback]` whose callback arguments are inferred from the event runner.\r\n * @template T Event key (distributed over unions).\r\n */\r\n export type Ticket<T extends KEY> = T extends T ? [T, (...args: Args<EventData[T]['callback']>) => any] : never\r\n\r\n /**\r\n * Argument accepted by {@link Event.sub} / {@link Event.unsub}: one ticket or an array of tickets.\r\n * Tickets are {@link Event.TICKET} without a subscriber and {@link Event.TICKET_CUSTOM} with one.\r\n * @template T Subscriber type, or `undefined` for the Event manager.\r\n */\r\n export type Pass<T extends SUBSCRIBER | undefined> = T extends SUBSCRIBER ? TICKET_CUSTOM | TICKET_CUSTOM[] : TICKET | TICKET[]\r\n\r\n /**\r\n * Whether an event runner is \"crushed\": `false` when its first parameter is a {@link Event.CALLER}\r\n * (subscribers are driven by that runner); `true` otherwise (subscribers receive the runner's arguments directly).\r\n * @template T Runner task signature to inspect.\r\n */\r\n export type IsCrushed<T extends Thread.TASK> = T extends (caller: infer U, ...args: any) => any\r\n ? U extends Event.CALLER\r\n ? false\r\n : true\r\n : true\r\n\r\n /**\r\n * Arguments passed to subscribers for a given runner: strips a leading {@link Event.CALLER} when present,\r\n * otherwise keeps the full parameter list (all made `Required`).\r\n * Used by {@link Event.Ticket} to type ticket callbacks.\r\n * @template T Runner task signature to inspect.\r\n */\r\n export type Args<T extends Thread.TASK> = T extends (...args: infer U) => any\r\n ? U extends [Event.CALLER, ...infer V]\r\n ? Required<V>\r\n : Required<U>\r\n : []\r\n}\r\n\r\n/**\r\n * Registry of built-in events. Its keys are the event names accepted by `Event.sub` / `Event.unsub`.\r\n * Unless stated otherwise, subscribers run inside the Thread (see {@link Thread}) with the listed flag, possibly spread over several frames.\r\n*/\r\ninterface EventData\r\n{\r\n /**\r\n * Runs every frame as a Thread forever task (flag `128`). Subscribers receive the current `Thread.timestamp` (ms).\r\n */\r\n TICK: Event.Data<'independent', true, 0, Thread.EVENT_FLAG, typeof eTick>,\r\n /**\r\n * Fired after each successful navigation (`Up.Adapter` `AFTER_NAVIGATE`, flag `128`).\r\n * Use it to bring the new page to life (enter animations, bind UI, …).\r\n * Subscribers receive a promise that resolves once every `LIFE` subscriber has run.\r\n */\r\n LIFE: Event.Data<'independent', false, 0, Thread.EVENT_FLAG, typeof eLife>,\r\n /**\r\n * Fired when a client-side navigation is committed (`Up.Adapter` `ON_NAVIGATE`), before the old page is torn down.\r\n * Use it to leave the current page (exit animations, unbind, dispose). Runs synchronously (not through the Thread).\r\n * Not fired for cancelled navigations that never reach `ON_NAVIGATE`. If a committed navigation later fails,\r\n * listen to `Up.Adapter` `ABORTED` to restore state — `LIFE` will not run for that attempt.\r\n */\r\n DEATH: Event.Data<'independent', false, 0, 0, typeof eDeath>,\r\n /**\r\n * Fired after `LIFE` once the framework has updated, static files are ready ({@link Event.CONFIG.staticFilesConfig})\r\n * and `App.wait` has resolved (flag `128`). Subscribers receive a promise that resolves once every `LOAD` subscriber has run.\r\n */\r\n LOAD: Event.Data<'independent', false, 0, Thread.EVENT_FLAG, typeof eLoad>,\r\n /**\r\n * Size changes of the app root (`Adapter.root`, or `document.body`) observed with a `ResizeObserver` on the content box,\r\n * debounced by 50 ms (flag `2`). Subscribers receive the `ResizeObserverEntry[]`.\r\n */\r\n EARTHQUAKE: Event.Data<'independent', false, 50, Thread.EARTHQUAKE_FLAG, typeof eEarthquake>,\r\n /**\r\n * Native `document` `\"visibilitychange\"` event. Pauses the Thread when the page is hidden and resumes it when visible,\r\n * then calls subscribers synchronously with `document.hidden`.\r\n */\r\n visibilitychange: Event.Data<'document', false, 0, 0, typeof eVisibilitychange>,\r\n /**\r\n * Native `window` `\"resize\"` event, debounced by 50 ms (flag `8`). Subscribers receive the DOM event.\r\n */\r\n resize: Event.Data<'window', false, 50, Thread.RESIZE_FLAG, typeof eResize>,\r\n /**\r\n * Native `window` `\"scroll\"` event (flag `32`). Subscribers receive the DOM event.\r\n */\r\n scroll: Event.Data<'window', false, 0, Thread.SCROLL_FLAG, typeof eScroll>\r\n}\r\n\r\n// #CONSTANTS\r\n\r\n // ##SYMBOLS\r\nconst\r\neTick = Symbol('eTick'),\r\neLife = Symbol('eLife'),\r\neDeath = Symbol('eDeath'),\r\neLoad = Symbol('eLoad'),\r\neEarthquake = Symbol('eEarthquake'),\r\neVisibilitychange = Symbol('eVisibilitychange'),\r\neResize = Symbol('eResize'),\r\neScroll = Symbol('eScroll')\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Event manager of the runtime. It dispatches page lifecycle events and a small set of DOM events to subscribers,\r\n * scheduling them through the {@link Thread} with debounce / throttle when configured.\r\n *\r\n * Page lifecycle (driven by `Up.Adapter` navigation phases), in order on a successful change:\r\n * `DEATH` (leave current page, on `ON_NAVIGATE`) → `LIFE` (enter new page, on `AFTER_NAVIGATE`) →\r\n * `LOAD` (after framework tick, static readiness and `App.wait`).\r\n *\r\n * Subscribe with `Up.Event.sub([['DEATH', handler], ['LIFE', handler], …])`. See {@link EventData} for built-in keys\r\n * and {@link Event.CONFIG} to register more.\r\n * @note Client-only: on the server no event is registered.\r\n*/\r\nabstract class Event\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n /**\r\n * Shared inheritance stack (starts with `[Adapter, App, Thread, Event]`) used by the module getters.\r\n * @internal\r\n */\r\n private static [INHERITANCE] = Thread.App.HRT.hydrate<(typeof Thread)[typeof INHERITANCE], [typeof Event]>(Event)\r\n\r\n static #PRE_DEATH : Event.PRE_DEATH = 1\r\n static #AFTER_DEATH: Event.AFTER_DEATH = 2\r\n static #PRE_LIFE : Event.PRE_LIFE = 4\r\n static #AFTER_LIFE : Event.AFTER_LIFE = 8\r\n static #PRE_LOAD : Event.PRE_LOAD = 16\r\n static #AFTER_LOAD : Event.AFTER_LOAD = 32\r\n\r\n static #THREAD_FLAG: Thread.EVENT_FLAG = 128\r\n\r\n static #ADAPTER_TICKETS: Adapter.TICKET[] =\r\n [\r\n ['ON_NAVIGATE' , Event.#eOnNavigate],\r\n ['AFTER_NAVIGATE', Event.#eAfterNavigate]\r\n ]\r\n\r\n static #PASSIVE = { passive: true } as const\r\n static #IMPASSIVE = { passive: false } as const\r\n\r\n static #STATIC_FILES_CONFIG: Wait.STATIC_FILES_CONFIG =\r\n {\r\n eagerOnly : true,\r\n viewportOnly : true,\r\n emptySizeOnly: true\r\n }\r\n\r\n static #DATA = new Map<Event.KEY, EventData[Event.KEY]>(\r\n [\r\n [\r\n 'TICK',\r\n {\r\n method : eTick,\r\n forever : true,\r\n crushed : false,\r\n on : 'independent',\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event[eTick]\r\n }\r\n ],\r\n [\r\n 'LIFE',\r\n {\r\n method : eLife,\r\n forever : false,\r\n crushed : true,\r\n on : 'independent',\r\n waitState : 0,\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event[eLife]\r\n }\r\n ],\r\n [\r\n 'DEATH',\r\n {\r\n method : eDeath,\r\n forever : false,\r\n crushed : false,\r\n on : 'independent',\r\n waitState : 0,\r\n threadFlag: 0,\r\n callback : Event[eDeath]\r\n }\r\n ],\r\n [\r\n 'LOAD',\r\n {\r\n method : eLoad,\r\n forever : false,\r\n crushed : true,\r\n on : 'independent',\r\n waitState : 0,\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event[eLoad]\r\n }\r\n ],\r\n [\r\n 'EARTHQUAKE',\r\n {\r\n method : eEarthquake,\r\n forever : false,\r\n crushed : true,\r\n on : 'independent',\r\n waitState : 50,\r\n threadFlag: 2,\r\n callback : Event[eEarthquake]\r\n }\r\n ],\r\n [\r\n 'visibilitychange',\r\n {\r\n method : eVisibilitychange,\r\n forever : false,\r\n crushed : false,\r\n on : 'document',\r\n waitState : 0,\r\n threadFlag: 0,\r\n callback : Event[eVisibilitychange]\r\n }\r\n ],\r\n [\r\n 'resize',\r\n {\r\n method : eResize,\r\n forever : false,\r\n crushed : true,\r\n on : 'window',\r\n waitState : 50,\r\n threadFlag: 8,\r\n callback : Event[eResize]\r\n }\r\n ],\r\n [\r\n 'scroll',\r\n {\r\n method : eScroll,\r\n forever : false,\r\n crushed : true,\r\n on : 'window',\r\n waitState : 0,\r\n threadFlag: 32,\r\n callback : Event[eScroll]\r\n }\r\n ]\r\n ])\r\n static #THREAD_TICKETS = new Map<Event.KEY, [task: Thread.TASK, flag: Thread.FLAG][]>()\r\n static #MANAGER = new Map<Event.KEY, Event.CALLBACK[]>()\r\n\r\n static #status = 0\r\n static #lifeIn = -1\r\n static #deathIn = -1\r\n\r\n static #resizeObserver: ResizeObserver | null = null\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * Active framework adapter (same as {@link Up.Adapter}).\r\n * @returns The adapter class.\r\n */\r\n static get Adapter(): typeof Adapter { return Event[INHERITANCE][0] }\r\n /**\r\n * Application runtime (same as {@link Up.App}).\r\n * @returns The {@link App} class.\r\n */\r\n static get App(): typeof App { return Event[INHERITANCE][1] }\r\n /**\r\n * Frame scheduler (same as {@link Up.Thread}).\r\n * @returns The {@link Thread} class.\r\n */\r\n static get Thread(): typeof Thread { return Event[INHERITANCE][2] }\r\n\r\n /**\r\n * Status bit set when the `DEATH` phase starts ({@link Event.PRE_DEATH}).\r\n * @returns `1`.\r\n */\r\n static get PRE_DEATH(): Event.PRE_DEATH { return Event.#PRE_DEATH }\r\n /**\r\n * Status bit set once all `DEATH` subscribers have run ({@link Event.AFTER_DEATH}).\r\n * @returns `2`.\r\n */\r\n static get AFTER_DEATH(): Event.AFTER_DEATH { return Event.#AFTER_DEATH }\r\n /**\r\n * Status bit set when the `LIFE` phase starts ({@link Event.PRE_LIFE}).\r\n * @returns `4`.\r\n */\r\n static get PRE_LIFE(): Event.PRE_LIFE { return Event.#PRE_LIFE }\r\n /**\r\n * Status bit set once all `LIFE` subscribers have run ({@link Event.AFTER_LIFE}).\r\n * @returns `8`.\r\n */\r\n static get AFTER_LIFE(): Event.AFTER_LIFE { return Event.#AFTER_LIFE }\r\n /**\r\n * Status bit set when the `LOAD` phase starts ({@link Event.PRE_LOAD}).\r\n * @returns `16`.\r\n */\r\n static get PRE_LOAD(): Event.PRE_LOAD { return Event.#PRE_LOAD }\r\n /**\r\n * Status bit set once all `LOAD` subscribers have run ({@link Event.AFTER_LOAD}).\r\n * @returns `32`.\r\n */\r\n static get AFTER_LOAD(): Event.AFTER_LOAD { return Event.#AFTER_LOAD }\r\n\r\n /**\r\n * Default Thread flag of event tasks (`TICK`, `LIFE`, `LOAD` and enhanced events without `threadFlag`).\r\n * @returns `128` ({@link Thread.EVENT_FLAG}).\r\n */\r\n static get THREAD_FLAG(): Thread.EVENT_FLAG { return Event.#THREAD_FLAG }\r\n\r\n /**\r\n * Shared listener options for passive DOM listeners.\r\n * @returns `{ passive: true }`.\r\n */\r\n static get PASSIVE(): { passive: true } { return Event.#PASSIVE }\r\n /**\r\n * Shared listener options for DOM listeners that need to call `preventDefault`.\r\n * @returns `{ passive: false }`.\r\n */\r\n static get IMPASSIVE(): { passive: false } { return Event.#IMPASSIVE }\r\n\r\n /**\r\n * Current lifecycle status, a bitmask of the `PRE_*` / `AFTER_*` bits. `0` until the first navigation hook runs.\r\n * @returns The status bitmask.\r\n * @example\r\n * ```ts\r\n * if (Up.Event.status & Up.Event.AFTER_LOAD) console.log('Page fully loaded')\r\n * ```\r\n */\r\n static get status(): number { return Event.#status }\r\n /**\r\n * Time (`performance.now()`, ms) at which the current `LIFE` phase started.\r\n * @returns The timestamp, or `-1` before the first `LIFE`.\r\n */\r\n static get lifeIn (): number { return Event.#lifeIn }\r\n /**\r\n * Time (`performance.now()`, ms) at which the latest `DEATH` phase started.\r\n * @returns The timestamp, or `-1` before the first `DEATH`.\r\n */\r\n static get deathIn(): number { return Event.#deathIn }\r\n\r\n// #METHODS\r\n\r\n // ##CONSTRUCT\r\n /**\r\n * Adds enhanced event descriptors from {@link Event.CONFIG.enhance} to the registry.\r\n */\r\n static #constructData(enhance: NonNullable<Event.CONFIG['enhance']>): void\r\n {\r\n for (let i = 0, max = enhance.length; i < max; i++)\r\n {\r\n const DATA = enhance[i]\r\n\r\n if (typeof DATA === 'string') (Event.#DATA as Map<string, Event.DATA>).set(DATA,\r\n {\r\n forever : false,\r\n crushed : true,\r\n on : 'window',\r\n waitState : 0,\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event.App.void\r\n })\r\n else (Event.#DATA as Map<string, Event.DATA>).set(DATA.key,\r\n {\r\n crushed : true,\r\n on : DATA.on ?? 'window',\r\n callback: Event.App.void,\r\n ...(DATA.forever\r\n ? {\r\n forever : true,\r\n threadFlag: DATA.threadFlag || Event.#THREAD_FLAG\r\n }\r\n : {\r\n forever : false,\r\n waitState: 'waitDelay' in DATA && DATA.waitDelay > 0\r\n ? DATA.waitType === 'debounce'\r\n ? DATA.waitDelay\r\n : DATA.waitType === 'throttle'\r\n ? -DATA.waitDelay\r\n : 0\r\n : 0,\r\n threadFlag: DATA.threadFlag ?? Event.#THREAD_FLAG,\r\n }\r\n )\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Builds the event registry and subscriber callstacks, wraps each runner with its Thread flag and debounce / throttle,\r\n * and starts the `TICK` forever task. Merges `staticFilesConfig` onto the defaults when provided.\r\n * Does nothing outside the browser.\r\n * @internal\r\n * @param config Optional {@link Event.CONFIG}.\r\n */\r\n static [construct](config?: Event.CONFIG): void\r\n {\r\n if (!Event.Adapter.BROWSER) return\r\n\r\n if (config)\r\n {\r\n if (config.staticFilesConfig) Parser.copy(Event.#STATIC_FILES_CONFIG, config.staticFilesConfig)\r\n\r\n if (config.enhance) Event.#constructData(config.enhance)\r\n }\r\n \r\n for (const [KEY, DATA] of Event.#DATA as Map<Event.KEY, Event.DATA>)\r\n {\r\n const\r\n CALLSTACK: Event.CALLBACK[] = [],\r\n caller = Event.#caller.bind(null, CALLSTACK),\r\n callback = DATA.crushed\r\n ? caller\r\n : (DATA.callback as (caller: Event.CALLER, ...args: any) => void | Thread.GENERATOR).bind(null, caller)\r\n\r\n Event.#MANAGER.set(KEY, CALLSTACK)\r\n\r\n if (DATA.forever)\r\n {\r\n Event.Thread.markForever(callback)\r\n Event.#getThreadSubscription(KEY, callback, DATA.threadFlag)() // *Let's call him directly\r\n\r\n DATA.callback = callback\r\n }\r\n else if (DATA.threadFlag)\r\n {\r\n DATA.callback = Event.#getThreadSubscription(KEY, callback, DATA.threadFlag)\r\n\r\n if (DATA.waitState)\r\n {\r\n // *It is essential to return the generator to the thread in order to take advantage of its benefits and, most importantly, to be able to execute the generators.\r\n // *The \"waiters\" take us out of the thread, and we can't put them ahead of the task because we have modifiers that are waiting for real-time updates.\r\n // *To solve the problem, we break it down into two separate tasks.\r\n \r\n DATA.callback = Event.#getThreadSubscription(KEY, Event.#getWaiter(DATA.callback, DATA.waitState), DATA.threadFlag)\r\n }\r\n }\r\n else DATA.callback = DATA.waitState ? Event.#getWaiter(callback, DATA.waitState) : callback // *Do not use \"Wait.frame\"\r\n\r\n if ('method' in DATA && DATA.method) Event[DATA.method] = DATA.callback as any\r\n }\r\n }\r\n\r\n // ##SET\r\n /**\r\n * Sets the static-file root and creates the `ResizeObserver`.\r\n */\r\n static #setVars(): void\r\n {\r\n Event.#STATIC_FILES_CONFIG.limiter = Event.Adapter.root\r\n\r\n Event.#resizeObserver = new ResizeObserver(Event.#oResize)\r\n }\r\n\r\n /**\r\n * Subscribes to adapter navigation hooks and attaches DOM listeners.\r\n */\r\n static #setEvents(): void\r\n {\r\n Event.Adapter.sub(Event.#ADAPTER_TICKETS)\r\n\r\n for (const [KEY, DATA] of Event.#DATA)\r\n if (DATA.on !== 'independent') (DATA.on === 'window' ? window : document).addEventListener(KEY, DATA.callback as () => void, Event.#PASSIVE)\r\n }\r\n\r\n /**\r\n * Observes the app root (or `document.body`) for `EARTHQUAKE`.\r\n */\r\n static #setObservers(): void { Event.#resizeObserver!.observe(Event.Adapter.root ?? document.body, { box: 'content-box' }) }\r\n\r\n /**\r\n * Attaches navigation hooks, DOM listeners and the `ResizeObserver`. Called from `Up.set` in the browser.\r\n * @internal\r\n */\r\n static [set](): void\r\n {\r\n Event.#setVars()\r\n Event.#setEvents()\r\n Event.#setObservers()\r\n }\r\n\r\n // ##GET\r\n /**\r\n * Records `task` for teardown and returns a function scheduling it on the Thread with `flag`.\r\n */\r\n static #getThreadSubscription(key: keyof EventData, task: Thread.TASK, flag: Thread.FLAG): (...args: any) => void\r\n {\r\n const TICKETS = Event.#THREAD_TICKETS.get(key)\r\n\r\n TICKETS\r\n ? TICKETS.push([task, flag])\r\n : Event.#THREAD_TICKETS.set(key, [[task, flag]])\r\n\r\n return Event.Thread.sub.bind(null, task, flag)\r\n }\r\n\r\n /**\r\n * Wraps `task` with a trailing debounce (`waitState > 0`) or a trailing throttle (`waitState < 0`).\r\n */\r\n static #getWaiter(task: Thread.TASK, waitState: number): Thread.TASK\r\n {\r\n return waitState > 0\r\n ? Wait.debounce(task, waitState, false)\r\n : Wait.throttle(task, waitState * -1, true, false)\r\n }\r\n\r\n // ##ADD\r\n /**\r\n * Adds `callback` to the callstack of `key` (no duplicates), or calls it immediately (see {@link Event.sub}).\r\n */\r\n static #add(key: Event.KEY, callback: Event.CALLBACK): void\r\n {\r\n if (key === 'LOAD' && Event.#status & Event.#PRE_LOAD)\r\n {\r\n callback()\r\n\r\n return\r\n }\r\n\r\n const CALLSTACK = Event.#MANAGER.get(key)\r\n\r\n if (!CALLSTACK) callback()\r\n else if (!CALLSTACK.includes(callback)) CALLSTACK.push(callback)\r\n }\r\n\r\n // ##REMOVE\r\n /**\r\n * Removes `callback` from the callstack of `key`.\r\n */\r\n static #remove(key: Event.KEY, callback: Event.CALLBACK): void\r\n {\r\n Wait.cancel(callback)\r\n \r\n const CALLSTACK = Event.#MANAGER.get(key)\r\n\r\n if (!CALLSTACK) return\r\n \r\n const INDEX = CALLSTACK.indexOf(callback)\r\n\r\n if (~INDEX) CALLSTACK.splice(INDEX, 1)\r\n }\r\n\r\n // ##UPDATES\r\n /**\r\n * Applies `action` to one ticket or to each ticket of an array.\r\n */\r\n static #update(pass: Event.Pass<Event.SUBSCRIBER | undefined>, action: (...ticket: Event.TICKET | Event.TICKET_CUSTOM) => void): void\r\n {\r\n if (typeof pass[0] === 'string') return action(...pass)\r\n\r\n for (let i = 0, max = pass.length; i < max; i++) action(...pass[i])\r\n }\r\n\r\n // ##DESTROY\r\n /**\r\n * Clears callstacks and disconnects the `ResizeObserver`.\r\n */\r\n static #destroyVars(): void\r\n {\r\n if (Event.#MANAGER.size) Event.#MANAGER.clear()\r\n \r\n if (Event.#resizeObserver)\r\n {\r\n Event.#resizeObserver.disconnect()\r\n\r\n Event.#resizeObserver = null\r\n }\r\n }\r\n\r\n /**\r\n * Unsubscribes and cancels every Thread task created for events.\r\n */\r\n static #destroyTasks(): void\r\n {\r\n for (const [_, TICKETS] of Event.#THREAD_TICKETS) for (let i = 0, max = TICKETS.length; i < max; i++)\r\n {\r\n const task = TICKETS[i][0]\r\n \r\n Event.Thread.unsub(task)\r\n Wait.cancel(task)\r\n }\r\n }\r\n\r\n /**\r\n * Detaches navigation hooks and DOM listeners and cancels pending waits.\r\n */\r\n static #destroyEvents(): void\r\n {\r\n Event.Adapter.unsub(Event.#ADAPTER_TICKETS)\r\n \r\n for (const [KEY, DATA] of Event.#DATA)\r\n {\r\n if (DATA.on !== 'independent') (DATA.on === 'window' ? window : document).removeEventListener(KEY, DATA.callback as () => void)\r\n\r\n Wait.cancel(DATA.callback)\r\n }\r\n }\r\n\r\n /**\r\n * Removes all subscribers, listeners, observers and event tasks. Called from `Up.destroy` in the browser.\r\n * @internal\r\n */\r\n static [destroy](): void\r\n {\r\n Event.#destroyVars()\r\n Event.#destroyTasks()\r\n Event.#destroyEvents()\r\n }\r\n\r\n // ##EVENTS\r\n /**\r\n * Adapter `ON_NAVIGATE` hook: runs the `DEATH` phase (leave current page once navigation is committed).\r\n */\r\n static #eOnNavigate(): void\r\n {\r\n Event.#status = Event.#PRE_DEATH\r\n Event.#deathIn = performance.now()\r\n\r\n ;(Event[eDeath] as any)()\r\n\r\n Event.#status |= Event.#AFTER_DEATH\r\n }\r\n\r\n /**\r\n * Adapter `AFTER_NAVIGATE` hook: runs the `LIFE` phase, waits for readiness, then runs the `LOAD` phase.\r\n */\r\n static async #eAfterNavigate(): Promise<void>\r\n {\r\n let res = Event.App.void\r\n \r\n Event.#status = Event.#PRE_LIFE\r\n Event.#lifeIn = performance.now()\r\n \r\n Event[eLife](new Promise((r): void => { res = r }))\r\n\r\n await Event.Thread.wait(Event.#THREAD_TICKETS.get('LIFE')![0][0])\r\n\r\n Event.#status |= Event.#AFTER_LIFE\r\n\r\n res()\r\n\r\n await Event.Adapter.tick() // *Wait for updates brought by the \"LIFE\" event\r\n await Wait.staticFiles(Event.#STATIC_FILES_CONFIG) // *Static readiness before LOAD (see CONFIG.staticFilesConfig / #STATIC_FILES_CONFIG)\r\n await Event.App.wait\r\n\r\n Event.#status |= Event.#PRE_LOAD\r\n\r\n Event[eLoad](new Promise((r): void => { res = r }))\r\n\r\n await Event.Thread.wait(Event.#THREAD_TICKETS.get('LOAD')![0][0])\r\n\r\n Event.#status |= Event.#AFTER_LOAD\r\n\r\n res()\r\n }\r\n\r\n /**\r\n * `TICK` runner: calls subscribers with the current frame timestamp.\r\n * @internal\r\n */\r\n static [eTick](caller: Event.CALLER, timestamp = Event.Thread.timestamp): Thread.GENERATOR { return caller(timestamp) }\r\n\r\n /**\r\n * `LIFE` trigger (signature placeholder, replaced by the scheduled runner in `[construct]`).\r\n * @internal\r\n */\r\n static [eLife](promise: Promise<void>): void {}\r\n\r\n /**\r\n * `DEATH` runner: calls every subscriber synchronously.\r\n * @internal\r\n */\r\n static [eDeath](caller: Event.CALLER): void\r\n {\r\n const GEN = caller()\r\n\r\n while (!GEN.next().done) {}\r\n }\r\n\r\n /**\r\n * `LOAD` trigger (signature placeholder, replaced by the scheduled runner in `[construct]`).\r\n * @internal\r\n */\r\n static [eLoad](promise: Promise<void>): void {}\r\n\r\n /**\r\n * `EARTHQUAKE` trigger (signature placeholder, replaced by the scheduled runner in `[construct]`).\r\n * @internal\r\n */\r\n static [eEarthquake](o: ResizeObserverEntry[]): void {}\r\n\r\n /**\r\n * `visibilitychange` runner: pauses or resumes the Thread, then calls every subscriber synchronously with `document.hidden`.\r\n * @internal\r\n */\r\n static [eVisibilitychange](caller: Event.CALLER): void\r\n {\r\n Event.Thread[document.hidden ? stop : start]()\r\n\r\n const GEN = caller(document.hidden)\r\n\r\n while (!GEN.next().done) {}\r\n }\r\n\r\n /**\r\n * `resize` trigger (signature placeholder, replaced by the DOM listener in `[construct]`).\r\n * @internal\r\n */\r\n static [eResize](e: Event): void {}\r\n\r\n /**\r\n * `scroll` trigger (signature placeholder, replaced by the DOM listener in `[construct]`).\r\n * @internal\r\n */\r\n static [eScroll](e: Event): void {}\r\n\r\n // ##OBSERVERS\r\n /**\r\n * `ResizeObserver` callback forwarding entries to `EARTHQUAKE`.\r\n */\r\n static #oResize(o: ResizeObserverEntry[]): void\r\n {\r\n // TODO: Earthquake ne devrait peut-être pas être un événements mais avoir un Plugin dédié permettant de fragmenter l'app en zone observable.\r\n // *Ici les earthquake se déclenchent aussi sur la largeur.\r\n Event[eEarthquake](o)\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Subscribes one or several tickets.\r\n * Without `subscriber`, each `[key, callback]` ticket ({@link Event.TICKET}) is added to the Event manager.\r\n * Subscribing the same callback twice to the same key has no effect, and subscribers of an event run in reverse subscription order.\r\n * With `subscriber`, each `[key, callback, options?]` ticket ({@link Event.TICKET_CUSTOM}) is passed to `subscriber.addEventListener`.\r\n * @note Without `subscriber`, the callback is called once immediately, with no arguments, and is not stored when:\r\n * the key is unknown or not registered (including on the server), or the key is `LOAD` and the current `LOAD` phase has already started.\r\n * @param pass A ticket or an array of tickets.\r\n * @param subscriber Optional listener target (`window`, `document`, an `Element`, …).\r\n * @example\r\n * ```ts\r\n * const onResize = (): void => console.log(Up.App.w, Up.App.h)\r\n * const onClick = (e: MouseEvent): void => console.log(e.clientX)\r\n *\r\n * Up.Event.sub([['LOAD', () => console.log('Page ready')], ['resize', onResize]])\r\n * Up.Event.sub(['click', onClick, Up.Event.PASSIVE], document.body)\r\n * ```\r\n */\r\n static sub<T extends undefined | Event.SUBSCRIBER = undefined>(pass: Event.Pass<T>, subscriber?: T): void\r\n {\r\n Event.#update(pass, (\r\n subscriber\r\n ? subscriber.addEventListener.bind(subscriber)\r\n : Event.#add as any\r\n )\r\n )\r\n }\r\n\r\n /**\r\n * Unsubscribes one or several tickets previously passed to {@link Event.sub}.\r\n * Callbacks are matched by reference, so pass the same function (and the same `subscriber`) used to subscribe.\r\n * @param pass A ticket or an array of tickets.\r\n * @param subscriber The listener target used when subscribing, if any.\r\n * @example\r\n * ```ts\r\n * Up.Event.unsub(['resize', onResize])\r\n * Up.Event.unsub(['click', onClick], document.body)\r\n * ```\r\n */\r\n static unsub<T extends undefined | Event.SUBSCRIBER = undefined>(pass: Event.Pass<T>, subscriber?: T): void\r\n {\r\n Event.#update(pass, (\r\n subscriber\r\n ? subscriber.removeEventListener.bind(subscriber)\r\n : Event.#remove as any\r\n )\r\n )\r\n }\r\n\r\n // ##GENERATORS\r\n /**\r\n * Calls each subscriber of `callstack` with `args`, from last to first, yielding after each call.\r\n */\r\n static *#caller(callstack: Event.CALLBACK[], ...args: any[]): Thread.GENERATOR\r\n {\r\n // ?The call starts at the end because the stack can be modified.\r\n for (let i = callstack.length - 1; i > -1; i--)\r\n {\r\n callstack[i](...args)\r\n\r\n yield\r\n }\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Event\r\n\r\nexport type {\r\n Event,\r\n EventData\r\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/core/%5B1%5D/Event.ts"],"sourcesContent":["/* [Event] */\r\n\r\n// #IMPORTS\r\n\r\n // ##SYMBOLS\r\nimport { INHERITANCE, construct, set, destroy, start, stop } from '../../symbols/index.js'\r\n\r\n // ##SCRIPTS\r\nimport Parser from '../../scripts/Parser.js'\r\nimport Wait from '../../scripts/Wait.js'\r\n\r\n // ##THIS\r\nimport Thread from './[2]/Thread.js'\r\n\r\n // ##TYPES\r\nimport type Adapter from '../../adapters/@/Adapter.js'\r\n\r\nimport type App from './[2]/[3]/App.js'\r\n\r\n// #TYPES\r\n\r\n // ##THIS\r\nnamespace Event\r\n{\r\n /**\r\n * Event module configuration, declared in `up.event` of the Vite initializer and applied by `Up[construct]`.\r\n */\r\n export type CONFIG =\r\n {\r\n /**\r\n * Extra events to register alongside the built-ins, so they can be used with {@link Event.sub}.\r\n * A string registers a DOM event on `window`, with no wait and the default Thread flag ({@link Event.THREAD_FLAG}).\r\n * An object allows customization:\r\n * - `key`: real DOM event name (e.g. `\"click\"`, `\"mousemove\"`).\r\n * - `on`: `\"window\"` (default), `\"document\"` or `\"independent\"` (no DOM listener).\r\n * - `forever`: run subscribers every frame as a Thread forever task.\r\n * - `waitType` + `waitDelay`: debounce or throttle the event by `waitDelay` ms.\r\n * - `threadFlag`: Thread priority flag; `0` runs subscribers inline instead of through the Thread (not allowed with `forever`).\r\n * - `argsTypes`: TypeScript tuple, as a string, typing subscriber arguments in the generated declarations (e.g. `\"[e: MouseEvent]\"`).\r\n * @note DOM listeners are always registered as passive.\r\n */\r\n enhance?: (CUSTOM_KEY |\r\n {\r\n forever : true,\r\n key : CUSTOM_KEY,\r\n on ?: ON,\r\n waitType ?: never, // *Wait.frame or forever task\r\n threadFlag?: Thread.FLAG,\r\n argsTypes ?: `[${string}]`\r\n } |\r\n {\r\n forever ?: false,\r\n key : CUSTOM_KEY,\r\n on ?: ON,\r\n waitType ?: never, // *Wait.frame or forever task\r\n threadFlag?: 0 | Thread.FLAG,\r\n argsTypes ?: `[${string}]`\r\n } |\r\n {\r\n forever ?: false,\r\n key : CUSTOM_KEY,\r\n on ?: ON,\r\n waitType : 'debounce' | 'throttle',\r\n waitDelay : number,\r\n threadFlag?: 0 | Thread.FLAG,\r\n argsTypes ?: `[${string}]`\r\n }\r\n )[],\r\n /**\r\n * Options for the static-file wait (images, media, …) performed before each `LOAD` event.\r\n * Shallow-merged onto the defaults, where `eagerOnly`, `viewportOnly` and `emptySizeOnly` are `true`.\r\n * `limiter` cannot be set: it is set at runtime to `Adapter.root` (falls back to `document.body` when `null`).\r\n * @see {@link Wait.STATIC_FILES_CONFIG}\r\n */\r\n staticFilesConfig?: Omit<Wait.STATIC_FILES_CONFIG, 'limiter'>\r\n }\r\n\r\n /**\r\n * Status bit (`1`): the `DEATH` phase has started (the app is about to navigate away from the current page).\r\n * Setting it clears all other status bits.\r\n */\r\n export type PRE_DEATH = 1\r\n\r\n /**\r\n * Status bit (`2`): all `DEATH` subscribers have run.\r\n */\r\n export type AFTER_DEATH = 2\r\n\r\n /**\r\n * Status bit (`4`): the `LIFE` phase has started (navigation to a new page has completed).\r\n * Setting it clears all other status bits.\r\n */\r\n export type PRE_LIFE = 4\r\n\r\n /**\r\n * Status bit (`8`): all `LIFE` subscribers have run.\r\n */\r\n export type AFTER_LIFE = 8\r\n\r\n /**\r\n * Status bit (`16`): the `LOAD` phase has started (static files and `App.wait` have resolved).\r\n */\r\n export type PRE_LOAD = 16\r\n\r\n /**\r\n * Status bit (`32`): all `LOAD` subscribers have run.\r\n */\r\n export type AFTER_LOAD = 32\r\n\r\n /**\r\n * Default listener target for enhanced events (`\"window\"`).\r\n */\r\n export type DEFAULT_ON = 'window'\r\n\r\n /**\r\n * Where an event listener is attached: `\"window\"`, `\"document\"`, or `\"independent\"` (no DOM listener, triggered by the runtime itself).\r\n */\r\n export type ON = DEFAULT_ON | 'document' | 'independent'\r\n\r\n /**\r\n * Name of an event known to the Event manager: a built-in key ({@link EventData}) or an enhanced one from {@link Event.CONFIG.enhance}.\r\n */\r\n export type KEY = keyof EventData\r\n\r\n /**\r\n * DOM event name (or any string) used by enhanced events and custom subscribers.\r\n */\r\n export type CUSTOM_KEY = keyof GlobalEventHandlersEventMap | string & {}\r\n\r\n /**\r\n * Subscriber callback stored in an event callstack.\r\n */\r\n export type CALLBACK = (...args: any) => any\r\n\r\n /**\r\n * Function that returns a generator calling every subscriber of an event with the given arguments, one per `next()`.\r\n * Built-in runners that need custom argument handling (`TICK`, `DEATH`, `visibilitychange`) receive it as first parameter.\r\n */\r\n export type CALLER = (...args: any) => Thread.GENERATOR\r\n\r\n /**\r\n * Subscription tuple `[key, callback]` for an event known to the Event manager; callback arguments are inferred from the key.\r\n */\r\n export type TICKET = Ticket<KEY>\r\n\r\n /**\r\n * Subscription tuple `[key, callback, options?]` forwarded as is to `addEventListener` / `removeEventListener` on a custom subscriber.\r\n */\r\n export type TICKET_CUSTOM = [key: CUSTOM_KEY, callback: (e: any) => any, options?: AddEventListenerOptions]\r\n\r\n /**\r\n * Any object exposing `addEventListener` / `removeEventListener` (`window`, `document`, an `Element`, …).\r\n */\r\n export type SUBSCRIBER =\r\n {\r\n addEventListener : (key: string, callback: CALLBACK, ...args: any) => any,\r\n removeEventListener: (key: string, callback: CALLBACK, ...args: any) => any\r\n }\r\n\r\n /**\r\n * Runtime descriptor of any registered event (built-in or enhanced).\r\n */\r\n export type DATA = Data<ON, boolean, number, 0 | Thread.FLAG | null, (keyof typeof Event & symbol) | Thread.TASK | null>\r\n\r\n /**\r\n * Typed descriptor of one event entry: listener target, scheduling mode, wait state, Thread flag and runner.\r\n * A \"crushed\" event calls its subscribers directly with the runner's arguments; a non-crushed one goes through\r\n * a built-in runner that receives a {@link Event.CALLER} and decides how subscribers are called.\r\n * @template T Listener target ({@link Event.ON}).\r\n * @template U `true` for a forever event (runs every frame).\r\n * @template V Wait state: `0` (none), `> 0` (debounce delay in ms) or `< 0` (throttle delay in ms). Always `0` for forever events.\r\n * @template W Thread flag: `null` / `undefined` (default {@link Thread.EVENT_FLAG}), `0` (run inline, not allowed for forever events) or a {@link Thread.FLAG}.\r\n * @template X Runner: a symbol-keyed method of `Event`, a task signature, or `null` (generic callback).\r\n */\r\n export type Data<\r\n T extends ON = DEFAULT_ON,\r\n U extends boolean = false,\r\n V extends U extends true ? 0 : number = 0,\r\n W extends U extends true ? Thread.FLAG | null | undefined : 0 | Thread.FLAG | null | undefined = null,\r\n X extends (keyof typeof Event & symbol) | Thread.TASK | null | undefined = null\r\n >\r\n = X extends symbol\r\n ? X extends keyof typeof Event\r\n ? (typeof Event)[X] extends Thread.TASK\r\n ? _Data<T, U, V, W, (typeof Event)[X], X>\r\n : never\r\n : never\r\n : X extends Thread.TASK\r\n ? _Data<T, U, V, W, X, null>\r\n : _Data<T, U, V, W, (...args: any) => void, null>\r\n\r\n type _Data<\r\n T extends ON,\r\n U extends boolean,\r\n V extends number,\r\n W extends 0 | Thread.FLAG | null | undefined,\r\n X extends Thread.TASK,\r\n Y extends symbol | null\r\n >\r\n = boolean extends U\r\n ? __Data<T, true, 0, W, X, Y> | __Data<T, false, V, W, X, Y>\r\n : __Data<T, U, V, W, X, Y>\r\n\r\n type __Data<\r\n T extends ON,\r\n U extends true | false,\r\n V extends number,\r\n W extends 0 | Thread.FLAG | null | undefined,\r\n X extends Thread.TASK,\r\n Y extends symbol | null\r\n >\r\n = Y extends symbol\r\n ? U extends true\r\n ? {\r\n method : Y,\r\n forever : true,\r\n crushed : IsCrushed<X>,\r\n on : T,\r\n threadFlag: W extends 0 | null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n : {\r\n method : Y,\r\n forever : false,\r\n crushed : IsCrushed<X>,\r\n on : T,\r\n waitState : V,\r\n threadFlag: W extends null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n : U extends true\r\n ? {\r\n forever : true,\r\n crushed : true,\r\n on : T,\r\n threadFlag: W extends 0 | null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n : {\r\n forever : false,\r\n crushed : true,\r\n on : T,\r\n waitState : V,\r\n threadFlag: W extends null | undefined ? Thread.EVENT_FLAG : W,\r\n callback : X\r\n }\r\n\r\n /**\r\n * Tuple `[key, callback]` whose callback arguments are inferred from the event runner.\r\n * @template T Event key (distributed over unions).\r\n */\r\n export type Ticket<T extends KEY> = T extends T ? [T, (...args: Args<EventData[T]['callback']>) => any] : never\r\n\r\n /**\r\n * Argument accepted by {@link Event.sub} / {@link Event.unsub}: one ticket or an array of tickets.\r\n * Tickets are {@link Event.TICKET} without a subscriber and {@link Event.TICKET_CUSTOM} with one.\r\n * @template T Subscriber type, or `undefined` for the Event manager.\r\n */\r\n export type Pass<T extends SUBSCRIBER | undefined> = T extends SUBSCRIBER ? TICKET_CUSTOM | TICKET_CUSTOM[] : TICKET | TICKET[]\r\n\r\n /**\r\n * Whether an event runner is \"crushed\": `false` when its first parameter is a {@link Event.CALLER}\r\n * (subscribers are driven by that runner); `true` otherwise (subscribers receive the runner's arguments directly).\r\n * @template T Runner task signature to inspect.\r\n */\r\n export type IsCrushed<T extends Thread.TASK> = T extends (caller: infer U, ...args: any) => any\r\n ? U extends Event.CALLER\r\n ? false\r\n : true\r\n : true\r\n\r\n /**\r\n * Arguments passed to subscribers for a given runner: strips a leading {@link Event.CALLER} when present,\r\n * otherwise keeps the full parameter list (all made `Required`).\r\n * Used by {@link Event.Ticket} to type ticket callbacks.\r\n * @template T Runner task signature to inspect.\r\n */\r\n export type Args<T extends Thread.TASK> = T extends (...args: infer U) => any\r\n ? U extends [Event.CALLER, ...infer V]\r\n ? Required<V>\r\n : Required<U>\r\n : []\r\n}\r\n\r\n/**\r\n * Registry of built-in events. Its keys are the event names accepted by `Event.sub` / `Event.unsub`.\r\n * Unless stated otherwise, subscribers run inside the Thread (see {@link Thread}) with the listed flag, possibly spread over several frames.\r\n*/\r\ninterface EventData\r\n{\r\n /**\r\n * Runs every frame as a Thread forever task (flag `128`). Subscribers receive the current `Thread.timestamp` (ms).\r\n */\r\n TICK: Event.Data<'independent', true, 0, Thread.EVENT_FLAG, typeof eTick>,\r\n /**\r\n * Fired after each successful navigation (`Up.Adapter` `AFTER_NAVIGATE`, flag `128`).\r\n * Use it to bring the new page to life (enter animations, bind UI, …).\r\n * Subscribers receive a promise that resolves once every `LIFE` subscriber has run.\r\n */\r\n LIFE: Event.Data<'independent', false, 0, Thread.EVENT_FLAG, typeof eLife>,\r\n /**\r\n * Fired when a client-side navigation is committed (`Up.Adapter` `ON_NAVIGATE`), before the old page is torn down.\r\n * Use it to leave the current page (exit animations, unbind, dispose). Runs synchronously (not through the Thread).\r\n * Not fired for cancelled navigations that never reach `ON_NAVIGATE`. If a committed navigation later fails,\r\n * listen to `Up.Adapter` `ABORTED` to restore state — `LIFE` will not run for that attempt.\r\n */\r\n DEATH: Event.Data<'independent', false, 0, 0, typeof eDeath>,\r\n /**\r\n * Fired after `LIFE` once the framework has updated, static files are ready ({@link Event.CONFIG.staticFilesConfig})\r\n * and `App.wait` has resolved (flag `128`). Subscribers receive a promise that resolves once every `LOAD` subscriber has run.\r\n */\r\n LOAD: Event.Data<'independent', false, 0, Thread.EVENT_FLAG, typeof eLoad>,\r\n /**\r\n * Size changes of the app root (`Adapter.root`, or `document.body`) observed with a `ResizeObserver` on the content box,\r\n * debounced by 50 ms (flag `2`). Subscribers receive the `ResizeObserverEntry[]`.\r\n */\r\n EARTHQUAKE: Event.Data<'independent', false, 50, Thread.EARTHQUAKE_FLAG, typeof eEarthquake>,\r\n /**\r\n * Native `document` `\"visibilitychange\"` event. Pauses the Thread when the page is hidden and resumes it when visible,\r\n * then calls subscribers synchronously with `document.hidden`.\r\n */\r\n visibilitychange: Event.Data<'document', false, 0, 0, typeof eVisibilitychange>,\r\n /**\r\n * Native `window` `\"resize\"` event, debounced by 50 ms (flag `8`). Subscribers receive the DOM event.\r\n */\r\n resize: Event.Data<'window', false, 50, Thread.RESIZE_FLAG, typeof eResize>,\r\n /**\r\n * Native `window` `\"scroll\"` event (flag `32`). Subscribers receive the DOM event.\r\n */\r\n scroll: Event.Data<'window', false, 0, Thread.SCROLL_FLAG, typeof eScroll>\r\n}\r\n\r\n// #CONSTANTS\r\n\r\n // ##SYMBOLS\r\nconst\r\neTick = Symbol('eTick'),\r\neLife = Symbol('eLife'),\r\neDeath = Symbol('eDeath'),\r\neLoad = Symbol('eLoad'),\r\neEarthquake = Symbol('eEarthquake'),\r\neVisibilitychange = Symbol('eVisibilitychange'),\r\neResize = Symbol('eResize'),\r\neScroll = Symbol('eScroll')\r\n\r\n// #CLASS\r\n\r\n // ##THIS\r\n/**\r\n * Event manager of the runtime. It dispatches page lifecycle events and a small set of DOM events to subscribers,\r\n * scheduling them through the {@link Thread} with debounce / throttle when configured.\r\n *\r\n * Page lifecycle (driven by `Up.Adapter` navigation phases), in order on a successful change:\r\n * `DEATH` (leave current page, on `ON_NAVIGATE`) → `LIFE` (enter new page, on `AFTER_NAVIGATE`) →\r\n * `LOAD` (after framework tick, static readiness and `App.wait`).\r\n *\r\n * Subscribe with `Up.Event.sub([['DEATH', handler], ['LIFE', handler], …])`. See {@link EventData} for built-in keys\r\n * and {@link Event.CONFIG} to register more.\r\n * @note Client-only: on the server no event is registered.\r\n*/\r\nabstract class Event\r\n{\r\n\r\n// #PROPS\r\n\r\n // ##STATICS\r\n static #PRE_DEATH : Event.PRE_DEATH = 1\r\n static #AFTER_DEATH: Event.AFTER_DEATH = 2\r\n static #PRE_LIFE : Event.PRE_LIFE = 4\r\n static #AFTER_LIFE : Event.AFTER_LIFE = 8\r\n static #PRE_LOAD : Event.PRE_LOAD = 16\r\n static #AFTER_LOAD : Event.AFTER_LOAD = 32\r\n\r\n static #THREAD_FLAG: Thread.EVENT_FLAG = 128\r\n\r\n static #ADAPTER_TICKETS: Adapter.TICKET[] =\r\n [\r\n ['ON_NAVIGATE' , Event.#eOnNavigate],\r\n ['AFTER_NAVIGATE', Event.#eAfterNavigate]\r\n ]\r\n\r\n static #PASSIVE = { passive: true } as const\r\n static #IMPASSIVE = { passive: false } as const\r\n\r\n static #STATIC_FILES_CONFIG: Wait.STATIC_FILES_CONFIG =\r\n {\r\n eagerOnly : true,\r\n viewportOnly : true,\r\n emptySizeOnly: true\r\n }\r\n\r\n static #DATA = new Map<Event.KEY, EventData[Event.KEY]>(\r\n [\r\n [\r\n 'TICK',\r\n {\r\n method : eTick,\r\n forever : true,\r\n crushed : false,\r\n on : 'independent',\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event[eTick]\r\n }\r\n ],\r\n [\r\n 'LIFE',\r\n {\r\n method : eLife,\r\n forever : false,\r\n crushed : true,\r\n on : 'independent',\r\n waitState : 0,\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event[eLife]\r\n }\r\n ],\r\n [\r\n 'DEATH',\r\n {\r\n method : eDeath,\r\n forever : false,\r\n crushed : false,\r\n on : 'independent',\r\n waitState : 0,\r\n threadFlag: 0,\r\n callback : Event[eDeath]\r\n }\r\n ],\r\n [\r\n 'LOAD',\r\n {\r\n method : eLoad,\r\n forever : false,\r\n crushed : true,\r\n on : 'independent',\r\n waitState : 0,\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event[eLoad]\r\n }\r\n ],\r\n [\r\n 'EARTHQUAKE',\r\n {\r\n method : eEarthquake,\r\n forever : false,\r\n crushed : true,\r\n on : 'independent',\r\n waitState : 50,\r\n threadFlag: 2,\r\n callback : Event[eEarthquake]\r\n }\r\n ],\r\n [\r\n 'visibilitychange',\r\n {\r\n method : eVisibilitychange,\r\n forever : false,\r\n crushed : false,\r\n on : 'document',\r\n waitState : 0,\r\n threadFlag: 0,\r\n callback : Event[eVisibilitychange]\r\n }\r\n ],\r\n [\r\n 'resize',\r\n {\r\n method : eResize,\r\n forever : false,\r\n crushed : true,\r\n on : 'window',\r\n waitState : 50,\r\n threadFlag: 8,\r\n callback : Event[eResize]\r\n }\r\n ],\r\n [\r\n 'scroll',\r\n {\r\n method : eScroll,\r\n forever : false,\r\n crushed : true,\r\n on : 'window',\r\n waitState : 0,\r\n threadFlag: 32,\r\n callback : Event[eScroll]\r\n }\r\n ]\r\n ])\r\n static #THREAD_TICKETS = new Map<Event.KEY, [task: Thread.TASK, flag: Thread.FLAG][]>()\r\n static #MANAGER = new Map<Event.KEY, Event.CALLBACK[]>()\r\n\r\n /**\r\n * Shared HRT stack after hydrating `Thread` (`[Adapter, App, Thread]`); `Up` later appends `Event`.\r\n * Same array as `Thread[INHERITANCE]` — does not include `Event` itself.\r\n * @internal\r\n */\r\n static [INHERITANCE] = Thread.App.HRT.hydrate<(typeof Thread)[typeof INHERITANCE], [typeof Thread]>(Thread)\r\n\r\n static #status = 0\r\n static #lifeIn = -1\r\n static #deathIn = -1\r\n\r\n static #resizeObserver: ResizeObserver | null = null\r\n\r\n// #MANAGERS\r\n\r\n // ##SETTER\r\n\r\n // ##GETTER\r\n /**\r\n * Active framework adapter (same as {@link Up.Adapter}).\r\n * @returns The adapter class.\r\n */\r\n static get Adapter(): typeof Adapter { return Thread[INHERITANCE][0] }\r\n /**\r\n * Application runtime (same as {@link Up.App}).\r\n * @returns The {@link App} class.\r\n */\r\n static get App(): typeof App { return Thread[INHERITANCE][1] }\r\n /**\r\n * Frame scheduler (same as {@link Up.Thread}).\r\n * @returns The {@link Thread} class.\r\n */\r\n static get Thread(): typeof Thread { return Thread }\r\n\r\n /**\r\n * Status bit set when the `DEATH` phase starts ({@link Event.PRE_DEATH}).\r\n * @returns `1`.\r\n */\r\n static get PRE_DEATH(): Event.PRE_DEATH { return Event.#PRE_DEATH }\r\n /**\r\n * Status bit set once all `DEATH` subscribers have run ({@link Event.AFTER_DEATH}).\r\n * @returns `2`.\r\n */\r\n static get AFTER_DEATH(): Event.AFTER_DEATH { return Event.#AFTER_DEATH }\r\n /**\r\n * Status bit set when the `LIFE` phase starts ({@link Event.PRE_LIFE}).\r\n * @returns `4`.\r\n */\r\n static get PRE_LIFE(): Event.PRE_LIFE { return Event.#PRE_LIFE }\r\n /**\r\n * Status bit set once all `LIFE` subscribers have run ({@link Event.AFTER_LIFE}).\r\n * @returns `8`.\r\n */\r\n static get AFTER_LIFE(): Event.AFTER_LIFE { return Event.#AFTER_LIFE }\r\n /**\r\n * Status bit set when the `LOAD` phase starts ({@link Event.PRE_LOAD}).\r\n * @returns `16`.\r\n */\r\n static get PRE_LOAD(): Event.PRE_LOAD { return Event.#PRE_LOAD }\r\n /**\r\n * Status bit set once all `LOAD` subscribers have run ({@link Event.AFTER_LOAD}).\r\n * @returns `32`.\r\n */\r\n static get AFTER_LOAD(): Event.AFTER_LOAD { return Event.#AFTER_LOAD }\r\n\r\n /**\r\n * Default Thread flag of event tasks (`TICK`, `LIFE`, `LOAD` and enhanced events without `threadFlag`).\r\n * @returns `128` ({@link Thread.EVENT_FLAG}).\r\n */\r\n static get THREAD_FLAG(): Thread.EVENT_FLAG { return Event.#THREAD_FLAG }\r\n\r\n /**\r\n * Shared listener options for passive DOM listeners.\r\n * @returns `{ passive: true }`.\r\n */\r\n static get PASSIVE(): { passive: true } { return Event.#PASSIVE }\r\n /**\r\n * Shared listener options for DOM listeners that need to call `preventDefault`.\r\n * @returns `{ passive: false }`.\r\n */\r\n static get IMPASSIVE(): { passive: false } { return Event.#IMPASSIVE }\r\n\r\n /**\r\n * Current lifecycle status, a bitmask of the `PRE_*` / `AFTER_*` bits. `0` until the first navigation hook runs.\r\n * @returns The status bitmask.\r\n * @example\r\n * ```ts\r\n * if (Up.Event.status & Up.Event.AFTER_LOAD) console.log('Page fully loaded')\r\n * ```\r\n */\r\n static get status(): number { return Event.#status }\r\n /**\r\n * Time (`performance.now()`, ms) at which the current `LIFE` phase started.\r\n * @returns The timestamp, or `-1` before the first `LIFE`.\r\n */\r\n static get lifeIn (): number { return Event.#lifeIn }\r\n /**\r\n * Time (`performance.now()`, ms) at which the latest `DEATH` phase started.\r\n * @returns The timestamp, or `-1` before the first `DEATH`.\r\n */\r\n static get deathIn(): number { return Event.#deathIn }\r\n\r\n// #METHODS\r\n\r\n // ##CONSTRUCT\r\n /**\r\n * Adds enhanced event descriptors from {@link Event.CONFIG.enhance} to the registry.\r\n */\r\n static #constructData(enhance: NonNullable<Event.CONFIG['enhance']>): void\r\n {\r\n for (let i = 0, max = enhance.length; i < max; i++)\r\n {\r\n const DATA = enhance[i]\r\n\r\n if (typeof DATA === 'string') (Event.#DATA as Map<string, Event.DATA>).set(DATA,\r\n {\r\n forever : false,\r\n crushed : true,\r\n on : 'window',\r\n waitState : 0,\r\n threadFlag: Event.#THREAD_FLAG,\r\n callback : Event.App.void\r\n })\r\n else (Event.#DATA as Map<string, Event.DATA>).set(DATA.key,\r\n {\r\n crushed : true,\r\n on : DATA.on ?? 'window',\r\n callback: Event.App.void,\r\n ...(DATA.forever\r\n ? {\r\n forever : true,\r\n threadFlag: DATA.threadFlag || Event.#THREAD_FLAG\r\n }\r\n : {\r\n forever : false,\r\n waitState: 'waitDelay' in DATA && DATA.waitDelay > 0\r\n ? DATA.waitType === 'debounce'\r\n ? DATA.waitDelay\r\n : DATA.waitType === 'throttle'\r\n ? -DATA.waitDelay\r\n : 0\r\n : 0,\r\n threadFlag: DATA.threadFlag ?? Event.#THREAD_FLAG,\r\n }\r\n )\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * Builds the event registry and subscriber callstacks, wraps each runner with its Thread flag and debounce / throttle,\r\n * and starts the `TICK` forever task. Merges `staticFilesConfig` onto the defaults when provided.\r\n * Does nothing outside the browser.\r\n * @internal\r\n * @param config Optional {@link Event.CONFIG}.\r\n */\r\n static [construct](config?: Event.CONFIG): void\r\n {\r\n if (!Event.Adapter.BROWSER) return\r\n\r\n if (config)\r\n {\r\n if (config.staticFilesConfig) Parser.copy(Event.#STATIC_FILES_CONFIG, config.staticFilesConfig)\r\n\r\n if (config.enhance) Event.#constructData(config.enhance)\r\n }\r\n \r\n for (const [KEY, DATA] of Event.#DATA as Map<Event.KEY, Event.DATA>)\r\n {\r\n const\r\n CALLSTACK: Event.CALLBACK[] = [],\r\n caller = Event.#caller.bind(null, CALLSTACK),\r\n callback = DATA.crushed\r\n ? caller\r\n : (DATA.callback as (caller: Event.CALLER, ...args: any) => void | Thread.GENERATOR).bind(null, caller)\r\n\r\n Event.#MANAGER.set(KEY, CALLSTACK)\r\n\r\n if (DATA.forever)\r\n {\r\n Event.Thread.markForever(callback)\r\n Event.#getThreadSubscription(KEY, callback, DATA.threadFlag)() // *Let's call him directly\r\n\r\n DATA.callback = callback\r\n }\r\n else if (DATA.threadFlag)\r\n {\r\n DATA.callback = Event.#getThreadSubscription(KEY, callback, DATA.threadFlag)\r\n\r\n if (DATA.waitState)\r\n {\r\n // *It is essential to return the generator to the thread in order to take advantage of its benefits and, most importantly, to be able to execute the generators.\r\n // *The \"waiters\" take us out of the thread, and we can't put them ahead of the task because we have modifiers that are waiting for real-time updates.\r\n // *To solve the problem, we break it down into two separate tasks.\r\n \r\n DATA.callback = Event.#getThreadSubscription(KEY, Event.#getWaiter(DATA.callback, DATA.waitState), DATA.threadFlag)\r\n }\r\n }\r\n else DATA.callback = DATA.waitState ? Event.#getWaiter(callback, DATA.waitState) : callback // *Do not use \"Wait.frame\"\r\n\r\n if ('method' in DATA && DATA.method) Event[DATA.method] = DATA.callback as any\r\n }\r\n }\r\n\r\n // ##SET\r\n /**\r\n * Sets the static-file root and creates the `ResizeObserver`.\r\n */\r\n static #setVars(): void\r\n {\r\n Event.#STATIC_FILES_CONFIG.limiter = Event.Adapter.root\r\n\r\n Event.#resizeObserver = new ResizeObserver(Event.#oResize)\r\n }\r\n\r\n /**\r\n * Subscribes to adapter navigation hooks and attaches DOM listeners.\r\n */\r\n static #setEvents(): void\r\n {\r\n Event.Adapter.sub(Event.#ADAPTER_TICKETS)\r\n\r\n for (const [KEY, DATA] of Event.#DATA)\r\n if (DATA.on !== 'independent') (DATA.on === 'window' ? window : document).addEventListener(KEY, DATA.callback as () => void, Event.#PASSIVE)\r\n }\r\n\r\n /**\r\n * Observes the app root (or `document.body`) for `EARTHQUAKE`.\r\n */\r\n static #setObservers(): void { Event.#resizeObserver!.observe(Event.Adapter.root ?? document.body, { box: 'content-box' }) }\r\n\r\n /**\r\n * Attaches navigation hooks, DOM listeners and the `ResizeObserver`. Called from `Up.set` in the browser.\r\n * @internal\r\n */\r\n static [set](): void\r\n {\r\n Event.#setVars()\r\n Event.#setEvents()\r\n Event.#setObservers()\r\n }\r\n\r\n // ##GET\r\n /**\r\n * Records `task` for teardown and returns a function scheduling it on the Thread with `flag`.\r\n */\r\n static #getThreadSubscription(key: keyof EventData, task: Thread.TASK, flag: Thread.FLAG): (...args: any) => void\r\n {\r\n const TICKETS = Event.#THREAD_TICKETS.get(key)\r\n\r\n TICKETS\r\n ? TICKETS.push([task, flag])\r\n : Event.#THREAD_TICKETS.set(key, [[task, flag]])\r\n\r\n return Event.Thread.sub.bind(null, task, flag)\r\n }\r\n\r\n /**\r\n * Wraps `task` with a trailing debounce (`waitState > 0`) or a trailing throttle (`waitState < 0`).\r\n */\r\n static #getWaiter(task: Thread.TASK, waitState: number): Thread.TASK\r\n {\r\n return waitState > 0\r\n ? Wait.debounce(task, waitState, false)\r\n : Wait.throttle(task, waitState * -1, true, false)\r\n }\r\n\r\n // ##ADD\r\n /**\r\n * Adds `callback` to the callstack of `key` (no duplicates), or calls it immediately (see {@link Event.sub}).\r\n */\r\n static #add(key: Event.KEY, callback: Event.CALLBACK): void\r\n {\r\n if (key === 'LOAD' && Event.#status & Event.#PRE_LOAD)\r\n {\r\n callback()\r\n\r\n return\r\n }\r\n\r\n const CALLSTACK = Event.#MANAGER.get(key)\r\n\r\n if (!CALLSTACK) callback()\r\n else if (!CALLSTACK.includes(callback)) CALLSTACK.push(callback)\r\n }\r\n\r\n // ##REMOVE\r\n /**\r\n * Removes `callback` from the callstack of `key`.\r\n */\r\n static #remove(key: Event.KEY, callback: Event.CALLBACK): void\r\n {\r\n Wait.cancel(callback)\r\n \r\n const CALLSTACK = Event.#MANAGER.get(key)\r\n\r\n if (!CALLSTACK) return\r\n \r\n const INDEX = CALLSTACK.indexOf(callback)\r\n\r\n if (~INDEX) CALLSTACK.splice(INDEX, 1)\r\n }\r\n\r\n // ##UPDATES\r\n /**\r\n * Applies `action` to one ticket or to each ticket of an array.\r\n */\r\n static #update(pass: Event.Pass<Event.SUBSCRIBER | undefined>, action: (...ticket: Event.TICKET | Event.TICKET_CUSTOM) => void): void\r\n {\r\n if (typeof pass[0] === 'string') return action(...pass)\r\n\r\n for (let i = 0, max = pass.length; i < max; i++) action(...pass[i])\r\n }\r\n\r\n // ##DESTROY\r\n /**\r\n * Clears callstacks and disconnects the `ResizeObserver`.\r\n */\r\n static #destroyVars(): void\r\n {\r\n if (Event.#MANAGER.size) Event.#MANAGER.clear()\r\n \r\n if (Event.#resizeObserver)\r\n {\r\n Event.#resizeObserver.disconnect()\r\n\r\n Event.#resizeObserver = null\r\n }\r\n }\r\n\r\n /**\r\n * Unsubscribes and cancels every Thread task created for events.\r\n */\r\n static #destroyTasks(): void\r\n {\r\n for (const [_, TICKETS] of Event.#THREAD_TICKETS) for (let i = 0, max = TICKETS.length; i < max; i++)\r\n {\r\n const task = TICKETS[i][0]\r\n \r\n Event.Thread.unsub(task)\r\n Wait.cancel(task)\r\n }\r\n }\r\n\r\n /**\r\n * Detaches navigation hooks and DOM listeners and cancels pending waits.\r\n */\r\n static #destroyEvents(): void\r\n {\r\n Event.Adapter.unsub(Event.#ADAPTER_TICKETS)\r\n \r\n for (const [KEY, DATA] of Event.#DATA)\r\n {\r\n if (DATA.on !== 'independent') (DATA.on === 'window' ? window : document).removeEventListener(KEY, DATA.callback as () => void)\r\n\r\n Wait.cancel(DATA.callback)\r\n }\r\n }\r\n\r\n /**\r\n * Removes all subscribers, listeners, observers and event tasks. Called from `Up.destroy` in the browser.\r\n * @internal\r\n */\r\n static [destroy](): void\r\n {\r\n Event.#destroyVars()\r\n Event.#destroyTasks()\r\n Event.#destroyEvents()\r\n }\r\n\r\n // ##EVENTS\r\n /**\r\n * Adapter `ON_NAVIGATE` hook: runs the `DEATH` phase (leave current page once navigation is committed).\r\n */\r\n static #eOnNavigate(): void\r\n {\r\n Event.#status = Event.#PRE_DEATH\r\n Event.#deathIn = performance.now()\r\n\r\n ;(Event[eDeath] as any)()\r\n\r\n Event.#status |= Event.#AFTER_DEATH\r\n }\r\n\r\n /**\r\n * Adapter `AFTER_NAVIGATE` hook: runs the `LIFE` phase, waits for readiness, then runs the `LOAD` phase.\r\n */\r\n static async #eAfterNavigate(): Promise<void>\r\n {\r\n let res = Event.App.void\r\n \r\n Event.#status = Event.#PRE_LIFE\r\n Event.#lifeIn = performance.now()\r\n \r\n Event[eLife](new Promise((r): void => { res = r }))\r\n\r\n await Event.Thread.wait(Event.#THREAD_TICKETS.get('LIFE')![0][0])\r\n\r\n Event.#status |= Event.#AFTER_LIFE\r\n\r\n res()\r\n\r\n await Event.Adapter.tick() // *Wait for updates brought by the \"LIFE\" event\r\n await Wait.staticFiles(Event.#STATIC_FILES_CONFIG) // *Static readiness before LOAD (see CONFIG.staticFilesConfig / #STATIC_FILES_CONFIG)\r\n await Event.App.wait\r\n\r\n Event.#status |= Event.#PRE_LOAD\r\n\r\n Event[eLoad](new Promise((r): void => { res = r }))\r\n\r\n await Event.Thread.wait(Event.#THREAD_TICKETS.get('LOAD')![0][0])\r\n\r\n Event.#status |= Event.#AFTER_LOAD\r\n\r\n res()\r\n }\r\n\r\n /**\r\n * `TICK` runner: calls subscribers with the current frame timestamp.\r\n * @internal\r\n */\r\n static [eTick](caller: Event.CALLER, timestamp = Event.Thread.timestamp): Thread.GENERATOR { return caller(timestamp) }\r\n\r\n /**\r\n * `LIFE` trigger (signature placeholder, replaced by the scheduled runner in `[construct]`).\r\n * @internal\r\n */\r\n static [eLife](promise: Promise<void>): void {}\r\n\r\n /**\r\n * `DEATH` runner: calls every subscriber synchronously.\r\n * @internal\r\n */\r\n static [eDeath](caller: Event.CALLER): void\r\n {\r\n const GEN = caller()\r\n\r\n while (!GEN.next().done) {}\r\n }\r\n\r\n /**\r\n * `LOAD` trigger (signature placeholder, replaced by the scheduled runner in `[construct]`).\r\n * @internal\r\n */\r\n static [eLoad](promise: Promise<void>): void {}\r\n\r\n /**\r\n * `EARTHQUAKE` trigger (signature placeholder, replaced by the scheduled runner in `[construct]`).\r\n * @internal\r\n */\r\n static [eEarthquake](o: ResizeObserverEntry[]): void {}\r\n\r\n /**\r\n * `visibilitychange` runner: pauses or resumes the Thread, then calls every subscriber synchronously with `document.hidden`.\r\n * @internal\r\n */\r\n static [eVisibilitychange](caller: Event.CALLER): void\r\n {\r\n Event.Thread[document.hidden ? stop : start]()\r\n\r\n const GEN = caller(document.hidden)\r\n\r\n while (!GEN.next().done) {}\r\n }\r\n\r\n /**\r\n * `resize` trigger (signature placeholder, replaced by the DOM listener in `[construct]`).\r\n * @internal\r\n */\r\n static [eResize](e: Event): void {}\r\n\r\n /**\r\n * `scroll` trigger (signature placeholder, replaced by the DOM listener in `[construct]`).\r\n * @internal\r\n */\r\n static [eScroll](e: Event): void {}\r\n\r\n // ##OBSERVERS\r\n /**\r\n * `ResizeObserver` callback forwarding entries to `EARTHQUAKE`.\r\n */\r\n static #oResize(o: ResizeObserverEntry[]): void\r\n {\r\n // TODO: Earthquake ne devrait peut-être pas être un événements mais avoir un Plugin dédié permettant de fragmenter l'app en zone observable.\r\n // *Ici les earthquake se déclenchent aussi sur la largeur.\r\n Event[eEarthquake](o)\r\n }\r\n\r\n // ##UTILS\r\n /**\r\n * Subscribes one or several tickets.\r\n * Without `subscriber`, each `[key, callback]` ticket ({@link Event.TICKET}) is added to the Event manager.\r\n * Subscribing the same callback twice to the same key has no effect, and subscribers of an event run in reverse subscription order.\r\n * With `subscriber`, each `[key, callback, options?]` ticket ({@link Event.TICKET_CUSTOM}) is passed to `subscriber.addEventListener`.\r\n * @note Without `subscriber`, the callback is called once immediately, with no arguments, and is not stored when:\r\n * the key is unknown or not registered (including on the server), or the key is `LOAD` and the current `LOAD` phase has already started.\r\n * @param pass A ticket or an array of tickets.\r\n * @param subscriber Optional listener target (`window`, `document`, an `Element`, …).\r\n * @example\r\n * ```ts\r\n * const onResize = (): void => console.log(Up.App.w, Up.App.h)\r\n * const onClick = (e: MouseEvent): void => console.log(e.clientX)\r\n *\r\n * Up.Event.sub([['LOAD', () => console.log('Page ready')], ['resize', onResize]])\r\n * Up.Event.sub(['click', onClick, Up.Event.PASSIVE], document.body)\r\n * ```\r\n */\r\n static sub<T extends undefined | Event.SUBSCRIBER = undefined>(pass: Event.Pass<T>, subscriber?: T): void\r\n {\r\n Event.#update(pass, (\r\n subscriber\r\n ? subscriber.addEventListener.bind(subscriber)\r\n : Event.#add as any\r\n )\r\n )\r\n }\r\n\r\n /**\r\n * Unsubscribes one or several tickets previously passed to {@link Event.sub}.\r\n * Callbacks are matched by reference, so pass the same function (and the same `subscriber`) used to subscribe.\r\n * @param pass A ticket or an array of tickets.\r\n * @param subscriber The listener target used when subscribing, if any.\r\n * @example\r\n * ```ts\r\n * Up.Event.unsub(['resize', onResize])\r\n * Up.Event.unsub(['click', onClick], document.body)\r\n * ```\r\n */\r\n static unsub<T extends undefined | Event.SUBSCRIBER = undefined>(pass: Event.Pass<T>, subscriber?: T): void\r\n {\r\n Event.#update(pass, (\r\n subscriber\r\n ? subscriber.removeEventListener.bind(subscriber)\r\n : Event.#remove as any\r\n )\r\n )\r\n }\r\n\r\n // ##GENERATORS\r\n /**\r\n * Calls each subscriber of `callstack` with `args`, from last to first, yielding after each call.\r\n */\r\n static *#caller(callstack: Event.CALLBACK[], ...args: any[]): Thread.GENERATOR\r\n {\r\n // ?The call starts at the end because the stack can be modified.\r\n for (let i = callstack.length - 1; i > -1; i--)\r\n {\r\n callstack[i](...args)\r\n\r\n yield\r\n }\r\n }\r\n\r\n}\r\n\r\n// #EXPORTS\r\n\r\n // ##THIS\r\nexport default Event\r\n\r\nexport type {\r\n Event,\r\n EventData\r\n}"],"mappings":"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","names":[]}
@@ -5,17 +5,18 @@ const FOREVER = /* @__PURE__ */ Symbol("FOREVER");
5
5
  class Thread {
6
6
  // #PROPS
7
7
  // ##STATICS
8
- /**
9
- * Shared inheritance stack (starts with `[Adapter, App, Thread]`) used by the module getters.
10
- * @internal
11
- */
12
- static [INHERITANCE] = App.HRT.hydrate(Thread);
13
8
  static #MAX_FLAG = 4096;
14
9
  static #MODIFIERS_MAP = /* @__PURE__ */ new Map();
15
10
  static #FLOW_MAP = /* @__PURE__ */ new Map();
16
11
  static #FOREVER_MAP = /* @__PURE__ */ new Map();
17
12
  static #FLOW_LISTED = /* @__PURE__ */ new Map();
18
13
  static #FOREVER_LISTED = /* @__PURE__ */ new Map();
14
+ /**
15
+ * Shared HRT stack after hydrating `App` (`[Adapter, App]`); later modules append `Thread`, `Event`.
16
+ * Same array as `App[INHERITANCE]` — does not include `Thread` itself.
17
+ * @internal
18
+ */
19
+ static [INHERITANCE] = App.HRT.hydrate(App);
19
20
  static #tickerState = -1;
20
21
  static #tickID = -1;
21
22
  static #timestamp = 0;
@@ -43,14 +44,14 @@ class Thread {
43
44
  * @returns The adapter class.
44
45
  */
45
46
  static get Adapter() {
46
- return Thread[INHERITANCE][0];
47
+ return App[INHERITANCE][0];
47
48
  }
48
49
  /**
49
50
  * Application runtime (same as {@link Up.App}).
50
51
  * @returns The {@link App} class.
51
52
  */
52
53
  static get App() {
53
- return Thread[INHERITANCE][1];
54
+ return App;
54
55
  }
55
56
  /**
56
57
  * Highest allowed flag, also the default flag of {@link Thread.sub}.