@moku-labs/game 0.15.19 → 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.
Files changed (37) hide show
  1. package/dist/app/page.d.mts +1 -1
  2. package/dist/app/page.mjs +1 -1
  3. package/dist/app/system.d.mts +3 -3
  4. package/dist/app.d.mts +3 -3
  5. package/dist/app.mjs +1 -1
  6. package/dist/assets.d.mts +1 -1
  7. package/dist/{capture-D7XvoHdH.mjs → capture-PTJXDpxK.mjs} +117 -16
  8. package/dist/{commands-G9maNqTK.d.mts → commands-CV6Deuaj.d.mts} +5 -5
  9. package/dist/control.d.mts +4 -4
  10. package/dist/control.mjs +1 -1
  11. package/dist/{define-BAuGN0UM.d.mts → define-42KUe-al.d.mts} +2 -2
  12. package/dist/{headless-BA6ffzqD.mjs → headless-Bxxl_mQX.mjs} +1 -1
  13. package/dist/{headless-uUUH54Ij.d.mts → headless-DIbfzWkr.d.mts} +1 -1
  14. package/dist/{index-Cku9aRz_.d.mts → index-CHI7dTc9.d.mts} +26 -4
  15. package/dist/index.d.mts +5 -5
  16. package/dist/index.mjs +3 -3
  17. package/dist/inspect.d.mts +6 -6
  18. package/dist/inspect.mjs +1 -1
  19. package/dist/jsx-dev-runtime.d.mts +1 -1
  20. package/dist/jsx-runtime.d.mts +1 -1
  21. package/dist/{run-BqYmcNo7.mjs → run-DRcc2SKF.mjs} +2 -2
  22. package/dist/{runtime-CuMDZhii.d.mts → runtime-BcMjHiib.d.mts} +1 -1
  23. package/dist/{sources-BYKXYPhd.mjs → sources-Dpc4NXvG.mjs} +1 -1
  24. package/dist/{src-CXfBuKpl.mjs → src-hVe3f8GV.mjs} +1380 -302
  25. package/dist/testing.d.mts +4 -4
  26. package/dist/testing.mjs +2 -2
  27. package/dist/{types-rr56N0Ab.d.mts → types-9xAh1wGm.d.mts} +8 -5
  28. package/dist/{types-bwefoJES.d.mts → types-CHmCFReJ.d.mts} +219 -24
  29. package/dist/{types-4T4QTU48.d.mts → types-DmGs6x0c.d.mts} +24 -6
  30. package/dist/{types-DQtBMqRE.d.mts → types-DwREs5vb.d.mts} +4 -4
  31. package/dist/{types-DMsvVZZT.d.mts → types-L4nVF9Ny.d.mts} +2 -2
  32. package/dist/{visual-B-c5OIFB.d.mts → visual-CjXAp0DW.d.mts} +6 -6
  33. package/dist/{visual-DNM5oFYx.mjs → visual-kEC9nb-o.mjs} +20 -2
  34. package/dist/visual.d.mts +1 -1
  35. package/dist/visual.mjs +2 -2
  36. package/llms.txt +2 -2
  37. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
- import { Qn as AnyFlow, Xn as FeaturePlugin, cr as Descriptor, fr as Hint, gr as ClockSource, ir as NodeTable, pr as NodeFx, vr as FakeClock, wr as Json } from "./types-bwefoJES.mjs";
2
- import { t as createApp } from "./index-Cku9aRz_.mjs";
3
- import { b as saveOf, v as WithGameState, y as memory } from "./types-DQtBMqRE.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-uUUH54Ij.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,7 +1,7 @@
1
- import { $t as exit, Qt as refuseStart, m as flattenFeatures, nn as type, t as createApp } from "./src-CXfBuKpl.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
- import { i as stepFrames, r as runRepro, t as createHeadless } from "./headless-BA6ffzqD.mjs";
4
+ import { i as stepFrames, r as runRepro, t as createHeadless } from "./headless-Bxxl_mQX.mjs";
5
5
  //#region src/testing/fake-fx.ts
6
6
  /** The node path a refused `fx.start` names when the test gives none. */
7
7
  const defaultPath = "test";
@@ -1,5 +1,5 @@
1
- import { $r as Events$2, $t as Api$3, An as ReducedMotion, Br as Events$5, Cn as Ease, Cr as Events$3, D as FilterSlotInputs, Dn as NumericFields, E as FilterSlot, En as MotionHandle, K as Api$4, Mn as TrackSegment, O as SyncApi, Pn as Api$2, Q as PixiTexture, Wr as Api$1, X as PixiModule, Y as PixiFilter, Z as PixiSprite, cr as Descriptor, dn as Entity, ei as Require, in as AnyComponent, jn as TrackOptions, ln as ComponentType, lt as FilterCache, on as AnyComponentValue, s as Events$1, sn as ComponentHandle, sr as TypeTag, st as Point, t as Api$5, v as Events$4, wr as Json, xr as Api$6 } from "./types-bwefoJES.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-4T4QTU48.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
 
@@ -2984,11 +2984,12 @@ type UiApi = {
2984
2984
  */
2985
2985
  find(key: string): Entity | undefined;
2986
2986
  /**
2987
- * Reads the live screen against the five rules: a tap target under `tapTargetPt` at the size
2987
+ * Reads the live screen against the six rules: a tap target under `tapTargetPt` at the size
2988
2988
  * it is drawn (a `fit: "contain"` on it or above it shrinks it), a text that does not fit its
2989
2989
  * box in some registered locale, an absolute element with no `reason`, a clipping element
2990
- * (`scroll`, `overflow: "hidden"`) whose style names a nine-slice it never draws, and a root
2991
- * element whose style sets a `zIndex` it ignores. Never throws; empty when nothing is mounted.
2990
+ * (`scroll`, `overflow: "hidden"`) whose style names a nine-slice it never draws, a style that
2991
+ * is `hollow` with no nine-slice to hollow, and a root element whose style sets a `zIndex` it
2992
+ * ignores. Never throws; empty when nothing is mounted.
2992
2993
  *
2993
2994
  * @returns One finding per rule and element.
2994
2995
  * @example
@@ -2997,6 +2998,8 @@ type UiApi = {
2997
2998
  * app.ui.lint(); // [{ rule: "tap-target", key: "cell", detail: "39 x 39 pt" }]
2998
2999
  * // A list styled with a nine-slice: the clip keeps it from drawing.
2999
3000
  * app.ui.lint(); // [{ rule: "nine-slice-clipped", key: "orders", detail: "scroll" }]
3001
+ * // A frame made hollow before its nine-slice was named: there is no rim to draw.
3002
+ * app.ui.lint(); // [{ rule: "hollow-without-nine-slice", key: "memFrost", detail: "stack" }]
3000
3003
  * // A screen root that asks to be drawn over the others: the layer decides that.
3001
3004
  * app.ui.lint(); // [{ rule: "z-index-on-root", key: "board", detail: "zIndex 2" }]
3002
3005
  * ```
@@ -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 }
@@ -7681,6 +7682,15 @@ type HostInternal = {
7681
7682
  * @returns True when it called Pixi.
7682
7683
  */
7683
7684
  renderProbe(container: PixiContainer, target?: PixiRenderTexture): boolean;
7685
+ /**
7686
+ * Puts a texture source on the GPU now with Pixi's public `renderer.texture.initSource(source)`: the GPU texture is
7687
+ * made and the pixels are uploaded, once; a source Pixi made already costs a lookup. Called by the upload queue of
7688
+ * `sync` before the stage pass of a drawn frame. A no-op while nothing draws. What Pixi throws is thrown on: the
7689
+ * caller logs it and counts the source done.
7690
+ *
7691
+ * @param source - The source of a texture `assets` loaded.
7692
+ */
7693
+ initSource(source: PixiTextureSource): void;
7684
7694
  /**
7685
7695
  * Tells whether the stage pass clears the canvas before it draws (`renderer.background.clearBeforeRender`, Pixi's
7686
7696
  * default, which the engine never turns off): only then may a probe draw onto the canvas.
@@ -7911,7 +7921,17 @@ type KeptRecord = {
7911
7921
  depth: number; /** Bytes of s1, s2, s3 (estimate, P6.1). */
7912
7922
  bytes: number; /** A settle retake is owed: the view came to rest off its picture's grid (P2.5). */
7913
7923
  settle: boolean; /** Bytes a refused take asked for; the record is not offered again until they fit (P6.3). */
7914
- refused: number; /** A view of kind `"Display"` hangs in the subtree; `undefined` until a take attempt walks it (P4.1). */
7924
+ refused: number;
7925
+ /**
7926
+ * The picture was cut to the canvas at its take (F53): a move or another canvas size would show what it left out,
7927
+ * so either takes it again.
7928
+ */
7929
+ cut: boolean;
7930
+ /**
7931
+ * The quad draws the subtree picture itself at the stack's alpha, with no stage 3 (F54): every enabled filter is an
7932
+ * `AlphaFilter` at the canvas resolution.
7933
+ */
7934
+ direct: boolean; /** A view of kind `"Display"` hangs in the subtree; `undefined` until a take attempt walks it (P4.1). */
7915
7935
  displays: boolean | undefined;
7916
7936
  };
