@moku-labs/game 0.15.9 → 0.15.10

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-DK-IYk-s.mjs";
1
+ import { m as StartedPage, r as GameConfig, t as AnyGameApp, u as PageOptions } from "../types-Dr5uC2fS.mjs";
2
2
 
3
3
  //#region src/app/page.d.ts
4
4
  /**
@@ -1,6 +1,6 @@
1
1
  import { Or as PlayerStateProvider } from "../types-i77Nrrv-.mjs";
2
- import { mt as PlatformProvider } from "../index-DT9aYVGd.mjs";
3
- import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types-DK-IYk-s.mjs";
2
+ import { mt as PlatformProvider } from "../index-PbX7OQIC.mjs";
3
+ import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types-Dr5uC2fS.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,6 +1,6 @@
1
1
  import { Cr as Json } from "./types-i77Nrrv-.mjs";
2
- import { H as StringTable } from "./types-D8roM1u3.mjs";
3
- 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, v as WithGameState } from "./types-DK-IYk-s.mjs";
2
+ import { H as StringTable } from "./types-DwktxRrt.mjs";
3
+ 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, v as WithGameState } from "./types-Dr5uC2fS.mjs";
4
4
  import { AnyPluginInstance } from "@moku-labs/core";
5
5
 
6
6
  //#region src/app/define.d.ts
package/dist/app.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { Bt as audioPlugin, J as platformPlugin, i as screen, kt as effectsPlugin, m as flattenFeatures, t as createApp } from "./src-Cs1bP3v7.mjs";
1
+ import { Bt as audioPlugin, J as platformPlugin, i as screen, kt as effectsPlugin, m as flattenFeatures, t as createApp } from "./src-zXAFOqEc.mjs";
2
2
  import { t as memory } from "./memory-CWlqhS7l.mjs";
3
3
  import { n as isFakeClock, t as fakeClock } from "./fake-6mazmHK3.mjs";
4
4
  //#region src/app/define.ts
@@ -1,6 +1,6 @@
1
1
  import { E as Api$1, Gr as FrameRate, L as Captured, Lr as Api, Mr as Snapshot, Ot as DebugSwitches, Pr as StoreApi, Qn as Bookmark, Qt as Api$2, S as ScenesApi, Yr as Time, tr as FlowState } from "./types-i77Nrrv-.mjs";
2
- import { P as AnimApi, a as AudioApi, h as EffectsApi, r as UiApi } from "./types-DDmfkONF.mjs";
3
- import { M as InputApi } from "./types-D8roM1u3.mjs";
2
+ import { P as AnimApi, a as AudioApi, h as EffectsApi, r as UiApi } from "./types-B73p1XBn.mjs";
3
+ import { M as InputApi } from "./types-DwktxRrt.mjs";
4
4
  import { t as HeadlessApp } from "./headless-CrxofjLt.mjs";
5
5
  import { n as Command, r as ControlApp } from "./types-YXykgTOp.mjs";
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { t as HeadlessApp } from "./headless-CrxofjLt.mjs";
2
2
  import { i as InputArguments, n as Command, o as InputSchema, s as Ran } from "./types-YXykgTOp.mjs";
3
- import { t as commands } from "./commands-5woFUxUr.mjs";
3
+ import { t as commands } from "./commands-DoMH0hnR.mjs";
4
4
  import { t as defineCommand } from "./define-B8A5IoeS.mjs";
5
5
 
6
6
  //#region src/plugins/flow/doors/dev.d.ts
@@ -1,6 +1,6 @@
1
1
  import { $n as DefineNode, $r as Require, $t as Config$8, Bn as State$3, Br as PauseReason, C as State$7, Cr as Json, D as Config$6, Dn as ProjectionMotion, Dr as Patch, E as Api$4, En as NumericFields, Fn as Config$3, Fr as RngApi, In as EmitterIdOf, Jn as FeatureDescription, Jr as ThermalReading, Kr as RateChange, Kt as SpriteOptions, Ln as GameTypes, Lr as Api$3, Lt as HudPartValue, Nn as Api$2, Nt as ViewportSize, On as ProjectionSpec, P as State$6, Pn as BundlesOf, Pr as StoreApi, Qr as Events$1, Qt as Api$6, Rn as HudKeysOf, Rr as Config$4, S as ScenesApi, Sn as Ease, Tr as State$5, U as FrameRecord, Un as defineFlow, Ur as Api$5, Vn as TextStylesOf, Vr as State$4, Vt as OverlayValue, W as FrameRing, Wr as Config$7, Wt as ShapeValue, Xn as FeatureTree, Xt as sprite, Yn as FeaturePlugin, Yt as TransformValue, Zr as Config$9, _ as DefineScene, _n as SystemDefinition, a as Config$1, ar as SceneIdOf, b as SceneDefinition, c as LoadBundles, cn as ComponentType, cr as Effect, dr as Hint, et as PassKind, f as State$1, g as AnySceneProjection, gn as ResourceType, gr as Config$2, hn as QueryTerm, i as BundleSpec, kn as ReducedMotion, l as LoadReason, ln as ComponentValue, lr as EffectOptions, mn as Narrowed, mr as Api$1, o as DefineBundles, on as ComponentHandle, p as Tier, pn as Mut, pr as Answer, qr as State$8, qt as SpriteValue, r as BundleMap, sr as Descriptor, t as Api, tn as State$9, u as LoadResult, ur as GuideOptions, vn as SystemFor, vr as State$2, wr as Root, x as SceneSpec, xn as DescriptionNode, xr as Config$5, y as LayerMap, yn as TagType, zr as Events, zt as NineSliceValue } from "./types-i77Nrrv-.mjs";
2
- import { A as GlowValue, B as Target, C as BlurValue, D as FilterComponent, F as AnimPlayerValue, H as HapticKind, I as Config$10, K as defineAnimation, L as FramesValue, M as OutlineValue, N as UniformDeclaration, O as FilterSpec, P as AnimApi, Q as play, R as MotionKeyframe, S as AlphaValue, T as DisplacementValue, U as SfxDescriptor, W as Step, _ as State$12, a as AudioApi, b as EmitterDefinition, c as MusicDescriptor, ct as OverlayApi, d as State$11, f as VolumesFor, h as EffectsApi, j as NoiseValue, k as FilterValueOf, l as MusicOptions, m as Config$12, n as State$13, r as UiApi, s as Config$11, t as Config$13, w as ColorMatrixValue, x as EmitterValue, y as EmitterConfig, z as State$10 } from "./types-DDmfkONF.mjs";
3
- import { A as defineComponent, B as Part, C as TextApi, D as TextStyles, E as TextStyleInput, F as Argument, I as Config$14, J as Style, K as IsFlags, L as I18nApi, M as InputApi, N as State$15, O as TextValue, R as IntlKit, S as State$16, U as TextKey, V as State$14, W as TypedTr, X as WhenFlags, _ as BindField, b as CountdownValue, h as IntrinsicElementsFor, j as Config$15, m as defineTokens, q as ResolvedStyle, s as PopupComponent, v as BindOptions, w as TextBind, x as Point, y as Config$16, z as Message } from "./types-D8roM1u3.mjs";
2
+ import { A as GlowValue, B as Target, C as BlurValue, D as FilterComponent, F as AnimPlayerValue, H as HapticKind, I as Config$10, K as defineAnimation, L as FramesValue, M as OutlineValue, N as UniformDeclaration, O as FilterSpec, P as AnimApi, Q as play, R as MotionKeyframe, S as AlphaValue, T as DisplacementValue, U as SfxDescriptor, W as Step, _ as State$12, a as AudioApi, b as EmitterDefinition, c as MusicDescriptor, ct as OverlayApi, d as State$11, f as VolumesFor, h as EffectsApi, j as NoiseValue, k as FilterValueOf, l as MusicOptions, m as Config$12, n as State$13, r as UiApi, s as Config$11, t as Config$13, w as ColorMatrixValue, x as EmitterValue, y as EmitterConfig, z as State$10 } from "./types-B73p1XBn.mjs";
3
+ import { A as defineComponent, B as Part, C as TextApi, D as TextStyles, E as TextStyleInput, F as Argument, I as Config$14, J as Style, K as IsFlags, L as I18nApi, M as InputApi, N as State$15, O as TextValue, R as IntlKit, S as State$16, U as TextKey, V as State$14, W as TypedTr, X as WhenFlags, _ as BindField, b as CountdownValue, h as IntrinsicElementsFor, j as Config$15, m as defineTokens, q as ResolvedStyle, s as PopupComponent, v as BindOptions, w as TextBind, x as Point, y as Config$16, z as Message } from "./types-DwktxRrt.mjs";
4
4
  import { Log } from "@moku-labs/common/browser";
5
5
  import { PluginCtx } from "@moku-labs/core";
6
6
 
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { $ as PROBLEM_RULES, B as FrameColumns, Bt as Overlay, Ct as ProblemRule, Dt as WarmDetail, Er as types_d_exports$10, Et as ShaderWhat, Ft as Display, G as LongFrameEntry, Gn as slot, Gt as Sprite, H as FrameReadout, Hn as types_d_exports$6, Hr as types_d_exports$9, Ht as Parent, I as types_d_exports$12, It as HudPart, J as OverlayEventDetail, Jt as Transform, K as MONITOR_SECTIONS, Kn as to, Lt as HudPartValue, N as PoolTrim, O as MonitorConfig, Q as PERF_LOG_VERSION, R as MonitorCounts, Rt as NineSlice, St as ProblemEventDetail, T as AdaptiveScale, Tt as ShaderEventDetail, U as FrameRecord, Ut as Shape, V as FrameReadResult, Vt as OverlayValue, W as FrameRing, Wn as exit, X as PERF_CAUSES, Xr as types_d_exports$15, Xt as sprite, Y as OverlayWhat, Z as PERF_GAP_BUCKETS, Zt as DEMAND_REASONS, _t as PerfSpikeLine, at as PerfCollectorLine, bt as PerfThermalLine, ct as PerfEventLine, dt as PerfHeaderLine, et as PassKind, ft as PerfLogLine, gt as PerfSampleLine, h as types_d_exports$1, ht as PerfMeasured, it as PerfChangeEntry, jr as SaveUnreadableError, lt as PerfEventName, mt as PerfMarkLine, nn as types_d_exports$17, nt as PerfCause, ot as PerfCounts, pt as PerfLongFrameLine, q as MonitorSections, qn as type, rt as PerfChange, st as PerfDisplay, tt as PassRecord, ut as PerfGapLine, vt as PerfStartupLine, w as types_d_exports$13, wt as SHADER_WHATS, xn as DescriptionNode, xt as PoolTrimDetail, yr as types_d_exports$3, yt as PerfTelemetryLine } from "./types-i77Nrrv-.mjs";
2
- import { $ as sequence, E as FilterArea, G as HAPTIC_KINDS, H as HapticKind, J as frames, K as defineAnimation, Q as play, V as types_d_exports, X as mark, Y as haptic, Z as parallel, at as tween, et as set, i as types_d_exports$16, it as stagger, lt as types_d_exports$4, nt as spawn, ot as use, p as types_d_exports$2, q as external, rt as spawned, st as wait, tt as sfx, v as types_d_exports$5 } from "./types-DDmfkONF.mjs";
3
- import { A as defineComponent, G as types_d_exports$7, P as types_d_exports$8, T as TextFormat, b as CountdownValue, d as LocalWrite, f as ScrollState, k as types_d_exports$14, l as Box, m as defineTokens, p as popup, u as DebugTrigger, v as BindOptions } from "./types-D8roM1u3.mjs";
4
- import { $ as tag, A as DropTarget, At as bind, B as Traceable, C as AnimPlayer, Ct as clockPlugin, D as defineBundles, Dt as projection, E as defineScene, Et as animPlugin, F as Pressable, G as Layer, H as PASS_KINDS, I as Pressed, J as Tree, K as Now, L as Swipeable, M as Hovered, Mt as label, N as Pointer, O as load, Ot as Countdown, P as PointerOver, Q as system, R as Tappable, S as defineMotion, St as debugPlugin, T as Frames, Tt as assetsPlugin, U as frameAt, V as Traced, W as Exiting, X as mut, Y as component, Z as resource, _ as defineStyle, _t as lifecyclePlugin, a as defineEmitter, at as flattenFeatures, b as messageDuration, bt as flowPlugin, c as Alpha, ct as timePlugin, d as Displacement, dt as rendererPlugin, et as defineEffect, f as Glow, ft as platformPlugin, g as resolve, gt as modelPlugin, h as music, ht as types_d_exports$11, i as screen, it as defineFeature, j as Held, jt as defineTextStyles, k as Draggable, kt as Text, l as Blur, lt as textPlugin, m as Outline, mt as PlatformProvider, n as createPlugin, nt as hint, o as Emitter, ot as worldPlugin, p as Noise, pt as BackResult, q as Order, r as defineGame, rt as schedule, s as defineFilter, st as uiPlugin, t as createApp, tt as guide, u as ColorMatrix, ut as scenesPlugin, v as tr, vt as inputPlugin, w as Animation, wt as audioPlugin, x as cubicBezier, xt as effectsPlugin, y as messageArgument, yt as i18nPlugin, z as Touchable } from "./index-DT9aYVGd.mjs";
2
+ import { $ as sequence, E as FilterArea, G as HAPTIC_KINDS, H as HapticKind, J as frames, K as defineAnimation, Q as play, V as types_d_exports, X as mark, Y as haptic, Z as parallel, at as tween, et as set, i as types_d_exports$16, it as stagger, lt as types_d_exports$4, nt as spawn, ot as use, p as types_d_exports$2, q as external, rt as spawned, st as wait, tt as sfx, v as types_d_exports$5 } from "./types-B73p1XBn.mjs";
3
+ import { A as defineComponent, G as types_d_exports$7, P as types_d_exports$8, T as TextFormat, b as CountdownValue, d as LocalWrite, f as ScrollState, k as types_d_exports$14, l as Box, m as defineTokens, p as popup, u as DebugTrigger, v as BindOptions } from "./types-DwktxRrt.mjs";
4
+ import { $ as tag, A as DropTarget, At as bind, B as Traceable, C as AnimPlayer, Ct as clockPlugin, D as defineBundles, Dt as projection, E as defineScene, Et as animPlugin, F as Pressable, G as Layer, H as PASS_KINDS, I as Pressed, J as Tree, K as Now, L as Swipeable, M as Hovered, Mt as label, N as Pointer, O as load, Ot as Countdown, P as PointerOver, Q as system, R as Tappable, S as defineMotion, St as debugPlugin, T as Frames, Tt as assetsPlugin, U as frameAt, V as Traced, W as Exiting, X as mut, Y as component, Z as resource, _ as defineStyle, _t as lifecyclePlugin, a as defineEmitter, at as flattenFeatures, b as messageDuration, bt as flowPlugin, c as Alpha, ct as timePlugin, d as Displacement, dt as rendererPlugin, et as defineEffect, f as Glow, ft as platformPlugin, g as resolve, gt as modelPlugin, h as music, ht as types_d_exports$11, i as screen, it as defineFeature, j as Held, jt as defineTextStyles, k as Draggable, kt as Text, l as Blur, lt as textPlugin, m as Outline, mt as PlatformProvider, n as createPlugin, nt as hint, o as Emitter, ot as worldPlugin, p as Noise, pt as BackResult, q as Order, r as defineGame, rt as schedule, s as defineFilter, st as uiPlugin, t as createApp, tt as guide, u as ColorMatrix, ut as scenesPlugin, v as tr, vt as inputPlugin, w as Animation, wt as audioPlugin, x as cubicBezier, xt as effectsPlugin, y as messageArgument, yt as i18nPlugin, z as Touchable } from "./index-PbX7OQIC.mjs";
5
5
  export { type AdaptiveScale, 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, DEMAND_REASONS, types_d_exports$4 as Debug, DebugTrigger, type DescriptionNode, Displacement, Display, Draggable, DropTarget, types_d_exports$5 as Effects, Emitter, Exiting, type FilterArea, types_d_exports$6 as Flow, type FrameColumns, type FrameReadResult, type FrameReadout, type FrameRecord, type FrameRing, Frames, Glow, HAPTIC_KINDS, type HapticKind, Held, Hovered, HudPart, type HudPartValue, types_d_exports$7 as I18n, types_d_exports$8 as Input, Layer, types_d_exports$9 as Lifecycle, LocalWrite, type LongFrameEntry, MONITOR_SECTIONS, types_d_exports$10 as Model, type MonitorConfig, type MonitorCounts, type MonitorSections, NineSlice, Noise, Now, Order, Outline, Overlay, type OverlayEventDetail, type OverlayValue, type OverlayWhat, PASS_KINDS, PERF_CAUSES, PERF_GAP_BUCKETS, PERF_LOG_VERSION, PROBLEM_RULES, Parent, type PassKind, type PassRecord, type PerfCause, type PerfChange, type PerfChangeEntry, type PerfCollectorLine, type PerfCounts, type PerfDisplay, type PerfEventLine, type PerfEventName, type PerfGapLine, type PerfHeaderLine, type PerfLogLine, type PerfLongFrameLine, type PerfMarkLine, type PerfMeasured, type PerfSampleLine, type PerfSpikeLine, type PerfStartupLine, type PerfTelemetryLine, type PerfThermalLine, types_d_exports$11 as Platform, type PlatformProvider, Pointer, PointerOver, type PoolTrim, type PoolTrimDetail, Pressable, Pressed, type ProblemEventDetail, type ProblemRule, types_d_exports$12 as Renderer, SHADER_WHATS, SaveUnreadableError, types_d_exports$13 as Scenes, ScrollState, type ShaderEventDetail, type ShaderWhat, Shape, Sprite, Swipeable, Tappable, Text, type TextFormat, types_d_exports$14 as TextTypes, types_d_exports$15 as Time, Touchable, Traceable, Traced, Transform, Tree, types_d_exports$16 as Ui, type WarmDetail, types_d_exports$17 as World, animPlugin, assetsPlugin, audioPlugin, bind, clockPlugin, component, createApp, createPlugin, cubicBezier, debugPlugin, defineAnimation, defineBundles, defineComponent, defineEffect, defineEmitter, defineFeature, defineFilter, defineGame, defineMotion, defineScene, defineStyle, defineTextStyles, defineTokens, effectsPlugin, exit, external, flattenFeatures, flowPlugin, frameAt, 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 haptic, $t as PERF_LOG_VERSION, A as types_exports$6, At as Emitter, B as Box, Bt as audioPlugin, C as types_exports$13, Ct as Touchable, D as types_exports$9, Dt as messageArgument, E as types_exports$10, Et as i18nPlugin, F as types_exports$1, Ft as Glow, G as defineTokens, Gt as Animation, H as LocalWrite, Ht as assetsPlugin, I as types_exports, It as Noise, J as platformPlugin, Jt as PASS_KINDS, K as defineStyle, Kt as Frames, L as uiPlugin, Lt as Outline, M as types_exports$4, Mt as Blur, N as types_exports$3, Nt as ColorMatrix, O as types_exports$8, Ot as messageDuration, P as types_exports$2, Pt as Displacement, Q as frames, Qt as PERF_GAP_BUCKETS, R as resolve, Rt as defineFilter, S as types_exports$14, St as Tappable, T as types_exports$11, Tt as Traced, U as ScrollState, Ut as animPlugin, V as DebugTrigger, Vt as scenesPlugin, W as popup, Wt as AnimPlayer, X as defineAnimation, Xt as MONITOR_SECTIONS, Y as HAPTIC_KINDS, Yt as frameAt, Z as external, Zt as PERF_CAUSES, _ as defineBundles, _t as Pointer, a as cubicBezier, at as sfx, b as types_exports$16, bt as Pressed, c as hint, cn as to, ct as stagger, d as defineScene, dn as SaveUnreadableError, dt as wait, en as PROBLEM_RULES, et as mark, f as tr, fn as lifecyclePlugin, ft as inputPlugin, g as music, gt as Hovered, h as defineEmitter, ht as Held, i as screen, in as flowPlugin, it as set, j as types_exports$5, jt as Alpha, k as types_exports$7, kt as effectsPlugin, l as schedule, ln as type, lt as tween, m as flattenFeatures, mn as clockPlugin, mt as DropTarget, n as createPlugin, nn as DEMAND_REASONS, nt as play, o as defineEffect, on as exit, ot as spawn, p as defineFeature, pn as timePlugin, pt as Draggable, q as textPlugin, qt as rendererPlugin, r as defineGame, rn as worldPlugin, rt as sequence, s as guide, sn as slot, st as spawned, t as createApp, tn as SHADER_WHATS, tt as parallel, u as projection, un as modelPlugin, ut as use, v as load, vt as PointerOver, w as types_exports$12, wt as Traceable, x as types_exports$15, xt as Swipeable, y as types_exports$17, yt as Pressable, z as defineMotion, zt as debugPlugin } from "./src-Cs1bP3v7.mjs";
1
+ import { $ as haptic, $t as PERF_LOG_VERSION, A as types_exports$6, At as Emitter, B as Box, Bt as audioPlugin, C as types_exports$13, Ct as Touchable, D as types_exports$9, Dt as messageArgument, E as types_exports$10, Et as i18nPlugin, F as types_exports$1, Ft as Glow, G as defineTokens, Gt as Animation, H as LocalWrite, Ht as assetsPlugin, I as types_exports, It as Noise, J as platformPlugin, Jt as PASS_KINDS, K as defineStyle, Kt as Frames, L as uiPlugin, Lt as Outline, M as types_exports$4, Mt as Blur, N as types_exports$3, Nt as ColorMatrix, O as types_exports$8, Ot as messageDuration, P as types_exports$2, Pt as Displacement, Q as frames, Qt as PERF_GAP_BUCKETS, R as resolve, Rt as defineFilter, S as types_exports$14, St as Tappable, T as types_exports$11, Tt as Traced, U as ScrollState, Ut as animPlugin, V as DebugTrigger, Vt as scenesPlugin, W as popup, Wt as AnimPlayer, X as defineAnimation, Xt as MONITOR_SECTIONS, Y as HAPTIC_KINDS, Yt as frameAt, Z as external, Zt as PERF_CAUSES, _ as defineBundles, _t as Pointer, a as cubicBezier, at as sfx, b as types_exports$16, bt as Pressed, c as hint, cn as to, ct as stagger, d as defineScene, dn as SaveUnreadableError, dt as wait, en as PROBLEM_RULES, et as mark, f as tr, fn as lifecyclePlugin, ft as inputPlugin, g as music, gt as Hovered, h as defineEmitter, ht as Held, i as screen, in as flowPlugin, it as set, j as types_exports$5, jt as Alpha, k as types_exports$7, kt as effectsPlugin, l as schedule, ln as type, lt as tween, m as flattenFeatures, mn as clockPlugin, mt as DropTarget, n as createPlugin, nn as DEMAND_REASONS, nt as play, o as defineEffect, on as exit, ot as spawn, p as defineFeature, pn as timePlugin, pt as Draggable, q as textPlugin, qt as rendererPlugin, r as defineGame, rn as worldPlugin, rt as sequence, s as guide, sn as slot, st as spawned, t as createApp, tn as SHADER_WHATS, tt as parallel, u as projection, un as modelPlugin, ut as use, v as load, vt as PointerOver, w as types_exports$12, wt as Traceable, x as types_exports$15, xt as Swipeable, y as types_exports$17, yt as Pressable, z as defineMotion, zt as debugPlugin } from "./src-zXAFOqEc.mjs";
2
2
  import { A as Now, C as Sprite, D as sprite, F as resource, I as system, M as Tree, N as component, O as Exiting, P as mut, R as tag, S as Shape, _ as HudPart, c as Countdown, f as defineTextStyles, g as Display, j as Order, k as Layer, l as Text, p as label, u as bind, v as NineSlice, w as Transform, x as Parent, y as Overlay } from "./visual-CIUx49C0.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, DEMAND_REASONS, types_exports$4 as Debug, DebugTrigger, Displacement, Display, Draggable, DropTarget, types_exports$5 as Effects, Emitter, Exiting, types_exports$6 as Flow, Frames, Glow, HAPTIC_KINDS, Held, Hovered, HudPart, types_exports$7 as I18n, types_exports$8 as Input, Layer, types_exports$9 as Lifecycle, LocalWrite, MONITOR_SECTIONS, types_exports$10 as Model, NineSlice, Noise, Now, Order, Outline, Overlay, PASS_KINDS, PERF_CAUSES, PERF_GAP_BUCKETS, PERF_LOG_VERSION, PROBLEM_RULES, Parent, types_exports$11 as Platform, Pointer, PointerOver, Pressable, Pressed, types_exports$12 as Renderer, SHADER_WHATS, SaveUnreadableError, types_exports$13 as Scenes, ScrollState, Shape, Sprite, Swipeable, Tappable, Text, types_exports$14 as TextTypes, types_exports$15 as Time, Touchable, Traceable, Traced, Transform, Tree, types_exports$16 as Ui, types_exports$17 as World, animPlugin, assetsPlugin, audioPlugin, bind, clockPlugin, component, createApp, createPlugin, cubicBezier, debugPlugin, defineAnimation, defineBundles, defineComponent, defineEffect, defineEmitter, defineFeature, defineFilter, defineGame, defineMotion, defineScene, defineStyle, defineTextStyles, defineTokens, effectsPlugin, exit, external, flattenFeatures, flowPlugin, frameAt, 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,6 +1,6 @@
1
1
  import { E as Api$2, F as Under, Mr as Snapshot, Qt as Api$1, br as Api, dn as EntitySnapshot, en as Explained, er as FlowGraph, fn as FrameDiff, m as Usage, nr as JournalEntry, sn as ComponentSchema, t as Api$3, z as RenderStats, zn as Position } from "./types-i77Nrrv-.mjs";
2
- import { a as AudioApi, g as EffectsStats, h as EffectsApi, r as UiApi, u as SoundEntry } from "./types-DDmfkONF.mjs";
3
- import { c as UiNode } from "./types-D8roM1u3.mjs";
2
+ import { a as AudioApi, g as EffectsStats, h as EffectsApi, r as UiApi, u as SoundEntry } from "./types-B73p1XBn.mjs";
3
+ import { c as UiNode } from "./types-DwktxRrt.mjs";
4
4
  import { t as HeadlessApp } from "./headless-CrxofjLt.mjs";
5
5
  import { a as InputOf, c as Source, i as InputArguments, l as WatchApp, o as InputSchema, t as CheatEntry, u as WatchInput } from "./types-YXykgTOp.mjs";
6
6
  import { n as defineSource } from "./define-B8A5IoeS.mjs";
@@ -1,2 +1,2 @@
1
- import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-BZQQPq56.mjs";
1
+ import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-Bk_rHR3K.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-BZQQPq56.mjs";
1
+ import { a as jsxs, n as JSX, r as jsx, t as Fragment } from "./runtime-Bk_rHR3K.mjs";
2
2
  export { Fragment, type JSX, jsx, jsxs };
@@ -1,4 +1,4 @@
1
- import { a as JsxChild, g as UiIntrinsicElements, t as DescriptionNode } from "./types-D8roM1u3.mjs";
1
+ import { a as JsxChild, g as UiIntrinsicElements, t as DescriptionNode } from "./types-DwktxRrt.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. */
@@ -16484,8 +16484,9 @@ function writeTakeKeys(record, now, box) {
16484
16484
  }
