@moku-labs/game 0.15.22 → 0.15.23

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-YxQts-fd.mjs";
1
+ import { m as StartedPage, r as GameConfig, t as AnyGameApp, u as PageOptions } from "../types-DwREs5vb.mjs";
2
2
 
3
3
  //#region src/app/page.d.ts
4
4
  /**
@@ -1,6 +1,6 @@
1
- import { Ar as PlayerStateProvider } from "../types-BFGyVykz.mjs";
2
- import { ht as PlatformProvider } from "../index-CKXNW8_t.mjs";
3
- import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types-YxQts-fd.mjs";
1
+ import { Ar as PlayerStateProvider } from "../types-CHmCFReJ.mjs";
2
+ import { ht as PlatformProvider } from "../index-CHI7dTc9.mjs";
3
+ import { _ as SystemShellFactory, g as SystemName, h as SystemModules } from "../types-DwREs5vb.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
- import { Tr as Json } from "./types-BFGyVykz.mjs";
2
- import { U as StringTable } from "./types-B02c7d6g.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-YxQts-fd.mjs";
1
+ import { Tr as Json } from "./types-CHmCFReJ.mjs";
2
+ import { U as StringTable } from "./types-DmGs6x0c.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-DwREs5vb.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 { Ct as effectsPlugin, H as platformPlugin, Pt as audioPlugin, i as screen, m as flattenFeatures, t as createApp } from "./src-BcfQy5vB.mjs";
1
+ import { Ct as effectsPlugin, H as platformPlugin, Pt as audioPlugin, i as screen, m as flattenFeatures, t as createApp } from "./src-hVe3f8GV.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
package/dist/assets.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { d as Manifest } from "./types-BFGyVykz.mjs";
1
+ import { d as Manifest } from "./types-CHmCFReJ.mjs";
2
2
 
3
3
  //#region src/plugins/assets/scan/cli.d.ts
4
4
  /**
@@ -1,8 +1,8 @@
1
- import { C as ScenesApi, E as DebugSwitches, Ir as StoreApi, Pr as Snapshot, Zr as Time, en as Api$2, er as Bookmark, it as Captured, q as Api$1, qr as FrameRate, rr as FlowState, zr as Api } from "./types-BFGyVykz.mjs";
2
- import { P as AnimApi, a as AudioApi, h as EffectsApi, r as UiApi } from "./types-COWBfy2L.mjs";
3
- import { N as InputApi } from "./types-B02c7d6g.mjs";
4
- import { t as HeadlessApp } from "./headless-BCwsb1wR.mjs";
5
- import { n as Command, r as ControlApp } from "./types-C8JK9u1Y.mjs";
1
+ import { C as ScenesApi, E as DebugSwitches, Ir as StoreApi, Pr as Snapshot, Zr as Time, en as Api$2, er as Bookmark, it as Captured, q as Api$1, qr as FrameRate, rr as FlowState, zr as Api } from "./types-CHmCFReJ.mjs";
2
+ import { P as AnimApi, a as AudioApi, h as EffectsApi, r as UiApi } from "./types-9xAh1wGm.mjs";
3
+ import { N as InputApi } from "./types-DmGs6x0c.mjs";
4
+ import { t as HeadlessApp } from "./headless-DIbfzWkr.mjs";
5
+ import { n as Command, r as ControlApp } from "./types-L4nVF9Ny.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-BCwsb1wR.mjs";
2
- import { i as InputArguments, n as Command, o as InputSchema, s as Ran } from "./types-C8JK9u1Y.mjs";
3
- import { t as commands } from "./commands-BvNp27KS.mjs";
4
- import { t as defineCommand } from "./define-DAVDb7dr.mjs";
1
+ import { t as HeadlessApp } from "./headless-DIbfzWkr.mjs";
2
+ import { i as InputArguments, n as Command, o as InputSchema, s as Ran } from "./types-L4nVF9Ny.mjs";
3
+ import { t as commands } from "./commands-CV6Deuaj.mjs";
4
+ import { t as defineCommand } from "./define-42KUe-al.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-BCwsb1wR.mjs";
2
- import { c as Source, n as Command, o as InputSchema } from "./types-C8JK9u1Y.mjs";
1
+ import { t as HeadlessApp } from "./headless-DIbfzWkr.mjs";
2
+ import { c as Source, n as Command, o as InputSchema } from "./types-L4nVF9Ny.mjs";
3
3
 
4
4
  //#region src/plugins/flow/doors/define.d.ts
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { Fn as Api$1, Gr as Api, Rr as RngState, Tr as Json, hr as Answer, ir as JournalEntry, or as RouteStep, rr as FlowState } from "./types-BFGyVykz.mjs";
1
+ import { Fn as Api$1, Gr as Api, Rr as RngState, Tr as Json, hr as Answer, ir as JournalEntry, or as RouteStep, rr as FlowState } from "./types-CHmCFReJ.mjs";
2
2
 
3
3
  //#region src/plugins/flow/headless.d.ts
4
4
  /**
@@ -1,6 +1,6 @@
1
- import { $r as Config$9, An as ProjectionSpec, Bn as HudKeysOf, Br as Config$4, C as ScenesApi, Cn as DescriptionNode, Cr as Config$5, Dr as State$5, Er as Root, Fn as Api$2, G as sprite, Gn as defineFlow, Gr as Api$5, H as SpriteValue, Hn as State$3, Hr as PauseReason, I as OverlayValue, In as BundlesOf, Ir as StoreApi, J as Config$6, Jr as RateChange, Kr as Config$7, Ln as Config$3, Lr as RngApi, M as HudPartValue, On as NumericFields, P as NineSliceValue, Qn as FeatureTree, Rn as EmitterIdOf, S as SceneSpec, Tr as Json, Tt as PassKind, Un as TextStylesOf, Ur as State$4, V as SpriteOptions, Vr as Events, W as TransformValue, Xn as FeatureDescription, Xr as ThermalReading, Yr as State$8, Zn as FeaturePlugin, _ as AnySceneProjection, _n as QueryTerm, a as Config$1, b as LayerMap, bn as SystemFor, br as State$2, c as LoadBundles, cn as ComponentHandle, dn as ComponentValue, dr as EffectOptions, ei as Events$1, en as Api$6, f as ReadyBundles, fr as GuideOptions, gn as Narrowed, gr as Api$1, hn as Mut, hr as Answer, ht as FrameRing, i as BundleSpec, jn as ReducedMotion, kn as ProjectionMotion, kr as Patch, l as LoadReason, lr as Descriptor, lt as ViewportSize, m as Tier, mt as FrameRecord, o as DefineBundles, p as State$1, pr as Hint, q as Api$4, r as BundleMap, rn as State$9, sr as SceneIdOf, t as Api, ti as Require, tn as Config$8, tr as DefineNode, tt as State$6, u as LoadResult, un as ComponentType, ur as Effect, v as DefineScene, vn as ResourceType, vr as Config$2, w as State$7, wn as Ease, x as SceneDefinition, xn as TagType, yn as SystemDefinition, z as ShapeValue, zn as GameTypes, zr as Api$3 } from "./types-BFGyVykz.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-COWBfy2L.mjs";
3
- import { B as Message, C as State$16, D as TextStyleInput, G as TypedTr, H as State$14, I as Argument, J as ResolvedStyle, L as Config$14, M as Config$15, N as InputApi, O as TextStyles, P as State$15, R as I18nApi, S as Point, T as TextBind, V as Part, W as TextKey, Y as Style, Z as WhenFlags, b as Config$16, g as IntrinsicElementsFor, h as defineTokens, j as defineComponent, k as TextValue, q as IsFlags, s as PopupComponent, v as BindField, w as TextApi, x as CountdownValue, y as BindOptions, z as IntlKit } from "./types-B02c7d6g.mjs";
1
+ import { $r as Config$9, An as ProjectionSpec, Bn as HudKeysOf, Br as Config$4, C as ScenesApi, Cn as DescriptionNode, Cr as Config$5, Dr as State$5, Er as Root, Fn as Api$2, G as sprite, Gn as defineFlow, Gr as Api$5, H as SpriteValue, Hn as State$3, Hr as PauseReason, I as OverlayValue, In as BundlesOf, Ir as StoreApi, J as Config$6, Jr as RateChange, Kr as Config$7, Ln as Config$3, Lr as RngApi, M as HudPartValue, On as NumericFields, P as NineSliceValue, Qn as FeatureTree, Rn as EmitterIdOf, S as SceneSpec, Tr as Json, Tt as PassKind, Un as TextStylesOf, Ur as State$4, V as SpriteOptions, Vr as Events, W as TransformValue, Xn as FeatureDescription, Xr as ThermalReading, Yr as State$8, Zn as FeaturePlugin, _ as AnySceneProjection, _n as QueryTerm, a as Config$1, b as LayerMap, bn as SystemFor, br as State$2, c as LoadBundles, cn as ComponentHandle, dn as ComponentValue, dr as EffectOptions, ei as Events$1, en as Api$6, f as ReadyBundles, fr as GuideOptions, gn as Narrowed, gr as Api$1, hn as Mut, hr as Answer, ht as FrameRing, i as BundleSpec, jn as ReducedMotion, kn as ProjectionMotion, kr as Patch, l as LoadReason, lr as Descriptor, lt as ViewportSize, m as Tier, mt as FrameRecord, o as DefineBundles, p as State$1, pr as Hint, q as Api$4, r as BundleMap, rn as State$9, sr as SceneIdOf, t as Api, ti as Require, tn as Config$8, tr as DefineNode, tt as State$6, u as LoadResult, un as ComponentType, ur as Effect, v as DefineScene, vn as ResourceType, vr as Config$2, w as State$7, wn as Ease, x as SceneDefinition, xn as TagType, yn as SystemDefinition, z as ShapeValue, zn as GameTypes, zr as Api$3 } from "./types-CHmCFReJ.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-9xAh1wGm.mjs";
3
+ import { B as Message, C as State$16, D as TextStyleInput, G as TypedTr, H as State$14, I as Argument, J as ResolvedStyle, L as Config$14, M as Config$15, N as InputApi, O as TextStyles, P as State$15, R as I18nApi, S as Point, T as TextBind, V as Part, W as TextKey, Y as Style, Z as WhenFlags, b as Config$16, g as IntrinsicElementsFor, h as defineTokens, j as defineComponent, k as TextValue, q as IsFlags, s as PopupComponent, v as BindField, w as TextApi, x as CountdownValue, y as BindOptions, z as IntlKit } from "./types-DmGs6x0c.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
- import { $t as DEMAND_REASONS, A as Display, At as PerfCollectorLine, B as Sprite, Bt as PerfMeasured, Cn as DescriptionNode, Ct as PERF_LOG_VERSION, Dt as PerfCause, Et as PassRecord, F as Overlay, Ft as PerfGapLine, G as sprite, Gt as PerfThermalLine, Ht as PerfSpikeLine, I as OverlayValue, It as PerfHeaderLine, Jn as to, Jt as ProblemRule, K as AdaptiveScale, Kn as exit, Kt as PoolTrimDetail, L as Parent, Lt as PerfLogLine, M as HudPartValue, Mt as PerfDisplay, N as NineSlice, Nr as SaveUnreadableError, Nt as PerfEventLine, Or as types_d_exports$10, Ot as PerfChange, Pt as PerfEventName, Qr as types_d_exports$15, Qt as WarmDetail, R as Shape, Rt as PerfLongFrameLine, St as PERF_GAP_BUCKETS, T as types_d_exports$13, Tt as PassKind, U as Transform, Ut as PerfStartupLine, Vt as PerfSampleLine, Wn as types_d_exports$6, Wr as types_d_exports$9, Wt as PerfTelemetryLine, Xt as ShaderEventDetail, Y as MonitorConfig, Yn as type, Yt as SHADER_WHATS, Zt as ShaderWhat, _t as MONITOR_SECTIONS, at as MonitorCounts, bt as OverlayWhat, dt as FrameColumns, et as PoolTrim, ft as FrameReadResult, g as types_d_exports$1, gt as LongFrameEntry, ht as FrameRing, in as types_d_exports$17, j as HudPart, jt as PerfCounts, kt as PerfChangeEntry, mt as FrameRecord, pt as FrameReadout, qn as slot, qt as ProblemEventDetail, rt as types_d_exports$12, vt as MonitorSections, wt as PROBLEM_RULES, xr as types_d_exports$3, xt as PERF_CAUSES, yt as OverlayEventDetail, zt as PerfMarkLine } from "./types-BFGyVykz.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-COWBfy2L.mjs";
3
- import { A as types_d_exports$14, E as TextFormat, F as types_d_exports$8, K as types_d_exports$7, d as DebugTrigger, f as LocalWrite, h as defineTokens, j as defineComponent, m as popup, p as ScrollState, u as Box, x as CountdownValue, y as BindOptions } from "./types-B02c7d6g.mjs";
4
- import { $ as system, A as Draggable, At as Text, B as Touchable, C as AnimPlayer, Ct as debugPlugin, D as defineBundles, Dt as animPlugin, E as defineScene, Et as assetsPlugin, F as PointerOver, G as Exiting, H as Traced, I as Pressable, J as Order, K as Layer, L as Pressed, M as Held, Mt as defineTextStyles, N as Hovered, Nt as label, O as load, Ot as projection, P as Pointer, Q as resource, R as Swipeable, S as defineMotion, St as effectsPlugin, T as Frames, Tt as audioPlugin, U as PASS_KINDS, V as Traceable, W as frameAt, X as component, Y as Tree, Z as mut, _ as defineStyle, _t as modelPlugin, a as defineEmitter, at as defineFeature, b as messageDuration, bt as i18nPlugin, c as Alpha, ct as uiPlugin, d as Displacement, dt as scenesPlugin, et as tag, f as Glow, ft as rendererPlugin, g as resolve, gt as types_d_exports$11, h as music, ht as PlatformProvider, i as screen, it as schedule, j as DropTarget, jt as bind, k as ready, kt as Countdown, l as Blur, lt as timePlugin, m as Outline, mt as BackResult, n as createPlugin, nt as guide, o as Emitter, ot as flattenFeatures, p as Noise, pt as platformPlugin, q as Now, r as defineGame, rt as hint, s as defineFilter, st as worldPlugin, t as createApp, tt as defineEffect, u as ColorMatrix, ut as textPlugin, v as tr, vt as lifecyclePlugin, w as Animation, wt as clockPlugin, x as cubicBezier, xt as flowPlugin, y as messageArgument, yt as inputPlugin, z as Tappable } from "./index-CKXNW8_t.mjs";
1
+ import { $t as DEMAND_REASONS, A as Display, At as PerfCollectorLine, B as Sprite, Bt as PerfMeasured, Cn as DescriptionNode, Ct as PERF_LOG_VERSION, Dt as PerfCause, Et as PassRecord, F as Overlay, Ft as PerfGapLine, G as sprite, Gt as PerfThermalLine, Ht as PerfSpikeLine, I as OverlayValue, It as PerfHeaderLine, Jn as to, Jt as ProblemRule, K as AdaptiveScale, Kn as exit, Kt as PoolTrimDetail, L as Parent, Lt as PerfLogLine, M as HudPartValue, Mt as PerfDisplay, N as NineSlice, Nr as SaveUnreadableError, Nt as PerfEventLine, Or as types_d_exports$10, Ot as PerfChange, Pt as PerfEventName, Qr as types_d_exports$15, Qt as WarmDetail, R as Shape, Rt as PerfLongFrameLine, St as PERF_GAP_BUCKETS, T as types_d_exports$13, Tt as PassKind, U as Transform, Ut as PerfStartupLine, Vt as PerfSampleLine, Wn as types_d_exports$6, Wr as types_d_exports$9, Wt as PerfTelemetryLine, Xt as ShaderEventDetail, Y as MonitorConfig, Yn as type, Yt as SHADER_WHATS, Zt as ShaderWhat, _t as MONITOR_SECTIONS, at as MonitorCounts, bt as OverlayWhat, dt as FrameColumns, et as PoolTrim, ft as FrameReadResult, g as types_d_exports$1, gt as LongFrameEntry, ht as FrameRing, in as types_d_exports$17, j as HudPart, jt as PerfCounts, kt as PerfChangeEntry, mt as FrameRecord, pt as FrameReadout, qn as slot, qt as ProblemEventDetail, rt as types_d_exports$12, vt as MonitorSections, wt as PROBLEM_RULES, xr as types_d_exports$3, xt as PERF_CAUSES, yt as OverlayEventDetail, zt as PerfMarkLine } from "./types-CHmCFReJ.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-9xAh1wGm.mjs";
3
+ import { A as types_d_exports$14, E as TextFormat, F as types_d_exports$8, K as types_d_exports$7, d as DebugTrigger, f as LocalWrite, h as defineTokens, j as defineComponent, m as popup, p as ScrollState, u as Box, x as CountdownValue, y as BindOptions } from "./types-DmGs6x0c.mjs";
4
+ import { $ as system, A as Draggable, At as Text, B as Touchable, C as AnimPlayer, Ct as debugPlugin, D as defineBundles, Dt as animPlugin, E as defineScene, Et as assetsPlugin, F as PointerOver, G as Exiting, H as Traced, I as Pressable, J as Order, K as Layer, L as Pressed, M as Held, Mt as defineTextStyles, N as Hovered, Nt as label, O as load, Ot as projection, P as Pointer, Q as resource, R as Swipeable, S as defineMotion, St as effectsPlugin, T as Frames, Tt as audioPlugin, U as PASS_KINDS, V as Traceable, W as frameAt, X as component, Y as Tree, Z as mut, _ as defineStyle, _t as modelPlugin, a as defineEmitter, at as defineFeature, b as messageDuration, bt as i18nPlugin, c as Alpha, ct as uiPlugin, d as Displacement, dt as scenesPlugin, et as tag, f as Glow, ft as rendererPlugin, g as resolve, gt as types_d_exports$11, h as music, ht as PlatformProvider, i as screen, it as schedule, j as DropTarget, jt as bind, k as ready, kt as Countdown, l as Blur, lt as timePlugin, m as Outline, mt as BackResult, n as createPlugin, nt as guide, o as Emitter, ot as flattenFeatures, p as Noise, pt as platformPlugin, q as Now, r as defineGame, rt as hint, s as defineFilter, st as worldPlugin, t as createApp, tt as defineEffect, u as ColorMatrix, ut as textPlugin, v as tr, vt as lifecyclePlugin, w as Animation, wt as clockPlugin, x as cubicBezier, xt as flowPlugin, y as messageArgument, yt as inputPlugin, z as Tappable } from "./index-CHI7dTc9.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, ready, 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$7, At as Noise, B as defineMotion, Bt as Frames, C as types_exports$14, Ct as effectsPlugin, D as types_exports$10, Dt as ColorMatrix, E as types_exports$11, Et as Blur, F as types_exports$2, Ft as scenesPlugin, G as external, Gt as PERF_CAUSES, H as platformPlugin, Ht as PASS_KINDS, I as types_exports$1, It as assetsPlugin, J as mark, Jt as PROBLEM_RULES, K as frames, Kt as PERF_GAP_BUCKETS, L as types_exports, Lt as animPlugin, M as types_exports$5, Mt as defineFilter, N as types_exports$4, Nt as debugPlugin, O as types_exports$9, Ot as Displacement, P as types_exports$3, Pt as audioPlugin, Q as set, Qt as flowPlugin, R as uiPlugin, Rt as AnimPlayer, S as types_exports$15, St as messageDuration, T as types_exports$12, Tt as Alpha, U as HAPTIC_KINDS, Ut as frameAt, V as textPlugin, Vt as rendererPlugin, W as defineAnimation, Wt as MONITOR_SECTIONS, X as play, Xt as DEMAND_REASONS, Y as parallel, Yt as SHADER_WHATS, Z as sequence, Zt as worldPlugin, _ as defineBundles, _t as Touchable, a as cubicBezier, an as SaveUnreadableError, at as wait, b as types_exports$17, bt as i18nPlugin, c as hint, cn as clockPlugin, ct as DropTarget, d as defineScene, dt as Pointer, en as exit, et as spawn, f as tr, ft as PointerOver, g as music, gt as Tappable, h as defineEmitter, ht as Swipeable, i as screen, in as modelPlugin, it as use, j as types_exports$6, jt as Outline, k as types_exports$8, kt as Glow, l as schedule, lt as Held, m as flattenFeatures, mt as Pressed, n as createPlugin, nn as to, nt as stagger, o as defineEffect, on as lifecyclePlugin, ot as inputPlugin, p as defineFeature, pt as Pressable, q as haptic, qt as PERF_LOG_VERSION, r as defineGame, rn as type, rt as tween, s as guide, sn as timePlugin, st as Draggable, t as createApp, tn as slot, tt as spawned, u as projection, ut as Hovered, v as load, vt as Traceable, w as types_exports$13, wt as Emitter, x as types_exports$16, xt as messageArgument, y as ready, yt as Traced, z as resolve, zt as Animation } from "./src-BcfQy5vB.mjs";
1
+ import { $ as sfx, A as types_exports$7, At as Noise, B as defineMotion, Bt as Frames, C as types_exports$14, Ct as effectsPlugin, D as types_exports$10, Dt as ColorMatrix, E as types_exports$11, Et as Blur, F as types_exports$2, Ft as scenesPlugin, G as external, Gt as PERF_CAUSES, H as platformPlugin, Ht as PASS_KINDS, I as types_exports$1, It as assetsPlugin, J as mark, Jt as PROBLEM_RULES, K as frames, Kt as PERF_GAP_BUCKETS, L as types_exports, Lt as animPlugin, M as types_exports$5, Mt as defineFilter, N as types_exports$4, Nt as debugPlugin, O as types_exports$9, Ot as Displacement, P as types_exports$3, Pt as audioPlugin, Q as set, Qt as flowPlugin, R as uiPlugin, Rt as AnimPlayer, S as types_exports$15, St as messageDuration, T as types_exports$12, Tt as Alpha, U as HAPTIC_KINDS, Ut as frameAt, V as textPlugin, Vt as rendererPlugin, W as defineAnimation, Wt as MONITOR_SECTIONS, X as play, Xt as DEMAND_REASONS, Y as parallel, Yt as SHADER_WHATS, Z as sequence, Zt as worldPlugin, _ as defineBundles, _t as Touchable, a as cubicBezier, an as SaveUnreadableError, at as wait, b as types_exports$17, bt as i18nPlugin, c as hint, cn as clockPlugin, ct as DropTarget, d as defineScene, dt as Pointer, en as exit, et as spawn, f as tr, ft as PointerOver, g as music, gt as Tappable, h as defineEmitter, ht as Swipeable, i as screen, in as modelPlugin, it as use, j as types_exports$6, jt as Outline, k as types_exports$8, kt as Glow, l as schedule, lt as Held, m as flattenFeatures, mt as Pressed, n as createPlugin, nn as to, nt as stagger, o as defineEffect, on as lifecyclePlugin, ot as inputPlugin, p as defineFeature, pt as Pressable, q as haptic, qt as PERF_LOG_VERSION, r as defineGame, rn as type, rt as tween, s as guide, sn as timePlugin, st as Draggable, t as createApp, tn as slot, tt as spawned, u as projection, ut as Hovered, v as load, vt as Traceable, w as types_exports$13, wt as Emitter, x as types_exports$16, xt as messageArgument, y as ready, yt as Traced, z as resolve, zt as Animation } from "./src-hVe3f8GV.mjs";
2
2
  import { $ as component, H as Shape, I as Display, J as Exiting, L as HudPart, Q as Tree, R as NineSlice, S as bind, T as label, U as Sprite, V as Parent, W as Transform, X as Now, Y as Layer, Z as Order, b as Countdown, d as LocalWrite, et as mut, g as popup, it as tag, l as DebugTrigger, nt as system, p as ScrollState, q as sprite, s as Box, tt as resource, v as defineTokens, w as defineTextStyles, x as Text, y as defineStyle, z as Overlay } from "./visual-kEC9nb-o.mjs";
3
3
  import { t as defineComponent } from "./component-DGg5DqKK.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, ready, 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,9 +1,9 @@
1
- import { Pr as Snapshot, Sr as Api, Vn as Position, en as Api$1, h as Usage, ir as JournalEntry, ln as ComponentSchema, mn as FrameDiff, nn as Explained, nr as FlowGraph, nt as Under, ot as RenderStats, pn as EntitySnapshot, q as Api$2, t as Api$3 } from "./types-BFGyVykz.mjs";
2
- import { a as AudioApi, g as EffectsStats, h as EffectsApi, r as UiApi, u as SoundEntry } from "./types-COWBfy2L.mjs";
3
- import { c as UiNode } from "./types-B02c7d6g.mjs";
4
- import { t as HeadlessApp } from "./headless-BCwsb1wR.mjs";
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-C8JK9u1Y.mjs";
6
- import { n as defineSource } from "./define-DAVDb7dr.mjs";
1
+ import { Pr as Snapshot, Sr as Api, Vn as Position, en as Api$1, h as Usage, ir as JournalEntry, ln as ComponentSchema, mn as FrameDiff, nn as Explained, nr as FlowGraph, nt as Under, ot as RenderStats, pn as EntitySnapshot, q as Api$2, t as Api$3 } from "./types-CHmCFReJ.mjs";
2
+ import { a as AudioApi, g as EffectsStats, h as EffectsApi, r as UiApi, u as SoundEntry } from "./types-9xAh1wGm.mjs";
3
+ import { c as UiNode } from "./types-DmGs6x0c.mjs";
4
+ import { t as HeadlessApp } from "./headless-DIbfzWkr.mjs";
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-L4nVF9Ny.mjs";
6
+ import { n as defineSource } from "./define-42KUe-al.mjs";
7
7
 
8
8
  //#region src/plugins/flow/doors/read.d.ts
9
9
  /**
@@ -1,2 +1,2 @@
1
- import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-Dt7VdhqR.mjs";
1
+ import { a as jsxs, i as jsxDEV, n as JSX, r as jsx, t as Fragment } from "./runtime-BcMjHiib.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-Dt7VdhqR.mjs";
1
+ import { a as jsxs, n as JSX, r as jsx, t as Fragment } from "./runtime-BcMjHiib.mjs";
2
2
  export { Fragment, type JSX, jsx, jsxs };
@@ -1,4 +1,4 @@
1
- import { _ as UiIntrinsicElements, a as JsxChild, t as DescriptionNode } from "./types-B02c7d6g.mjs";
1
+ import { _ as UiIntrinsicElements, a as JsxChild, t as DescriptionNode } from "./types-DmGs6x0c.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. */
@@ -595,6 +595,11 @@ const CAP_SLACK_SHARE = .12;
595
595
  const DISPLAY_SHARE = .25;
