@moku-labs/game 0.15.27 → 0.15.29

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,7 +1,7 @@
1
- import { Er as Json, Qn as FeaturePlugin, br as FakeClock, er as AnyFlow, hr as NodeFx, mr as Hint, or as NodeTable, ur as Descriptor, vr as ClockSource } from "./types-DFROr3sM.mjs";
2
- import { t as createApp } from "./index-CURQhlzb.mjs";
3
- import { b as saveOf, v as WithGameState, y as memory } from "./types-DHxDVC5b.mjs";
4
- import { a as createHeadless, i as ReproResult, n as HeadlessGame, o as runRepro, r as Repro, s as stepFrames, t as HeadlessApp } from "./headless-DDymHw9o.mjs";
1
+ import { $n as FeaturePlugin, Dr as Json, dr as Descriptor, gr as NodeFx, hr as Hint, sr as NodeTable, tr as AnyFlow, xr as FakeClock, yr as ClockSource } from "./types-D27I4Q7b.mjs";
2
+ import { t as createApp } from "./index-Cl5zwodk.mjs";
3
+ import { b as saveOf, v as WithGameState, y as memory } from "./types-Cyu_jKop.mjs";
4
+ import { a as createHeadless, i as ReproResult, n as HeadlessGame, o as runRepro, r as Repro, s as stepFrames, t as HeadlessApp } from "./headless-f31cEZ7f.mjs";
5
5
  import { AnyPluginInstance } from "@moku-labs/core";
6
6
 
7
7
  //#region src/plugins/clock/fake.d.ts
package/dist/testing.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { en as refuseStart, in as type, m as flattenFeatures, t as createApp, tn as exit } from "./src-DLs4b_Vs.mjs";
1
+ import { en as refuseStart, in as type, m as flattenFeatures, t as createApp, tn as exit } from "./src-wyJYr12n.mjs";
2
2
  import { n as saveOf, t as memory } from "./memory-CWlqhS7l.mjs";
3
3
  import { t as fakeClock } from "./fake-6mazmHK3.mjs";
4
4
  import { i as stepFrames, r as runRepro, t as createHeadless } from "./headless-Bxxl_mQX.mjs";
@@ -1,4 +1,4 @@
1
- import { An as ProjectionMotion, Cn as ChangeHook, Dn as MotionCause, En as Motion, Er as Json, Fn as ViewHandle, G as TransformValue, In as Api$1, J as Api$3, Kr as Api, Mn as ReducedMotion, On as MotionHandle, Sn as TagType, Tn as Ease, _r as Api$5, cn as AnyComponentValue, dn as ComponentType, gr as Answer, kn as NumericFields, mr as Hint, ni as Require, on as AnyComponent, pn as Entity, s as Events$1, sn as AnyComponentType, t as Api$4, tn as Api$2, ur as Descriptor, ut as ViewportSize } from "./types-DFROr3sM.mjs";
1
+ import { An as NumericFields, Cn as TagType, Dn as Motion, Dr as Json, En as Ease, In as ViewHandle, K as TransformValue, Ln as Api$1, Nn as ReducedMotion, On as MotionCause, Y as Api$3, _r as Answer, cn as AnyComponentType, dr as Descriptor, dt as ViewportSize, fn as ComponentType, hr as Hint, jn as ProjectionMotion, kn as MotionHandle, ln as AnyComponentValue, mn as Entity, nn as Api$2, qr as Api, ri as Require, s as Events$1, sn as AnyComponent, t as Api$4, vr as Api$5, wn as ChangeHook } from "./types-D27I4Q7b.mjs";
2
2
  import { Log } from "@moku-labs/common/browser";
3
3
  import { PluginCtx } from "@moku-labs/core";
4
4
  import { Node, Yoga } from "yoga-layout/load";
@@ -2790,6 +2790,12 @@ type Root = {
2790
2790
  h: number;
2791
2791
  } | undefined;
2792
2792
  pending?: boolean;
2793
+ /**
2794
+ * Present from the reconcile that found the root in the scene `world` builds aside (spec 31)
2795
+ * until the reconcile that finds it committed, which gives the slots out again. Absent on every
2796
+ * other root.
2797
+ */
2798
+ aside?: true;
2793
2799
  };
2794
2800
  /**
2795
2801
  * Where the focus ring was last drawn: the layer and order of its root, the rect grown by the
@@ -2950,6 +2956,7 @@ type JsxState = {
2950
2956
  /**
2951
2957
  * The elements whose `Box` came since the last `sync`: their enter hooks played at the `Box` (F49) and are settled
2952
2958
  * there, after the game's systems, played again when a system changed what a hook read (F48). The first `count` slots are the queue; the array keeps its length, so a frame allocates nothing.
2959
+ * An element of a scene `world` builds aside stays queued, its hook unplayed, until the swap (spec 31).
2953
2960
  */