16485
16485
  /**
16486
16486
  * Takes or retakes the picture of a record: stages 1, 2 (when its first filter has inputs) and 3, at the phase of this
16487
- * frame. Refused, and the view drawn live, for a `Display` in the subtree without `onDemand`, empty bounds, a picture
16488
- * over 4096 device pixels, or a budget that has no room (P6.3, warned once).
16487
+ * frame. The bounds are cut to the filter area of the top when it holds one (F43). Refused, and the view drawn live,
16488
+ * for a `Display` in the subtree without `onDemand`, empty bounds, a picture over 4096 device pixels, or a budget that
16489
+ * has no room (P6.3, warned once).
16489
16490
  *
16490
16491
  * @param kctx - The kept context.
16491
16492
  * @param pixi - The module that draws.
@@ -16498,7 +16499,7 @@ function writeTakeKeys(record, now, box) {
16498
16499
  function takePicture(kctx, pixi, matrices, record, view, now) {
16499
16500
  const { top } = record;
16500
16501
  if (!kctx.ctx.config.onDemand && holdsDisplay(kctx, top)) return false;
16501
- const local = top.getLocalBounds();
16502
+ const local = clippedToArea(top.getLocalBounds(), top.filterArea);
16502
16503
  if (isEmptyBounds(local)) return false;
16503
16504
  const box = linearBounds(now.a, now.b, now.c, now.d, local);
16504
16505
  const x = gridSpan(now.tx + box.x0, now.tx + box.x1, now.rs);
@@ -16530,6 +16531,27 @@ function takePicture(kctx, pixi, matrices, record, view, now) {
16530
16531
  return ok;
16531
16532
  }
16532
16533
  /**
16534
+ * The local bounds of a top cut to its filter area, both in the top's own units: its filters draw nothing outside
16535
+ * the area. With no area the bounds are returned as they are. Pure.
16536
+ *
16537
+ * @param bounds - The top's local bounds.
16538
+ * @param area - The filter area on the top, or none.
16539
+ * @returns The bounds the picture takes.
16540
+ * @example
16541
+ * ```ts
16542
+ * clippedToArea({ minX: 0, minY: 0, maxX: 400, maxY: 400 }, { x: 100, y: 100, width: 40, height: 40 }); // { minX: 100, minY: 100, maxX: 140, maxY: 140 }
16543
+ * ```
16544
+ */
16545
+ function clippedToArea(bounds, area) {
16546
+ if (area === null || area === void 0) return bounds;
16547
+ return {
16548
+ minX: Math.max(bounds.minX, area.x),
16549
+ minY: Math.max(bounds.minY, area.y),
16550
+ maxX: Math.min(bounds.maxX, area.x + area.width),
16551
+ maxY: Math.min(bounds.maxY, area.y + area.height)
16552
+ };
16553
+ }
16554
+ /**
16533
16555
  * Tells whether local bounds hold nothing to draw: no width or no height. Pure.
16534
16556
  *
16535
16557
  * @param bounds - The bounds of a subtree in its own space.
@@ -27329,7 +27351,9 @@ function displayObjectOf(sctx, entity) {
27329
27351
  }
27330
27352
  /**
27331
27353
  * Detaches the children of a parent that left, and names the ones that stay. A child that leaves in the same teardown
27332
- * is no orphan: its view goes in this very pass (it waits in `removed`), or it plays its exit (`Exiting`).
27354
+ * is no orphan: its view goes in this very pass (it waits in `removed`), or it plays its exit (`Exiting`). Nor is a
27355
+ * child whose `Parent` names another entity, or none, by now: it moved in the same frame (a hosted view a restore
27356
+ * hung under the rebuilt host, F44), and the later steps of this pass hang it where it belongs.
27333
27357
  *
27334
27358
  * @param sctx - Domain context of the sync module.
27335
27359
  * @param entity - The parent entity.
@@ -27337,7 +27361,6 @@ function displayObjectOf(sctx, entity) {
27337
27361
  */