596
596
  /** …and at least this share of the window's drawn intervals: the p90 rule written as a count. */
597
597
  const DROP_SHARE = .1;
598
+ /**
599
+ * The drop window stays late this long before the rate drops, ms (F64): longer than the window, so one burst of late
600
+ * frames (a mount, an upload, a GC) never drops the rate by itself; only a sustained slow run does.
601
+ */
602
+ const DROP_HOLD_MS = 2e3;
598
603
  /** The least time at a rate before a return, ms. */
599
604
  const DWELL_BASE_MS = 5e3;
600
605
  /** The dwell never grows past this, ms. */
@@ -901,6 +906,7 @@ function createGovernor(floor) {
901
906
  returnDrawn: 0,
902
907
  returnMissed: 0,
903
908
  returnHeavy: 0,
909
+ lateSince: NaN,
904
910
  switchedAt: Number.NEGATIVE_INFINITY,
905
911
  lastReturnAt: Number.NEGATIVE_INFINITY,
906
912
  climbed: false,
@@ -993,6 +999,7 @@ function emptyWindows(g) {
993
999
  g.returnDrawn = 0;
994
1000
  g.returnMissed = 0;
995
1001
  g.returnHeavy = 0;
1002
+ g.lateSince = NaN;
996
1003
  }
997
1004
  /**
998
1005
  * Takes the oldest sample of the drop window out of its counts.
@@ -1326,15 +1333,36 @@ function isSample(ctx, g, intervalMs) {
1326
1333
  return g.lastDrawn && !g.lastIdle && !g.lastProbed && intervalMs <= 500 && g.lastFps === rate.fps && rate.mode === "auto" && rate.display.hz !== null;
1327
1334
  }
1328
1335
  /**
1329
- * Tells whether the drop window is late enough to step down: late intervals reach `max(8, 10 %)` of the second's.
1336
+ * Tells whether the drop window is late: late intervals reach `max(8, 10 %)` of the second's.
1330
1337
  *
1331
1338
  * @param g - The governor.
1332
- * @returns True when the rate should drop one step.
1339
+ * @returns True when the window is late.
1333
1340
  */
1334
- function shouldDrop(g) {
1341
+ function isLate(g) {
1335
1342
  return g.dropMissed >= Math.max(8, Math.ceil(DROP_SHARE * g.dropDrawn));
1336
1343
  }
1337
1344
  /**
1345
+ * Tells whether the rate should step down (F64): the drop window has been late for 2 s in a row, so one burst of late
1346
+ * frames never drops it. Within 3 s of a step of the rule itself the first late window is enough: a return on
1347
+ * probation that fails, and the next step of a descent already under way. Notes when the window turned late.
1348
+ *
1349
+ * @param ctx - Domain context of the time plugin.
1350
+ * @param g - The governor.
1351
+ * @param at - The page time of the sample.
1352
+ * @returns True when the rate should drop one step.
1353
+ */
1354
+ function shouldDrop(ctx, g, at) {
1355
+ if (!isLate(g)) {
1356
+ g.lateSince = NaN;
1357
+ return false;
1358
+ }
1359
+ if (Number.isNaN(g.lateSince)) g.lateSince = at;
1360
+ const { reason } = ctx.state.rate;
1361
+ const afterRuleStep = (reason === "missed" || reason === "headroom") && at - g.switchedAt < 3e3;
1362
+ const heldLate = at - g.lateSince >= DROP_HOLD_MS;
1363
+ return afterRuleStep || heldLate;
1364
+ }
1365
+ /**
1338
1366
  * Tells whether the late frames of the drop window are GPU-bound: fewer than half of them kept the main thread longer
1339
1367
  * than their frame.
1340
1368
  *
@@ -1357,8 +1385,8 @@ function canReturn(g, at, scaleStep) {
1357
1385
  return thermalRank(g.thermal) < HEAT_LIMIT_RANK && at - g.switchedAt >= (scaleStep ? 2 * g.dwellMs : g.dwellMs) && g.returnDrawn >= 90 && g.returnMissed <= 1 && (scaleStep || g.returnHeavy <= Math.floor(.1 * g.returnDrawn));
1358
1386
  }
1359
1387
  /**
1360
- * Decides on the windows after a sample. Down one step when late intervals reach `max(8, 10 %)` of the second's: the
1361
- * render scale when the window is GPU-bound and a lower scale is allowed, the rate otherwise. Up one step in the
1388
+ * Decides on the windows after a sample. Down one step when late intervals reach `max(8, 10 %)` of the second's
1389
+ * for 2 s in a row (at once within 3 s of a step of the rule): the render scale when the window is GPU-bound and a lower scale is allowed, the rate otherwise. Up one step in the
1362
1390
  * reverse of the way down, with 90 steady drawn frames in three seconds, at most one late and no heat: the rate first,
1363
1391
  * at the scale it dropped at, after the dwell and with a tenth heavy at most, then the scale after twice the dwell. A
1364
1392
  * probe of the higher rate so never starts at full scale, and its failure changes no resolution.
@@ -1369,13 +1397,14 @@ function canReturn(g, at, scaleStep) {
1369
1397
  */
1370
1398
  function decide(ctx, g, at) {
1371
1399
  const { fps, scale } = ctx.state.rate;
1372
- if (shouldDrop(g)) {
1400
+ if (shouldDrop(ctx, g, at)) {
1373
1401
  const smaller = gpuBound(g) ? stepBelow(g.scales, scale) : void 0;
1374
1402
  const lower = stepBelow(g.ladder, fps);
1375
1403
  if (smaller !== void 0) switchRate(ctx, fps, smaller, "auto", "missed", at);
1376
1404
  else if (lower !== void 0) switchRate(ctx, lower, scale, "auto", "missed", at);
1377
1405
  return;
1378
1406
  }
1407
+ if (!Number.isNaN(g.lateSince)) return;
1379
1408
  const higher = stepAbove(g.ladder, fps);
1380
1409
  if (higher !== void 0 && canReturn(g, at, false)) {
1381
1410
  switchRate(ctx, higher, scale, "auto", "headroom", at);
@@ -35489,6 +35518,8 @@ async function bootTiers(ctx) {
35489
35518
  */
35490
35519
  /** How many of the heaviest entries the over-budget warning names. */
35491
35520
  const HEAVIEST = 5;
35521
+ /** No feature holds a bundle: the stack as a leaving scene's non-`feature` bundle sees it. */
35522
+ const NO_FEATURES = Object.freeze(/* @__PURE__ */ new Set());
35492
35523
  /**
35493
35524
  * Adds up the estimated texture memory of every loaded bundle.
35494
35525
  *
@@ -35719,10 +35750,13 @@ function nameSceneBundles(state, named) {
35719
35750
  /**
35720
35751
  * Lets the bundles a leaving scene named go once nothing carries `Exiting` any more: each loaded
35721
35752
  * `"leave"` bundle among them that nothing else holds is unloaded with the reason `"leave"`, at
35722
- * once, not at the next rest. A bundle of another release stays, as it would have. The system
35723
- * `assets.leave` calls it in every phase `sync`: after the reconcile of `layout`, which tags the
35724
- * leaving elements `Exiting` in the frame after the switch, so the hold never ends before the leave
35725
- * begins (F51b). It costs a length read while no scene leaves, and a count read while one does.
35753
+ * once, not at the next rest. Its feature on the stack holds only a `feature`-tier bundle, which
35754
+ * lives with its feature's flow: a scene's bundle goes with the scene, also while another scene of
35755
+ * its feature shows (the splash's 7.5 MiB under the ward). A bundle of another release stays, as
35756
+ * it would have. The system `assets.leave` calls it in every phase `sync`: after the reconcile of
35757
+ * `layout`, which tags the leaving elements `Exiting` in the frame after the switch, so the hold
35758
+ * never ends before the leave begins (F51b). It costs a length read while no scene leaves, and a
35759
+ * count read while one does.
35726
35760
  *
35727
35761
  * @param ctx - Domain context of the plugin.
35728
35762
  */
@@ -35733,7 +35767,10 @@ function releaseSceneLeft(ctx) {
35733
35767
  state.sceneLeaving = [];
35734
35768
  if (state.io === void 0) return;
35735
35769
  const onStack = featuresOnStack(ctx);
35736
- for (const name of names) unloadIfLeft(ctx, name, onStack);
35770
+ for (const name of names) {
35771
+ const tier = state.manifest.bundles[name]?.tier;
35772
+ unloadIfLeft(ctx, name, tier === "feature" ? onStack : NO_FEATURES);
35773
+ }
35737
35774
  }
35738
35775
  /**
35739
35776
  * Unloads one bundle with the reason `"leave"` when it is a loaded `"leave"` bundle nobody holds.
@@ -50746,9 +50783,23 @@ function buildRun(ctx, pixi, run, style, at) {
50746
50783
  return objects;
50747
50784
  }
50748
50785
  /**
50786
+ * Tells whether a label of a `"box"` style is drawn outside a ui layout: it has no box, it is not
50787
+ * empty (ui lays an empty one out 0 wide), and no layout measured its style at a width (a laid-out
50788
+ * label that fits its row gets no box, F65).
50789
+ *
50790
+ * @param ctx - Domain context of the text plugin.
50791
+ * @param style - The style of the label.
50792
+ * @param value - The component value.
50793
+ * @returns True when the label wraps at no box for want of a layout.
50794
+ */
50795
+ function isOutsideLayout(ctx, style, value) {
50796
+ if (style.wrap !== "box") return false;
50797
+ return (value.box ?? 0) <= 0 && value.resolved !== "" && !ctx.state.laidOut.has(value.style);
50798
+ }
50799
+ /**
50749
50800
  * The style and the laid-out block of one component value, under the generation of this moment.
50750
- * A `"box"` style wraps at the box `ui` wrote; with none (a label outside a ui layout) it is one
50751
- * line, and a dev warning says so once per style.
50801
+ * A `"box"` style wraps at the box `ui` wrote; with none it is one line, and a dev warning says
50802
+ * so once per style unless a layout measured that style at a width (a label that fits its row).
50752
50803
  *
50753
50804
  * @param ctx - Domain context of the text plugin.
50754
50805
  * @param value - The component value.
@@ -50756,7 +50807,7 @@ function buildRun(ctx, pixi, run, style, at) {
50756
50807
  */
50757
50808
  function labelOf(ctx, value) {
50758
50809
  const style = styleOf$1(ctx, value.style);
50759
- if (style.wrap === "box" && (value.box ?? 0) <= 0 && value.resolved !== "") warnOnce(ctx, `wrap-box:${value.style}`, "text: wrap \"box\" outside layout", { style: value.style });
50810
+ if (isOutsideLayout(ctx, style, value)) warnOnce(ctx, `wrap-box:${value.style}`, "text: wrap \"box\" outside layout", { style: value.style });
50760
50811
  return {
50761
50812
  style,
50762
50813
  layout: layoutFor(ctx, value.resolved, value.style, value.box),
@@ -51124,6 +51175,7 @@ function stopText(state) {
51124
51175
  state.added.length = 0;
51125
51176
  state.rewrite.length = 0;
51126
51177
  state.warned.clear();
51178
+ state.laidOut.clear();
51127
51179
  }
51128
51180
  //#endregion
51129
51181
  //#region src/plugins/text/api.ts
@@ -51148,6 +51200,7 @@ function createTextApi(ctx) {
51148
51200
  return {
51149
51201
  measure: (content, style, width = 0) => {
51150
51202
  const tctx = text();
51203
+ if (width > 0) tctx.state.laidOut.add(style);
51151
51204
  return sizeOf(layoutFor(tctx, sourceOf(tctx, content), style, width));
51152
51205
  },
51153
51206
  hasGlyph: (char, style) => hasGlyphOf(text(), char, style),
@@ -51276,6 +51329,7 @@ function createTextState$1() {
51276
51329
  rewrite: [],
51277
51330
  generation: 0,
51278
51331
  warned: emptySet$1(),
51332
+ laidOut: emptySet$1(),
51279
51333
  removers: []
51280
51334
  };
51281
51335
  }
@@ -56439,33 +56493,40 @@ function createReconciler(ctx, modules, fields) {
56439
56493
  *
56440
56494
  * @param element - The element that left the description.
56441
56495
  * @param cause - Why it leaves: `"change"` for a commit, `"mount"` when it goes with its screen.
56496
+ * @param leads - The element is the top of a root that goes with its screen.
56442
56497
  */
56443
- function exitElement(element, cause) {
56498
+ function exitElement(element, cause, leads = false) {
56444
56499
  forgetSubtree(element);
56445
56500
  forgetInstances(state, element.identity);
56446
56501
  state.exiting.add(element.entity);
56447
- exitSubtree(element, cause);
56502
+ exitSubtree(element, cause, false, leads);
56448
56503
  }
56449
56504
  /**
56450
56505
  * Plays the exit hook of an element and of everything under it, each told why it leaves. A child
56451
- * keeps its rect and its `Exiting` tag until the whole subtree stopped moving.
56506
+ * keeps its rect and its `Exiting` tag until the whole subtree stopped moving. Under the top of a
56507
+ * root that goes with its screen and plays an exit of its own, the elements stand and go with it
56508
+ * (F55b): an exit of theirs would change the subtree in every frame of the top's, so a kept
56509
+ * picture of it would be drawn live through its filters.
56452
56510
  *
56453
56511
  * @param element - The element that leaves, or one of its children.
56454
56512
  * @param cause - Why the subtree leaves.
56513
+ * @param stands - The element stands under an exit that leads the leave: its own hook does not play.
56514
+ * @param leads - The element is the top of a root that goes with its screen.
56455
56515
  */
56456
- function exitSubtree(element, cause) {
56516
+ function exitSubtree(element, cause, stands, leads) {
56457
56517
  dropHost(state, element.entity);
56458
56518
  state.scrolls.delete(element.entity);
56459
- if (overlayOf(element) === void 0) modules.layout.exit(element, cause);
56519
+ if (overlayOf(element) === void 0) modules.layout.exit(element, cause, void 0, stands);
56460
56520
  else {
56461
56521
  const span = createSpan();
56462
- modules.layout.exit(element, cause, span);
56522
+ modules.layout.exit(element, cause, span, stands);
56463
56523
  exitOverlay(ctx, modules.layout, element, span);
56464
56524
  }
56465
56525
  if (element.type === "input") fields.exit(element);
56526
+ const under = stands || leads && !modules.layout.settled(element);
56466
56527
  for (const child of element.children) {
56467
56528
  const childElement = state.elements.get(child);
56468
- if (childElement !== void 0) exitSubtree(childElement, cause);
56529
+ if (childElement !== void 0) exitSubtree(childElement, cause, under, false);
56469
56530
  }
56470
56531
  }
56471
56532
  /**
@@ -57172,7 +57233,7 @@ function createReconciler(ctx, modules, fields) {
57172
57233
  state.removing.add(entity);
57173
57234
  hostsMoved(state);
57174
57235
  if (element !== void 0) {
57175
- exitElement(element, cause);
57236
+ exitElement(element, cause, cause === "mount");
57176
57237
  if (cause === "mount" && !modules.layout.settled(element)) state.leading.add(element.entity);
57177
57238
  }
57178
57239
  ctx.deps.time.wake();
@@ -58160,15 +58221,16 @@ const EXIT_WAITS_FOREVER = "ui:exit-waits-forever";
58160
58221
  * @param element - The element that left the description.
58161
58222
  * @param cause - Why it leaves: a `when: "change"` hook plays nothing for `"mount"`, and the next sweep takes it.
58162
58223
  * @param span - Notes the longest finite track the exit hook starts, for the level of an overlay.
58224
+ * @param stands - The element stands and goes with the exit over it: its own exit hook does not play (F55b).
58163
58225
  */
58164
- function beginExit(ctx, state, element, cause, span) {
58226
+ function beginExit(ctx, state, element, cause, span, stands = false) {
58165
58227
  detachNode(state, element);
58166
58228
  element.dropKey?.();
58167
58229
  element.dropKey = void 0;
58168
58230
  if (!element.live) return;
58169
58231
  ctx.deps.world.ecs.tag(element.entity, Exiting);
58170
58232
  element.handles = keptExtras(ctx, element);
58171
- const hook = element.motion?.exit;
58233
+ const hook = stands ? void 0 : element.motion?.exit;
58172
58234
  play(ctx, element, hook === void 0 ? void 0 : (view) => hook(view, element.node, void 0, cause), span);
58173
58235
  }
58174
58236
  /**
@@ -59597,7 +59659,7 @@ function createLayoutApi(ctx) {
59597
59659
  changeExtra: (element, name, values, hint) => playExtraChange(ctx, element, name, values, hint),
59598
59660
  repose: (element, parent, hooked, hint) => repose(ctx, element, parent, hooked, hint),
59599
59661
  lift: (element, units) => liftRest(ctx, element, units),
59600
- exit: (element, cause, span) => beginExit(ctx, state, element, cause, span),
59662
+ exit: (element, cause, span, stands) => beginExit(ctx, state, element, cause, span, stands),
59601
59663
  playTrack: (element, hook) => {
59602
59664
  play(ctx, element, hook);
59603
59665
  },
@@ -1,7 +1,7 @@
1
- import { $n as AnyFlow, Tr as Json, Zn as FeaturePlugin, _r as ClockSource, ar as NodeTable, lr as Descriptor, mr as NodeFx, pr as Hint, yr as FakeClock } from "./types-BFGyVykz.mjs";
2
- import { t as createApp } from "./index-CKXNW8_t.mjs";
3
- import { b as saveOf, v as WithGameState, y as memory } from "./types-YxQts-fd.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-BCwsb1wR.mjs";
1
+ import { $n as AnyFlow, Tr as Json, Zn as FeaturePlugin, _r as ClockSource, ar as NodeTable, lr as Descriptor, mr as NodeFx, pr as Hint, yr as FakeClock } from "./types-CHmCFReJ.mjs";
2
+ import { t as createApp } from "./index-CHI7dTc9.mjs";
3
+ import { b as saveOf, v as WithGameState, y as memory } from "./types-DwREs5vb.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-DIbfzWkr.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 { $t as refuseStart, en as exit, m as flattenFeatures, rn as type, t as createApp } from "./src-BcfQy5vB.mjs";
1
+ import { $t as refuseStart, en as exit, m as flattenFeatures, rn as type, t as createApp } from "./src-hVe3f8GV.mjs";
2
2
  import { n as saveOf, t as memory } from "./memory-CWlqhS7l.mjs";
3
3
  import { t as fakeClock } from "./fake-6mazmHK3.mjs";
4
4
  import { i as stepFrames, r as runRepro, t as createHeadless } from "./headless-Bxxl_mQX.mjs";
@@ -1,5 +1,5 @@
1
- import { $ as PixiTexture, D as FilterSlot, Dn as MotionHandle, Fn as Api$2, Gr as Api$1, Mn as TrackOptions, Nn as TrackSegment, O as FilterSlotInputs, On as NumericFields, Q as PixiSprite, Sr as Api$6, Tr as Json, Vr as Events$5, X as PixiFilter, Z as PixiModule, an as AnyComponent, cn as ComponentHandle, cr as TypeTag, ct as Point, ei as Events$2, en as Api$3, fn as Entity, jn as ReducedMotion, k as SyncApi, lr as Descriptor, q as Api$4, s as Events$1, sn as AnyComponentValue, t as Api$5, ti as Require, un as ComponentType, ut as FilterCache, wn as Ease, wr as Events$3, y as Events$4 } from "./types-BFGyVykz.mjs";
2
- import { N as InputApi, R as I18nApi, X as StylesState, c as UiNode, i as Finding, l as LayoutState, n as ElementChange, o as JsxState, r as ElementMotion, w as TextApi } from "./types-B02c7d6g.mjs";
1
+ import { $ as PixiTexture, D as FilterSlot, Dn as MotionHandle, Fn as Api$2, Gr as Api$1, Mn as TrackOptions, Nn as TrackSegment, O as FilterSlotInputs, On as NumericFields, Q as PixiSprite, Sr as Api$6, Tr as Json, Vr as Events$5, X as PixiFilter, Z as PixiModule, an as AnyComponent, cn as ComponentHandle, cr as TypeTag, ct as Point, ei as Events$2, en as Api$3, fn as Entity, jn as ReducedMotion, k as SyncApi, lr as Descriptor, q as Api$4, s as Events$1, sn as AnyComponentValue, t as Api$5, ti as Require, un as ComponentType, ut as FilterCache, wn as Ease, wr as Events$3, y as Events$4 } from "./types-CHmCFReJ.mjs";
2
+ import { N as InputApi, R as I18nApi, X as StylesState, c as UiNode, i as Finding, l as LayoutState, n as ElementChange, o as JsxState, r as ElementMotion, w as TextApi } from "./types-DmGs6x0c.mjs";
3
3
  import { Log } from "@moku-labs/common/browser";
4
4
  import { PluginCtx } from "@moku-labs/core";
5
5
 
@@ -157,7 +157,7 @@ type AdaptiveRate = {
157
157
  type RateMode = "fixed" | "auto" | "forced";
158
158
  /**
159
159
  * Why the rate is what it is, the reason of the last change: `"start"` (nothing changed it yet), `"display"` (the
160
- * display rate became known or changed), `"missed"` (drawn frames came late), `"headroom"` (a return after steady
160
+ * display rate became known or changed), `"missed"` (drawn frames came late for 2 s in a row, at once within 3 s of a step of the rule), `"headroom"` (a return after steady
161
161
  * room), `"thermal"` (the native shell reported heat), `"forced"` / `"auto"` (`setRate`).
162
162
  *
163
163
  * @example
@@ -384,7 +384,7 @@ type Config$8 = {
384
384
  /**
385
385
  * Adaptive frame rate. `false` (the default): the loop runs at `maxFps`, as before. With `{ floor }` the loop runs
386
386
  * at the highest divisor of the display's refresh rate at or below `maxFps`, drops to the next divisor when drawn
387
- * frames come late, and returns when there is room again; never below `floor`. Off in a headless app and on a fake
387
+ * frames come late for 2 s in a row (one late burst, a mount or an upload, never drops it), and returns when there is room again; never below `floor`. Off in a headless app and on a fake
388
388
  * clock.
389
389
  */
390
390
  adaptive: false | AdaptiveRate;
@@ -502,7 +502,8 @@ type Governor = {
502
502
  returnTail: number; /** Samples in the return window. */
503
503
  returnDrawn: number; /** Late samples in the return window. */
504
504
  returnMissed: number; /** Heavy samples in the return window. */
505
- returnHeavy: number; /** When the rate or its mode last changed. */
505
+ returnHeavy: number; /** When the drop window last turned late and stayed late; NaN while it is not. */
506
+ lateSince: number; /** When the rate or its mode last changed. */
506
507
  switchedAt: number; /** When the rule last returned a step up; -Infinity before the first return. */
507
508
  lastReturnAt: number; /** The last step of the rule was a return: its first drop judges it. */
508
509
  climbed: boolean; /** How long a return waits after a switch, ms. */
@@ -718,7 +719,7 @@ type Api$7 = {
718
719
  * ```ts
719
720
  * // The settings screen shows the rate the game runs at on this phone.
720
721
  * app.time.rate(); // { fps: 120, mode: "auto", reason: "start", displayHz: 120, ladder: [120, 60], thermal: "none", asked: null, heldBy: null, scale: 1 }
721
- * // on the memory screen of a weak phone, a second later:
722
+ * // on the memory screen of a weak phone, a few seconds later (late for 2 s, then the scale and the rate step down):
722
723
  * app.time.rate(); // { fps: 60, mode: "auto", reason: "missed", displayHz: 120, ladder: [120, 60], thermal: "none", asked: null, heldBy: null, scale: 0.75 }
723
724
  * // a game with maxFps 120 and no adaptive, on a 60 Hz phone:
724
725
  * app.time.rate(); // { fps: 60, mode: "fixed", reason: "start", displayHz: 60, ladder: [], thermal: null, asked: 120, heldBy: "panel", scale: 1 }
@@ -763,7 +764,7 @@ type Api$7 = {
763
764
  * ```ts
764
765
  * // The renderer on a phone, at start:
765
766
  * ctx.require(timePlugin).allowScale(0.75); // { fps: 120, …, scale: 1 }
766
- * // on the memory screen of a weak phone, half a second later:
767
+ * // on the memory screen of a weak phone, a few seconds later (late for 2 s in a row):
767
768
  * app.time.rate(); // { fps: 120, mode: "auto", reason: "missed", …, scale: 0.75 }
768
769
  * // the player picked a resolution in the settings: the renderer takes the scale away from the rule
769
770
  * ctx.require(timePlugin).allowScale(1); // { fps: 120, …, scale: 1 }
@@ -1,4 +1,4 @@
1
- import { Dn as MotionHandle, En as MotionCause, Fn as Api$1, Gr as Api, On as NumericFields, Pn as ViewHandle, Sn as ChangeHook, Tn as Motion, Tr as Json, W as TransformValue, an as AnyComponent, en as Api$2, fn as Entity, gr as Api$5, hr as Answer, jn as ReducedMotion, kn as ProjectionMotion, lr as Descriptor, lt as ViewportSize, on as AnyComponentType, pr as Hint, q as Api$3, s as Events$1, sn as AnyComponentValue, t as Api$4, ti as Require, un as ComponentType, wn as Ease, xn as TagType } from "./types-BFGyVykz.mjs";
1
+ import { Dn as MotionHandle, En as MotionCause, Fn as Api$1, Gr as Api, On as NumericFields, Pn as ViewHandle, Sn as ChangeHook, Tn as Motion, Tr as Json, W as TransformValue, an as AnyComponent, en as Api$2, fn as Entity, gr as Api$5, hr as Answer, jn as ReducedMotion, kn as ProjectionMotion, lr as Descriptor, lt as ViewportSize, on as AnyComponentType, pr as Hint, q as Api$3, s as Events$1, sn as AnyComponentValue, t as Api$4, ti as Require, un as ComponentType, wn as Ease, xn as TagType } from "./types-CHmCFReJ.mjs";
2
2
  import { Log } from "@moku-labs/common/browser";
3
3
  import { PluginCtx } from "@moku-labs/core";
4
4
  import { Node, Yoga } from "yoga-layout/load";
@@ -1755,7 +1755,8 @@ type State = {
1755
1755
  * container drawn under an older count is built again on its next update.
1756
1756
  */
1757
1757
  generation: number; /** Warning keys already written, so a style, a tag, a glyph or a font warns once. */
1758
- warned: Set<string>; /** The system, the step after the layout flush, the two world hooks and the display adapter. */
1758
+ warned: Set<string>; /** The `"box"` styles a layout measured at a width: a label of one with no box fits its row, it is not outside a layout (F65). */
1759
+ laidOut: Set<string>; /** The system, the step after the layout flush, the two world hooks and the display adapter. */
1759
1760
  removers: Array<() => void>;
1760
1761
  };
1761
1762
  /**
@@ -1774,7 +1775,9 @@ type TextApi = {
1774
1775
  * The size of a piece of text in reference pixels, from the advance table of the style's font.
1775
1776
  * A `Message` is formatted in the current locale first. Never touches a canvas, so the answer
1776
1777
  * is the same in a browser and in plain Bun. Cached per style and resolved string, and per
1777
- * width for a `"box"` style.
1778
+ * width for a `"box"` style. A call with a width is a layout's (`ui.layout` is the caller it is
1779
+ * meant for): it marks the style as laid out, so a label of it with no box (one that fits its
1780
+ * row) no longer warns `wrap "box" outside layout` (F65).
1778
1781
  *
1779
1782
  * @param content - A plain string, or what `tr` returned.
1780
1783
  * @param style - A registered style name. An unknown one warns once and measures as `body`.
@@ -1,7 +1,7 @@
1
- import { $n as AnyFlow, Ar as PlayerStateProvider, Cr as Config, Fr as SnapshotOf, J as Config$2, Ln as Config$1, Mr as SaveDoc, Tr as Json, Z as PixiModule, Zn as FeaturePlugin, _r as ClockSource, a as Config$3, cr as TypeTag, d as Manifest, jr as ProviderCall, n as AssetsIo, st as Orientation, yr as FakeClock } from "./types-BFGyVykz.mjs";
2
- import { o as AudioContextLike, s as Config$4 } from "./types-COWBfy2L.mjs";
3
- import { R as I18nApi, U as StringTable, W as TextKey } from "./types-B02c7d6g.mjs";
4
- import { St as effectsPlugin, Tt as audioPlugin, ht as PlatformProvider, i as screen, pt as platformPlugin, t as createApp } from "./index-CKXNW8_t.mjs";
1
+ import { $n as AnyFlow, Ar as PlayerStateProvider, Cr as Config, Fr as SnapshotOf, J as Config$2, Ln as Config$1, Mr as SaveDoc, Tr as Json, Z as PixiModule, Zn as FeaturePlugin, _r as ClockSource, a as Config$3, cr as TypeTag, d as Manifest, jr as ProviderCall, n as AssetsIo, st as Orientation, yr as FakeClock } from "./types-CHmCFReJ.mjs";
2
+ import { o as AudioContextLike, s as Config$4 } from "./types-9xAh1wGm.mjs";
3
+ import { R as I18nApi, U as StringTable, W as TextKey } from "./types-DmGs6x0c.mjs";
4
+ import { St as effectsPlugin, Tt as audioPlugin, ht as PlatformProvider, i as screen, pt as platformPlugin, t as createApp } from "./index-CHI7dTc9.mjs";
5
5
  import { AnyPluginInstance } from "@moku-labs/core";
6
6
 
7
7
  //#region src/plugins/model/store/providers/memory.d.ts
@@ -1,5 +1,5 @@
1
- import { Pr as Snapshot, Tr as Json } from "./types-BFGyVykz.mjs";
2
- import { t as HeadlessApp } from "./headless-BCwsb1wR.mjs";
1
+ import { Pr as Snapshot, Tr as Json } from "./types-CHmCFReJ.mjs";
2
+ import { t as HeadlessApp } from "./headless-DIbfzWkr.mjs";
3
3
  import { Log } from "@moku-labs/common/browser";
4
4
 
5
5
  //#region src/plugins/flow/doors/types.d.ts
@@ -1,9 +1,9 @@
1
- import { Sr as Api$2, en as Api$1, q as Api, zr as Api$3 } from "./types-BFGyVykz.mjs";
2
- import { P as AnimApi, r as UiApi } from "./types-COWBfy2L.mjs";
3
- import { N as InputApi } from "./types-B02c7d6g.mjs";
4
- import { r as Repro } from "./headless-BCwsb1wR.mjs";
5
- import { a as InputOf, r as ControlApp } from "./types-C8JK9u1Y.mjs";
6
- import { t as commands } from "./commands-BvNp27KS.mjs";
1
+ import { Sr as Api$2, en as Api$1, q as Api, zr as Api$3 } from "./types-CHmCFReJ.mjs";
2
+ import { P as AnimApi, r as UiApi } from "./types-9xAh1wGm.mjs";
3
+ import { N as InputApi } from "./types-DmGs6x0c.mjs";
4
+ import { r as Repro } from "./headless-DIbfzWkr.mjs";
5
+ import { a as InputOf, r as ControlApp } from "./types-L4nVF9Ny.mjs";
6
+ import { t as commands } from "./commands-CV6Deuaj.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-Dv67ITPu.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-CjXAp0DW.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moku-labs/game",
3
- "version": "0.15.22",
3
+ "version": "0.15.23",
4
4
  "description": "2D puzzle game engine on TypeScript and PixiJS, built on @moku-labs/core.",
5
5
  "type": "module",
6
6
  "sideEffects": [