2954
2961
  entering: {
2955
2962
  list: Entity[];
@@ -2969,7 +2976,8 @@ type JsxState = {
2969
2976
  written: number; /** The wall times of the last taps on a `DebugTrigger` view, five at the most. */
2970
2977
  debugTaps: number[]; /** Whether `ui:debug-trigger-no-agent` was logged: once per app. */
2971
2978
  debugWarned: boolean; /** Elements that carry `Overlay`, from their enter to their despawn (spec 22 O4.5). */
2972
- overlays: Set<Entity>;
2979
+ overlays: Set<Entity>; /** How many roots carry `aside`, as the last reconcile counted them: 0 while no scene is built aside. */
2980
+ asideRoots: number;
2973
2981
  };
2974
2982
  /**
2975
2983
  * One node of the snapshot `tree()` answers with. `rect` is natural: under a `fit` ancestor it
@@ -1,5 +1,5 @@
1
- import { Er as Json, Fr as Snapshot } from "./types-DFROr3sM.mjs";
2
- import { t as HeadlessApp } from "./headless-DDymHw9o.mjs";
1
+ import { Dr as Json, Ir as Snapshot } from "./types-D27I4Q7b.mjs";
2
+ import { t as HeadlessApp } from "./headless-f31cEZ7f.mjs";
3
3
  import { Log } from "@moku-labs/common/browser";
4
4
 
5
5
  //#region src/plugins/flow/doors/types.d.ts
@@ -1,7 +1,7 @@
1
- import { Er as Json, Ir as SnapshotOf, Mr as ProviderCall, Nr as SaveDoc, Q as PixiModule, Qn as FeaturePlugin, Rn as Config$1, Y as Config$2, a as Config$3, br as FakeClock, ct as Orientation, d as Manifest, er as AnyFlow, jr as PlayerStateProvider, lr as TypeTag, n as AssetsIo, vr as ClockSource, wr as Config } from "./types-DFROr3sM.mjs";
2
- import { o as AudioContextLike, s as Config$4 } from "./types-BbuRDHDK.mjs";
3
- import { R as I18nApi, U as StringTable, W as TextKey } from "./types--1Zq5_6Q.mjs";
4
- import { St as effectsPlugin, Tt as audioPlugin, ht as PlatformProvider, i as screen, pt as platformPlugin, t as createApp } from "./index-CURQhlzb.mjs";
1
+ import { $ as PixiModule, $n as FeaturePlugin, Dr as Json, Lr as SnapshotOf, Mr as PlayerStateProvider, Nr as ProviderCall, Pr as SaveDoc, Tr as Config, X as Config$2, a as Config$3, d as Manifest, lt as Orientation, n as AssetsIo, tr as AnyFlow, ur as TypeTag, xr as FakeClock, yr as ClockSource, zn as Config$1 } from "./types-D27I4Q7b.mjs";
2
+ import { o as AudioContextLike, s as Config$4 } from "./types-DjQkfbfZ.mjs";
3
+ import { R as I18nApi, U as StringTable, W as TextKey } from "./types-BAp9HdR4.mjs";
4
+ import { St as effectsPlugin, Tt as audioPlugin, ht as PlatformProvider, i as screen, pt as platformPlugin, t as createApp } from "./index-Cl5zwodk.mjs";
5
5
  import { AnyPluginInstance } from "@moku-labs/core";
6
6
 
7
7
  //#region src/plugins/model/store/providers/memory.d.ts
@@ -3969,14 +3969,16 @@ type Motion = MotionHandle | void;
3969
3969
  /**
3970
3970
  * Why a motion hook plays: `"mount"` when the view or element comes or goes with its screen (a scene mount or
3971
3971
  * unmount, a load, a restore, a paused or fast world), `"change"` when a commit changed a live screen (a new key,
3972
- * a key that left, a new element in a live tree, a popup).
3972
+ * a key that left, a new element in a live tree, a popup). `"discard"` when an aborted scene build dropped the view
3973
+ * before it was ever drawn (`projection.discard()`): it plays no exit, so a game's hook never sees it; the removal
3974
+ * hook of `ui` reads it through `causeOf` and drops the root at once.
3973
3975
  *
3974
3976
  * @example
3975
3977
  * ```ts
3976
3978
  * const cause: MotionCause = "change";
3977
3979
  * ```
3978
3980
  */
3979
- type MotionCause = "mount" | "change";
3981
+ type MotionCause = "mount" | "change" | "discard";
3980
3982
  /**
3981
3983
  * What reduced motion does to one track: `"cut"` (the default) lands it on its target at the next frame step, or holds
3982
3984
  * a loop on its first key; `"keep"` plays it as written. The engine never guesses which tracks are fades: the author
@@ -4378,6 +4380,11 @@ type Mounted = {
4378
4380
  * identity: a `mount` under the same list is a second mount of one scene, a `mount` under a new one keeps it.
4379
4381
  */
4380
4382
  layers: ReadonlyArray<LayerSpec>;
4383
+ /**
4384
+ * The state of its last reconcile: a play reconcile against the same `player` and `session` trees changes nothing
4385
+ * and is passed over (the frame after a scene mounted it direct). Absent before the first reconcile.
4386
+ */
4387
+ seen?: Snapshot;
4381
4388
  };
4382
4389
  /**
4383
4390
  * One track the projection started on the driver. The world keeps the component name and the
@@ -4476,7 +4483,29 @@ type ProjectionState = {
4476
4483
  * The despawn count of the ecs when the sweep last looked for dead elements; -1 after a new
4477
4484
  * key, so the next sweep looks.
4478
4485
  */
4479
- sweptDespawns: number;
4486
+ sweptDespawns: number; /** The running build of the next scene; absent when none runs, never written as `undefined`. */
4487
+ building?: Building; /** The `onBuild` checks: every one answers true before `built()` does. Kept across builds. */
4488
+ buildChecks: Array<() => boolean>;
4489
+ };
4490
+ /**
4491
+ * The build of the next scene aside (spec 31): its projections mounted into a table of their own, so a name never has
4492
+ * two records in `mounted`, and every entity the build spawned, so `isBuilding` answers with one lookup. Absent while
4493
+ * no build runs.
4494
+ */
4495
+ type Building = {
4496
+ /** The projection list of the coming scene, in its order: the places of its screen roots. */names: readonly string[]; /** The layer list of the coming scene, as the caller handed it: the build checked the names against it. */
4497
+ layers: ReadonlyArray<LayerSpec>; /** Who owns the entities of the projections the build mounts. */
4498
+ owner: Owner; /** The projections only the coming list names, mounted aside until the commit moves them into `mounted`. */
4499
+ mounted: Map<string, Mounted>; /** Every entity of the build: the views it spawned and the entities `adopt` marked. */
4500
+ entities: Set<Entity>; /** The game clock at the start of this frame (world's `input` phase), or at the build start in its own frame. */
4501
+ frameStart: number; /** Milliseconds per frame the building work may take. */
4502
+ budgetMs: number;
4503
+ /**
4504
+ * Whether a reconcile passed over a mounted projection the coming list drops, which keeps what it showed when the
4505
+ * switch began: `"change"`, or `"rerun"` when that reconcile forced `view`. The commit and the discard then mark the
4506
+ * world dirty, so one still mounted reads the store in the next frame. Absent while none was passed over.
4507
+ */
4508
+ held?: "change" | "rerun";
4480
4509
  };
4481
4510
  /**
4482
4511
  * projection module API, `app.world.projection`: the bridge from the model to entities.
@@ -4675,8 +4704,8 @@ type ProjectionApi = {
4675
4704
  membershipVersion(): number;
4676
4705
  /**
4677
4706
  * How the view of an entity came, or how it is leaving: `"mount"` when a direct reconcile or an unmount moved it,
4678
- * `"change"` when a live commit did. A despawned view still answers until the next sweep, so a hook on its removal
4679
- * can ask. `undefined` for an entity no projection made.
4707
+ * `"change"` when a live commit did, `"discard"` when `discard()` dropped the build it belonged to. A despawned view
4708
+ * still answers until the next sweep, so a hook on its removal can ask. `undefined` for an entity no projection made.
4680
4709
  *
4681
4710
  * @param entity - A view, or a view in its removal hook.
4682
4711
  * @returns The cause, or `undefined`.
@@ -4739,11 +4768,12 @@ type ProjectionApi = {
4739
4768
  entityOf(projection: string, key: string): Entity | undefined;
4740
4769
  /**
4741
4770
  * The live view entities of a mounted projection, in the order of its model keys. A view that
4742
- * plays its exit is left out, and so is an element registered with `registerKey`. Every call
4743
- * hands out a new array.
4771
+ * plays its exit is left out, and so is an element registered with `registerKey`. A projection
4772
+ * the running build mounts answers its building views (`isBuilding` tells them apart), so a host
4773
+ * of the coming scene can take them before the swap. Every call hands out a new array.
4744
4774
  *
4745
4775
  * @param name - Name of the projection.
4746
- * @returns The entities, or `[]` when the projection is not mounted.
4776
+ * @returns The entities, or `[]` when the projection is neither mounted nor being built.
4747
4777
  * @example
4748
4778
  * ```ts
4749
4779
  * // `ui` hosts the board inside a slot and parents every board item to it on reconcile.
@@ -4859,6 +4889,161 @@ type ProjectionApi = {
4859
4889
  * ```
4860
4890
  */