7917
7937
  /** One picture of an overlay's range (P7), keyed by the owner overlay's entity. */
@@ -9017,7 +9037,7 @@ type PictureRequest = {
9017
9037
  reject: (error: Error) => void;
9018
9038
  };
9019
9039
  declare namespace types_d_exports$2 {
9020
- export { AdaptiveScale, Api$1 as Api, AspectRange, BitmapFontData, CaptureOptions, Captured, Config$2 as Config, CountingClasses, CoverFrame, CreateTextureOptions$1 as CreateTextureOptions, DebugApi, DebugSwitches, DemandFrame, DemandModule, DemandReason, DemandState, Deps$2 as Deps, DisplayAdapter, DisplayEntry, DisplaysApi, DrawCounter, Events$2 as Events, FilterCache, FilterSlot, FilterSlotInputs, FiltersApi, FontsApi, FrameColumns, FrameReadResult, FrameReadout, FrameRecord, FrameRing, HitBox, HostApi, HostInternal, HostModule, HostState, HudPartValue, KeptInternal, KeptModule, KeptRange, KeptState, KeptStats, KernelSlice$2 as KernelSlice, LayerEntry, LegendEntry, LongFrameEntry, Modules, MonitorApi, MonitorConfig, MonitorCounts, MonitorDeps, MonitorInternal, MonitorModule, MonitorSections, MonitorState, NineBorders$1 as NineBorders, Orientation, OverlayEventDetail, OverlayLevelValue, OverlayMode, OverlayPhase, OverlayReport, OverlayValue, OverlayWhat, PassKind, PassRecord, PerfCause, PerfChange, PerfChangeEntry, PerfCollectorLine, PerfCounts, PerfDisplay, PerfEventLine, PerfEventName, PerfGapLine, PerfHeaderLine, PerfLogLine, PerfLongFrameLine, PerfMarkLine, PerfMeasured, PerfMonitorApi, PerfSampleLine, PerfSpikeLine, PerfStartupLine, PerfTelemetryLine, PerfThermalLine, PictureRect, PixiApplication, PixiBitmapFont, PixiBounds, PixiContainer, PixiFilter, PixiFilterManager, PixiGraphics, PixiMatrix, PixiModule, PixiNineSliceSprite, PixiRectangle, PixiRenderTexture, PixiSprite, PixiTexture, Point, PoolTrim, PoolTrimDetail, ProblemEventDetail, ProblemRule, Rect, RenderStats, RendererCtx, RendererKind, SafeArea, ShaderEventDetail, ShaderWhat, SliceFrame, State$2 as State, SyncApi, SyncCounts, SyncInternal, SyncModule, SyncState, TeardownScope, TextureProvider, TextureUsage, TexturesApi, Under, View, ViewKind, ViewportApi, ViewportInternal, ViewportModule, ViewportSize, ViewportState, WarmDetail };
9040
+ export { AdaptiveScale, Api$1 as Api, AspectRange, BitmapFontData, CaptureOptions, Captured, Config$2 as Config, CountingClasses, CoverFrame, CreateTextureOptions$1 as CreateTextureOptions, DebugApi, DebugSwitches, DemandFrame, DemandModule, DemandReason, DemandState, Deps$2 as Deps, DisplayAdapter, DisplayEntry, DisplaysApi, DrawCounter, Events$2 as Events, FilterCache, FilterSlot, FilterSlotInputs, FiltersApi, FontsApi, FrameColumns, FrameReadResult, FrameReadout, FrameRecord, FrameRing, HitBox, HostApi, HostInternal, HostModule, HostState, HudPartValue, KeptInternal, KeptModule, KeptRange, KeptState, KeptStats, KernelSlice$2 as KernelSlice, LayerEntry, LegendEntry, LongFrameEntry, Modules, MonitorApi, MonitorConfig, MonitorCounts, MonitorDeps, MonitorInternal, MonitorModule, MonitorSections, MonitorState, NineBorders$1 as NineBorders, Orientation, OverlayEventDetail, OverlayLevelValue, OverlayMode, OverlayPhase, OverlayReport, OverlayValue, OverlayWhat, PassKind, PassRecord, PerfCause, PerfChange, PerfChangeEntry, PerfCollectorLine, PerfCounts, PerfDisplay, PerfEventLine, PerfEventName, PerfGapLine, PerfHeaderLine, PerfLogLine, PerfLongFrameLine, PerfMarkLine, PerfMeasured, PerfMonitorApi, PerfSampleLine, PerfSpikeLine, PerfStartupLine, PerfTelemetryLine, PerfThermalLine, PictureRect, PixiApplication, PixiBitmapFont, PixiBounds, PixiContainer, PixiFilter, PixiFilterManager, PixiGraphics, PixiMatrix, PixiMesh, PixiModule, PixiNineSliceSprite, PixiRectangle, PixiRenderTexture, PixiSprite, PixiTexture, PixiTextureSource, Point, PoolTrim, PoolTrimDetail, ProblemEventDetail, ProblemRule, Rect, RenderStats, RendererCtx, RendererKind, SafeArea, ShaderEventDetail, ShaderWhat, SliceFrame, State$2 as State, SyncApi, SyncCounts, SyncInternal, SyncModule, SyncState, TeardownScope, TextureProvider, TextureUsage, TexturesApi, Under, View, ViewKind, ViewportApi, ViewportInternal, ViewportModule, ViewportSize, ViewportState, WarmDetail };
9021
9041
  }
