@moku-labs/game 0.14.2 → 0.14.3

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,4 +1,4 @@
1
- import { m as StartedPage, r as GameConfig, t as AnyGameApp, u as PageOptions } from "../types-v3HEx-i8.mjs";
1
+ import { m as StartedPage, r as GameConfig, t as AnyGameApp, u as PageOptions } from "../types--IldPLbm.mjs";
2
2
 
3
3
  //#region src/app/page.d.ts
4
4
  /**
@@ -1,6 +1,6 @@
1
- import { tn as PlayerStateProvider } from "../types-BAWV0bNA.mjs";
2
- import { ct as PlatformProvider } from "../index-CGynRcOj.mjs";
3
- import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types-v3HEx-i8.mjs";
1
+ import { tn as PlayerStateProvider } from "../types-CUNcMkD1.mjs";
2
+ import { ct as PlatformProvider } from "../index-qc-2WJnj.mjs";
3
+ import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types--IldPLbm.mjs";
4
4
  import { Back, Haptics, KeepAwake, Lifecycle, Store } from "@moku-labs/system";
5
5
 
6
6
  //#region src/app/system.d.ts
package/dist/app.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { Xt as Json } from "./types-BAWV0bNA.mjs";
2
- import { a as GameHandle, c as MemoryProvider, d as SaveKind, f as Scenario, g as SystemName, i as GameDefinition, l as PageAgent, n as GameApp, o as GamePluginConfigs, p as ScreenSeams, r as GameConfig, s as HeadlessSeams } from "./types-v3HEx-i8.mjs";
1
+ import { Xt as Json } from "./types-CUNcMkD1.mjs";
2
+ import { a as GameHandle, c as MemoryProvider, d as SaveKind, f as Scenario, g as SystemName, i as GameDefinition, l as PageAgent, n as GameApp, o as GamePluginConfigs, p as ScreenSeams, r as GameConfig, s as HeadlessSeams } from "./types--IldPLbm.mjs";
3
3
  import { AnyPluginInstance } from "@moku-labs/core";
4
4
 
5
5
  //#region src/app/define.d.ts
package/dist/app.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { Ct as effectsPlugin, H as platformPlugin, Nt as audioPlugin, i as screen, t as createApp } from "./src-BD-MZliM.mjs";
1
+ import { Ct as effectsPlugin, H as platformPlugin, Nt as audioPlugin, i as screen, t as createApp } from "./src-DiPISDVO.mjs";
2
2
  import { t as memory } from "./memory-CWlqhS7l.mjs";
3
3
  import { t as fakeClock } from "./fake-MpzwZhIZ.mjs";
4
4
  //#region src/app/define.ts
package/dist/assets.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { u as Manifest } from "./types-BAWV0bNA.mjs";
1
+ import { u as Manifest } from "./types-CUNcMkD1.mjs";
2
2
 
3
3
  //#region src/plugins/assets/scan/cli.d.ts
4
4
  /**
@@ -1,8 +1,8 @@
1
- import { A as Api$2, E as DebugSwitches, Ot as Bookmark, h as Api$1, jt as FlowState, ln as Api, vn as Time, w as Captured } from "./types-BAWV0bNA.mjs";
2
- import { a as AudioApi, r as UiApi, v as ScenesApi, x as AnimApi } from "./types-DO_5UT1J.mjs";
3
- import { A as InputApi } from "./types-zzul0fH3.mjs";
4
- import { t as HeadlessApp } from "./headless-CBQhbYPZ.mjs";
5
- import { n as Command, r as ControlApp } from "./types-BVHYu1kz.mjs";
1
+ import { A as Api$2, E as DebugSwitches, Ot as Bookmark, h as Api$1, jt as FlowState, ln as Api, vn as Time, w as Captured } from "./types-CUNcMkD1.mjs";
2
+ import { a as AudioApi, r as UiApi, v as ScenesApi, x as AnimApi } from "./types-DzbRzti4.mjs";
3
+ import { A as InputApi } from "./types-p12uOu00.mjs";
4
+ import { t as HeadlessApp } from "./headless-TowWxARz.mjs";
5
+ import { n as Command, r as ControlApp } from "./types-CsejHij6.mjs";
6
6
 
7
7
  //#region src/plugins/flow/doors/commands.d.ts
8
8
  /**
@@ -1,7 +1,7 @@
1
- import { t as HeadlessApp } from "./headless-CBQhbYPZ.mjs";
2
- import { i as InputArguments, n as Command, o as InputSchema, s as Ran } from "./types-BVHYu1kz.mjs";
3
- import { t as commands } from "./commands-DWuuqLHu.mjs";
4
- import { t as defineCommand } from "./define-HP1Xow8i.mjs";
1
+ import { t as HeadlessApp } from "./headless-TowWxARz.mjs";
2
+ import { i as InputArguments, n as Command, o as InputSchema, s as Ran } from "./types-CsejHij6.mjs";
3
+ import { t as commands } from "./commands-BMpk-pW7.mjs";
4
+ import { t as defineCommand } from "./define-TUpLvorL.mjs";
5
5
 
6
6
  //#region src/plugins/flow/doors/dev.d.ts
7
7
  /**
@@ -1,5 +1,5 @@
1
- import { t as HeadlessApp } from "./headless-CBQhbYPZ.mjs";
2
- import { c as Source, n as Command, o as InputSchema } from "./types-BVHYu1kz.mjs";
1
+ import { t as HeadlessApp } from "./headless-TowWxARz.mjs";
2
+ import { c as Source, n as Command, o as InputSchema } from "./types-CsejHij6.mjs";
3
3
 
4
4
  //#region src/plugins/flow/doors/define.d.ts
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { Bt as Answer, Mt as JournalEntry, Pt as RouteStep, Xt as Json, cn as RngState, dt as Api$1, hn as Api, jt as FlowState } from "./types-BAWV0bNA.mjs";
1
+ import { Bt as Answer, Mt as JournalEntry, Pt as RouteStep, Xt as Json, cn as RngState, dt as Api$1, hn as Api, jt as FlowState } from "./types-CUNcMkD1.mjs";
2
2
 
3
3
  //#region src/plugins/flow/headless.d.ts
4
4
  /**
@@ -1,7 +1,7 @@
1
- import { $ as DescriptionNode, A as Api$6, B as ComponentType, Et as FeatureDescription, Ft as SceneIdOf, G as Mut, Gt as State$2, J as QueryTerm, Jt as Config$5, K as Narrowed, Lt as Descriptor, N as State$8, Qt as State$5, R as ComponentHandle, Rt as GuideOptions, Sn as Require, Ut as Config$2, V as ComponentValue, Vt as Api$1, X as SystemDefinition, Xt as Json, Y as ResourceType, Z as TagType, Zt as Root, _n as State$7, a as Config$1, at as NumericFields, bn as Config$9, c as LoadBundles, d as State$1, dn as Events, dt as Api$2, en as Patch, et as Ease, f as Tier, fn as PauseReason, ft as BundlesOf, g as Config$6, gn as Config$7, gt as GameTypes, h as Api$4, hn as Api$5, ht as FeaturePlugin, i as BundleSpec, j as Config$8, k as ViewportSize, kt as DefineNode, l as LoadReason, ln as Api$3, mt as EmitterIdOf, o as DefineBundles, on as StoreApi, ot as ProjectionMotion, pn as State$4, pt as Config$3, r as BundleMap, sn as RngApi, st as ProjectionSpec, t as Api, un as Config$4, vt as State$3, x as State$6, xn as Events$1, xt as defineFlow, yt as TextStylesOf, zt as Hint } from "./types-BAWV0bNA.mjs";
2
- import { A as SfxDescriptor, C as Config$10, D as Target, E as State$9, N as defineAnimation, S as AnimPlayerValue, T as MotionKeyframe, _ as SceneSpec, a as AudioApi, c as MusicDescriptor, d as State$10, g as SceneDefinition, h as LayerMap, j as Step, k as HapticKind, l as MusicOptions, m as DefineScene, n as State$12, p as AnySceneProjection, r as UiApi, s as Config$11, t as Config$12, v as ScenesApi, w as FramesValue, x as AnimApi, y as State$11, z as play } from "./types-DO_5UT1J.mjs";
3
- import { _ as NoiseValue, c as EmitterValue, d as ColorMatrixValue, f as DisplacementValue, g as GlowValue, h as FilterValueOf, i as State$13, l as AlphaValue, m as FilterSpec, n as EffectsApi, o as EmitterConfig, p as FilterComponent, s as EmitterDefinition, t as Config$13, u as BlurValue, v as OutlineValue, y as UniformDeclaration } from "./types-c50K8lVm.mjs";
4
- import { A as InputApi, B as SpriteOptions, E as TextValue, F as NineSliceValue, G as Argument, J as IntlKit, K as Config$14, O as defineComponent, Q as TypedTr, R as ShapeValue, S as TextBind, T as TextStyles, U as TransformValue, V as SpriteValue, W as sprite, X as Part, Y as Message, Z as State$14, _ as Config$16, b as State$16, et as IsFlags, f as defineTokens, g as BindOptions, h as BindField, it as WhenFlags, j as State$15, k as Config$15, nt as Style, p as IntrinsicElementsFor, q as I18nApi, s as PopupComponent, tt as ResolvedStyle, v as CountdownValue, w as TextStyleInput, x as TextApi, y as Point } from "./types-zzul0fH3.mjs";
1
+ import { $ as DescriptionNode, A as Api$6, B as ComponentType, Et as FeatureDescription, Ft as SceneIdOf, G as Mut, Gt as State$2, J as QueryTerm, Jt as Config$5, K as Narrowed, Lt as Descriptor, N as State$8, Qt as State$5, R as ComponentHandle, Rt as GuideOptions, Sn as Require, Ut as Config$2, V as ComponentValue, Vt as Api$1, X as SystemDefinition, Xt as Json, Y as ResourceType, Z as TagType, Zt as Root, _n as State$7, a as Config$1, at as NumericFields, bn as Config$9, c as LoadBundles, d as State$1, dn as Events, dt as Api$2, en as Patch, et as Ease, f as Tier, fn as PauseReason, ft as BundlesOf, g as Config$6, gn as Config$7, gt as GameTypes, h as Api$4, hn as Api$5, ht as FeaturePlugin, i as BundleSpec, j as Config$8, k as ViewportSize, kt as DefineNode, l as LoadReason, ln as Api$3, mt as EmitterIdOf, o as DefineBundles, on as StoreApi, ot as ProjectionMotion, pn as State$4, pt as Config$3, r as BundleMap, sn as RngApi, st as ProjectionSpec, t as Api, un as Config$4, vt as State$3, x as State$6, xn as Events$1, xt as defineFlow, yt as TextStylesOf, zt as Hint } from "./types-CUNcMkD1.mjs";
2
+ import { A as SfxDescriptor, C as Config$10, D as Target, E as State$9, N as defineAnimation, S as AnimPlayerValue, T as MotionKeyframe, _ as SceneSpec, a as AudioApi, c as MusicDescriptor, d as State$10, g as SceneDefinition, h as LayerMap, j as Step, k as HapticKind, l as MusicOptions, m as DefineScene, n as State$12, p as AnySceneProjection, r as UiApi, s as Config$11, t as Config$12, v as ScenesApi, w as FramesValue, x as AnimApi, y as State$11, z as play } from "./types-DzbRzti4.mjs";
3
+ import { _ as NoiseValue, c as EmitterValue, d as ColorMatrixValue, f as DisplacementValue, g as GlowValue, h as FilterValueOf, i as State$13, l as AlphaValue, m as FilterSpec, n as EffectsApi, o as EmitterConfig, p as FilterComponent, s as EmitterDefinition, t as Config$13, u as BlurValue, v as OutlineValue, y as UniformDeclaration } from "./types-NgMDwIrO.mjs";
4
+ import { A as InputApi, B as SpriteOptions, E as TextValue, F as NineSliceValue, G as Argument, J as IntlKit, K as Config$14, O as defineComponent, Q as TypedTr, R as ShapeValue, S as TextBind, T as TextStyles, U as TransformValue, V as SpriteValue, W as sprite, X as Part, Y as Message, Z as State$14, _ as Config$16, b as State$16, et as IsFlags, f as defineTokens, g as BindOptions, h as BindField, it as WhenFlags, j as State$15, k as Config$15, nt as Style, p as IntrinsicElementsFor, q as I18nApi, s as PopupComponent, tt as ResolvedStyle, v as CountdownValue, w as TextStyleInput, x as TextApi, y as Point } from "./types-p12uOu00.mjs";
5
5
  import { Log } from "@moku-labs/common/browser";
6
6
  import { PluginCtx } from "@moku-labs/core";
7
7
 
package/dist/index.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { $ as DescriptionNode, $t as types_d_exports$9, C as types_d_exports$11, Ct as slot, Kt as types_d_exports$3, P as types_d_exports$16, St as exit, Tt as type, bt as types_d_exports$5, in as SaveUnreadableError, m as types_d_exports$1, mn as types_d_exports$8, wt as to, yn as types_d_exports$14 } from "./types-BAWV0bNA.mjs";
2
- import { B as sequence, F as frames, G as stagger, H as sfx, I as haptic, J as wait, K as tween, L as mark, M as HAPTIC_KINDS, N as defineAnimation, O as types_d_exports, P as external, R as parallel, U as spawn, V as set, W as spawned, b as types_d_exports$12, f as types_d_exports$2, i as types_d_exports$15, k as HapticKind, q as use, z as play } from "./types-DO_5UT1J.mjs";
3
- import { a as types_d_exports$4 } from "./types-c50K8lVm.mjs";
4
- import { $ as types_d_exports$6, C as TextFormat, D as types_d_exports$13, H as Transform, I as Parent, L as Shape, M as types_d_exports$7, N as Display, O as defineComponent, P as NineSlice, W as sprite, d as popup, f as defineTokens, g as BindOptions, l as Box, u as LocalWrite, v as CountdownValue, z as Sprite } from "./types-zzul0fH3.mjs";
5
- import { $ as defineFeature, A as Held, B as Traced, C as Animation, Ct as bind, D as load, E as defineBundles, F as Pressed, G as component, H as Layer, I as Swipeable, J as system, K as mut, L as Tappable, M as Pointer, N as PointerOver, O as Draggable, P as Pressable, Q as schedule, R as Touchable, S as AnimPlayer, St as Text, T as defineScene, Tt as label, U as Order, V as Exiting, W as Tree, X as guide, Y as tag, Z as hint, _ as defineStyle, _t as audioPlugin, a as defineEmitter, at as rendererPlugin, b as messageDuration, bt as projection, c as Alpha, ct as PlatformProvider, d as Displacement, dt as lifecyclePlugin, et as worldPlugin, f as Glow, ft as inputPlugin, g as resolve, gt as clockPlugin, h as music, ht as effectsPlugin, i as screen, it as scenesPlugin, j as Hovered, k as DropTarget, l as Blur, lt as types_d_exports$10, m as Outline, mt as flowPlugin, n as createPlugin, nt as timePlugin, o as Emitter, ot as platformPlugin, p as Noise, pt as i18nPlugin, q as resource, r as defineGame, rt as textPlugin, s as defineFilter, st as BackResult, t as createApp, tt as uiPlugin, u as ColorMatrix, ut as modelPlugin, v as tr, vt as assetsPlugin, w as Frames, wt as defineTextStyles, x as defineMotion, xt as Countdown, y as messageArgument, yt as animPlugin, z as Traceable } from "./index-CGynRcOj.mjs";
1
+ import { $ as DescriptionNode, $t as types_d_exports$9, C as types_d_exports$11, Ct as slot, Kt as types_d_exports$3, P as types_d_exports$16, St as exit, Tt as type, bt as types_d_exports$5, in as SaveUnreadableError, m as types_d_exports$1, mn as types_d_exports$8, wt as to, yn as types_d_exports$14 } from "./types-CUNcMkD1.mjs";
2
+ import { B as sequence, F as frames, G as stagger, H as sfx, I as haptic, J as wait, K as tween, L as mark, M as HAPTIC_KINDS, N as defineAnimation, O as types_d_exports, P as external, R as parallel, U as spawn, V as set, W as spawned, b as types_d_exports$12, f as types_d_exports$2, i as types_d_exports$15, k as HapticKind, q as use, z as play } from "./types-DzbRzti4.mjs";
3
+ import { a as types_d_exports$4 } from "./types-NgMDwIrO.mjs";
4
+ import { $ as types_d_exports$6, C as TextFormat, D as types_d_exports$13, H as Transform, I as Parent, L as Shape, M as types_d_exports$7, N as Display, O as defineComponent, P as NineSlice, W as sprite, d as popup, f as defineTokens, g as BindOptions, l as Box, u as LocalWrite, v as CountdownValue, z as Sprite } from "./types-p12uOu00.mjs";
5
+ import { $ as defineFeature, A as Held, B as Traced, C as Animation, Ct as bind, D as load, E as defineBundles, F as Pressed, G as component, H as Layer, I as Swipeable, J as system, K as mut, L as Tappable, M as Pointer, N as PointerOver, O as Draggable, P as Pressable, Q as schedule, R as Touchable, S as AnimPlayer, St as Text, T as defineScene, Tt as label, U as Order, V as Exiting, W as Tree, X as guide, Y as tag, Z as hint, _ as defineStyle, _t as audioPlugin, a as defineEmitter, at as rendererPlugin, b as messageDuration, bt as projection, c as Alpha, ct as PlatformProvider, d as Displacement, dt as lifecyclePlugin, et as worldPlugin, f as Glow, ft as inputPlugin, g as resolve, gt as clockPlugin, h as music, ht as effectsPlugin, i as screen, it as scenesPlugin, j as Hovered, k as DropTarget, l as Blur, lt as types_d_exports$10, m as Outline, mt as flowPlugin, n as createPlugin, nt as timePlugin, o as Emitter, ot as platformPlugin, p as Noise, pt as i18nPlugin, q as resource, r as defineGame, rt as textPlugin, s as defineFilter, st as BackResult, t as createApp, tt as uiPlugin, u as ColorMatrix, ut as modelPlugin, v as tr, vt as assetsPlugin, w as Frames, wt as defineTextStyles, x as defineMotion, xt as Countdown, y as messageArgument, yt as animPlugin, z as Traceable } from "./index-qc-2WJnj.mjs";
6
6
  export { Alpha, types_d_exports as Anim, AnimPlayer, Animation, types_d_exports$1 as Assets, types_d_exports$2 as Audio, type BackResult, type BindOptions, Blur, Box, types_d_exports$3 as Clock, ColorMatrix, Countdown, type CountdownValue, type DescriptionNode, Displacement, Display, Draggable, DropTarget, types_d_exports$4 as Effects, Emitter, Exiting, types_d_exports$5 as Flow, Frames, Glow, HAPTIC_KINDS, type HapticKind, Held, Hovered, types_d_exports$6 as I18n, types_d_exports$7 as Input, Layer, types_d_exports$8 as Lifecycle, LocalWrite, types_d_exports$9 as Model, NineSlice, Noise, Order, Outline, Parent, types_d_exports$10 as Platform, type PlatformProvider, Pointer, PointerOver, Pressable, Pressed, types_d_exports$11 as Renderer, SaveUnreadableError, types_d_exports$12 as Scenes, Shape, Sprite, Swipeable, Tappable, Text, type TextFormat, types_d_exports$13 as TextTypes, types_d_exports$14 as Time, Touchable, Traceable, Traced, Transform, Tree, types_d_exports$15 as Ui, types_d_exports$16 as World, animPlugin, assetsPlugin, audioPlugin, bind, clockPlugin, component, createApp, createPlugin, defineAnimation, defineBundles, defineComponent, defineEmitter, defineFeature, defineFilter, defineGame, defineMotion, defineScene, defineStyle, defineTextStyles, defineTokens, effectsPlugin, exit, external, flowPlugin, frames, guide, haptic, hint, i18nPlugin, inputPlugin, label, lifecyclePlugin, load, mark, messageArgument, messageDuration, modelPlugin, music, mut, parallel, platformPlugin, play, popup, projection, rendererPlugin, resolve, resource, scenesPlugin, schedule, screen, sequence, set, sfx, slot, spawn, spawned, sprite, stagger, system, tag, textPlugin, timePlugin, to, tr, tween, type, uiPlugin, use, wait, worldPlugin };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as sfx, A as types_exports$3, At as Noise, B as defineStyle, Bt as rendererPlugin, C as types_exports$10, Ct as effectsPlugin, D as types_exports$6, Dt as ColorMatrix, E as types_exports$7, Et as Blur, F as resolve, Ft as assetsPlugin, G as external, Gt as to, H as platformPlugin, Ht as flowPlugin, I as Box, It as animPlugin, J as mark, Jt as SaveUnreadableError, K as frames, Kt as type, L as LocalWrite, Lt as AnimPlayer, M as types_exports$1, Mt as defineFilter, N as types_exports, Nt as audioPlugin, O as types_exports$5, Ot as Displacement, P as uiPlugin, Pt as scenesPlugin, Q as set, R as popup, Rt as Animation, S as types_exports$11, St as messageDuration, T as types_exports$8, Tt as Alpha, U as HAPTIC_KINDS, Ut as exit, V as textPlugin, Vt as worldPlugin, W as defineAnimation, Wt as slot, X as play, Xt as timePlugin, Y as parallel, Yt as lifecyclePlugin, Z as sequence, Zt as clockPlugin, _ as types_exports$16, _t as Touchable, a as defineMotion, at as wait, b as types_exports$13, bt as i18nPlugin, c as schedule, ct as DropTarget, d as tr, dt as Pointer, et as spawn, f as defineFeature, ft as PointerOver, g as load, gt as Tappable, h as defineBundles, ht as Swipeable, i as screen, it as use, j as types_exports$2, jt as Outline, k as types_exports$4, kt as Glow, l as projection, lt as Held, m as music, mt as Pressed, n as createPlugin, nt as stagger, o as guide, ot as inputPlugin, p as defineEmitter, pt as Pressable, q as haptic, qt as modelPlugin, r as defineGame, rt as tween, s as hint, st as Draggable, t as createApp, tt as spawned, u as defineScene, ut as Hovered, v as types_exports$15, vt as Traceable, w as types_exports$9, wt as Emitter, x as types_exports$12, xt as messageArgument, y as types_exports$14, yt as Traced, z as defineTokens, zt as Frames } from "./src-BD-MZliM.mjs";
1
+ import { $ as sfx, A as types_exports$3, At as Noise, B as defineStyle, Bt as rendererPlugin, C as types_exports$10, Ct as effectsPlugin, D as types_exports$6, Dt as ColorMatrix, E as types_exports$7, Et as Blur, F as resolve, Ft as assetsPlugin, G as external, Gt as to, H as platformPlugin, Ht as flowPlugin, I as Box, It as animPlugin, J as mark, Jt as SaveUnreadableError, K as frames, Kt as type, L as LocalWrite, Lt as AnimPlayer, M as types_exports$1, Mt as defineFilter, N as types_exports, Nt as audioPlugin, O as types_exports$5, Ot as Displacement, P as uiPlugin, Pt as scenesPlugin, Q as set, R as popup, Rt as Animation, S as types_exports$11, St as messageDuration, T as types_exports$8, Tt as Alpha, U as HAPTIC_KINDS, Ut as exit, V as textPlugin, Vt as worldPlugin, W as defineAnimation, Wt as slot, X as play, Xt as timePlugin, Y as parallel, Yt as lifecyclePlugin, Z as sequence, Zt as clockPlugin, _ as types_exports$16, _t as Touchable, a as defineMotion, at as wait, b as types_exports$13, bt as i18nPlugin, c as schedule, ct as DropTarget, d as tr, dt as Pointer, et as spawn, f as defineFeature, ft as PointerOver, g as load, gt as Tappable, h as defineBundles, ht as Swipeable, i as screen, it as use, j as types_exports$2, jt as Outline, k as types_exports$4, kt as Glow, l as projection, lt as Held, m as music, mt as Pressed, n as createPlugin, nt as stagger, o as guide, ot as inputPlugin, p as defineEmitter, pt as Pressable, q as haptic, qt as modelPlugin, r as defineGame, rt as tween, s as hint, st as Draggable, t as createApp, tt as spawned, u as defineScene, ut as Hovered, v as types_exports$15, vt as Traceable, w as types_exports$9, wt as Emitter, x as types_exports$12, xt as messageArgument, y as types_exports$14, yt as Traced, z as defineTokens, zt as Frames } from "./src-DiPISDVO.mjs";
2
2
  import { A as system, C as Exiting, D as component, E as Tree, O as mut, S as sprite, T as Order, _ as Parent, b as Transform, c as Text, d as defineTextStyles, f as label, g as NineSlice, h as Display, j as tag, k as resource, l as bind, s as Countdown, v as Shape, w as Layer, y as Sprite } from "./visual-dMW8iqAE.mjs";
3
3
  import { r as defineComponent } from "./flatten-BkXuscAV.mjs";
4
4
  export { Alpha, types_exports as Anim, AnimPlayer, Animation, types_exports$1 as Assets, types_exports$2 as Audio, Blur, Box, types_exports$3 as Clock, ColorMatrix, Countdown, Displacement, Display, Draggable, DropTarget, types_exports$4 as Effects, Emitter, Exiting, types_exports$5 as Flow, Frames, Glow, HAPTIC_KINDS, Held, Hovered, types_exports$6 as I18n, types_exports$7 as Input, Layer, types_exports$8 as Lifecycle, LocalWrite, types_exports$9 as Model, NineSlice, Noise, Order, Outline, Parent, types_exports$10 as Platform, Pointer, PointerOver, Pressable, Pressed, types_exports$11 as Renderer, SaveUnreadableError, types_exports$12 as Scenes, Shape, Sprite, Swipeable, Tappable, Text, types_exports$13 as TextTypes, types_exports$14 as Time, Touchable, Traceable, Traced, Transform, Tree, types_exports$15 as Ui, types_exports$16 as World, animPlugin, assetsPlugin, audioPlugin, bind, clockPlugin, component, createApp, createPlugin, defineAnimation, defineBundles, defineComponent, defineEmitter, defineFeature, defineFilter, defineGame, defineMotion, defineScene, defineStyle, defineTextStyles, defineTokens, effectsPlugin, exit, external, flowPlugin, frames, guide, haptic, hint, i18nPlugin, inputPlugin, label, lifecyclePlugin, load, mark, messageArgument, messageDuration, modelPlugin, music, mut, parallel, platformPlugin, play, popup, projection, rendererPlugin, resolve, resource, scenesPlugin, schedule, screen, sequence, set, sfx, slot, spawn, spawned, sprite, stagger, system, tag, textPlugin, timePlugin, to, tr, tween, type, uiPlugin, use, wait, worldPlugin };
@@ -1,10 +1,10 @@
1
- import { A as Api$1, At as FlowGraph, M as Explained, Mt as JournalEntry, S as Under, T as RenderStats, U as EntitySnapshot, W as FrameDiff, _t as Position, an as Snapshot, h as Api$2, p as Usage, qt as Api, t as Api$3, z as ComponentSchema } from "./types-BAWV0bNA.mjs";
2
- import { a as AudioApi, r as UiApi, u as SoundEntry } from "./types-DO_5UT1J.mjs";
3
- import { n as EffectsApi, r as EffectsStats } from "./types-c50K8lVm.mjs";
4
- import { c as UiNode } from "./types-zzul0fH3.mjs";
5
- import { t as HeadlessApp } from "./headless-CBQhbYPZ.mjs";
6
- import { a as InputOf, c as Source, i as InputArguments, l as WatchApp, o as InputSchema, t as CheatEntry, u as WatchInput } from "./types-BVHYu1kz.mjs";
7
- import { n as defineSource } from "./define-HP1Xow8i.mjs";
1
+ import { A as Api$1, At as FlowGraph, M as Explained, Mt as JournalEntry, S as Under, T as RenderStats, U as EntitySnapshot, W as FrameDiff, _t as Position, an as Snapshot, h as Api$2, p as Usage, qt as Api, t as Api$3, z as ComponentSchema } from "./types-CUNcMkD1.mjs";
2
+ import { a as AudioApi, r as UiApi, u as SoundEntry } from "./types-DzbRzti4.mjs";
3
+ import { n as EffectsApi, r as EffectsStats } from "./types-NgMDwIrO.mjs";
4
+ import { c as UiNode } from "./types-p12uOu00.mjs";
5
+ import { t as HeadlessApp } from "./headless-TowWxARz.mjs";
6
+ import { a as InputOf, c as Source, i as InputArguments, l as WatchApp, o as InputSchema, t as CheatEntry, u as WatchInput } from "./types-CsejHij6.mjs";
7
+ import { n as defineSource } from "./define-TUpLvorL.mjs";
8
8
 
9
9
  //#region src/plugins/flow/doors/read.d.ts
10
10
  /**
@@ -1,2 +1,2 @@
1
- import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-CRfdX18W.mjs";
1
+ import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-BYbkAbM9.mjs";
2
2
  export { Fragment, type JSX, jsx, jsxDEV, jsxs };
@@ -1,2 +1,2 @@
1
- import { a as jsxs, n as JSX, r as jsx, t as Fragment } from "./runtime-CRfdX18W.mjs";
1
+ import { a as jsxs, n as JSX, r as jsx, t as Fragment } from "./runtime-BYbkAbM9.mjs";
2
2
  export { Fragment, type JSX, jsx, jsxs };
@@ -1,4 +1,4 @@
1
- import { Xt as Json, nn as ProviderCall, rn as SaveDoc, tn as PlayerStateProvider } from "./types-BAWV0bNA.mjs";
1
+ import { Xt as Json, nn as ProviderCall, rn as SaveDoc, tn as PlayerStateProvider } from "./types-CUNcMkD1.mjs";
2
2
 
3
3
  //#region src/plugins/model/store/providers/memory.d.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { a as JsxChild, m as UiIntrinsicElements, t as DescriptionNode } from "./types-zzul0fH3.mjs";
1
+ import { a as JsxChild, m as UiIntrinsicElements, t as DescriptionNode } from "./types-p12uOu00.mjs";
2
2
 
3
3
  //#region src/plugins/ui/jsx/runtime.d.ts
4
4
  /** What the compiler passes as props: the children plus whatever the tag declared. */