4861
4891
  rerunAll(): void;
4892
+ /**
4893
+ * Starts building the next scene aside, while the current one stays mounted, drawn and alive. The projections only
4894
+ * the coming list names are mounted at once, direct, against the committed state, into a table of their own: their
4895
+ * views are spawned and flagged building (`isBuilding`), and their screen roots take the `Order` of their place in
4896
+ * the coming list. `entityOf` does not answer for them until `commit`. A projection the current scene mounts and
4897
+ * the coming list declares alike (F23) is not touched now. Answers `false` and touches nothing when a listed
4898
+ * projection is mounted now under other layer rules: building it beside its live twin would need two records under
4899
+ * one name, so the caller takes the one-block path (`setLayers`, `unmount`, `mount`). Nothing is built when the call
4900
+ * throws: the entities a throwing `view` left behind are despawned first.
4901
+ *
4902
+ * @param names - The projection list of the coming scene, in its order.
4903
+ * @param owner - Who owns the entities of the projections the build mounts.
4904
+ * @param layers - The layer list of the coming scene: the names are checked against it, not the current list.
4905
+ * @param budgetMs - Milliseconds per frame the building work of the other plugins may take, read through `left`.
4906
+ * @returns True when the build runs, false when a listed projection is mounted now under other layer rules.
4907
+ * @throws {Error} When a build already runs, for an unknown name, for a `layer` or `lift` the coming list does not
4908
+ * declare, and when a `view` throws.
4909
+ * @example
4910
+ * ```ts
4911
+ * // `scenes` leaves the ward, whose HUD draws in `ui` sorted by order.
4912
+ * const projection = ctx.require(worldPlugin).projection;
4913
+ *
4914
+ * // The shop sorts `ui` otherwise: nothing is built, `scenes` mounts the shop in one block.
4915
+ * projection.build(
4916
+ * ["hud", "shop.shelf"],
4917
+ * { kind: "plugin", name: "scenes" },
4918
+ * [{ name: "ui", sort: "none" }],
4919
+ * 4
4920
+ * ); // false
4921
+ *
4922
+ * // The board declares `ui` alike: the HUD stays, the board items are built aside.
4923
+ * projection.build(
4924
+ * ["board.items", "hud"],
4925
+ * { kind: "plugin", name: "scenes" },
4926
+ * [{ name: "items", sort: "y" }, { name: "ui", sort: "order" }],
4927
+ * 4
4928
+ * ); // true
4929
+ * projection.entityOf("board.items", "i7"); // undefined until the commit
4930
+ *
4931
+ * // A second build before the commit or the discard of the first:
4932
+ * projection.build(["shop.shelf"], { kind: "plugin", name: "scenes" }, [{ name: "ui", sort: "none" }], 4);
4933
+ * // throws: A scene is already being built
4934
+ * ```
4935
+ */
4936
+ build(names: readonly string[], owner: Owner, layers: ReadonlyArray<LayerSpec>, budgetMs: number): boolean;
4937
+ /**
4938
+ * Whether the running build is done: true when a build runs and every `onBuild` check answers true, false without a
4939
+ * build. A caller polls it once a frame; it is never an event.
4940
+ *
4941
+ * @returns True when the build can be committed.
4942
+ * @example
4943
+ * ```ts
4944
+ * // `scenes`, in its `signals` callback while the board builds:
4945
+ * const projection = ctx.require(worldPlugin).projection;
4946
+ * projection.built(); // false on the first build frame: the renderer still creates views
4947
+ * projection.built(); // true two frames later: commit now
4948
+ * ```
4949
+ */
4950
+ built(): boolean;
4951
+ /**
4952
+ * The swap of a build: its projections become mounted, each at the `Order` of its place in the coming list as
4953
+ * `mount` would write it, a kept projection (F23) takes its new place, every building flag clears and the table is
4954
+ * dropped. Each moved and kept projection takes the layer list `setLayers` stored just before, so the next scene
4955
+ * compares it by identity as after a `mount`. The loops of the moved views start in the next live sweep. Does nothing
4956
+ * without a build.
4957
+ *
4958
+ * @example
4959
+ * ```ts
4960
+ * // `scenes`, in the frame `built()` first answers true: the layers, the leaving list out, the build in.
4961
+ * const projection = ctx.require(worldPlugin).projection;
4962
+ * projection.setLayers([{ name: "items", sort: "y" }, { name: "ui", sort: "order" }]);
4963
+ * projection.unmount(["ward.beds"]);
4964
+ * projection.commit();
4965
+ * projection.entityOf("board.items", "i7"); // 1048600: mounted now
4966
+ * projection.built(); // false: nothing builds any more
4967
+ * ```
4968
+ */
4969
+ commit(): void;
4970
+ /**
4971
+ * Drops the running build: every entity it spawned, its views and the entities `adopt` marked, is despawned at once
4972
+ * with no motion, and the table is dropped. A dropped view leaves with the cause `"discard"`, which a removal hook
4973
+ * reads through `causeOf`. The mounted projections, the layer list and the scene of the world are not touched. Does
4974
+ * nothing without a build.
4975
+ *
4976
+ * @example
4977
+ * ```ts
4978
+ * // `scenes`: a restore aborted the node while the board was built.
4979
+ * const projection = ctx.require(worldPlugin).projection;
4980
+ * projection.discard();
4981
+ * projection.causeOf(1_048_600); // "discard", until the next sweep
4982
+ * projection.isBuilding(1_048_600); // false
4983
+ * ```
4984
+ */
4985
+ discard(): void;
4986
+ /**
4987
+ * Milliseconds of building budget left in this frame: the build's `budgetMs` minus the game clock time since the
4988
+ * frame started (read at the start of world's `input` phase). The clock counts whole milliseconds. Negative once
4989
+ * the frame spent more; `Infinity` with no build. Allocates nothing.
4990
+ *
4991
+ * @returns The milliseconds left, or `Infinity`.
4992
+ * @example
4993
+ * ```ts
4994
+ * // A renderer build step creates held views while the frame has budget, at least one a frame.
4995
+ * const projection = ctx.require(worldPlugin).projection;
4996
+ * projection.left(); // 3: 1 ms of the 4 ms budget is spent
4997
+ * projection.left(); // -1 after 4 ms more of views: the rest waits for the next frame
4998
+ * ```
4999
+ */
5000
+ left(): number;
5001
+ /**
5002
+ * Whether an entity belongs to the running build: a view it spawned, or an entity `adopt` marked. One set lookup;
5003
+ * false with no build and after the commit. Allocates nothing.
5004
+ *
5005
+ * @param entity - The entity to ask about.
5006
+ * @returns True for an entity of the running build.
5007
+ * @example
5008
+ * ```ts
5009
+ * // The renderer pass sorts the views of the coming scene out of its live work.
5010
+ * const projection = ctx.require(worldPlugin).projection;
5011
+ * projection.isBuilding(1_048_600); // true: a board item the build spawned
5012
+ * projection.isBuilding(1_048_576); // false: a ward bed on screen
5013
+ * ```
5014
+ */
5015
+ isBuilding(entity: Entity): boolean;
5016
+ /**
5017
+ * Registers one part of the build that has to be done before the swap: `built()` answers true only when every
5018
+ * registered check does. A registration stays across builds.
5019
+ *
5020
+ * @param check - Answers true when the caller's part of the running build is done.
5021
+ * @returns The remover; calling it twice is safe.
5022
+ * @example
5023
+ * ```ts
5024
+ * // The renderer, at start: its part is done when no building view waits for its Pixi object.
5025
+ * const off = ctx.require(worldPlugin).projection.onBuild(() => state.aside.count === 0);
5026
+ *
5027
+ * off(); // onStop: the renderer is gone
5028
+ * ```
5029
+ */
5030
+ onBuild(check: () => boolean): () => void;
5031
+ /**
5032
+ * Marks an entity another plugin spawned for a building root as building, so `isBuilding` answers for the whole
5033
+ * tree and `discard` despawns it with the rest. Does nothing with no build; the commit clears the mark with every
5034
+ * other.
5035
+ *
5036
+ * @param entity - The entity to mark.
5037
+ * @example
5038
+ * ```ts
5039
+ * // `ui` spawns an element of a building root and marks it right away.
5040
+ * const world = ctx.require(worldPlugin);
5041
+ * const button = world.ecs.spawn({ kind: "plugin", name: "ui" }, []);
5042
+ * world.projection.adopt(button);
5043
+ * world.projection.isBuilding(button); // true until the commit
5044
+ * ```
5045
+ */
5046
+ adopt(entity: Entity): void;
4862
5047
  };