9022
9042
  /**
9023
9043
  * The part of Pixi the engine uses: the classes `sync` builds views from (a `Rectangle` frames the
@@ -9031,7 +9051,8 @@ declare namespace types_d_exports$2 {
9031
9051
  * batched distance-field text `host` installs: Pixi's `Batcher` with its geometry and buffers, the bitmap text pipe
9032
9052
  * and the batcher pipe it subclasses, and the WGSL and GLSL shader pieces of the batch's SDF shader, and the WebGPU
9033
9053
  * render target system with its adaptor, the pipeline system and the stencil system the lazy canvas pass of `host`
9034
- * subclasses or registers again (`host/render-pass.ts`). The module object
9054
+ * subclasses or registers again (`host/render-pass.ts`), and the mesh and its geometry the rim-only nine-slice of
9055
+ * `sync` is drawn with (`sync/hollow.ts`). The module object
9035
9056
  * never arrives through a static import: `config.loadPixi()` returns it, so a game without a screen carries no
9036
9057
  * Pixi in its bundle.
9037
9058
  *
@@ -9047,7 +9068,7 @@ declare namespace types_d_exports$2 {
9047
9068
  * pixi.defaultFilterVert.startsWith("in vec2 aPosition;"); // true
9048
9069
  * ```
9049
9070
  */
9050
- type PixiModule = Pick<typeof import("pixi.js"), "AlphaFilter" | "Application" | "Batcher" | "BatcherPipe" | "BitmapFont" | "BitmapText" | "BitmapTextPipe" | "BlurFilter" | "Bounds" | "Buffer" | "BufferUsage" | "Cache" | "ColorMatrixFilter" | "Container" | "DefaultBatcher" | "DisplacementFilter" | "ExtensionType" | "Filter" | "FilterSystem" | "Geometry" | "GlProgram" | "GlTextureSystem" | "GpuBatchAdaptor" | "GpuEncoderSystem" | "GpuGraphicsAdaptor" | "GpuProgram" | "GpuRenderTargetAdaptor" | "GpuRenderTargetSystem" | "GpuStencilSystem" | "GpuTextureSystem" | "Graphics" | "Matrix" | "NineSliceSprite" | "NoiseFilter" | "Particle" | "ParticleContainer" | "PipelineSystem" | "Rectangle" | "RenderGroupPipe" | "RenderTexture" | "Shader" | "Sprite" | "Texture" | "TexturePool" | "UniformGroup" | "bitmapFontTextParser" | "bitmapFontXMLStringParser" | "colorBit" | "colorBitGl" | "compileHighShaderGlProgram" | "compileHighShaderGpuProgram" | "defaultFilterVert" | "extensions" | "generateTextureBatchBit" | "generateTextureBatchBitGl" | "getBatchSamplersUniformGroup" | "mSDFBit" | "mSDFBitGl" | "roundPixelsBit" | "roundPixelsBitGl">;
9071
+ type PixiModule = Pick<typeof import("pixi.js"), "AlphaFilter" | "Application" | "Batcher" | "BatcherPipe" | "BitmapFont" | "BitmapText" | "BitmapTextPipe" | "BlurFilter" | "Bounds" | "Buffer" | "BufferUsage" | "Cache" | "ColorMatrixFilter" | "Container" | "DefaultBatcher" | "DisplacementFilter" | "ExtensionType" | "Filter" | "FilterSystem" | "Geometry" | "GlProgram" | "GlTextureSystem" | "GpuBatchAdaptor" | "GpuEncoderSystem" | "GpuGraphicsAdaptor" | "GpuProgram" | "GpuRenderTargetAdaptor" | "GpuRenderTargetSystem" | "GpuStencilSystem" | "GpuTextureSystem" | "Graphics" | "Matrix" | "Mesh" | "MeshGeometry" | "NineSliceSprite" | "NoiseFilter" | "Particle" | "ParticleContainer" | "PipelineSystem" | "Rectangle" | "RenderGroupPipe" | "RenderTexture" | "Shader" | "Sprite" | "Texture" | "TexturePool" | "UniformGroup" | "bitmapFontTextParser" | "bitmapFontXMLStringParser" | "colorBit" | "colorBitGl" | "compileHighShaderGlProgram" | "compileHighShaderGpuProgram" | "defaultFilterVert" | "extensions" | "generateTextureBatchBit" | "generateTextureBatchBitGl" | "getBatchSamplersUniformGroup" | "mSDFBit" | "mSDFBitGl" | "roundPixelsBit" | "roundPixelsBitGl">;
9051
9072
  /**
9052
9073
  * One Pixi application: renderer, canvas and stage.
9053
9074
  */
@@ -9069,6 +9090,10 @@ type PixiSprite = InstanceType<PixiModule["Sprite"]>;
9069
9090
  * A Pixi nine-slice sprite.
9070
9091
  */
9071
9092
  type PixiNineSliceSprite = InstanceType<PixiModule["NineSliceSprite"]>;
9093
+ /**
9094
+ * A Pixi mesh: what the rim-only nine-slice of a `NineSlice` with `hollow: true` is drawn with.
9095
+ */
9096
+ type PixiMesh = InstanceType<PixiModule["Mesh"]>;
9072
9097
  /**
9073
9098
  * A Pixi graphics object: what a `Shape` component is drawn with, and what clips its children.
9074
9099
  */
@@ -9077,6 +9102,11 @@ type PixiGraphics = InstanceType<PixiModule["Graphics"]>;
9077
9102
  * A Pixi texture. `assets` owns its lifetime; the renderer only makes and destroys it on request.
9078
9103
  */
9079
9104
  type PixiTexture = InstanceType<PixiModule["Texture"]>;
9105
+ /**
9106
+ * The source of a Pixi texture: the pixels the GPU holds once, shared by every slice of an atlas page. What the
9107
+ * upload queue of `sync.textures.upload` hands to Pixi's texture system.
9108
+ */
9109
+ type PixiTextureSource = PixiTexture["source"];
9080
9110
  /**
9081
9111
  * A texture Pixi renders into: what a kept picture is drawn into, engine-owned and destroyed by the engine.
9082
9112
  */