@@ -6520,6 +6520,7 @@ function clearWorld(state) {
6520
6520
  state.ecs.offFrame.length = 0;
6521
6521
  for (const off of state.projection.offHints) off();
6522
6522
  state.projection.offHints.length = 0;
6523
+ state.projection.converged.length = 0;
6523
6524
  state.projection.specs.clear();
6524
6525
  state.projection.mounted.clear();
6525
6526
  state.projection.byEntity.clear();
@@ -7630,13 +7631,63 @@ function keyedItems(pctx, spec, snapshot) {
7630
7631
  return next;
7631
7632
  }
7632
7633
  /**
7634
+ * The last step of a reconcile a restore or a load caused: every live view is written to its rest
7635
+ * pose, whether its item changed or not. An aborted node finishes its animation, which leaves a
7636
+ * view on the end pose, and a view whose item is the same object as before is never touched by
7637
+ * the entries. It runs after the flush: every handle is finished and every track of the entity is
7638
+ * cancelled by then, also an additive one, which writes its base back when it ends. So nothing
7639
+ * writes after it. Muted fields are left out, and `view` does not run again.
7640
+ *
7641
+ * @param pctx - Domain context of the projection module.
7642
+ * @param mounted - The mounted projection, already flushed.
7643
+ */
7644
+ function convergeMounted(pctx, mounted) {
7645
+ for (const view of mounted.live.values()) writeRestNow(pctx, view, [...view.rest.keys()]);
7646
+ }
7647
+ /**
7648
+ * The same last step for the elements another plugin owns, which no reconcile of a projection
7649
+ * meets: each is written to the rest pose its owner recorded with `setRest`. Every track on the
7650
+ * entity is ended first, so nothing writes after it. Only a component the entity still carries
7651
+ * is written and muted fields are left out. An element that is leaving has its tracks ended and
7652
+ * keeps its place, and the recorded pose of an entity that is gone is skipped. So is one recorded
7653
+ * for a projection view: its own rest pose wins, as in `restOf`, and it is already home.
7654
+ *
7655
+ * @param pctx - Domain context of the projection module.
7656
+ */
7657
+ function convergeElements(pctx) {
7658
+ const { ecs, components } = pctx.deps;
7659
+ const state = pctx.ctx.state.projection;
7660
+ for (const [entity, rest] of state.rests) {
7661
+ if (ecs.ownerOf(entity) === void 0 || state.byEntity.has(entity)) continue;
7662
+ cancelTracks(pctx, entity);
7663
+ if (ecs.has(entity, components.Exiting)) continue;
7664
+ const carried = [];
7665
+ for (const [name, value] of rest) if (storedValue(pctx, entity, value.type) !== void 0) carried.push(name);
7666
+ writeRestNow(pctx, createViewRecord(entity, "", "", void 0, rest), carried);
7667
+ }
7668
+ }
7669
+ /**
7670
+ * Tells every `onConverged` listener that the picture is home, so an owner puts back what only
7671
+ * it knows: `ui` builds its roots again. A listener that throws is logged and the others still
7672
+ * run.
7673
+ *
7674
+ * @param pctx - Domain context of the projection module.
7675
+ */
7676
+ function tellConverged(pctx) {
7677
+ for (const listener of [...pctx.ctx.state.projection.converged]) try {
7678
+ listener();
7679
+ } catch (error) {
7680
+ pctx.ctx.log.error("world:converged-listener-failed", {}, asError$2(error));
7681
+ }
7682
+ }
7683
+ /**
7633
7684
  * Reconciles one mounted projection against the snapshot.
7634
7685
  *
7635
7686
  * @param pctx - Domain context of the projection module.
7636
7687
  * @param spec - The projection spec.
7637
7688
  * @param mounted - The mounted projection.
7638
7689
  * @param snapshot - The model snapshot of this reconcile.
7639
- * @param options - Mode and force flag of this reconcile.
7690
+ * @param options - Mode, force flag and converge flag of this reconcile.
7640
7691
  * @param counts - The counters of this reconcile.
7641
7692
  * @param used - The hints that reached an entry.
7642
7693
  */
@@ -7665,13 +7716,16 @@ function reconcileOne(pctx, spec, mounted, snapshot, options, counts, used) {
7665
7716
  }
7666
7717
  mounted.items = next;
7667
7718
  if (options.direct) flushMounted(pctx, mounted);
7719
+ if (options.converge) convergeMounted(pctx, mounted);
7668
7720
  counts.queued += mounted.queue.length;
7669
7721
  }