4863
5048
  /**
4864
5049
  * projection methods the plugin root drives from the frame and the hooks. Not public.
@@ -4875,6 +5060,13 @@ type ProjectionInternal = {
4875
5060
  * Reconciles when the world is dirty. Runs at the start of `time` phase `input`.
4876
5061
  */
4877
5062
  reconcileIfDirty(): void;
5063
+ /**
5064
+ * Records the moment a frame starts, for the budget `left()` counts down. Runs first in `time`
5065
+ * phase `input`, with the moment `Now` gets; a frame without a build only reads a field.
5066
+ *
5067
+ * @param now - The game clock at the start of the frame.
5068
+ */
5069
+ startFrame(now: number): void;
4878
5070
  /**
4879
5071
  * Empties the hint buffer. Runs once per frame, reconcile or not.
4880
5072
  */
@@ -7137,9 +7329,11 @@ type PerfLongFrameLine = PerfLine<"longFrame"> & LongFrameEntry & {
7137
7329
  * it on the 2b debug build; `"pool-trim"` is the pool trim of spec 25, detail `PoolTrimDetail`; `"warm"` is the end of
7138
7330
  * a pipeline warm-up run of spec 27, detail `WarmDetail`; `"sections"` is a switch of the monitor's sections, detail
7139
7331
  * `{ on, off }`: the names of the sections on and off, in the order of `MONITOR_SECTIONS`; `"scale"` is a move of the
7140
- * render scale of the adaptive frame rate, detail `{ from, to, reason, fps }`).
7332
+ * render scale of the adaptive frame rate, detail `{ from, to, reason, fps }`; `"scene:build"` is the start of a
7333
+ * scene built aside on a live switch (spec 31), detail `{ from, to }`, and the `"scene"` line of its commit carries
7334
+ * `buildFrames`, `buildMs` and the budget of a frame it ran with, `budgetMs`, too).
7141
7335
  */
7142
- type PerfEventName = "scene" | "overlay" | "bundle" | "compile" | "upload" | "resolution" | "device-lost" | "device-restored" | "pause" | "resume" | "switch" | "display" | "command" | "recorder" | "rate" | "devtools" | "pool-trim" | "warm" | "shader" | "problem" | "debug" | "sections" | "scale";
7336
+ type PerfEventName = "scene" | "scene:build" | "overlay" | "bundle" | "compile" | "upload" | "resolution" | "device-lost" | "device-restored" | "pause" | "resume" | "switch" | "display" | "command" | "recorder" | "rate" | "devtools" | "pool-trim" | "warm" | "shader" | "problem" | "debug" | "sections" | "scale";
7143
7337
  /**
7144
7338
  * What an `overlay` event line says happened to an overlay (spec 22 O10.2): it opened, landed (its enter motion is
7145
7339
  * over), started to leave, is gone, or its range went live or was kept again (the live fallback).
@@ -10035,6 +10229,12 @@ type View = {
10035
10229
  hiddenSelf: number; /** The reasons that hide the whole subtree, on the top (`hidden.ts`). */
10036
10230
  hiddenTop: number; /** The HUD factor an overlay fades this view with (a `HudPart`), 1 for every other view (spec 22 O7). */
10037
10231
  hud: number;
10232
+ /**
10233
+ * A held top of a scene build (spec 31): a view of the next scene with no parent, or with a live parent, built while
10234
+ * the current scene stays drawn. It hangs nowhere in the stage, is listed in `SyncState.heldViews`, and is attached
10235
+ * in the pass after the commit.
10236
+ */
10237
+ held: boolean;
10038
10238
  };
10039
10239
  /**
10040
10240
  * The crop of a `"cover"` sprite: a texture that shows the part of `base` covering one box.
@@ -10795,8 +10995,10 @@ type SyncInternal = {
10795
10995
  */
10796
10996
  rebuildAll(): void;
10797
10997
  /**
10798
- * One pass over the change sets: removed, layers, added, changed, the views that lost their `Parent`, the orphans
10799
- * whose parent has a view now, the adapters' values, the invalidated keys and the nine-slice switch.
10998
+ * One pass over the change sets: removed, layers, the held views of a scene build that was committed, added, changed,
10999
+ * the views that lost their `Parent`, the orphans whose parent has a view now, the adapters' values, the invalidated
11000
+ * keys and the nine-slice switch; then, while a scene is built aside, the views of its aside queue under the build
11001
+ * budget (spec 31).
10800
11002
  */