@@ -9206,6 +9236,8 @@ type AdaptiveScale = {
9206
9236
  * createApp({ pluginConfigs: { renderer: { mount: "#game", keptMb: 32 } } }); // a game with small art
9207
9237
  * // A short splash: two probe draws a frame create the pipelines sooner.
9208
9238
  * createApp({ pluginConfigs: { renderer: { mount: "#game", onDemand: true, warm: 2 } } });
9239
+ * // A desktop game with a fast GPU: `assets.warm` puts two textures a drawn frame on the GPU instead of one.
9240
+ * createApp({ pluginConfigs: { renderer: { mount: "#game", uploads: 2 } } });
9209
9241
  * // A game whose art must stay sharp: the adaptive frame rate drops the rate, never the resolution.
9210
9242
  * createApp({ pluginConfigs: { renderer: { mount: "#game", adaptiveScale: false } } });
9211
9243
  * ```
@@ -9255,6 +9287,22 @@ type Config$2 = {
9255
9287
  * created in the first frame that draws with it, as before. A whole number from 0 to 16; default 1.
9256
9288
  */
9257
9289
  warm: number;
9290
+ /**
9291
+ * Textures `sync.textures.upload` (what `assets.warm` calls) puts on the GPU per drawn frame, before the stage pass,
9292
+ * so the frame that first shows them does not upload them all at once. One upload costs about 9 ms on a Galaxy A26
9293
+ * whatever its size (median, 41 ms at worst): the show frame of 6 cold textures (9.4 MB) took 55 ms there, 8 ms with
9294
+ * them uploaded before. So the budget counts textures, not bytes. 0 turns the queue off: `upload` answers false and
9295
+ * the first draw of a texture uploads it, as before. A whole number from 0 to 8; default 1.
9296
+ *
9297
+ * @example
9298
+ * ```ts
9299
+ * // The memory screen's 6 textures, warmed while the board still shows: 3 drawn frames at 2 a frame.
9300
+ * const app = createApp({ pluginConfigs: { renderer: { mount: "#game", uploads: 2 } } });
9301
+ * await app.start();
9302
+ * await app.assets.warm("ep01.memory"); // resolves after the third drawn frame
9303
+ * ```
9304
+ */
9305
+ uploads: number;
9258
9306
  /**
9259
9307
  * The render scale of the adaptive frame rate on a GPU-bound screen: `{ floor: 0.75, devices: "phone" }` by default,
9260
9308
  * `false` keeps the resolution. Needs `time.adaptive`. A player's `monitor.setResolution` wins over it. Every change
@@ -9539,7 +9587,8 @@ type SpriteValue = {
9539
9587
  * strokes the bounds and the four cut lines over the panel: cyan, red when the corners overlap or
9540
9588
  * the texture is missing. `clip` masks the children of the entity to the `width × height` box,
9541
9589
  * the same rule as `Shape.clip`: the mask is a filled rectangle and is never drawn, and the panel
9542
- * itself is never masked. `alpha` fades the panel and the entity's children.
9590
+ * itself is never masked. `alpha` fades the panel and the entity's children. `hollow` draws the
9591
+ * rim alone: the eight border pieces, never the centre.
9543
9592
  *
9544
9593
  * @example
9545
9594
  * ```ts
@@ -9555,6 +9604,10 @@ type SpriteValue = {
9555
9604
  * const field: NineSliceValue = {
9556
9605
  * ...value, texture: "ui.field", width: 480, height: 96, clip: true
9557
9606
  * };
9607
+ * // The frost frame of the memory screen: its rim is drawn, its empty centre costs no pixel.
9608
+ * const frost: NineSliceValue = {
9609
+ * ...value, texture: "glass.frost", width: 960, height: 1400, hollow: true
9610
+ * };
9558
9611
  * ```
9559
9612
  */
9560
9613
  type NineSliceValue = {
@@ -9565,6 +9618,20 @@ type NineSliceValue = {
9565
9618
  tint: number;
9566
9619
  debug: boolean;
9567
9620
  clip: boolean;
9621
+ /**
9622
+ * Draws the rim alone: the four corners and the four edges of the slicing, never the centre cell, so a frame or a
9623
+ * glass panel whose middle is empty fills no pixel there. The hit box stays the whole `width × height`, and `debug`
9624
+ * and `clip` work as on a filled panel. Absent by default, read as `false`, so a panel that never sets it keeps the
9625
+ * values it had before the field existed.
9626
+ *
9627
+ * @example
9628
+ * ```ts
9629
+ * // A 960 x 1400 frame over the memory board, its slices 48 u wide: 8 rim pieces are drawn, the 864 x 1304 centre
9630
+ * // is not, and a tap in the middle still lands on the frame's entity.
9631
+ * world.ecs.spawn(owner, [Layer({ name: "ui" }), Transform(), NineSlice({ texture: "glass.frost", width: 960, height: 1400, hollow: true })]);
9632
+ * ```
9633
+ */
9634
+ hollow?: boolean;
9568
9635
  };
9569
9636
  /**
9570
9637
  * The escape hatch: the game owns a Pixi object and `sync` only attaches and detaches it.
@@ -9712,16 +9779,9 @@ declare const Sprite: ComponentType<SpriteValue>;
9712
9779
  /**
9713
9780
  * A stretchable panel, sized in reference units, with its own alpha and tint. `debug: true` draws
9714
9781
  * the slice outline over it. `clip: true` masks the children of the entity to the panel box.
9782
+ * `hollow: true` draws its rim alone, never the centre cell.
9715
9783
  */
9716
- declare const NineSlice$1: ComponentType<{
9717
- texture: string;
9718
- width: number;
9719
- height: number;
9720
- alpha: number;
9721
- tint: number;
9722
- debug: boolean;
9723
- clip: boolean;
9724
- }>;
9784
+ declare const NineSlice$1: ComponentType<NineSliceValue>;
9725
9785
  /**
9726
9786
  * The entity this view moves with. `0` means no parent.
9727
9787
  */
@@ -10084,6 +10144,29 @@ type TexturesApi = {
10084
10144
  * ```
10085
10145
  */
10086
10146
  invalidate(keys: readonly string[]): void;
10147
+ /**
10148
+ * Puts textures on the GPU before a screen shows them: each texture's source is queued once and uploaded with Pixi's
10149
+ * `renderer.texture.initSource` before the stage pass of a drawn frame, `renderer.uploads` a frame (one by default),
10150
+ * and the renderer asks for the next frame while sources wait. The slices of one atlas page share its source, so the
10151
+ * page is uploaded once. On a Galaxy A26 one upload costs about 9 ms whatever its size: the frame that showed 6 cold
10152
+ * textures took 55 ms, 8 ms once they were uploaded before. Answers `true` once every source of this call went
10153
+ * through, at once when they all did on this device; `false` at once while nothing draws (headless, a lost device)
10154
+ * or with `uploads: 0`, and `false` when the renderer stops or the device is lost before the queue reached them. A
10155
+ * source whose upload throws is logged (`renderer:upload-failed`) and counted done: its first draw uploads it, as
10156
+ * before. A source destroyed while it waits is skipped. The renderer never destroys a texture it was handed.
10157
+ *
10158
+ * @param textures - The textures; `assets` hands every texture and page of a bundle it loaded.
10159
+ * @returns Whether every source is on the GPU.
10160
+ * @example
10161
+ * ```ts
10162
+ * // `assets.warm("ep01.memory")`: the bundle is loaded; its 6 textures go to the GPU while the board still shows.
10163
+ * const renderer = ctx.require(rendererPlugin);
10164
+ * const textures = [...record.textures.values(), ...record.pages.values()];
10165
+ * const uploaded = await renderer.sync.textures.upload(textures); // true 6 drawn frames later (uploads: 1)
10166
+ * await renderer.sync.textures.upload(textures); // true at once: they are on this device already
10167
+ * ```
10168
+ */
10169
+ upload(textures: readonly PixiTexture[]): Promise<boolean>;
10087
10170
  };
10088
10171
  /**
10089
10172
  * The display registry a plugin above extends, `app.renderer.sync.displays`. `Sprite`,
@@ -10720,6 +10803,14 @@ type SyncInternal = {
10720
10803
  * @returns True when it drew a probe in this frame: the frame is then no sample of the adaptive rate.
10721
10804
  */
10722
10805
  warmStep(): boolean;
10806
+ /**
10807
+ * Uploads up to `renderer.uploads` queued texture sources (F60), in a drawn frame, right after the warm-up's probes
10808
+ * and before the stage pass. Asks for the next frame while sources wait. One compare and no allocation while the
10809
+ * queue is empty.
10810
+ *
10811
+ * @returns True when it uploaded a source in this frame: the frame is then no sample of the adaptive rate.
10812
+ */
10813
+ uploadStep(): boolean;
10723
10814
  /**
10724
10815
  * Subscribes to the end of a warm-up run: the queue became empty (the monitor of an agent build writes the `warm`
10725
10816
  * event line). Emptied by `stopSync`.
@@ -10838,6 +10929,60 @@ type WarmState = {
10838
10929
  reported: Set<unknown>;
10839
10930
  listeners: WarmListener[];
10840
10931
  };
10932
+ /**
10933
+ * One call of `textures.upload` that waits: how many of its sources are still queued, and its answer. Not public.
10934
+ */
10935
+ type UploadWaiter = {
10936
+ left: number;
10937
+ resolve: (ok: boolean) => void;
10938
+ };
10939
+ /**
10940
+ * The texture upload queue (F60): the sources not yet uploaded from `head` on, emptied when the head reaches the end
10941
+ * (the warm-up's pattern); for each queued source the calls that wait for it; the sources uploaded on this device. A
10942
+ * step with an empty queue reads two numbers. Not public.
10943
+ */
10944
+ type UploadState = {
10945
+ /** The sources to upload, from `head` on; each queued once. */queue: PixiTextureSource[];
10946
+ head: number;
10947
+ /**
10948
+ * The calls each queued source is waited for by, in call order: a source in it is in the queue, and every call that
10949
+ * waits is in it under one of its sources. Answered `false` when the renderer stops or the device is lost.
10950
+ */
10951
+ waiting: Map<PixiTextureSource, UploadWaiter[]>;
10952
+ /**
10953
+ * The sources that went through `initSource` on this device, or threw there: a call naming only these answers at
10954
+ * once.
10955
+ */
10956
+ done: WeakSet<PixiTextureSource>;
10957
+ };
10958
+ /**
10959
+ * What a nine-slice view's object offers `sync`, whichever class draws it: Pixi's `NineSliceSprite`, or the engine's
10960
+ * rim-only mesh of a `hollow` one (`hollow.ts`). The six numbers rebuild the panel when written, the tint and the
10961
+ * texture are written as on a sprite. Not public.
10962
+ */
10963
+ type SliceLike = PixiContainer & {
10964
+ leftWidth: number;
10965
+ topHeight: number;
10966
+ rightWidth: number;
10967
+ bottomHeight: number;
10968
+ width: number;
10969
+ height: number;
10970
+ tint: number;
10971
+ texture: PixiTexture;
10972
+ };
10973
+ /**
10974
+ * The engine's rim-only nine-slice (F59): a Pixi `Mesh` of 16 vertices and 48 indices, the eight border cells of the
10975
+ * slicing and never the centre, driven through the same numbers as a `NineSliceSprite`. `hollow` tells it apart. Not
10976
+ * public.
10977
+ */
10978
+ type HollowSlice = SliceLike & {
10979
+ readonly hollow: true;
10980
+ };
10981
+ /**
10982
+ * The class of the rim-only nine-slice, made once over the Pixi module the renderer loaded (Pixi arrives lazily, so
10983
+ * the class cannot be declared at import). Built with the texture it draws first. Not public.
10984
+ */
10985
+ type HollowClass = new (texture: PixiTexture) => HollowSlice;
10841
10986
  /**
10842
10987
  * Where the overlay step's event lines go: the monitor's `event`. Private to the renderer.
10843
10988
  */
@@ -11012,7 +11157,9 @@ type SyncState = {
11012
11157
  * view, so a still frame walks no entry.
11013
11158
  */
11014
11159
  viewlessEntries: boolean; /** The pipeline warm-up (F4). */
11015
- warm: WarmState;
11160
+ warm: WarmState; /** The texture upload queue (F60). */
11161
+ upload: UploadState; /** The class of the rim-only nine-slice (F59), made at the first hollow view over the loaded Pixi module. */
11162
+ hollowClass: HollowClass | undefined;
11016
11163
  /**
11017
11164
  * The kind of each Pixi filter a slot named, for the performance log of an agent build; a
11018
11165
  * blur's two passes are filters of their own and are in it too. Empty in a production build.
@@ -11410,7 +11557,7 @@ type RunContext = {
11410
11557
  signal: AbortSignal;
11411
11558
  };
11412
11559
  declare namespace types_d_exports {
11413
- export { Api, AssetKind, AssetStamps, AssetsCtx, AssetsIo, AtlasFrame, AtlasPage, AudioAsset, AudioMime, BundleCompanion, BundleMap, BundleRecord, BundleRelease, BundleSpec, BundleUsage, Config, CreateTextureOptions, DecodedImage, DefineBundles, Deps, Events, FetchResponse, FlowRest, FontAsset, FontPage, HotSwap, Inflight, KernelSlice, LoadBundles, LoadReason, LoadResult, LoadedAssets, LoadedFont, Manifest, ManifestBundle, ManifestFile, NineBorders, NineSlice, PreloadQueue, State, Texture, Tier, Usage };
11560
+ export { Api, AssetKind, AssetStamps, AssetsCtx, AssetsIo, AtlasFrame, AtlasPage, AudioAsset, AudioMime, BundleCompanion, BundleMap, BundleRecord, BundleRelease, BundleSpec, BundleUsage, Config, CreateTextureOptions, DecodedImage, DefineBundles, Deps, Events, FetchResponse, FlowRest, FontAsset, FontPage, HotSwap, Inflight, KernelSlice, LoadBundles, LoadReason, LoadResult, LoadedAssets, LoadedFont, Manifest, ManifestBundle, ManifestFile, NineBorders, NineSlice, PreloadQueue, ReadyBundles, State, Texture, Tier, Usage, WarmEntry };
11414
11561
  }
11415
11562
  /**
11416
11563
  * When a bundle is loaded. `boot` and `core` stay for the whole session, `scene` and `feature`
@@ -11808,6 +11955,18 @@ type DefineBundles<Key extends string> = (map: Partial<Record<Key, BundleSpec>>)
11808
11955
  * ```
11809
11956
  */
11810
11957
  type LoadBundles<Key extends string> = (bundle: Key | readonly Key[]) => Descriptor<LoadResult | undefined>;
11958
+ /**
11959
+ * The `ready` descriptor helper bound to the bundle keys of one game (F52). The descriptor resolves
11960
+ * `true` when every bundle is loaded and on the GPU, `false` while the node should rest until the
11961
+ * inbox event `ready`, or `undefined` in an app without `assets`.
11962
+ *
11963
+ * @example
11964
+ * ```ts
11965
+ * const readyGameBundle: ReadyBundles<"board" | "board.chains"> = ready;
11966
+ * readyGameBundle("board"); // { kind: "ready", payload: { bundles: ["board"] } }
11967
+ * ```
11968
+ */
11969
+ type ReadyBundles<Key extends string> = (bundle: Key | readonly Key[]) => Descriptor<boolean | undefined>;
11811
11970
  /**
11812
11971
  * What the `load` effect resolves with, so a loading node can write its own progress.
11813
11972
  *
@@ -11912,6 +12071,15 @@ type PreloadQueue = {
11912
12071
  bundles: string[];
11913
12072
  controller: AbortController;
11914
12073
  };
12074
+ /**
12075
+ * One warm of a bundle (F60): the promise every caller of `warm` joins, and `done` once it
12076
+ * resolved, so the `ready` effect answers without waiting. Dropped when the bundle unloads, and
12077
+ * when the warm fails, so the next call tries again.
12078
+ */
12079
+ type WarmEntry = {
12080
+ promise: Promise<void>;
12081
+ done: boolean;
12082
+ };
11915
12083
  /**
11916
12084
  * What the keys watch of `moku-game dev` knows about the asset files of a game: the default export
11917
12085
  * of the generated `.moku/assets-stamp.ts`. The dev hot swap compares it with the map it applied
@@ -11968,8 +12136,8 @@ type State = {
11968
12136
  useCounter: number; /** Keys already reported missing, so one key warns and starts its background load once. */
11969
12137
  warned: Set<string>;
11970
12138
  /**
11971
- * `onEnter`, the `load` handler, the texture provider, the start and the end of an exit in `world`, and the system
11972
- * `assets.leave` of phase `sync`.
12139
+ * `onEnter`, the `load` and `ready` handlers, the texture provider, the start and the end of an exit in `world`,
12140
+ * and the system `assets.leave` of phase `sync`.
11973
12141
  */
11974
12142
  removers: Array<() => void>; /** The `files` map of the stamp the dev hot swap applied last. `undefined` until the first swap. */
11975
12143
  stamps: Readonly<Record<string, string>> | undefined; /** The running dev hot swap. The next one waits for it, so two swaps never overlap. */
@@ -11983,6 +12151,12 @@ type State = {
11983
12151
  exiting: number; /** Registered companions, in registration order. */
11984
12152
  companions: BundleCompanion[]; /** A live rest was announced; the arriving node's `load` stage runs the release. */
11985
12153
  restPending: boolean;
12154
+ /**
12155
+ * Bundles whose warm for a `ready` effect failed (not an abort): `ready` counts them as there, so a node never
12156
+ * hangs on them, until a later load of the bundle succeeds (F52).
12157
+ */
12158
+ readyFailed: Set<string>; /** One running or finished warm per bundle, joined by a second `warm`; dropped when the bundle unloads (F60). */
12159
+ warmed: Map<string, WarmEntry>;
11986
12160
  };
11987
12161
  /**
11988
12162
  * What `usage()` reports about one loaded bundle.
@@ -12110,6 +12284,27 @@ type Api = {
12110
12284
  * ```
12111
12285
  */
12112
12286
  load(bundle: string): Promise<void>;
12287
+ /**
12288
+ * Puts the textures of a bundle on the GPU before a scene shows them (F60): loads the bundle when
12289
+ * it is not loaded, then hands every texture and atlas page of it to
12290
+ * `renderer.sync.textures.upload`, which uploads `renderer.uploads` of them a drawn frame. A
12291
+ * second call joins the running or finished warm of the same bundle; an unload forgets it, so a
12292
+ * reload warms again. It resolves also when the renderer could not upload (no device,
12293
+ * `uploads: 0`, a stop): the first draw uploads then, as before. Headless it resolves at once,
12294
+ * as `load` does. The `ready` effect waits for it.
12295
+ *
12296
+ * @param bundle - Name of a bundle of the manifest.
12297
+ * @returns A promise that resolves once the bundle is loaded and its textures went to the GPU.
12298
+ * @throws {Error} When the manifest has no such bundle, and when a file fails to load.
12299
+ * @example
12300
+ * ```ts
12301
+ * // Outside a node: the board's art goes to the GPU while the menu still shows.
12302
+ * await app.assets.warm("ep01.board"); // the board's textures are on the GPU, 1 per drawn frame
12303
+ * app.assets.isLoaded("ep01.board"); // true
12304
+ * await app.assets.warm("ep01.board"); // at once: the same warm, nothing is uploaded twice
12305
+ * ```
12306
+ */
12307
+ warm(bundle: string): Promise<void>;
12113
12308
  /**
12114
12309
  * Destroys the textures of a bundle and tells `renderer` that its keys are gone; every
12115
12310
  * companion's `unload` runs. A pinned bundle and the tiers `boot` and `core` are refused with a
@@ -12337,4 +12532,4 @@ type BundleCompanion = {
12337
12532
  unload(bundle: string): void;
12338
12533
  };
12339
12534
  //#endregion
12340
- export { PoolTrim as $, Bookmark as $n, Events$8 as $r, Api$2 as $t, HudPart as A, ReducedMotion as An, ProviderCall as Ar, PerfCounts as At, SpriteOptions as B, Position as Bn, Events$6 as Br, PerfSampleLine as Bt, State$1 as C, Ease as Cn, Events$5 as Cr, PROBLEM_RULES as Ct, FilterSlotInputs as D, NumericFields as Dn, types_d_exports$6 as Dr, PerfChange as Dt, FilterSlot as E, MotionHandle as En, State$6 as Er, PerfCause as Et, OverlayValue as F, BundlesOf as Fn, StoreApi as Fr, PerfHeaderLine as Ft, AdaptiveScale as G, exit as Gn, Config$8 as Gr, PoolTrimDetail as Gt, Transform as H, TextStylesOf as Hn, State$7 as Hr, PerfStartupLine as Ht, Parent as I, Config$4 as In, RngApi as Ir, PerfLogLine as It, MonitorConfig as J, type as Jn, State$8 as Jr, SHADER_WHATS as Jt, Api$1 as K, slot as Kn, FrameRate as Kr, ProblemEventDetail as Kt, Shape as L, EmitterIdOf as Ln, RngState as Lr, PerfLongFrameLine as Lt, NineSlice$1 as M, TrackSegment as Mn, SaveUnreadableError as Mr, PerfEventLine as Mt, NineSliceValue as N, ViewHandle as Nn, Snapshot as Nr, PerfEventName as Nt, SyncApi as O, ProjectionMotion as On, Patch as Or, PerfChangeEntry as Ot, Overlay as P, Api$3 as Pn, SnapshotOf as Pr, PerfGapLine as Pt, PixiTexture as Q, AnyFlow as Qn, Config$9 as Qr, DEMAND_REASONS as Qt, ShapeValue as R, GameTypes as Rn, Api$6 as Rr, PerfMarkLine as Rt, ScenesApi as S, DescriptionNode as Sn, Config$6 as Sr, PERF_LOG_VERSION as St, DebugSwitches as T, MotionCause as Tn, Root as Tr, PassRecord as Tt, TransformValue as U, types_d_exports$4 as Un, types_d_exports$7 as Ur, PerfTelemetryLine as Ut, SpriteValue as V, State$4 as Vn, PauseReason as Vr, PerfSpikeLine as Vt, sprite as W, defineFlow as Wn, Api$7 as Wr, PerfThermalLine as Wt, PixiModule as X, FeaturePlugin as Xn, Time as Xr, ShaderWhat as Xt, PixiFilter as Y, FeatureDescription as Yn, ThermalReading as Yr, ShaderEventDetail as Yt, PixiSprite as Z, FeatureTree as Zn, types_d_exports$8 as Zr, WarmDetail as Zt, DefineScene as _, ResourceType as _n, Config$5 as _r, MonitorSections as _t, Config as a, AnyComponentType as an, RouteStep as ar, RenderStats as at, SceneDefinition as b, TagType as bn, types_d_exports$5 as br, PERF_CAUSES as bt, LoadBundles as c, ComponentSchema as cn, Descriptor as cr, ViewportSize as ct, Manifest as d, Entity as dn, GuideOptions as dr, FrameReadResult as dt, Require as ei, Config$3 as en, DefineNode as er, State$2 as et, State as f, EntitySnapshot as fn, Hint as fr, FrameReadout as ft, AnySceneProjection as g, QueryTerm as gn, ClockSource as gr, MONITOR_SECTIONS as gt, types_d_exports as h, Narrowed as hn, Api$4 as hr, LongFrameEntry as ht, BundleSpec as i, AnyComponent as in, NodeTable as ir, MonitorCounts as it, HudPartValue as j, TrackOptions as jn, SaveDoc as jr, PerfDisplay as jt, Display as k, ProjectionSpec as kn, PlayerStateProvider as kr, PerfCollectorLine as kt, LoadReason as l, ComponentType as ln, Effect as lr, FilterCache as lt, Usage as m, Mut as mn, Answer as mr, FrameRing as mt, AssetsIo as n, State$3 as nn, FlowState as nr, types_d_exports$2 as nt, DefineBundles as o, AnyComponentValue as on, SceneIdOf as or, Orientation as ot, Tier as p, FrameDiff as pn, NodeFx as pr, FrameRecord as pt, Config$2 as q, to as qn, RateChange as qr, ProblemRule as qt, BundleMap as r, types_d_exports$3 as rn, JournalEntry as rr, Captured as rt, Events as s, ComponentHandle as sn, TypeTag as sr, Point as st, Api as t, Explained as tn, FlowGraph as tr, Under as tt, LoadResult as u, ComponentValue as un, EffectOptions as ur, FrameColumns as ut, Events$1 as v, SystemDefinition as vn, FakeClock as vr, OverlayEventDetail as vt, types_d_exports$1 as w, Motion as wn, Json as wr, PassKind as wt, SceneSpec as x, ChangeHook as xn, Api$5 as xr, PERF_GAP_BUCKETS as xt, LayerMap as y, SystemFor as yn, State$5 as yr, OverlayWhat as yt, Sprite as z, HudKeysOf as zn, Config$7 as zr, PerfMeasured as zt };
12535
+ export { PixiTexture as $, AnyFlow as $n, Config$9 as $r, DEMAND_REASONS as $t, Display as A, ProjectionSpec as An, PlayerStateProvider as Ar, PerfCollectorLine as At, Sprite as B, HudKeysOf as Bn, Config$7 as Br, PerfMeasured as Bt, ScenesApi as C, DescriptionNode as Cn, Config$6 as Cr, PERF_LOG_VERSION as Ct, FilterSlot as D, MotionHandle as Dn, State$6 as Dr, PerfCause as Dt, DebugSwitches as E, MotionCause as En, Root as Er, PassRecord as Et, Overlay as F, Api$3 as Fn, SnapshotOf as Fr, PerfGapLine as Ft, sprite as G, defineFlow as Gn, Api$7 as Gr, PerfThermalLine as Gt, SpriteValue as H, State$4 as Hn, PauseReason as Hr, PerfSpikeLine as Ht, OverlayValue as I, BundlesOf as In, StoreApi as Ir, PerfHeaderLine as It, Config$2 as J, to as Jn, RateChange as Jr, ProblemRule as Jt, AdaptiveScale as K, exit as Kn, Config$8 as Kr, PoolTrimDetail as Kt, Parent as L, Config$4 as Ln, RngApi as Lr, PerfLogLine as Lt, HudPartValue as M, TrackOptions as Mn, SaveDoc as Mr, PerfDisplay as Mt, NineSlice$1 as N, TrackSegment as Nn, SaveUnreadableError as Nr, PerfEventLine as Nt, FilterSlotInputs as O, NumericFields as On, types_d_exports$6 as Or, PerfChange as Ot, NineSliceValue as P, ViewHandle as Pn, Snapshot as Pr, PerfEventName as Pt, PixiSprite as Q, FeatureTree as Qn, types_d_exports$8 as Qr, WarmDetail as Qt, Shape as R, EmitterIdOf as Rn, RngState as Rr, PerfLongFrameLine as Rt, SceneSpec as S, ChangeHook as Sn, Api$5 as Sr, PERF_GAP_BUCKETS as St, types_d_exports$1 as T, Motion as Tn, Json as Tr, PassKind as Tt, Transform as U, TextStylesOf as Un, State$7 as Ur, PerfStartupLine as Ut, SpriteOptions as V, Position as Vn, Events$6 as Vr, PerfSampleLine as Vt, TransformValue as W, types_d_exports$4 as Wn, types_d_exports$7 as Wr, PerfTelemetryLine as Wt, PixiFilter as X, FeatureDescription as Xn, ThermalReading as Xr, ShaderEventDetail as Xt, MonitorConfig as Y, type as Yn, State$8 as Yr, SHADER_WHATS as Yt, PixiModule as Z, FeaturePlugin as Zn, Time as Zr, ShaderWhat as Zt, AnySceneProjection as _, QueryTerm as _n, ClockSource as _r, MONITOR_SECTIONS as _t, Config as a, AnyComponent as an, NodeTable as ar, MonitorCounts as at, LayerMap as b, SystemFor as bn, State$5 as br, OverlayWhat as bt, LoadBundles as c, ComponentHandle as cn, TypeTag as cr, Point as ct, Manifest as d, ComponentValue as dn, EffectOptions as dr, FrameColumns as dt, Events$8 as ei, Api$2 as en, Bookmark as er, PoolTrim as et, ReadyBundles as f, Entity as fn, GuideOptions as fr, FrameReadResult as ft, types_d_exports as g, Narrowed as gn, Api$4 as gr, LongFrameEntry as gt, Usage as h, Mut as hn, Answer as hr, FrameRing as ht, BundleSpec as i, types_d_exports$3 as in, JournalEntry as ir, Captured as it, HudPart as j, ReducedMotion as jn, ProviderCall as jr, PerfCounts as jt, SyncApi as k, ProjectionMotion as kn, Patch as kr, PerfChangeEntry as kt, LoadReason as l, ComponentSchema as ln, Descriptor as lr, ViewportSize as lt, Tier as m, FrameDiff as mn, NodeFx as mr, FrameRecord as mt, AssetsIo as n, Explained as nn, FlowGraph as nr, Under as nt, DefineBundles as o, AnyComponentType as on, RouteStep as or, RenderStats as ot, State as p, EntitySnapshot as pn, Hint as pr, FrameReadout as pt, Api$1 as q, slot as qn, FrameRate as qr, ProblemEventDetail as qt, BundleMap as r, State$3 as rn, FlowState as rr, types_d_exports$2 as rt, Events as s, AnyComponentValue as sn, SceneIdOf as sr, Orientation as st, Api as t, Require as ti, Config$3 as tn, DefineNode as tr, State$2 as tt, LoadResult as u, ComponentType as un, Effect as ur, FilterCache as ut, DefineScene as v, ResourceType as vn, Config$5 as vr, MonitorSections as vt, State$1 as w, Ease as wn, Events$5 as wr, PROBLEM_RULES as wt, SceneDefinition as x, TagType as xn, types_d_exports$5 as xr, PERF_CAUSES as xt, Events$1 as y, SystemDefinition as yn, FakeClock as yr, OverlayEventDetail as yt, ShapeValue as z, GameTypes as zn, Api$6 as zr, PerfMarkLine as zt };
@@ -1,4 +1,4 @@
1
- import { $t as Api$2, An as ReducedMotion, Cn as Ease, Dn as NumericFields, En as MotionHandle, K as Api$3, Nn as ViewHandle, On as ProjectionMotion, Pn as Api$1, Tn as MotionCause, U as TransformValue, Wr as Api, an as AnyComponentType, bn as TagType, cr as Descriptor, ct as ViewportSize, dn as Entity, ei as Require, fr as Hint, hr as Api$5, in as AnyComponent, ln as ComponentType, mr as Answer, on as AnyComponentValue, s as Events$1, t as Api$4, wn as Motion, wr as Json, xn as ChangeHook } from "./types-bwefoJES.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";
@@ -157,7 +157,21 @@ type VisualStyle<Asset extends string = string> = {
157
157
  * but `image`, `icon` and `text` takes it; a clipping element (`scroll`, `overflow: "hidden"`)
158
158
  * keeps its rectangle, which carries the clip.
159
159
  */
160
- nineSlice?: Asset; /** Multiplies the colour of a nine-slice or an image. */
160
+ nineSlice?: Asset;
161
+ /**
162
+ * Draws the nine-slice of the style as its rim alone: the eight border pieces, never the
163
+ * centre, so a frame or a glass panel with an empty middle fills no pixel there. `false` by
164
+ * default. Does nothing without `nineSlice`; `lint()` reports it as
165
+ * `hollow-without-nine-slice`. A tap in the middle still lands on the element.
166
+ *
167
+ * @example
168
+ * ```tsx
169
+ * // The frost frame of the memory screen: its rim is drawn, its centre shows the board under it.
170
+ * <stack key="memFrost" style={{ nineSlice: "glass.frost", hollow: true, width: 960, height: 1400 }} />;
171
+ * app.world.ecs.get(app.ui.find("memFrost") ?? 0, NineSlice)?.hollow; // true
172
+ * ```
173
+ */
174
+ hollow?: boolean; /** Multiplies the colour of a nine-slice or an image. */
161
175
  tint?: number;
162
176
  /**
163
177
  * Outlines the nine-slice of the style: its bounds and the four slice lines, cyan, red when
@@ -1741,7 +1755,8 @@ type State = {
1741
1755
  * container drawn under an older count is built again on its next update.
1742
1756
  */
1743
1757
  generation: number; /** Warning keys already written, so a style, a tag, a glyph or a font warns once. */
1744
- 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. */
1745
1760
  removers: Array<() => void>;
1746
1761
  };
1747
1762
  /**
@@ -1760,7 +1775,9 @@ type TextApi = {
1760
1775
  * The size of a piece of text in reference pixels, from the advance table of the style's font.
1761
1776
  * A `Message` is formatted in the current locale first. Never touches a canvas, so the answer
1762
1777
  * is the same in a browser and in plain Bun. Cached per style and resolved string, and per
1763
- * 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).
1764
1781
  *
1765
1782
  * @param content - A plain string, or what `tr` returned.
1766
1783
  * @param style - A registered style name. An unknown one warns once and measures as `body`.
@@ -2685,7 +2702,8 @@ type Element = {
2685
2702
  height: number;
2686
2703
  };
2687
2704
  measuredWidth?: number | undefined; /** True once the text wrapped at its box: from then on `ui` writes its box, 0 when it fits. */
2688
- boxed?: boolean;
2705
+ boxed?: boolean; /** True once its nine-slice was hollow: from then on `ui` writes `hollow`, false when the style drops it. */
2706
+ hollowed?: boolean;
2689
2707
  basis?: StyleBasis; /** The motions of its hooks that started a `repeat: "forever"` track; made with the first one. */
2690
2708
  endless?: Set<MotionHandle>; /** What its enter hook did at the `Box`, until `ui.enter` keeps the play or plays it again (F49). */
2691
2709
  posed?: PosedEnter | undefined;
@@ -3017,7 +3035,7 @@ type UiNode = {
3017
3035
  * ```
3018
3036
  */
3019
3037
  type Finding = {
3020
- rule: "tap-target" | "text-overflow" | "absolute-without-reason" | "nine-slice-clipped" | "z-index-on-root";
3038
+ rule: "tap-target" | "text-overflow" | "absolute-without-reason" | "nine-slice-clipped" | "hollow-without-nine-slice" | "z-index-on-root";
3021
3039
  key: string;
3022
3040
  detail: string;
3023
3041
  };
@@ -1,7 +1,7 @@
1
- import { Ar as ProviderCall, In as Config$1, Pr as SnapshotOf, Qn as AnyFlow, Sr as Config, X as PixiModule, Xn as FeaturePlugin, a as Config$3, d as Manifest, gr as ClockSource, jr as SaveDoc, kr as PlayerStateProvider, n as AssetsIo, ot as Orientation, q as Config$2, sr as TypeTag, vr as FakeClock, wr as Json } from "./types-bwefoJES.mjs";
2
- import { o as AudioContextLike, s as Config$4 } from "./types-rr56N0Ab.mjs";
3
- import { R as I18nApi, U as StringTable, W as TextKey } from "./types-4T4QTU48.mjs";
4
- import { ft as platformPlugin, i as screen, mt as PlatformProvider, t as createApp, wt as audioPlugin, xt as effectsPlugin } from "./index-Cku9aRz_.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 { Nr as Snapshot, wr as Json } from "./types-bwefoJES.mjs";
2
- import { t as HeadlessApp } from "./headless-uUUH54Ij.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