7670
7722
  /**
7671
- * Runs one reconcile over every mounted projection, or over the named ones only.
7723
+ * Runs one reconcile over every mounted projection, or over the named ones only. A converging
7724
+ * one then brings the elements other plugins own home and tells their owners.
7672
7725
  *
7673
7726
  * @param pctx - Domain context of the projection module.
7674
- * @param options - Which projections, play or direct, and whether `view` is forced.
7727
+ * @param options - Which projections, play or direct, whether `view` is forced, and whether
7728
+ * every live view and every element is brought to its rest pose at the end.
7675
7729
  */
7676
7730
  function reconcile(pctx, options) {
7677
7731
  const state = pctx.ctx.state.projection;
@@ -7685,6 +7739,10 @@ function reconcile(pctx, options) {
7685
7739
  counts.projections += 1;
7686
7740
  reconcileOne(pctx, spec, mounted, snapshot, options, counts, used);
7687
7741
  }
7742
+ if (options.converge) {
7743
+ convergeElements(pctx);
7744
+ tellConverged(pctx);
7745
+ }
7688
7746
  counts.hintsRouted = used.size;
7689
7747
  counts.hintsDropped = state.hints.length - used.size;
7690
7748
  if (pctx.ctx.config.reconciledEvent) pctx.ctx.emit("world:reconciled", {
@@ -7721,6 +7779,22 @@ function isDirectCause(cause) {
7721
7779
  return cause === "load" || cause === "restore" || cause === "mount" || cause === "rerun";
7722
7780
  }
7723
7781
  /**
7782
+ * Tells whether a cause replaces the state, so every live view has to stand on its rest pose
7783
+ * when the reconcile ends, also a view whose item is the same object as before, and every
7784
+ * element on the rest pose its owner recorded.
7785
+ *
7786
+ * @param cause - Why the reconcile runs.
7787
+ * @returns True for a load and a restore.
7788
+ * @example
7789
+ * ```ts
7790
+ * isConvergeCause("restore"); // true
7791
+ * isConvergeCause("rerun"); // false
7792
+ * ```
7793
+ */
7794
+ function isConvergeCause(cause) {
7795
+ return cause === "load" || cause === "restore";
7796
+ }
7797
+ /**
7724
7798
  * Creates the empty view tables of a freshly mounted projection. These live in their own
7725
7799
  * non-exported functions because lint rule L5 refuses a collection built inside an exported
7726
7800
  * declaration.
@@ -7851,16 +7925,19 @@ function createProjectionApi(ctx, deps) {
7851
7925
  };
7852
7926
  const state = ctx.state.projection;
7853
7927
  /**
7854
- * Reconciles what is dirty. The cause table decides play or direct.
7928
+ * Reconciles what is dirty. The cause table decides play or direct, and whether every live view
7929
+ * and every element with a recorded rest pose is brought to it: a restore and a load do that.
7855
7930
  */
7856
7931
  const reconcileIfDirty = () => {
7857
7932
  const dirty = state.dirty;
7858
7933
  state.dirty = void 0;
7859
7934
  if (dirty !== void 0 && (dirty.roots.has("player") || dirty.roots.has("session"))) {
7860
7935
  const direct = dirty.force || dirty.causes.some((cause) => isDirectCause(cause)) || deps.ecs.mode() !== "live";
7936
+ const converge = dirty.causes.some((cause) => isConvergeCause(cause));
7861
7937
  reconcile(pctx, {
7862
7938
  direct,
7863
- force: dirty.force
7939
+ force: dirty.force,
7940
+ converge
7864
7941
  });
7865
7942
  }
7866
7943
  state.hints.length = 0;
@@ -7920,7 +7997,8 @@ function createProjectionApi(ctx, deps) {
7920
7997
  if (fresh.length > 0) reconcile(pctx, {
7921
7998
  names: fresh.map((spec) => spec.name),
7922
7999
  direct: true,
7923
- force: true
8000
+ force: true,
8001
+ converge: false
7924
8002
  });
7925
8003
  },
7926
8004
  unmount: (names) => {
@@ -8034,6 +8112,13 @@ function createProjectionApi(ctx, deps) {
8034
8112
  state.rests.delete(entity);
8035
8113
  };
8036
8114
  },
8115
+ onConverged: (listener) => {
8116
+ state.converged.push(listener);
8117
+ return () => {
8118
+ const at = state.converged.indexOf(listener);
8119
+ if (at !== -1) state.converged.splice(at, 1);
8120
+ };
8121
+ },
8037
8122
  rerunAll: forceRerun,
8038
8123
  markDirty: (roots, cause) => {
8039
8124
  const dirty = state.dirty ?? emptyDirty();
@@ -8197,6 +8282,7 @@ function exposeProjection(projection) {
8197
8282
  setRest: projection.setRest,
8198
8283
  restOf: projection.restOf,
8199
8284
  registerKey: projection.registerKey,
8285
+ onConverged: projection.onConverged,
8200
8286
  rerunAll: projection.rerunAll
8201
8287
  };
8202
8288
  }
@@ -8323,6 +8409,7 @@ function createProjectionState() {
8323
8409
  keys: emptyMap$7(),
8324
8410
  keysByEntity: emptyMap$7(),
8325
8411
  mutes: emptyMap$7(),
8412
+ converged: [],
8326
8413
  offHints: []
8327
8414
  };
8328
8415
  }
@@ -30236,9 +30323,10 @@ function restValueOf(current, value, owned) {
30236
30323
  /**
30237
30324
  * Records the rest pose of one extra component with a value, so a `change` hook can bring it
30238
30325
  * home with `view.toRest`; a tag has no rest. The fields the type gives to a plugin are skipped.
30326
+ * The visual of a live element is recorded the same way each time its look is written.
30239
30327
  *
30240
30328
  * @param ctx - Domain context of the ui plugin.
30241
- * @param element - The element that carries the extra.
30329
+ * @param element - The element that carries the component.
30242
30330
  * @param value - The value of this render.
30243
30331
  */
30244
30332
  function recordRest(ctx, element, value) {
@@ -31206,14 +31294,17 @@ function createReconciler(ctx, modules, fields) {
31206
31294
  * Writes the visual and input components of a live element again. A visual or an input the
31207
31295
  * element no longer carries is removed, so a variant can trade the rectangle for a nine-slice and
31208
31296
  * back, and a button that became disabled stops answering the gate. `Scroll` is only ever added:
31209
- * its offset belongs to the finger, and a new look or a new rect never resets it. The extras of
31210
- * the `components` prop are diffed last.
31297
+ * its offset belongs to the finger, and a new look or a new rect never resets it. The look
31298
+ * written is recorded as the rest of the visual, so the rest the world holds is always the one
31299
+ * the element is drawn with: a restore brings it back to exactly that. The extras of the
31300
+ * `components` prop are diffed last.
31211
31301
  *
31212
31302
  * @param element - The element that changed.
31213
31303
  */
31214
31304
  function writeLive(element) {
31215
31305
  writeOrder(element);
31216
- const values = [...visualOf$1(element), ...inputOf(element)];
31306
+ const visuals = visualOf$1(element);
31307
+ const values = [...visuals, ...inputOf(element)];
31217
31308
  for (const type of [...VISUALS, ...INPUTS]) if (!values.some((value) => value.type === type) && ecs.has(element.entity, type)) ecs.remove(element.entity, type);
31218
31309
  for (const value of values) {
31219
31310
  if (!ecs.has(element.entity, value.type)) {
@@ -31224,6 +31315,7 @@ function createReconciler(ctx, modules, fields) {
31224
31315
  const owned = ecs.typeOf(value.type.componentName)?.owned ?? [];
31225
31316
  ecs.set(element.entity, asHandle(value.type), livePatch(value.value, owned));
31226
31317
  }
31318
+ for (const value of visuals) recordRest(ctx, element, value);
31227
31319
  writeExtras(element);
31228
31320
  }
31229
31321
  /**
@@ -31514,6 +31606,39 @@ function createReconciler(ctx, modules, fields) {
31514
31606
  else modules.layout.enter(element);
31515
31607
  }
31516
31608
  /**
31609
+ * Asks for every root to be built again. The world calls it after a restore or a load, when it
31610
+ * brought every element to its rest pose and ended every track on it. The next reconcile does
31611
+ * the work, because only then the tree of the restored state is here to build from.
31612
+ */
31613
+ function converged() {
31614
+ state.remount = true;
31615
+ ctx.deps.time.wake();
31616
+ }
31617
+ /**
31618
+ * Builds every root again from nothing: its element tree is dropped at once, with no exit, and
31619
+ * the reconcile of this pass enters it through the mount path. So after a restore or a load an
31620
+ * element stands exactly as if its root had just been mounted with the restored state: a new
31621
+ * entity with the components of the description, then its `enter` hook, then its loop. What a
31622
+ * mount does not bring is gone with the old tree: the local state of a component, a scroll
31623
+ * offset, the keyboard focus, a text being edited, a hover. A root that is leaving keeps
31624
+ * leaving.
31625
+ */
31626
+ function remountRoots() {
31627
+ state.remount = false;
31628
+ for (const root of state.roots.values()) {
31629
+ if (state.removing.has(root.entity)) continue;
31630
+ const element = root.element === void 0 ? void 0 : lookup(root.element);
31631
+ if (element !== void 0) {
31632
+ forgetSubtree(element);
31633
+ forgetInstances(state, element.identity);
31634
+ despawnTree(element);
31635
+ }
31636
+ root.element = void 0;
31637
+ root.dirty = true;
31638
+ root.needsSolve = true;
31639
+ }
31640
+ }
31641
+ /**
31517
31642
  * Reconciles one root from the node its `Tree` carries.
31518
31643
  *
31519
31644
  * @param root - The root to reconcile.
@@ -31574,13 +31699,15 @@ function createReconciler(ctx, modules, fields) {
31574
31699
  }
31575
31700
  }
31576
31701
  /**
31577
- * The first of the two systems of phase `layout`: the sweep, the popups that may leave, the
31578
- * pull of the text being typed, the scroll offsets and the windowed ranges, the bound texts that
31579
- * show a string of another size, the viewport, the dirty roots and the hosted views.
31702
+ * The first of the two systems of phase `layout`: the sweep, the roots a restore asked to build
31703
+ * again, the popups that may leave, the pull of the text being typed, the scroll offsets and the
31704
+ * windowed ranges, the bound texts that show a string of another size, the viewport, the dirty
31705
+ * roots and the hosted views.
31580
31706
  */
31581
31707
  function reconcile() {
31582
31708
  sweep();
31583
31709
  state.reconciles += 1;
31710
+ if (state.remount) remountRoots();
31584
31711
  settlePopups(ctx, state, unmountRoot);
31585
31712
  fields.pull();
31586
31713
  const containers = scrollContainers();
@@ -31720,7 +31847,8 @@ function createReconciler(ctx, modules, fields) {
31720
31847
  unmountRoot,
31721
31848
  markPointer,
31722
31849
  playEnter,
31723
- sweep
31850
+ sweep,
31851
+ converged
31724
31852
  };
31725
31853
  }
31726
31854
  //#endregion
@@ -31846,6 +31974,7 @@ function createJsxApi(ctx, modules) {
31846
31974
  applyTap: (entity) => applyTap(ctx, entity),
31847
31975
  markPointer: frame.markPointer,
31848
31976
  playEnter: frame.playEnter,
31977
+ converged: frame.converged,
31849
31978
  key: (input) => focus.key(input),
31850
31979
  blur: focus.blur
31851
31980
  };
@@ -32119,7 +32248,9 @@ function restVisual(element) {
32119
32248
  }
32120
32249
  /**
32121
32250
  * Records the rest pose of one element before a hook runs: the transform from `Box` and the
32122
- * style, and the visual the element is actually drawn with.
32251
+ * style, and the visual the element is actually drawn with. The content of a scroll records no
32252
+ * rest `Transform`: the scroll step owns its pose, and the world brings an element back to every
32253
+ * rest it holds after a restore.
32123
32254
  *
32124
32255
  * @param ctx - Domain context of the ui plugin.
32125
32256
  * @param element - The element that entered or moved.
@@ -32127,7 +32258,7 @@ function restVisual(element) {
32127
32258
  */
32128
32259
  function writeRest(ctx, element, parent) {
32129
32260
  const projection = ctx.deps.world.projection;
32130
- projection.setRest(element.entity, Transform, restTransform(element.rect, parent, element.style, element.fit));
32261
+ if (element.type !== "content") projection.setRest(element.entity, Transform, restTransform(element.rect, parent, element.style, element.fit));
32131
32262
  const visual = restVisual(element);
32132
32263
  if (visual !== void 0) projection.setRest(element.entity, visual.component, visual.value);
32133
32264
  }
@@ -32239,8 +32370,8 @@ function still(element) {
32239
32370
  * element plays its `change.Transform` motion when it has one, else takes the pose through a
32240
32371
  * 0 ms rest track, which lands on the next frame step and lets an additive loop re-base on the
32241
32372
  * new rest; an element that has not spawned yet only records it, and so does one whose
32242
- * `change.Box` motion already played. The content of a scroll keeps its `Transform`: the scroll
32243
- * step owns it.
32373
+ * `change.Box` motion already played. The content of a scroll keeps its `Transform` and records
32374
+ * no rest with the world: the scroll step owns it.
32244
32375
  *
32245
32376
  * @param ctx - Domain context of the ui plugin.
32246
32377
  * @param element - The element whose rect, style or fit may have changed.
@@ -32253,6 +32384,7 @@ function repose(ctx, element, parent, hooked, hint) {
32253
32384
  if (samePose(element.rest, next)) return;
32254
32385
  const previous = element.rest;
32255
32386
  element.rest = next;
32387
+ if (element.type === "content") return;
32256
32388
  ctx.deps.world.projection.setRest(element.entity, Transform, next);
32257
32389
  if (!element.live || hooked) return;
32258
32390
  const hook = element.motion?.change?.Transform;
@@ -32260,7 +32392,7 @@ function repose(ctx, element, parent, hooked, hint) {
32260
32392
  play(ctx, element, (view) => hook(view, previous, next, hint));
32261
32393
  return;
32262
32394
  }
32263
- if (element.type !== "content") handleOf(ctx, element)?.toRest(Transform, { ms: 0 });
32395
+ handleOf(ctx, element)?.toRest(Transform, { ms: 0 });
32264
32396
  }
32265
32397
  /**
32266
32398
  * Moves the rest `Transform` of a root element up by the keyboard lift, or back to its own rest
@@ -33692,7 +33824,8 @@ function registerComponents(ctx, jsx) {
33692
33824
  }
33693
33825
  /**
33694
33826
  * Opens the two systems of phase `layout`, the seven world hooks of `Tree`, `Box`, `Pressed` and
33695
- * `PointerOver`, the two effect handlers, the hint listener that buffers every released hint for
33827
+ * `PointerOver`, the listener that asks for every root to be built again after a restore or a
33828
+ * load, the two effect handlers, the hint listener that buffers every released hint for
33696
33829
  * the `change` hooks of the next frame step, the three tap listeners (the `LocalWrite` patch, the
33697
33830
  * pointer tap that clears the keyboard focus, and the tap that starts or ends the editing of a
33698
33831
  * text field), the pointer door that opens the keyboard inside the DOM listener, the key listener
@@ -33720,7 +33853,7 @@ function openRegistrations(ctx, jsx, layout) {
33720
33853
  })), ecs.onAdded(Tree, (entity) => {
33721
33854
  const place = projection.keyOf(entity);
33722
33855
  jsx.mountRoot(entity, place?.projection ?? "ui", ecs.get(entity, Layer)?.name ?? "ui");
33723
- }), ecs.onRemoved(Tree, (entity) => jsx.unmountRoot(entity)), ecs.onAdded(Box, (entity) => jsx.playEnter(entity)), ecs.onAdded(Pressed, (entity) => jsx.markPointer(entity, "pressed", true)), ecs.onRemoved(Pressed, (entity) => jsx.markPointer(entity, "pressed", false)), ecs.onAdded(PointerOver, (entity) => jsx.markPointer(entity, "hover", true)), ecs.onRemoved(PointerOver, (entity) => jsx.markPointer(entity, "hover", false)), ctx.deps.flow.fx.handle("popup", layout.popupHandler(jsx)), ctx.deps.flow.fx.handle("guide", layout.guideHandler()), ctx.deps.flow.fx.onHint((hint) => {
33856
+ }), ecs.onRemoved(Tree, (entity) => jsx.unmountRoot(entity)), ecs.onAdded(Box, (entity) => jsx.playEnter(entity)), projection.onConverged(jsx.converged), ecs.onAdded(Pressed, (entity) => jsx.markPointer(entity, "pressed", true)), ecs.onRemoved(Pressed, (entity) => jsx.markPointer(entity, "pressed", false)), ecs.onAdded(PointerOver, (entity) => jsx.markPointer(entity, "hover", true)), ecs.onRemoved(PointerOver, (entity) => jsx.markPointer(entity, "hover", false)), ctx.deps.flow.fx.handle("popup", layout.popupHandler(jsx)), ctx.deps.flow.fx.handle("guide", layout.guideHandler()), ctx.deps.flow.fx.onHint((hint) => {
33724
33857
  ctx.state.jsx.hints.push(hint);
33725
33858
  }), ctx.deps.input.onTap(jsx.applyTap), ctx.deps.input.onTap(() => jsx.blur()), ctx.deps.input.onTap(jsx.tapped), ctx.deps.input.onPointer(jsx.pointer), ctx.deps.input.onKey(jsx.key), ctx.deps.input.controls.add(LocalWrite), () => jsx.releaseHosted(), () => ecs.despawnOwnedBy(UI_OWNER));
33726
33859
  }
@@ -33773,6 +33906,7 @@ function stopUi(state) {
33773
33906
  state.jsx.hosts.clear();
33774
33907
  state.jsx.hosted.clear();
33775
33908
  state.jsx.scrolls.clear();
33909
+ state.jsx.remount = false;
33776
33910
  state.jsx.hints.length = 0;
33777
33911
  state.jsx.focus.entity = void 0;
33778
33912
  state.jsx.focus.ring = void 0;
@@ -34115,7 +34249,8 @@ function createJsxState() {
34115
34249
  text: createTextState(),
34116
34250
  hints: [],
34117
34251
  scrolls: emptySet(),
34118
- windowRenders: 0
34252
+ windowRenders: 0,
34253
+ remount: false
34119
34254
  };
34120
34255
  }
34121
34256
  //#endregion
@@ -1,7 +1,7 @@
1
- import { Dt as AnyFlow, Ht as ClockSource, Nt as NodeTable, Wt as FakeClock, Xt as Json, ht as FeaturePlugin } from "./types-BAWV0bNA.mjs";
2
- import { t as createApp } from "./index-CGynRcOj.mjs";
3
- import { n as saveOf, t as memory } from "./memory-DUNdViKq.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-CBQhbYPZ.mjs";
1
+ import { Dt as AnyFlow, Ht as ClockSource, Nt as NodeTable, Wt as FakeClock, Xt as Json, ht as FeaturePlugin } from "./types-CUNcMkD1.mjs";
2
+ import { t as createApp } from "./index-qc-2WJnj.mjs";
3
+ import { n as saveOf, t as memory } from "./memory-D6S7BUAo.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-TowWxARz.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 { Kt as type, Ut as exit, t as createApp } from "./src-BD-MZliM.mjs";
1
+ import { Kt as type, Ut as exit, t as createApp } from "./src-DiPISDVO.mjs";
2
2
  import { n as saveOf, t as memory } from "./memory-CWlqhS7l.mjs";
3
3
  import { t as fakeClock } from "./fake-MpzwZhIZ.mjs";
4
4
  import { i as stepFrames, r as runRepro, t as createHeadless } from "./headless-BA6ffzqD.mjs";
@@ -1,7 +1,7 @@
1
- import { Dt as AnyFlow, Ht as ClockSource, Jt as Config, Wt as FakeClock, Xt as Json, a as Config$3, g as Config$2, ht as FeaturePlugin, n as AssetsIo, pt as Config$1, tn as PlayerStateProvider, u as Manifest, v as PixiModule } from "./types-BAWV0bNA.mjs";
2
- import { o as AudioContextLike, s as Config$4 } from "./types-DO_5UT1J.mjs";
3
- import { _t as audioPlugin, ct as PlatformProvider, ht as effectsPlugin, i as screen, ot as platformPlugin, t as createApp } from "./index-CGynRcOj.mjs";
4
- import { t as memory } from "./memory-DUNdViKq.mjs";
1
+ import { Dt as AnyFlow, Ht as ClockSource, Jt as Config, Wt as FakeClock, Xt as Json, a as Config$3, g as Config$2, ht as FeaturePlugin, n as AssetsIo, pt as Config$1, tn as PlayerStateProvider, u as Manifest, v as PixiModule } from "./types-CUNcMkD1.mjs";
2
+ import { o as AudioContextLike, s as Config$4 } from "./types-DzbRzti4.mjs";
3
+ import { _t as audioPlugin, ct as PlatformProvider, ht as effectsPlugin, i as screen, ot as platformPlugin, t as createApp } from "./index-qc-2WJnj.mjs";
4
+ import { t as memory } from "./memory-D6S7BUAo.mjs";
5
5
  import { AnyPluginInstance } from "@moku-labs/core";
6
6
 
7
7
  //#region src/app/types.d.ts
@@ -3470,7 +3470,10 @@ type AnyProjectionSpec = {
3470
3470
  readonly motion?: AnyProjectionMotion;
3471
3471
  };
3472
3472
  /**
3473
- * Why a reconcile runs. Merged over the frame; the cause table decides play or direct.
3473
+ * Why a reconcile runs. Merged over the frame; the cause table decides play or direct. A
3474
+ * `"restore"` and a `"load"` replace the state, so their reconcile also brings every live view to
3475
+ * its rest pose, whether its item changed or not, and every element to the rest pose its owner
3476
+ * recorded with `setRest`.
3474
3477
  *
3475
3478
  * @example
3476
3479
  * ```ts
@@ -3590,7 +3593,8 @@ type ProjectionState = {
3590
3593
  rests: Map<Entity, RestPose>; /** Projection name to key to the entity a plugin above registered under it. */
3591
3594
  keys: Map<string, Map<string, Entity>>; /** The reverse of `keys`, so `keyOf` answers for a registered element too. */
3592
3595
  keysByEntity: Map<Entity, ProjectionKey>; /** Entity to component name to the fields another writer owns. */
3593
- mutes: Map<Entity, Map<string, Set<string>>>;
3596
+ mutes: Map<Entity, Map<string, Set<string>>>; /** The `onConverged` listeners: the owners of elements, told after a restore or a load. */
3597
+ converged: Array<() => void>;
3594
3598
  offHints: Array<() => void>;
3595
3599
  };
3596
3600
  /**
@@ -3858,6 +3862,9 @@ type ProjectionApi = {
3858
3862
  viewOf(entity: Entity, owner: Owner): ViewHandle<unknown> | undefined;
3859
3863
  /**
3860
3864
  * Records what one component of an element looks like at rest, so `toRest` knows where home is.
3865
+ * It is also where a restore and a load put the element: after their reconcile every track on
3866
+ * the entity is ended and every recorded component it still carries is written, muted fields
3867
+ * left out. So the owner records the pose it draws the element with, every time that changes.
3861
3868
  *
3862
3869
  * @param entity - The entity of the element.
3863
3870
  * @param component - The component whose rest value is recorded.
@@ -3892,6 +3899,23 @@ type ProjectionApi = {
3892
3899
  * ```
3893
3900
  */
3894
3901
  registerKey(projection: string, key: string, entity: Entity): () => void;
3902
+ /**
3903
+ * Calls a listener after a reconcile a restore or a load caused. By then every live view and
3904
+ * every element with a recorded rest pose stands on that pose, and every track on them is
3905
+ * ended, also a loop the owner of an element started. The owner puts back what only it knows.
3906
+ *
3907
+ * @param listener - Called once after each such reconcile.
3908
+ * @returns The remover; calling it twice is safe.
3909
+ * @example
3910
+ * ```ts
3911
+ * // `ui` builds its roots again after a restore, so each element stands as freshly mounted.
3912
+ * const world = ctx.require(worldPlugin);
3913
+ * const off = world.projection.onConverged(() => jsx.converged());
3914
+ *
3915
+ * off(); // onStop: `ui` is gone
3916
+ * ```
3917
+ */
3918
+ onConverged(listener: () => void): () => void;
3895
3919
  /**
3896
3920
  * Marks every mounted projection dirty and forces `view` for every item, so the next frame
3897
3921
  * rebuilds the picture directly.
@@ -1,5 +1,5 @@
1
- import { Xt as Json, an as Snapshot } from "./types-BAWV0bNA.mjs";
2
- import { t as HeadlessApp } from "./headless-CBQhbYPZ.mjs";
1
+ import { Xt as Json, an as Snapshot } from "./types-CUNcMkD1.mjs";
2
+ import { t as HeadlessApp } from "./headless-TowWxARz.mjs";
3
3
  import { Log } from "@moku-labs/common/browser";
4
4
 
5
5
  //#region src/plugins/flow/doors/types.d.ts
@@ -1,5 +1,5 @@
1
- import { A as Api$2, B as ComponentType, F as AnyComponent, H as Entity, It as TypeTag, L as AnyComponentValue, Lt as Descriptor, R as ComponentHandle, Sn as Require, Xt as Json, Yt as Events$2, at as NumericFields, ct as TrackOptions, dn as Events$3, dt as Api$1, et as Ease, h as Api$5, hn as Api, it as MotionHandle, lt as TrackSegment, nt as LayerSpec, q as Owner, qt as Api$4, s as Events$4, t as Api$3, tt as LayerSort, xn as Events$5 } from "./types-BAWV0bNA.mjs";
2
- import { A as InputApi, c as UiNode, i as Finding, n as ElementChange, o as JsxState, q as I18nApi, r as ElementMotion, rt as StylesState, x as TextApi } from "./types-zzul0fH3.mjs";
1
+ import { A as Api$2, B as ComponentType, F as AnyComponent, H as Entity, It as TypeTag, L as AnyComponentValue, Lt as Descriptor, R as ComponentHandle, Sn as Require, Xt as Json, Yt as Events$2, at as NumericFields, ct as TrackOptions, dn as Events$3, dt as Api$1, et as Ease, h as Api$5, hn as Api, it as MotionHandle, lt as TrackSegment, nt as LayerSpec, q as Owner, qt as Api$4, s as Events$4, t as Api$3, tt as LayerSort, xn as Events$5 } from "./types-CUNcMkD1.mjs";
2
+ import { A as InputApi, c as UiNode, i as Finding, n as ElementChange, o as JsxState, q as I18nApi, r as ElementMotion, rt as StylesState, x as TextApi } from "./types-p12uOu00.mjs";
3
3
  import { Log } from "@moku-labs/common/browser";
4
4
  import { PluginCtx } from "@moku-labs/core";
5
5
  import { Node, Yoga } from "yoga-layout/load";
@@ -1,5 +1,5 @@
1
- import { A as Api$1, B as ComponentType, D as FilterSlot, H as Entity, O as Point, R as ComponentHandle, Sn as Require, _ as PixiFilter, b as PixiTexture, dt as Api, h as Api$2, s as Events, t as Api$3, v as PixiModule, xn as Events$1, y as PixiSprite } from "./types-BAWV0bNA.mjs";
2
- import { x as AnimApi } from "./types-DO_5UT1J.mjs";
1
+ import { A as Api$1, B as ComponentType, D as FilterSlot, H as Entity, O as Point, R as ComponentHandle, Sn as Require, _ as PixiFilter, b as PixiTexture, dt as Api, h as Api$2, s as Events, t as Api$3, v as PixiModule, xn as Events$1, y as PixiSprite } from "./types-CUNcMkD1.mjs";
2
+ import { x as AnimApi } from "./types-DzbRzti4.mjs";
3
3
  import { Log } from "@moku-labs/common/browser";
4
4
  import { PluginCtx } from "@moku-labs/core";
5
5
 
@@ -1,4 +1,4 @@
1
- import { A as Api$2, B as ComponentType, F as AnyComponent, H as Entity, I as AnyComponentType, L as AnyComponentValue, Lt as Descriptor, O as Point$2, Q as ChangeHook, Sn as Require, V as ComponentValue, Vt as Api$5, Xt as Json, at as NumericFields, dt as Api$1, h as Api$3, hn as Api, it as MotionHandle, k as ViewportSize, ot as ProjectionMotion, rt as Motion, s as Events$1, t as Api$4, ut as ViewHandle, zt as Hint } from "./types-BAWV0bNA.mjs";
1
+ import { A as Api$2, B as ComponentType, F as AnyComponent, H as Entity, I as AnyComponentType, L as AnyComponentValue, Lt as Descriptor, O as Point$2, Q as ChangeHook, Sn as Require, V as ComponentValue, Vt as Api$5, Xt as Json, at as NumericFields, dt as Api$1, h as Api$3, hn as Api, it as MotionHandle, k as ViewportSize, ot as ProjectionMotion, rt as Motion, s as Events$1, t as Api$4, ut as ViewHandle, zt as Hint } from "./types-CUNcMkD1.mjs";
2
2
  import { Log } from "@moku-labs/common/browser";
3
3
  import { PluginCtx } from "@moku-labs/core";
4
4
 
@@ -2693,7 +2693,8 @@ type JsxState = {
2693
2693
  text: TextState;
2694
2694
  hints: Hint[];
2695
2695
  scrolls: Set<Entity>;
2696
- windowRenders: number;
2696
+ windowRenders: number; /** True from a restore or a load until the next reconcile built every root again. */
2697
+ remount: boolean;
2697
2698
  };
2698
2699
  /**
2699
2700
  * One node of the snapshot `tree()` answers with. `rect` is natural: under a `fit` ancestor it
package/dist/visual.d.mts CHANGED
@@ -1,9 +1,9 @@
1
- import { A as Api$1, h as Api, ln as Api$3, qt as Api$2 } from "./types-BAWV0bNA.mjs";
2
- import { r as UiApi, x as AnimApi } from "./types-DO_5UT1J.mjs";
3
- import { A as InputApi } from "./types-zzul0fH3.mjs";
4
- import { r as Repro } from "./headless-CBQhbYPZ.mjs";
5
- import { a as InputOf, r as ControlApp } from "./types-BVHYu1kz.mjs";
6
- import { t as commands } from "./commands-DWuuqLHu.mjs";
1
+ import { A as Api$1, h as Api, ln as Api$3, qt as Api$2 } from "./types-CUNcMkD1.mjs";
2
+ import { r as UiApi, x as AnimApi } from "./types-DzbRzti4.mjs";
3
+ import { A as InputApi } from "./types-p12uOu00.mjs";
4
+ import { r as Repro } from "./headless-TowWxARz.mjs";
5
+ import { a as InputOf, r as ControlApp } from "./types-CsejHij6.mjs";
6
+ import { t as commands } from "./commands-BMpk-pW7.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/llms.txt CHANGED
@@ -479,6 +479,7 @@ The graph. Modules `runner`, `gate`, `inbox`, `fx`, `features`. Runner methods s
479
479
  - `features.register(name, description)`, `features.all()`, `features.contributions(slotName)`.
480
480
  - `FlowState` is `{ running, path, stack, pending: { fx?, gate? }, mode }`.
481
481
  - `Bookmark` is `{ path, input, player, session, rng, graph, scene?, rest? }`. Serialisable. `scene` is written by the `game.bookmark` door and read by `game.restore`; `flow.restore` ignores it. `path` names a rest node, or the transit node that waits at the gate for an effect that takes answers (a `popup`, or a hand-written descriptor with `answers`); `rest: { path, input }` then names the rest point before it (left out when the graph started at that node or a restore entered it), and the state is the one committed when that node was entered. `restore` needs a running graph. A rest checkpoint is always accepted. Any other node is accepted only when the graph did not change since the bookmark; with another graph a transit bookmark is entered at `rest` instead when that is a checkpoint, and the log gets `flow:restore-fell-back`.
482
+ - After a `restore` or a load the picture is the one of the restored state, whatever played before: every view of a mounted projection stands on its rest pose with no motion running, and every ui root is built again through the mount path, so `enter` hooks run and a loop starts as after a fresh mount. Scroll offsets, local state, hover and focus start anew. Look an element up again with `ui.find(key)` after a restore. A rest node names the scene it is shown on (`scene: "splash"`): a restore into a node without `scene` keeps the mounted scene.
482
483
  - `restore` of a rest node resolves when the node is entered. `restore` of a transit node runs it again from its start, so its effects before the gate play again, and resolves once its gate is open. The open gate is not the draw: the popup shows on the next frame. `restore` also resolves when the loop ends before the bookmark was entered, after a stop or a fatal error, and nothing is entered then.
483
484
  - Events: `flow:edge` `{ flow, node, outcome, payload, next, patches: { doc, session }, index, now }` after the commit of an edge. `flow:rest` `{ path, checkpoint }`. `flow:error` `{ path, error, rolledBackTo, retry }`.
484
485
  - Config: `mainFlow` default `undefined` and required before `run()`, `safeNode: string | undefined` default `undefined` which means the main flow's `start`, `retries` default `1`, `settleTimeoutMs` default `2000`, `journalLimit` default `500`, `holdMs` default `0`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moku-labs/game",
3
- "version": "0.14.2",
3
+ "version": "0.14.3",
4
4
  "description": "2D puzzle game engine on TypeScript and PixiJS, built on @moku-labs/core.",
5
5
  "type": "module",
6
6
  "sideEffects": [