10801
11003
  pass(): void;
10802
11004
  /**
@@ -10859,6 +11061,13 @@ type SyncInternal = {
10859
11061
  * @returns True when it drew a probe in this frame: the frame is then no sample of the adaptive rate.
10860
11062
  */
10861
11063
  warmStep(): boolean;
11064
+ /**
11065
+ * The render phase's half of a scene build (spec 31): tells whether the pass made views of the build aside in this
11066
+ * frame, and clears the count, so a frame the pass did not run in reads false. A field read and no allocation.
11067
+ *
11068
+ * @returns True when this frame did building work: such a frame is no sample of the adaptive rate.
11069
+ */
11070
+ takeBuildWork(): boolean;
10862
11071
  /**
10863
11072
  * Uploads up to `renderer.uploads` queued texture sources (F60), in a drawn frame, right after the warm-up's probes
10864
11073
  * and before the stage pass. Asks for the next frame while sources wait. One compare and no allocation while the
@@ -11165,6 +11374,28 @@ type SyncCounts = {
11165
11374
  views: number;
11166
11375
  pooled: number;
11167
11376
  };
11377
+ /**
11378
+ * The building entities whose view waits to be made (spec 31): sorted out of `added` by the pass while a scene is
11379
+ * built aside, made in chunks after the live pass under `world.projection.left()`. The queue is dense, from `head` to
11380
+ * `count`, in the order the pass sorted them, and emptied when the head reaches the end. Private to `sync`.
11381
+ */
11382
+ type AsideQueue = {
11383
+ entities: Entity[];
11384
+ count: number;
11385
+ head: number; /** The entities of the queue that have no view yet: a parent that waits here is made before its child. */
11386
+ waiting: Set<Entity>; /** The views the pass made aside in the current frame, read and cleared by the render phase (`takeBuildWork`). */
11387
+ made: number;
11388
+ };
11389
+ /**
11390
+ * The held tops of a scene build, in the order they were made (spec 31): dense, from 0 to `count`. A slot whose view
11391
+ * went, or that hangs under a building parent by now, is stale and skipped. Not `held`, the unseen cache of the
11392
+ * loops. Private to `sync`.
11393
+ */
11394
+ type HeldViews = {
11395
+ entities: Entity[];
11396
+ count: number; /** The dev check named a building view under the stage in this build: named once. */
11397
+ reported: boolean;
11398
+ };
11168
11399
  /**
11169
11400
  * sync module state.
11170
11401
  */
@@ -11248,7 +11479,9 @@ type SyncState = {
11248
11479
  */
11249
11480
  passesVersion: number; /** The filtered views' passes of `renderPassesOf`, counted at `passesVersion` `at` under `root`. */
11250
11481
  passes: PassCount; /** The name of the scene's HUD layer (`above: "overlays"`), kept with the layers; `undefined` without one. */
11251
- hudLayer: string | undefined;
11482
+ hudLayer: string | undefined; /** The building entities waiting for their view (spec 31). */
11483
+ aside: AsideQueue; /** The held tops of the scene build, attached in the pass after its commit (spec 31). */
11484
+ heldViews: HeldViews;
11252
11485
  cleanups: Array<() => void>;
11253
11486
  };
11254
11487
  /**
@@ -11283,7 +11516,7 @@ type PassCount = {
11283
11516
  enabled: boolean[];
11284
11517
  };
11285
11518
  declare namespace types_d_exports$1 {
11286
- export { AnySceneProjection, CheckedProjections, Config$1 as Config, DefineScene, Deps$1 as Deps, Events$1 as Events, KernelSlice$1 as KernelSlice, LayerMap, RunContext, SceneDefinition, SceneLayer, SceneOwner, SceneProjection, SceneSpec, SceneState, ScenesApi, ScenesCtx, SortRule, State$1 as State, UiLayer };
11519
+ export { AnySceneProjection, CheckedProjections, Config$1 as Config, DefineScene, Deps$1 as Deps, Events$1 as Events, KernelSlice$1 as KernelSlice, LayerMap, RunContext, SceneBuild, SceneDefinition, SceneLayer, SceneOwner, SceneProjection, SceneSpec, SceneState, ScenesApi, ScenesCtx, SortRule, State$1 as State, UiLayer };
11287
11520
  }
11288
11521
  /**
11289
11522
  * How a layer orders what is drawn in it. The scene's name for the rule `world` stores.
@@ -11478,15 +11711,45 @@ type SceneOwner = Owner & {
11478
11711
  name: "scenes";
11479
11712
  };
11480
11713
  /**
11481
- * scenes plugin config: none. A scene is data in a feature, and a transition effect is V3 work
11482
- * of `anim`, so a key here would have no reader.
11714
+ * scenes plugin config. A scene is data in a feature; the one key is the budget of a live switch.
11483
11715
  *
11484
11716
  * @example
11485
11717
  * ```ts
11486
- * const config: Config = {};
11718
+ * // The default: half of each frame, read at the start of every build: 8.33… ms at 60 Hz, 4.17 ms at 120 Hz.
11719
+ * const config: Config = { buildMs: "auto" };
11720
+ *
11721
+ * // A game on a slow phone gives the next scene a fixed 3 ms of each frame: the switch takes more frames.
11722
+ * const fixed: Config = { buildMs: 3 };
11487
11723
  * ```
11488
11724
  */
11489
- type Config$1 = Record<string, never>;
11725
+ type Config$1 = {
11726
+ /**
11727
+ * Milliseconds per frame the next scene's building work may take on a live switch with a
11728
+ * drawing renderer: a finite number above 0, or `"auto"` (the default) for half of the frame
11729
+ * interval the loop runs at, `500 / time.rate().fps`, read once at the build start.
11730
+ */
11731
+ buildMs: number | "auto";
11732
+ };
11733
+ /**
11734
+ * The running build of the next scene (spec 31): what the commit needs, and how to stop
11735
+ * listening. Absent while no build runs.
11736
+ */
11737
+ type SceneBuild = {
11738
+ /** The scene being built. */scene: SceneDefinition; /** The bundles it names, as they were awaited. */
11739
+ named: readonly string[]; /** The scene current at the build start, the one that leaves at the commit. */
11740
+ from: string | undefined; /** Frames the build waited in so far. */
11741
+ frames: number; /** The building budget of a frame the build runs with, ms: `buildMs`, or what `"auto"` gave at its start. */
11742
+ budgetMs: number; /** The page clock of an agent build at the build start, ms; 0 in a build without the flag. */
11743
+ startedAt: number; /** Removes the frame callback and the abort listener of the build. */
11744
+ off: () => void; /** Settles the switch once the build is committed, discarded or dropped by a stop. */
11745
+ resolve: () => void;
11746
+ /**
11747
+ * Rejects the switch when the commit threw.
11748
+ *
11749
+ * @param error - What the commit threw.
11750
+ */
11751
+ reject: (error: unknown) => void;
11752
+ };
11490
11753
  /**
11491
11754
  * scenes plugin state.
11492
11755
  */