27338
27362
  function detachChildren(sctx, entity, host) {
27339
27363
  const state = sctx.ctx.state.sync;
27340
- const ecs = sctx.ctx.deps.world.ecs;
27341
27364
  const orphans = [];
27342
27365
  for (const [child, childView] of state.views) {
27343
27366
  if (child === entity) continue;
@@ -27346,7 +27369,7 @@ function detachChildren(sctx, entity, host) {
27346
27369
  markView(sctx, child);
27347
27370
  detach$1(object);
27348
27371
  state.orphans.add(child);
27349
- if (!state.removed.has(child) && !isLeaving(ecs, child)) orphans.push(child);
27372
+ if (isLostOrphan(sctx, child, entity)) orphans.push(child);
27350
27373
  }
27351
27374
  if (orphans.length > 0) sctx.ctx.log.warn("renderer: parent left before its children", {
27352
27375
  parent: entity,
@@ -27354,6 +27377,19 @@ function detachChildren(sctx, entity, host) {
27354
27377
  });
27355
27378
  }
27356
27379
  /**
27380
+ * Tells whether a child of a parent that left is an orphan worth a warning: it does not go in this pass, it plays no
27381
+ * exit, and its `Parent` still names the parent that left.
27382
+ *
27383
+ * @param sctx - Domain context of the sync module.
27384
+ * @param child - The child entity.
27385
+ * @param parent - The parent that left.
27386
+ * @returns True when the child stays behind with no parent.
27387
+ */
27388
+ function isLostOrphan(sctx, child, parent) {
27389
+ const ecs = sctx.ctx.deps.world.ecs;
27390
+ return !sctx.ctx.state.sync.removed.has(child) && !isLeaving(ecs, child) && parentOf$1(ecs, child) === parent;
27391
+ }
27392
+ /**
27357
27393
  * Takes a view out of the tree and gives its object back to the pool.
27358
27394
  *
27359
27395
  * @param sctx - Domain context of the sync module.
@@ -32939,9 +32975,23 @@ function startTrack$1(actx, entity, component, to, options, muted, driven = fals
32939
32975
  countPlaying(actx.deps.world.ecs, entity, 1);
32940
32976
  actx.deps.time.wake();
32941
32977
  warnIfCrowded(actx);
32978
+ if (landsAtStart(track, options)) writeFields(actx, track, true);
32942
32979
  return track;
32943
32980
  }
32944
32981
  /**
32982
+ * Tells whether a track writes its target as it starts: an absolute one of 0 ms with no delay,
32983
+ * no repeat and no keys, started so by its caller (not cut by reduced motion). A rest pose a
32984
+ * caller sets in phase `layout` so lands with the fields written beside it in that frame (F47);
32985
+ * the next frame step ends it, where its `Animation` count lands too.
32986
+ *
32987
+ * @param track - The track that starts.
32988
+ * @param options - What its caller asked for.
32989
+ * @returns True when it lands now.
32990
+ */
32991
+ function landsAtStart(track, options) {
32992
+ return options.ms === 0 && track.delayMs === 0 && !track.additive && !track.driven && track.repeatsLeft === 0 && track.segments === void 0;
32993
+ }
32994
+ /**
32945
32995
  * Tells whether a loop stands on its first key instead of walking: with reduced motion on, unless
32946
32996
  * the author kept it, or when it has no length to walk. It stays in the table either way, so it
32947
32997
  * never ends by itself.
@@ -42352,16 +42402,20 @@ function boxCovers(ectx, entity, width, height, size) {
42352
42402
  return width * scale >= size.width && height * scale >= size.height;
42353
42403
  }
42354
42404
  /**
42355
- * Tells whether a filtered view covers the whole viewport: the box its sprite, its nine-slice or
42356
- * its shape declares, times its scale, covers the reference size on both axes. A sprite without a
42357
- * size declares none. Read from components, never from Pixi bounds.
42405
+ * Tells whether a filtered view covers the whole viewport. A view whose enabled filters declare an
42406
+ * area draws only there: that area, times the view's scale, covers the reference size on both axes
42407
+ * (F43, a lens over a full-screen sprite is not full screen). Otherwise the box its sprite, its
42408
+ * nine-slice or its shape declares, times its scale, does. A sprite without a size declares none.
42409
+ * Read from components and the area handed over last, never from Pixi bounds.
42358
42410
  *
42359
42411
  * @param ectx - Domain context of the effects plugin.
42360
- * @param entity - The entity.
42412
+ * @param view - The view's record.
42361
42413
  * @param size - The viewport size.
42362
42414
  * @returns True for a full-screen view.
42363
42415
  */
42364
- function coversScreen(ectx, entity, size) {
42416
+ function coversScreen(ectx, view, size) {
42417
+ const { entity, areaSent } = view;
42418
+ if (areaSent.some) return boxCovers(ectx, entity, areaSent.width, areaSent.height, size);
42365
42419
  const ecs = ectx.deps.world.ecs;
42366
42420
  const sprite = ecs.get(entity, Sprite);
42367
42421
  if (sprite !== void 0) {
@@ -42436,7 +42490,7 @@ function countFullScreen(ectx, size) {
42436
42490
  let count = 0;
42437
42491
  for (const view of ectx.state.viewList) {
42438
42492
  if (view.gone) continue;
42439
- if (hasEnabledFilter(ectx, view) && coversScreen(ectx, view.entity, size)) count += 1;
42493
+ if (hasEnabledFilter(ectx, view) && coversScreen(ectx, view, size)) count += 1;
42440
42494
  }
42441
42495
  return count;
42442
42496
  }
@@ -49353,24 +49407,37 @@ function createTextSystem(ctx, frame) {
49353
49407
  });
49354
49408
  }
49355
49409
  /**
49356
- * Resolves the labels whose `Text` came after the layout system ran. `ui` adds a label in its
49357
- * solve, and the flush at the end of phase `layout` attaches it with the rest of its batch, a bound
49358
- * component included; this runs right after that flush and before phase `sync`, so the renderer
49359
- * builds the label with its string, and lists it, so the next system run writes its `Text` once
49360
- * more for the remeasure of `ui`. A label whose content changed is not among them: it resolves in
49361
- * the next layout phase, as before. While the world is not live its layout phase did not run: the
49362
- * list is dropped, and the labels, marked, wait for the next live run, as every label does.
49410
+ * Resolves the labels whose `Text` came or changed after the layout system ran. `ui` adds a label in
49411
+ * its solve, and the flush at the end of phase `layout` attaches it with the rest of its batch, a
49412
+ * bound component included; this runs right after that flush and before phase `sync`, so the
49413
+ * renderer builds the label with its string, and lists it, so the next system run writes its `Text`
49414
+ * once more for the remeasure of `ui`. A label whose content or style `ui` changed in its reconcile
49415
+ * is resolved here too, in the frame of the change (F45): `ui` measured its content itself, so it is
49416
+ * not listed. While the world is not live its layout phase did not run: the list is dropped, and the
49417
+ * labels, marked, wait for the next live run, as every label does.
49363
49418
  *
49364
49419
  * @param ctx - Domain context of the text plugin.
49365
49420
  * @param frame - What the system's runs share.
49366
49421
  */
49367
49422
  function resolveAdded(ctx, frame) {
49368
49423
  const added = ctx.state.added;
49369
- if (added.length === 0) return;
49370
- if (ctx.deps.world.ecs.mode() !== "live") {
49371
- added.length = 0;
49372
- return;
49424
+ if (added.length > 0) {
49425
+ if (ctx.deps.world.ecs.mode() !== "live") {
49426
+ added.length = 0;
49427
+ return;
49428
+ }
49429
+ resolveCame(ctx, frame, added);
49373
49430
  }
49431
+ resolveChanged(ctx, frame);
49432
+ }
49433
+ /**
49434
+ * Resolves the labels whose `Text` came with the layout flush, and lists them for the remeasure.
49435
+ *
49436
+ * @param ctx - Domain context of the text plugin.
49437
+ * @param frame - What the system's runs share.
49438
+ * @param added - The labels that came.
49439
+ */
49440
+ function resolveCame(ctx, frame, added) {
49374
49441
  frame.now = NaN;
49375
49442
  frame.locale = ctx.deps.i18n.locale();
49376
49443
  for (const entity of added) {
@@ -49382,6 +49449,25 @@ function resolveAdded(ctx, frame) {
49382
49449
  forgetAdded(added);
49383
49450
  }
49384
49451
  /**
49452
+ * Resolves the labels of this frame's `changed(Text)` whose content or style moved since they were
49453
+ * resolved: `ui` writes `Text` after the layout system. The labels this frame resolved already
49454
+ * stand on what they show; a bound label shows its value, as in the system.
49455
+ *
49456
+ * @param ctx - Domain context of the text plugin.
49457
+ * @param frame - What the system's runs share; the locale of this frame is already in it.
49458
+ */
49459
+ function resolveChanged(ctx, frame) {
49460
+ const ecs = ctx.deps.world.ecs;
49461
+ let live = false;
49462
+ for (const entity of ecs.changed(Text)) {
49463
+ const text = ecs.get(entity, Text);
49464
+ if (text === void 0 || !isStale(ctx, entity, text, frame)) continue;
49465
+ if (!live && ecs.mode() !== "live") return;
49466
+ live = true;
49467
+ stepText(ctx, entity, text, frame);
49468
+ }
49469
+ }
49470
+ /**
49385
49471
  * Marks labels for the next layout phase: every one of them, or only the ones `keep` names. A
49386
49472
  * locale change names the labels whose content is a message; a dev hot swap names the labels
49387
49473
  * drawn with a replaced font or icon.
@@ -53973,7 +54059,10 @@ function recordRest(ctx, element, value) {
53973
54059
  * @param name - The component name of the extra.
53974
54060
  */
53975
54061
  function cancelExtra(element, name) {
53976
- element.extraHandles.get(name)?.cancel();
54062
+ const last = element.extraHandles.get(name);
54063
+ if (last === void 0) return;
54064
+ last.cancel();
54065
+ element.endless?.delete(last);
53977
54066
  element.extraHandles.delete(name);
53978
54067
  }
53979
54068
  //#endregion
@@ -55687,10 +55776,11 @@ function createReconciler(ctx, modules, fields) {
55687
55776
  */
55688
55777
  function subtreeSettled(element) {
55689
55778
  if (!modules.layout.settled(element)) return false;
55690
- return element.children.every((child) => {
55779
+ for (const child of element.children) {
55691
55780
  const childElement = state.elements.get(child);
55692
- return childElement === void 0 || subtreeSettled(childElement);
55693
- });
55781
+ if (childElement !== void 0 && !subtreeSettled(childElement)) return false;
55782
+ }
55783
+ return true;
55694
55784
  }
55695
55785
  /**
55696
55786
  * Drops the identity, the key and the key registration of an element and of everything under
@@ -55745,6 +55835,24 @@ function createReconciler(ctx, modules, fields) {
55745
55835
  if (!subtreeSettled(element)) continue;
55746
55836
  despawnTree(element);
55747
55837
  }
55838
+ dropRemovedRoots();
55839
+ }
55840
+ /**
55841
+ * Despawns every exiting element at once, finished or not, and drops the roots that were leaving:
55842
+ * what a restore or a load does, as a page reload would (F42).
55843
+ */
55844
+ function dropLeaving() {
55845
+ for (const entity of state.exiting) {
55846
+ const element = state.elements.get(entity);
55847
+ if (element === void 0) state.exiting.delete(entity);
55848
+ else despawnTree(element);
55849
+ }
55850
+ dropRemovedRoots();
55851
+ }
55852
+ /**
55853
+ * Drops every removed root whose element tree is gone, and closes its popup.
55854
+ */
55855
+ function dropRemovedRoots() {
55748
55856
  for (const entity of state.removing) {
55749
55857
  const root = state.roots.get(entity);
55750
55858
  if (root === void 0) continue;
@@ -56079,11 +56187,12 @@ function createReconciler(ctx, modules, fields) {
56079
56187
  * element stands exactly as if its root had just been mounted with the restored state: a new
56080
56188
  * entity with the components of the description, then its `enter` hook, then its loop. What a
56081
56189
  * mount does not bring is gone with the old tree: the local state of a component, a scroll
56082
- * offset, the keyboard focus, a text being edited, a hover. A root that is leaving keeps
56083
- * leaving.
56190
+ * offset, the keyboard focus, a text being edited, a hover. An element or a root that is
56191
+ * leaving is dropped at once, as a page reload drops it.
56084
56192
  */
56085
56193
  function remountRoots() {
56086
56194
  state.remount = false;
56195
+ dropLeaving();
56087
56196
  for (const root of state.roots.values()) {
56088
56197
  if (state.removing.has(root.entity)) continue;
56089
56198
  const element = root.element === void 0 ? void 0 : lookup(root.element);
@@ -56247,8 +56356,8 @@ function createReconciler(ctx, modules, fields) {
56247
56356
  /**
56248
56357
  * The second system of phase `layout`: every root takes its slot, then one solve per marked
56249
56358
  * root, a root in a slot after the root of its slot and in its content box, then the rects, the
56250
- * rest poses and the hooks, the scrolls settled on what the solve and the render gave them, and
56251
- * the hosting of the hosts that came. The hints released since the last frame step are dropped
56359
+ * rest poses and the hooks, the scrolls settled on what the solve and the render gave them, the
56360
+ * hosting of the hosts that came, and a sweep of what left with nothing to wait for. The hints released since the last frame step are dropped
56252
56361
  * at its end, so the `change.Box` and `change.Transform` hooks the solve plays get the hint the
56253
56362
  * reconcile routed, and the next frame starts with none.
56254
56363
  *
@@ -56268,6 +56377,7 @@ function createReconciler(ctx, modules, fields) {
56268
56377
  hostViews(ctx, state, state.risen);
56269
56378
  state.risen.clear();
56270
56379
  }
56380
+ if (state.exiting.size > 0 || state.removing.size > 0) sweep();
56271
56381
  state.hints.length = 0;
56272
56382
  writeCounters();
56273
56383
  }
@@ -56850,14 +56960,15 @@ function noteTrack(span, options) {
56850
56960
  span.reduced = options.reduced;
56851
56961
  }
56852
56962
  /**
56853
- * The view handle of a hook whose tracks are measured: every call goes to the real handle, `tween` and `toRest` note
56854
- * their track first.
56963
+ * The view handle of a watched hook: every call goes to the real handle; `tween` notes whether its track repeats
56964
+ * forever, and with a span `tween` and `toRest` note their track for the level of an overlay.
56855
56965
  *
56856
56966
  * @param handle - The real handle.
56857
- * @param span - The span being measured.
56858
- * @returns The measuring handle.
56967
+ * @param span - The span being measured, or nothing.
56968
+ * @param watch - Where a track that repeats forever is noted.
56969
+ * @returns The watching handle.
56859
56970
  */
56860
- function spanned(handle, span) {
56971
+ function watched(handle, span, watch) {
56861
56972
  return {
56862
56973
  entity: handle.entity,
56863
56974
  key: handle.key,
@@ -56865,11 +56976,12 @@ function spanned(handle, span) {
56865
56976
  rest: (component) => handle.rest(component),
56866
56977
  set: (component, patch) => handle.set(component, patch),
56867
56978
  tween: (component, to, options) => {
56868
- noteTrack(span, options);
56979
+ if (options.repeat === "forever") watch.forever = true;
56980
+ if (span !== void 0) noteTrack(span, options);
56869
56981
  return handle.tween(component, to, options);
56870
56982
  },
56871
56983
  toRest: (component, options) => {
56872
- noteTrack(span, options);
56984
+ if (span !== void 0) noteTrack(span, options);
56873
56985
  return handle.toRest(component, options);
56874
56986
  },
56875
56987
  all: (handles) => handle.all(handles),
@@ -56878,8 +56990,9 @@ function spanned(handle, span) {
56878
56990
  }
56879
56991
  /**
56880
56992
  * Runs one motion hook and keeps the handle it returned, so the exit sweep knows when the
56881
- * element is still playing. Without a hook the value the solve wrote stands; a throwing hook is
56882
- * logged and the same happens.
56993
+ * element is still playing. A motion whose hook started a track that repeats forever is also
56994
+ * noted as endless: the sweep never waits for it. Without a hook the value the solve wrote stands;
56995
+ * a throwing hook is logged and the same happens.
56883
56996
  *
56884
56997
  * @param ctx - Domain context of the ui plugin.
56885
56998
  * @param element - The element the hook belongs to.
@@ -56892,9 +57005,11 @@ function play(ctx, element, hook, span) {
56892
57005
  const handle = handleOf(ctx, element);
56893
57006
  if (handle === void 0) return void 0;
56894
57007
  try {
56895
- const motion = hook(span === void 0 ? handle : spanned(handle, span));
57008
+ const watch = { forever: false };
57009
+ const motion = hook(watched(handle, span, watch));
56896
57010
  if (motion === void 0) return void 0;
56897
57011
  element.handles.push(motion);
57012
+ if (watch.forever) noteEndless(element, motion);
56898
57013
  return motion;
56899
57014
  } catch (error) {
56900
57015
  ctx.log.error("ui:motion-failed", {
@@ -56905,6 +57020,16 @@ function play(ctx, element, hook, span) {
56905
57020
  }
56906
57021
  }
56907
57022
  /**
57023
+ * Notes a motion that never ends on its element, the set made with the first one.
57024
+ *
57025
+ * @param element - The element the motion plays on.
57026
+ * @param motion - The endless motion.
57027
+ */
57028
+ function noteEndless(element, motion) {
57029
+ element.endless ??= /* @__PURE__ */ new Set();
57030
+ element.endless.add(motion);
57031
+ }
57032
+ /**
56908
57033
  * Plays the `change` hook of one extra component whose fields changed. The motion the last change
56909
57034
  * of that name started is cancelled first, so its value stays where it is and the new motion
56910
57035
  * starts from there; the new motion is kept with the element's handles, so an exit waits for it.
@@ -56919,8 +57044,12 @@ function play(ctx, element, hook, span) {
56919
57044
  * @returns True when the hook returned a motion: the caller writes nothing directly.
56920
57045
  */
56921
57046
  function playExtraChange(ctx, element, name, values, hint) {
56922
- element.extraHandles.get(name)?.cancel();
56923
- element.extraHandles.delete(name);
57047
+ const last = element.extraHandles.get(name);
57048
+ if (last !== void 0) {
57049
+ last.cancel();
57050
+ element.endless?.delete(last);
57051
+ element.extraHandles.delete(name);
57052
+ }
56924
57053
  const hook = element.motion?.change?.[name];
56925
57054
  if (hook === void 0) return false;
56926
57055
  const motion = play(ctx, element, (view) => hook(view, values.previous, values.next, hint));
@@ -56956,19 +57085,23 @@ function startLoop(ctx, element) {
56956
57085
  }
56957
57086
  /**
56958
57087
  * Tells whether every motion of an element has finished, which is when an exiting element may
56959
- * be despawned.
57088
+ * be despawned. A motion over a track that repeats forever never finishes, so it does not count:
57089
+ * waiting for it would keep the element for the life of the page (F42).
56960
57090
  *
56961
57091
  * @param element - The element to ask about.
56962
- * @returns True when nothing is still playing.
57092
+ * @returns True when nothing that can end is still playing.
56963
57093
  */
56964
57094
  function still(element) {
56965
- return element.handles.every((handle) => !handle.active());
57095
+ const { handles, endless } = element;
57096
+ for (const handle of handles) if (handle.active() && endless?.has(handle) !== true) return false;
57097
+ return true;
56966
57098
  }
56967
57099
  /**
56968
57100
  * Moves the rest `Transform` of an element to where its rect, style and fit put it now. A live
56969
57101
  * element plays its `change.Transform` motion when it has one, else takes the pose through a
56970
- * 0 ms rest track, which lands on the next frame step and lets an additive loop re-base on the
56971
- * new rest; an element that has not spawned yet only records it, and so does one whose
57102
+ * 0 ms rest track. That track writes the pose as it starts, so the pivot and the position land in
57103
+ * the same frame, and ends at the next frame step, where an additive loop re-bases on the new
57104
+ * rest. An element that has not spawned yet only records it, and so does one whose
56972
57105
  * `change.Box` motion already played. The content of a scroll keeps its `Transform` and records
56973
57106
  * no rest with the world: the scroll step owns it.
56974
57107
  *
@@ -57081,10 +57214,14 @@ function placeChildren(state, parent, children) {
57081
57214
  * @file ui/layout — exiting elements, policy "leave": the element leaves the flow in the same
57082
57215
  * reconcile, so its siblings reflow this frame while it plays its exit over them.
57083
57216
  */
57217
+ /** The dev warning of an element that left while a motion of it repeated forever. */
57218
+ const EXIT_WAITS_FOREVER = "ui:exit-waits-forever";
57084
57219
  /**
57085
57220
  * Starts the exit of one element: out of the Yoga tree at once, tagged `Exiting` so `input`
57086
57221
  * never hits it, then the hook plays over the siblings that already moved. A `change` motion of
57087
57222
  * an extra component that still runs, a counter's roll, is kept, so the sweep waits for it too.
57223
+ * One that repeats forever, a hot pulse, is cancelled where it stands: it would never end, and a
57224
+ * dev build names the element once (F42).
57088
57225
  *
57089
57226
  * @param ctx - Domain context of the ui plugin.
57090
57227
  * @param state - The layout state.
@@ -57098,11 +57235,45 @@ function beginExit(ctx, state, element, cause, span) {
57098
57235
  element.dropKey = void 0;
57099
57236
  if (!element.live) return;
57100
57237
  ctx.deps.world.ecs.tag(element.entity, Exiting);
57101
- element.handles = [...element.extraHandles.values()].filter((handle) => handle.active());
57238
+ element.handles = keptExtras(ctx, element);
57102
57239
  const hook = element.motion?.exit;
57103
57240
  play(ctx, element, hook === void 0 ? void 0 : (view) => hook(view, element.node, void 0, cause), span);
57104
57241
  }
57105
57242
  /**
57243
+ * The `change` motions of the extras an exit waits for: the ones still running that can end. One
57244
+ * that repeats forever is cancelled where it stands, and a dev build warns once per element.
57245
+ *
57246
+ * @param ctx - Domain context of the ui plugin.
57247
+ * @param element - The element that starts its exit.
57248
+ * @returns The motions the sweep waits for.
57249
+ */
57250
+ function keptExtras(ctx, element) {
57251
+ const kept = [];
57252
+ for (const handle of element.extraHandles.values()) {
57253
+ if (!handle.active()) continue;
57254
+ if (element.endless?.has(handle) !== true) {
57255
+ kept.push(handle);
57256
+ continue;
57257
+ }
57258
+ handle.cancel();
57259
+ warnEndless(ctx, element);
57260
+ }
57261
+ return kept;
57262
+ }
57263
+ /**
57264
+ * Names an element that left while a motion of it repeated forever, once per element, in a dev
57265
+ * build: the motion is cut where it stands, which the author may want to end in the exit instead.
57266
+ *
57267
+ * @param ctx - Domain context of the ui plugin.
57268
+ * @param element - The leaving element.
57269
+ */
57270
+ function warnEndless(ctx, element) {
57271
+ if (typeof __MOKU_GAME_DEV__ === "undefined" || !__MOKU_GAME_DEV__) return;
57272
+ if (element.warned.has(EXIT_WAITS_FOREVER)) return;
57273
+ element.warned.add(EXIT_WAITS_FOREVER);
57274
+ ctx.log.warn(EXIT_WAITS_FOREVER, { key: element.key ?? element.identity });
57275
+ }
57276
+ /**
57106
57277
  * Tells whether an exiting element may be despawned: no hook, or every hook finished.
57107
57278
  *
57108
57279
  * @param element - The exiting element.
@@ -1,6 +1,6 @@
1
1
  import { Cr as Json, Yn as FeaturePlugin, Zn as AnyFlow, _r as FakeClock, dr as Hint, fr as NodeFx, hr as ClockSource, rr as NodeTable, sr as Descriptor } from "./types-i77Nrrv-.mjs";
2
- import { t as createApp } from "./index-DT9aYVGd.mjs";
3
- import { b as saveOf, v as WithGameState, y as memory } from "./types-DK-IYk-s.mjs";
2
+ import { t as createApp } from "./index-PbX7OQIC.mjs";
3
+ import { b as saveOf, v as WithGameState, y as memory } from "./types-Dr5uC2fS.mjs";
4
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-CrxofjLt.mjs";
5
5
  import { AnyPluginInstance } from "@moku-labs/core";
6
6
 
package/dist/testing.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { an as refuseStart, ln as type, m as flattenFeatures, on as exit, t as createApp } from "./src-Cs1bP3v7.mjs";
1
+ import { an as refuseStart, ln as type, m as flattenFeatures, on as exit, t as createApp } from "./src-zXAFOqEc.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-BA6ffzqD.mjs";
@@ -1,5 +1,5 @@
1
1
  import { $r as Require, A as PixiModule, An as TrackOptions, At as FilterSlotInputs, Cr as Json, E as Api$4, En as NumericFields, M as PixiTexture, Mt as Point, Nn as Api$2, Pt as FilterCache, Qr as Events$2, Qt as Api$3, Sn as Ease, Sr as Events$3, Tn as MotionHandle, Ur as Api$1, an as AnyComponentValue, br as Api$6, cn as ComponentType, j as PixiSprite, jn as TrackSegment, k as PixiFilter, kn as ReducedMotion, kt as FilterSlot, on as ComponentHandle, or as TypeTag, rn as AnyComponent, s as Events$1, sr as Descriptor, t as Api$5, un as Entity, v as Events$4, zr as Events$5 } from "./types-i77Nrrv-.mjs";
2
- import { C as TextApi, L as I18nApi, M as InputApi, Y as StylesState, c as UiNode, i as Finding, n as ElementChange, o as JsxState, r as ElementMotion } from "./types-D8roM1u3.mjs";
2
+ import { C as TextApi, L as I18nApi, M as InputApi, Y as StylesState, c as UiNode, i as Finding, n as ElementChange, o as JsxState, r as ElementMotion } from "./types-DwktxRrt.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,7 +1,7 @@
1
1
  import { A as PixiModule, Ar as SaveDoc, Cr as Json, D as Config$2, Fn as Config$1, Nr as SnapshotOf, Or as PlayerStateProvider, Yn as FeaturePlugin, Zn as AnyFlow, _r as FakeClock, a as Config$3, d as Manifest, hr as ClockSource, jt as Orientation, kr as ProviderCall, n as AssetsIo, or as TypeTag, xr as Config } from "./types-i77Nrrv-.mjs";
2
- import { o as AudioContextLike, s as Config$4 } from "./types-DDmfkONF.mjs";
3
- import { H as StringTable, L as I18nApi, U as TextKey } from "./types-D8roM1u3.mjs";
4
- import { ft as platformPlugin, i as screen, mt as PlatformProvider, t as createApp, wt as audioPlugin, xt as effectsPlugin } from "./index-DT9aYVGd.mjs";
2
+ import { o as AudioContextLike, s as Config$4 } from "./types-B73p1XBn.mjs";
3
+ import { H as StringTable, L as I18nApi, U as TextKey } from "./types-DwktxRrt.mjs";
4
+ import { ft as platformPlugin, i as screen, mt as PlatformProvider, t as createApp, wt as audioPlugin, xt as effectsPlugin } from "./index-PbX7OQIC.mjs";
5
5
  import { AnyPluginInstance } from "@moku-labs/core";
6
6
 
7
7
  //#region src/plugins/model/store/providers/memory.d.ts
@@ -2541,7 +2541,8 @@ type StyleBasis = {
2541
2541
  * `cause` is why the element appeared: `"mount"` when it came with the first build of its root and
2542
2542
  * the root came by a mount, `"change"` otherwise; its `enter` hook is told. `rebuilds` counts the
2543
2543
  * patches in a row that brought a loop of another reference that is not really another loop: a
2544
- * dev build names the element once it reaches three.
2544
+ * dev build names the element once it reaches three. `endless` holds the motions a hook returned
2545
+ * after it started a track that repeats forever: they never end, so no exit waits for them (F42).
2545
2546
  */
2546
2547
  type Element = {
2547
2548
  entity: Entity;
@@ -2591,7 +2592,8 @@ type Element = {
2591
2592
  width: number;
2592
2593
  height: number;
2593
2594
  };
2594
- basis?: StyleBasis;
2595
+ basis?: StyleBasis; /** The motions of its hooks that started a `repeat: "forever"` track; made with the first one. */
2596
+ endless?: Set<MotionHandle>;
2595
2597
  };
2596
2598
  /**
2597
2599
  * The popup side of a root: the handler that shows it now and the root it was opened over.
@@ -1,9 +1,9 @@
1
1
  import { E as Api, Lr as Api$3, Qt as Api$1, br as Api$2 } from "./types-i77Nrrv-.mjs";
2
- import { P as AnimApi, r as UiApi } from "./types-DDmfkONF.mjs";
3
- import { M as InputApi } from "./types-D8roM1u3.mjs";
2
+ import { P as AnimApi, r as UiApi } from "./types-B73p1XBn.mjs";
3
+ import { M as InputApi } from "./types-DwktxRrt.mjs";
4
4
  import { r as Repro } from "./headless-CrxofjLt.mjs";
5
5
  import { a as InputOf, r as ControlApp } from "./types-YXykgTOp.mjs";
6
- import { t as commands } from "./commands-5woFUxUr.mjs";
6
+ import { t as commands } from "./commands-DoMH0hnR.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-1doiBOD3.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-CQnurNOj.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 };
package/llms.txt CHANGED
@@ -541,7 +541,7 @@ The graph. Modules `runner`, `gate`, `inbox`, `fx`, `features`. Runner methods s
541
541
  - Overdraw heat map (dev and debug builds): `app.renderer.sync.debug.overdraw(true)` (or `game.debug { overdraw: true }`) draws every frame so a pixel's brightness counts the layers drawn there: 1/16 white a layer, white at sixteen. While on, every frame is drawn (also with `onDemand`), kept pictures draw live and filters are off; only the stage pass changes, the tree between frames stays the game's, and off draws the game again from the next frame. Texels a texture leaves transparent count nothing.
542
542
  - `app.renderer.viewport.size()` answers one frozen object, replaced only when the frame changes (a resize, a rotation, new insets, a new scale): compare frames with `===`; a write into it throws a `TypeError`.
543
543
  - `pluginConfigs.renderer.warm` (default `1`, 0 to 16) is the pipeline warm-up: while a game loads, each drawn frame first draws that many invisible probes (sprites, graphics, text, particles, every filter kind and stage `effects` registers, on the canvas and on a texture, with and without a clip), wiped by the stage pass, so no screen creates a GPU pipeline in the frame it opens in; `0` turns it off. `app.renderer.sync.filters.warm(filter)` warms a game's own filter (answers `true` once drawn). An agent build writes a `warm` event `{ draws }` when the queue empties.
544
- - `defineFilter(id, { area: value => [x, y, width, height] })` declares the box, in the entity's own units, outside of which the filter draws nothing: Pixi renders and fills only that box (a lens over a full-screen cover fills its disc, not the screen). The view gets the union of its enabled filters' areas, none when an enabled filter declares none (`renderer.sync.filters.area(entity, area)`). The area also clips the view's own children: Pixi draws nothing of the view outside it, so a shadow or a badge that overhangs the box is cut; make the box hold them. Distance-field text uses device pixels for its edge: sharper at a resolution above 1.
544
+ - `defineFilter(id, { area: value => [x, y, width, height] })` declares the box, in the entity's own units, outside of which the filter draws nothing: Pixi renders and fills only that box (a lens over a full-screen cover fills its disc, not the screen). The view gets the union of its enabled filters' areas, none when an enabled filter declares none (`renderer.sync.filters.area(entity, area)`). The area also clips the view's own children: Pixi draws nothing of the view outside it, so a shadow or a badge that overhangs the box is cut; make the box hold them. The full-screen filter budget and the kept-picture budget count a view with an area by that area, not by its box. Distance-field text uses device pixels for its edge: sharper at a resolution above 1.
545
545
  - `pluginConfigs.renderer.poolTrim` (default `{ restMs: 1000, aboveMb: 16 }`) gives back the idle render targets Pixi's texture pool keeps, strictly between frames: after `restMs` of a still screen (`onDemand`), `restMs` after a scene change (each when the targets grew by `aboveMb` MiB), and on a pause (whatever grew); `false` keeps them. `stats().textureMbSplit.targets` shows the drop; an agent build writes a `pool-trim` event `{ reason, freedMb }`.
546
546
  - `app.renderer.viewport.size().safeArea` is read from four CSS custom properties on the page, `--moku-safe-top`, `--moku-safe-right`, `--moku-safe-bottom`, `--moku-safe-left`, each falling back to `env(safe-area-inset-*, 0px)`. Any CSS length works (`max()`, `calc()`, `env()`); a negative one counts as 0. A change of a property or of the page's insets, and the window event `moku-native:insets`, is laid out at the next frame. There is no `setInsets`: set the properties, e.g. `:root { --moku-safe-top: max(env(safe-area-inset-top, 0px), 24px); }`.
547
547
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moku-labs/game",
3
- "version": "0.15.9",
3
+ "version": "0.15.10",
4
4
  "description": "2D puzzle game engine on TypeScript and PixiJS, built on @moku-labs/core.",
5
5
  "type": "module",
6
6
  "sideEffects": [