@@ -11508,6 +11771,11 @@ type State$1 = {
11508
11771
  named: readonly string[];
11509
11772
  owner: SceneOwner; /** The remover of the `onEnter` callback: set in `onStart`, run in `onStop`. */
11510
11773
  teardown: (() => void) | undefined;
11774
+ /**
11775
+ * The build of the next scene on a live switch, from its start to its commit or discard.
11776
+ * Absent otherwise: deleted, never written as `undefined`.
11777
+ */
11778
+ build?: SceneBuild;
11511
11779
  };
11512
11780
  /**
11513
11781
  * scenes plugin events.
@@ -11583,7 +11851,11 @@ type Deps$1 = {
11583
11851
  world: Api$2;
11584
11852
  assets: Api;
11585
11853
  time: Api$7;
11586
- model: Api$5; /** The performance log of an agent build names every switch. */
11854
+ model: Api$5;
11855
+ /**
11856
+ * Whether the renderer draws, which chooses the path of a switch, and the performance log of
11857
+ * an agent build that names every switch.
11858
+ */
11587
11859
  renderer: Api$1;
11588
11860
  };
11589
11861
  /**
@@ -12207,7 +12479,12 @@ type State = {
12207
12479
  * The bundles a scene named before and the list names no more: held until a phase `sync` finds nothing carrying
12208
12480
  * `Exiting`, so a leaving scene's pictures stay until its elements played their exit (F51, F51b).
12209
12481
  */
12210
- sceneLeaving: string[]; /** How many entities carry `Exiting` now, counted from the world's `onAdded` and `onRemoved` of the tag. */
12482
+ sceneLeaving: string[];
12483
+ /**
12484
+ * The bundles of the scene being built aside, from the last `sceneComing` call: held like `sceneNamed` from the
12485
+ * build start until `sceneBundles` names them at the swap, or until a discarded build empties the list (F61 S2).
12486
+ */
12487
+ sceneComing: string[]; /** How many entities carry `Exiting` now, counted from the world's `onAdded` and `onRemoved` of the tag. */
12211
12488
  exiting: number; /** Registered companions, in registration order. */
12212
12489
  companions: BundleCompanion[]; /** A live rest was announced; the arriving node's `load` stage runs the release. */
12213
12490
  restPending: boolean;
@@ -12460,7 +12737,8 @@ type Api = {
12460
12737
  * released by `release: "leave"` while it stays in the list. A bundle the list named before and names no more
12461
12738
  * stays held until a phase `sync` finds nothing carrying `Exiting`, so a leaving scene's pictures stay until its
12462
12739
  * elements played their exit, also when the exit starts only in the frame after the switch; then a `"leave"` one
12463
- * goes (F51, F51b). Called by `scenes`; a game never calls it.
12740
+ * goes (F51, F51b). It empties the list of `sceneComing`: the coming scene is now the mounted one. Called by
12741
+ * `scenes`; a game never calls it.
12464
12742
  *
12465
12743
  * @param named - The bundle names of the mounted scene, the scene bundle first.
12466
12744
  * @example
@@ -12473,6 +12751,23 @@ type Api = {
12473
12751
  * ```
12474
12752
  */
12475
12753
  sceneBundles(named: readonly string[]): void;
12754
+ /**
12755
+ * Tells assets which bundles the scene being built aside names, while the scene before stays mounted (F61 S2).
12756
+ * Each call replaces the list. A bundle in it is held as a mounted scene's is: never a victim of the budget, never
12757
+ * released by `release: "leave"`. The next `sceneBundles` call empties it, because the coming scene is then the
12758
+ * mounted one; a discarded build calls it with `[]`. Called by `scenes`; a game never calls it.
12759
+ *
12760
+ * @param named - The bundle names of the coming scene, the scene bundle first.
12761
+ * @example
12762
+ * ```ts
12763
+ * // scenes, at the build start of the switch from the ward to the board of episode 1.
12764
+ * ctx.require(assetsPlugin).sceneComing(["board", "ep01"]);
12765
+ * // a rest or budget pressure during the build leaves board and ep01 loaded
12766
+ * ctx.require(assetsPlugin).sceneComing([]);
12767
+ * // the build was discarded: board and ep01 are held no more
12768
+ * ```
12769
+ */
12770
+ sceneComing(named: readonly string[]): void;
12476
12771
  /**
12477
12772
  * Tells whether the manifest carries a bundle, loaded or not. It reads the manifest only, so it
12478
12773
  * answers the same live and headless.
@@ -12592,4 +12887,4 @@ type BundleCompanion = {
12592
12887
  unload(bundle: string): void;
12593
12888
  };
12594
12889
  //#endregion
12595
- export { PixiSprite as $, FeatureTree as $n, types_d_exports$8 as $r, WarmDetail as $t, Display as A, ProjectionMotion as An, Patch as Ar, PerfChangeEntry as At, Sprite as B, GameTypes as Bn, Api$6 as Br, PerfMarkLine as Bt, ScenesApi as C, ChangeHook as Cn, Api$5 as Cr, PERF_GAP_BUCKETS as Ct, FilterSlot as D, MotionCause as Dn, Root as Dr, PassRecord as Dt, DebugSwitches as E, Motion as En, Json as Er, PassKind as Et, Overlay as F, ViewHandle as Fn, Snapshot as Fr, PerfEventName as Ft, TransformValue as G, types_d_exports$4 as Gn, types_d_exports$7 as Gr, PerfTelemetryLine as Gt, SpriteOptions as H, Position as Hn, Events$6 as Hr, PerfSampleLine as Ht, OverlayValue as I, Api$3 as In, SnapshotOf as Ir, PerfGapLine as It, Api$1 as J, slot as Jn, FrameRate as Jr, ProblemEventDetail as Jt, sprite as K, defineFlow as Kn, Api$7 as Kr, PerfThermalLine as Kt, Parent as L, BundlesOf as Ln, StoreApi as Lr, PerfHeaderLine as Lt, HudPartValue as M, ReducedMotion as Mn, ProviderCall as Mr, PerfCounts as Mt, NineSlice$1 as N, TrackOptions as Nn, SaveDoc as Nr, PerfDisplay as Nt, FilterSlotInputs as O, MotionHandle as On, State$6 as Or, PerfCause as Ot, NineSliceValue as P, TrackSegment as Pn, SaveUnreadableError as Pr, PerfEventLine as Pt, PixiModule as Q, FeaturePlugin as Qn, Time as Qr, ShaderWhat as Qt, Shape as R, Config$4 as Rn, RngApi as Rr, PerfLogLine as Rt, SceneSpec as S, TagType as Sn, types_d_exports$5 as Sr, PERF_CAUSES as St, types_d_exports$1 as T, Ease as Tn, Events$5 as Tr, PROBLEM_RULES as Tt, SpriteValue as U, State$4 as Un, PauseReason as Ur, PerfSpikeLine as Ut, SpriteBlend as V, HudKeysOf as Vn, Config$7 as Vr, PerfMeasured as Vt, Transform as W, TextStylesOf as Wn, State$7 as Wr, PerfStartupLine as Wt, MonitorConfig as X, type as Xn, State$8 as Xr, SHADER_WHATS as Xt, Config$2 as Y, to as Yn, RateChange as Yr, ProblemRule as Yt, PixiFilter as Z, FeatureDescription as Zn, ThermalReading as Zr, ShaderEventDetail as Zt, AnySceneProjection as _, Narrowed as _n, Api$4 as _r, LongFrameEntry as _t, Config as a, types_d_exports$3 as an, JournalEntry as ar, Captured as at, LayerMap as b, SystemDefinition as bn, FakeClock as br, OverlayEventDetail as bt, LoadBundles as c, AnyComponentValue as cn, SceneIdOf as cr, Orientation as ct, Manifest as d, ComponentType as dn, Effect as dr, FilterCache as dt, Config$9 as ei, DEMAND_REASONS as en, AnyFlow as er, PixiTexture as et, ReadyBundles as f, ComponentValue as fn, EffectOptions as fr, FrameColumns as ft, types_d_exports as g, Mut as gn, Answer as gr, FrameRing as gt, Usage as h, FrameDiff as hn, NodeFx as hr, FrameRecord as ht, BundleSpec as i, State$3 as in, FlowState as ir, types_d_exports$2 as it, HudPart as j, ProjectionSpec as jn, PlayerStateProvider as jr, PerfCollectorLine as jt, SyncApi as k, NumericFields as kn, types_d_exports$6 as kr, PerfChange as kt, LoadReason as l, ComponentHandle as ln, TypeTag as lr, Point as lt, Tier as m, EntitySnapshot as mn, Hint as mr, FrameReadout as mt, AssetsIo as n, Require as ni, Config$3 as nn, DefineNode as nr, State$2 as nt, DefineBundles as o, AnyComponent as on, NodeTable as or, MonitorCounts as ot, State as p, Entity as pn, GuideOptions as pr, FrameReadResult as pt, AdaptiveScale as q, exit as qn, Config$8 as qr, PoolTrimDetail as qt, BundleMap as r, Explained as rn, FlowGraph as rr, Under as rt, Events as s, AnyComponentType as sn, RouteStep as sr, RenderStats as st, Api as t, Events$8 as ti, Api$2 as tn, Bookmark as tr, PoolTrim as tt, LoadResult as u, ComponentSchema as un, Descriptor as ur, ViewportSize as ut, DefineScene as v, QueryTerm as vn, ClockSource as vr, MONITOR_SECTIONS as vt, State$1 as w, DescriptionNode as wn, Config$6 as wr, PERF_LOG_VERSION as wt, SceneDefinition as x, SystemFor as xn, State$5 as xr, OverlayWhat as xt, Events$1 as y, ResourceType as yn, Config$5 as yr, MonitorSections as yt, ShapeValue as z, EmitterIdOf as zn, RngState as zr, PerfLongFrameLine as zt };
12890
+ export { PixiModule as $, FeaturePlugin as $n, Time as $r, ShaderWhat as $t, SyncApi as A, NumericFields as An, types_d_exports$6 as Ar, PerfChange as At, ShapeValue as B, EmitterIdOf as Bn, RngState as Br, PerfLongFrameLine as Bt, SceneSpec as C, TagType as Cn, types_d_exports$5 as Cr, PERF_CAUSES as Ct, DebugSwitches as D, Motion as Dn, Json as Dr, PassKind as Dt, types_d_exports$1 as E, Ease as En, Events$5 as Er, PROBLEM_RULES as Et, NineSliceValue as F, TrackSegment as Fn, SaveUnreadableError as Fr, PerfEventLine as Ft, Transform as G, TextStylesOf as Gn, State$7 as Gr, PerfStartupLine as Gt, SpriteBlend as H, HudKeysOf as Hn, Config$7 as Hr, PerfMeasured as Ht, Overlay as I, ViewHandle as In, Snapshot as Ir, PerfEventName as It, AdaptiveScale as J, exit as Jn, Config$8 as Jr, PoolTrimDetail as Jt, TransformValue as K, types_d_exports$4 as Kn, types_d_exports$7 as Kr, PerfTelemetryLine as Kt, OverlayValue as L, Api$3 as Ln, SnapshotOf as Lr, PerfGapLine as Lt, HudPart as M, ProjectionSpec as Mn, PlayerStateProvider as Mr, PerfCollectorLine as Mt, HudPartValue as N, ReducedMotion as Nn, ProviderCall as Nr, PerfCounts as Nt, FilterSlot as O, MotionCause as On, Root as Or, PassRecord as Ot, NineSlice$1 as P, TrackOptions as Pn, SaveDoc as Pr, PerfDisplay as Pt, PixiFilter as Q, FeatureDescription as Qn, ThermalReading as Qr, ShaderEventDetail as Qt, Parent as R, BundlesOf as Rn, StoreApi as Rr, PerfHeaderLine as Rt, SceneDefinition as S, SystemFor as Sn, State$5 as Sr, OverlayWhat as St, State$1 as T, DescriptionNode as Tn, Config$6 as Tr, PERF_LOG_VERSION as Tt, SpriteOptions as U, Position as Un, Events$6 as Ur, PerfSampleLine as Ut, Sprite as V, GameTypes as Vn, Api$6 as Vr, PerfMarkLine as Vt, SpriteValue as W, State$4 as Wn, PauseReason as Wr, PerfSpikeLine as Wt, Config$2 as X, to as Xn, RateChange as Xr, ProblemRule as Xt, Api$1 as Y, slot as Yn, FrameRate as Yr, ProblemEventDetail as Yt, MonitorConfig as Z, type as Zn, State$8 as Zr, SHADER_WHATS as Zt, AnySceneProjection as _, Mut as _n, Answer as _r, FrameRing as _t, Config as a, State$3 as an, FlowState as ar, types_d_exports$2 as at, Events$1 as b, ResourceType as bn, Config$5 as br, MonitorSections as bt, LoadBundles as c, AnyComponentType as cn, RouteStep as cr, RenderStats as ct, Manifest as d, ComponentSchema as dn, Descriptor as dr, ViewportSize as dt, types_d_exports$8 as ei, WarmDetail as en, FeatureTree as er, PixiSprite as et, ReadyBundles as f, ComponentType as fn, Effect as fr, FilterCache as ft, types_d_exports as g, FrameDiff as gn, NodeFx as gr, FrameRecord as gt, Usage as h, EntitySnapshot as hn, Hint as hr, FrameReadout as ht, BundleSpec as i, Explained as in, FlowGraph as ir, Under as it, Display as j, ProjectionMotion as jn, Patch as jr, PerfChangeEntry as jt, FilterSlotInputs as k, MotionHandle as kn, State$6 as kr, PerfCause as kt, LoadReason as l, AnyComponentValue as ln, SceneIdOf as lr, Orientation as lt, Tier as m, Entity as mn, GuideOptions as mr, FrameReadResult as mt, AssetsIo as n, Events$8 as ni, Api$2 as nn, Bookmark as nr, PoolTrim as nt, DefineBundles as o, types_d_exports$3 as on, JournalEntry as or, Captured as ot, State as p, ComponentValue as pn, EffectOptions as pr, FrameColumns as pt, sprite as q, defineFlow as qn, Api$7 as qr, PerfThermalLine as qt, BundleMap as r, Require as ri, Config$3 as rn, DefineNode as rr, State$2 as rt, Events as s, AnyComponent as sn, NodeTable as sr, MonitorCounts as st, Api as t, Config$9 as ti, DEMAND_REASONS as tn, AnyFlow as tr, PixiTexture as tt, LoadResult as u, ComponentHandle as un, TypeTag as ur, Point as ut, Config$1 as v, Narrowed as vn, Api$4 as vr, LongFrameEntry as vt, ScenesApi as w, ChangeHook as wn, Api$5 as wr, PERF_GAP_BUCKETS as wt, LayerMap as x, SystemDefinition as xn, FakeClock as xr, OverlayEventDetail as xt, DefineScene as y, QueryTerm as yn, ClockSource as yr, MONITOR_SECTIONS as yt, Shape as z, Config$4 as zn, RngApi as zr, PerfLogLine as zt };
@@ -1,5 +1,5 @@
1
- import { $ as PixiSprite, Cr as Api$6, D as FilterSlot, Er as Json, Hr as Events$5, In as Api$2, J as Api$4, Kr as Api$1, Mn as ReducedMotion, Nn as TrackOptions, O as FilterSlotInputs, On as MotionHandle, Pn as TrackSegment, Q as PixiModule, Tn as Ease, Tr as Events$3, Z as PixiFilter, cn as AnyComponentValue, dn as ComponentType, dt as FilterCache, et as PixiTexture, k as SyncApi, kn as NumericFields, ln as ComponentHandle, lr as TypeTag, lt as Point, ni as Require, on as AnyComponent, pn as Entity, s as Events$1, t as Api$5, ti as Events$2, tn as Api$3, ur as Descriptor, y as Events$4 } from "./types-DFROr3sM.mjs";
2
- import { N as InputApi, R as I18nApi, X as StylesState, c as UiNode, i as Finding, l as LayoutState, n as ElementChange, o as JsxState, r as ElementMotion, w as TextApi } from "./types--1Zq5_6Q.mjs";
1
+ import { $ as PixiModule, A as SyncApi, An as NumericFields, Dr as Json, En as Ease, Er as Events$3, Fn as TrackSegment, Ln as Api$2, Nn as ReducedMotion, O as FilterSlot, Pn as TrackOptions, Q as PixiFilter, Ur as Events$5, Y as Api$4, b as Events$4, dr as Descriptor, et as PixiSprite, fn as ComponentType, ft as FilterCache, k as FilterSlotInputs, kn as MotionHandle, ln as AnyComponentValue, mn as Entity, ni as Events$2, nn as Api$3, qr as Api$1, ri as Require, s as Events$1, sn as AnyComponent, t as Api$5, tt as PixiTexture, un as ComponentHandle, ur as TypeTag, ut as Point, wr as Api$6 } from "./types-D27I4Q7b.mjs";
2
+ import { N as InputApi, R as I18nApi, X as StylesState, c as UiNode, i as Finding, l as LayoutState, n as ElementChange, o as JsxState, r as ElementMotion, w as TextApi } from "./types-BAp9HdR4.mjs";
3
3
  import { Log } from "@moku-labs/common/browser";
4
4
  import { PluginCtx } from "@moku-labs/core";
5
5
 
@@ -1,9 +1,9 @@
1
- import { Br as Api$3, Cr as Api$2, J as Api, tn as Api$1 } from "./types-DFROr3sM.mjs";
2
- import { P as AnimApi, r as UiApi } from "./types-BbuRDHDK.mjs";
3
- import { N as InputApi } from "./types--1Zq5_6Q.mjs";
4
- import { r as Repro } from "./headless-DDymHw9o.mjs";
5
- import { a as InputOf, r as ControlApp } from "./types-WoDZEVQI.mjs";
6
- import { t as commands } from "./commands-BTAIwlyn.mjs";
1
+ import { Vr as Api$3, Y as Api, nn as Api$1, wr as Api$2 } from "./types-D27I4Q7b.mjs";
2
+ import { P as AnimApi, r as UiApi } from "./types-DjQkfbfZ.mjs";
3
+ import { N as InputApi } from "./types-BAp9HdR4.mjs";
4
+ import { r as Repro } from "./headless-f31cEZ7f.mjs";
5
+ import { a as InputOf, r as ControlApp } from "./types-CgE5L_7f.mjs";
6
+ import { t as commands } from "./commands-BOxMqhVe.mjs";
7
7
 
8
8
  //#region src/visual/types.d.ts
9
9
  /** The base commands of the `/control` door, keyed by their short names. */
package/dist/visual.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as VisualApp, c as VisualRenderer, d as VisualStart, f as VisualStep, h as VisualTolerance, i as CheckpointResult, l as VisualReport, m as VisualTestResult, n as runVisualTests, o as VisualOptions, p as VisualTest, r as defineVisualTest, s as VisualPage, t as parseVisualArgv, u as VisualSetup } from "./visual-Dj1tlgUk.mjs";
1
+ import { a as VisualApp, c as VisualRenderer, d as VisualStart, f as VisualStep, h as VisualTolerance, i as CheckpointResult, l as VisualReport, m as VisualTestResult, n as runVisualTests, o as VisualOptions, p as VisualTest, r as defineVisualTest, s as VisualPage, t as parseVisualArgv, u as VisualSetup } from "./visual-DhNLNtl8.mjs";
2
2
  export { type CheckpointResult, type VisualApp, type VisualOptions, type VisualPage, type VisualRenderer, type VisualReport, type VisualSetup, type VisualStart, type VisualStep, type VisualTest, type VisualTestResult, type VisualTolerance, defineVisualTest, parseVisualArgv, runVisualTests };