@simpludify/core 0.1.3 → 0.1.4

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["integer","finite","finite","inputPhase","updatePhase","integratePhase","latePhase","finite","finite","finite","finite","finite","finite","integer","clamp"],"sources":["../src/foundation/diagnostics.ts","../src/foundation/easing.ts","../src/foundation/tween.ts","../src/foundation/lifetime.ts","../src/foundation/events.ts","../src/scene/component.ts","../src/graphics/sprite-sheet.ts","../src/graphics/components.ts","../src/animation/actor-tween.ts","../src/animation/sprite-animation.ts","../src/game/motion.ts","../src/foundation/cancellation.ts","../src/foundation/grid.ts","../src/foundation/random.ts","../src/foundation/version.ts","../src/scene/actor.ts","../src/game/character.ts","../src/game/collision-policy.ts","../src/game/tilemap-collision.ts","../src/graphics/coordinates.ts","../src/game/tilemap.ts","../src/foundation/timers.ts","../src/scene/scene.ts","../src/game/collider.ts","../src/game/collision-body.ts","../src/game/collision-contact.ts","../src/game/collision-geometry.ts","../src/game/collision-response.ts","../src/game/tile-collision-geometry.ts","../src/game/tile-collision-index.ts","../src/game/tile-contact.ts","../src/game/collision.ts","../src/game/geometry-tilemap.ts","../src/graphics/camera-follow.ts","../src/graphics/tile-geometry.ts","../src/interaction/key-code.ts","../src/interaction/action-bindings.ts","../src/interaction/action-frame.ts","../src/interaction/action-types.ts","../src/interaction/input-source.ts","../src/interaction/actions.ts","../src/interaction/input.ts","../src/ui/canvas-layout.ts","../src/ui/scrollbar.ts","../src/interaction/pointer-routing.ts","../src/runtime/engine.ts","../src/runtime/fixed-step.ts","../src/runtime/replay-data.ts","../src/runtime/replay.ts","../src/ui/canvas-control.ts","../src/ui/canvas-node.ts","../src/ui/canvas-input.ts","../src/ui/native-edit.ts","../src/ui/canvas-editor.ts","../src/ui/canvas-number-input.ts","../src/ui/canvas-select.ts","../src/ui/canvas-text.ts","../src/ui/canvas-text-input.ts","../src/ui/canvas-tween.ts","../src/ui/canvas-ui.ts"],"sourcesContent":["export class EngineError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly details: Readonly<Record<string, unknown>> = {},\n ) {\n super(message);\n this.name = \"EngineError\";\n }\n toJSON() {\n return { code: this.code, message: this.message, ...this.details };\n }\n}\nexport function positive(value: number, name: string): number {\n if (!Number.isFinite(value) || value <= 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n `${name} must be finite and positive`,\n { field: name },\n );\n return value;\n}\n","/** Pure normalized easing functions. Custom easing must return a finite value in [0,1]. */\nexport type EasingFunction = (progress: number) => number;\nexport const Easing = Object.freeze({\n Linear: (t: number) => t,\n InQuad: (t: number) => t * t,\n OutQuad: (t: number) => t * (2 - t),\n InOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2),\n InCubic: (t: number) => t ** 3,\n OutCubic: (t: number) => 1 - (1 - t) ** 3,\n InOutCubic: (t: number) => (t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2),\n});\n","import { EngineError } from \"./diagnostics\";\nimport { Easing, type EasingFunction } from \"./easing\";\nimport type { LifetimeOwner } from \"./lifetime\";\n\nexport type TweenCancelReason =\n | \"cancelled\"\n | \"stopped\"\n | \"replaced\"\n | \"external-write\"\n | \"target-unavailable\"\n | \"owner-disposed\"\n | \"scheduler-disposed\"\n | \"error\";\nexport interface TweenBindingOptions {\n readonly target: object;\n readonly key: PropertyKey;\n readonly read: () => number;\n readonly write: ((value: number) => void) | ((value: number) => boolean);\n readonly owner?: LifetimeOwner;\n readonly scope?: () => object | undefined;\n readonly valid?: () => boolean;\n readonly validate?: (value: number) => void;\n readonly stamp?: () => unknown;\n readonly watch?: (\n invalidate: (reason?: TweenCancelReason) => void,\n ) => () => void;\n}\n/** Explicit numeric write capability. target/key identifies a channel, not a reflected object path. */\nexport class TweenBinding {\n readonly key: string | symbol;\n constructor(readonly options: TweenBindingOptions) {\n if (\n !options?.target ||\n ![\"object\", \"function\"].includes(typeof options.target) ||\n ![\"string\", \"number\", \"symbol\"].includes(typeof options.key) ||\n typeof options.read !== \"function\" ||\n typeof options.write !== \"function\"\n )\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Binding needs a target, property identity, read and write\",\n );\n for (const fn of [\n options.scope,\n options.valid,\n options.validate,\n options.stamp,\n options.watch,\n ])\n if (fn !== undefined && typeof fn !== \"function\")\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Binding hooks must be functions\",\n );\n this.key =\n typeof options.key === \"symbol\" ? options.key : String(options.key);\n this.options = Object.freeze({ ...options });\n Object.freeze(this);\n }\n}\nexport interface TweenOptions {\n readonly duration: number;\n readonly from?: number;\n readonly easing?: EasingFunction;\n readonly delay?: number;\n /** Additional iterations, or Infinity. */\n readonly repeat?: number;\n readonly yoyo?: boolean;\n}\ntype NumberRecipe = Readonly<{\n kind: \"number\";\n binding: TweenBinding;\n to: number;\n duration: number;\n delay: number;\n repeat: number;\n yoyo: boolean;\n easing: EasingFunction;\n from: number | undefined;\n}>;\nexport type TweenRecipe =\n | NumberRecipe\n | Readonly<{ kind: \"delay\"; duration: number }>\n | Readonly<{\n kind: \"sequence\" | \"parallel\";\n children: readonly TweenRecipe[];\n }>;\nconst recipes = new WeakSet<object>();\nexport function tweenFinite(value: number, label: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_TWEEN\", `${label} must be finite`);\n return value;\n}\nfunction seconds(value: number, label: string): number {\n tweenFinite(value, label);\n if (value < 0)\n throw new EngineError(\n \"INVALID_TWEEN\",\n `${label} must be nonnegative seconds`,\n );\n return value;\n}\nfunction recipe<T extends TweenRecipe>(value: T): T {\n recipes.add(value);\n return Object.freeze(value);\n}\ntype Equal<X, Y, A, B> =\n (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;\nexport type TweenNumericKey<T> = {\n [K in keyof T]-?: T[K] extends number\n ? Equal<Pick<T, K>, { -readonly [P in K]: T[P] }, K, never>\n : never;\n}[keyof T];\nexport const Tween = Object.freeze({\n bind: (options: TweenBindingOptions): TweenBinding =>\n new TweenBinding(options),\n /** Only writable own numeric data properties on plain records. Classes need explicit adapters. */\n property<T extends object>(target: T, key: TweenNumericKey<T>): TweenBinding {\n const prototype = Object.getPrototypeOf(target),\n descriptor = Object.getOwnPropertyDescriptor(target, key);\n if (\n (prototype !== Object.prototype && prototype !== null) ||\n !descriptor?.writable ||\n !(\"value\" in descriptor) ||\n typeof descriptor.value !== \"number\"\n )\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Property binding requires a writable own numeric data property on a plain object\",\n );\n tweenFinite(descriptor.value, \"property\");\n return new TweenBinding({\n target,\n key,\n read: () => (target as Record<PropertyKey, number>)[key] as number,\n write: (value) => {\n (target as Record<PropertyKey, number>)[key] = value;\n },\n valid: () => {\n const d = Object.getOwnPropertyDescriptor(target, key);\n return !!d?.writable && \"value\" in d && typeof d.value === \"number\";\n },\n });\n },\n to(binding: TweenBinding, to: number, options: TweenOptions): TweenRecipe {\n if (!(binding instanceof TweenBinding) || !options)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Tween.to requires a numeric binding and options\",\n );\n tweenFinite(to, \"to\");\n if (options.from !== undefined) tweenFinite(options.from, \"from\");\n const duration = seconds(options.duration, \"duration\"),\n delay = seconds(options.delay ?? 0, \"delay\"),\n repeat = options.repeat ?? 0,\n yoyo = options.yoyo ?? false,\n easing = options.easing ?? Easing.Linear;\n if (\n (repeat !== Infinity && (!Number.isSafeInteger(repeat) || repeat < 0)) ||\n typeof yoyo !== \"boolean\" ||\n typeof easing !== \"function\" ||\n (repeat === Infinity && duration === 0)\n )\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Invalid repeat, yoyo or easing; infinite zero-duration loops are not allowed\",\n );\n if (\n repeat !== Infinity &&\n !Number.isFinite(delay + duration * (repeat + 1))\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Tween duration overflows\");\n synchronous(binding.options.validate?.(to));\n if (options.from !== undefined)\n synchronous(binding.options.validate?.(options.from));\n return recipe({\n kind: \"number\",\n binding,\n to,\n duration,\n delay,\n repeat,\n yoyo,\n easing,\n from: options.from,\n });\n },\n delay: (duration: number): TweenRecipe =>\n recipe({ kind: \"delay\", duration: seconds(duration, \"delay\") }),\n sequence: (...children: TweenRecipe[]): TweenRecipe =>\n recipe({ kind: \"sequence\", children: Object.freeze([...children]) }),\n parallel: (...children: TweenRecipe[]): TweenRecipe =>\n recipe({ kind: \"parallel\", children: Object.freeze([...children]) }),\n});\ninterface Track {\n definition: NumberRecipe;\n start: number;\n end: number;\n from: number | undefined;\n done: boolean;\n channel?: Channel | undefined;\n}\ninterface Channel {\n binding: TweenBinding;\n expected: number;\n stamp: unknown;\n}\nfunction same(a: TweenBinding, b: TweenBinding): boolean {\n return a.options.target === b.options.target && a.key === b.key;\n}\nfunction compile(root: TweenRecipe) {\n let count = 0;\n const tracks: Track[] = [];\n const visit = (\n item: TweenRecipe,\n start: number,\n depth: number,\n ): { duration: number; bindings: TweenBinding[] } => {\n if (!item || !recipes.has(item) || ++count > 4096 || depth > 64)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Expected engine recipes within 4096 nodes / 64 nesting levels\",\n );\n if (item.kind === \"number\") {\n const duration =\n item.repeat === Infinity ? Infinity : item.duration * (item.repeat + 1);\n tracks.push({\n definition: item,\n start: start + item.delay,\n end: duration === Infinity ? Infinity : start + item.delay + duration,\n from: undefined,\n done: false,\n });\n return { duration: item.delay + duration, bindings: [item.binding] };\n }\n if (item.kind === \"delay\") return { duration: item.duration, bindings: [] };\n let duration = 0;\n const bindings: TweenBinding[] = [];\n for (const child of item.children) {\n if (item.kind === \"sequence\" && duration === Infinity)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"An unbounded sequence child must be last\",\n );\n const part = visit(\n child,\n start + (item.kind === \"sequence\" ? duration : 0),\n depth + 1,\n );\n if (\n item.kind === \"parallel\" &&\n part.bindings.some((b) => bindings.some((a) => same(a, b)))\n )\n throw new EngineError(\n \"TWEEN_CONFLICT\",\n \"Parallel children cannot share a property channel\",\n );\n for (const b of part.bindings)\n if (!bindings.some((a) => same(a, b))) bindings.push(b);\n const next =\n item.kind === \"sequence\"\n ? duration + part.duration\n : Math.max(duration, part.duration);\n if (\n next === Infinity &&\n duration !== Infinity &&\n part.duration !== Infinity\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Composite duration overflows\");\n duration = next;\n }\n return { duration, bindings };\n };\n const plan = visit(root, 0, 0);\n if (\n tracks.some(\n (t) =>\n t.start === Infinity ||\n (t.end === Infinity && t.definition.repeat !== Infinity),\n )\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Track timing overflows\");\n return { ...plan, tracks };\n}\nexport interface TweenPlayOptions {\n readonly owner?: LifetimeOwner;\n readonly conflict?: \"replace\" | \"error\";\n readonly onComplete?: (playback: TweenPlayback) => void;\n readonly onCancel?: (\n reason: TweenCancelReason,\n playback: TweenPlayback,\n ) => void;\n}\nexport type TweenState = \"playing\" | \"paused\" | \"completed\" | \"cancelled\";\nconst claims = new WeakMap<object, Map<string | symbol, TweenPlayback>>();\nfunction synchronous<T>(result: T): T {\n if (\n result &&\n (typeof result === \"object\" || typeof result === \"function\") &&\n \"then\" in result &&\n typeof result.then === \"function\"\n ) {\n void Promise.resolve(result).catch(() => {});\n throw new EngineError(\n \"TWEEN_ASYNC_CALLBACK\",\n \"Tween hooks and callbacks must be synchronous\",\n );\n }\n return result;\n}\nfunction notify(callback: (() => unknown) | undefined): void {\n synchronous(callback?.());\n}\n/** One playback, terminal once. A finished handle drops channels, targets and scheduler references. */\nexport class TweenPlayback {\n private status: TweenState = \"playing\";\n private time = 0;\n private updating = false;\n private cause: TweenCancelReason | undefined;\n private removers: Array<() => void> = [];\n private channels: Channel[];\n private tracks: Track[];\n private scheduler: TweenScheduler | undefined;\n private complete: TweenPlayOptions[\"onComplete\"];\n private cancelled: TweenPlayOptions[\"onCancel\"];\n readonly duration: number;\n /** @internal Created by Scheduler.play after recipe validation. */\n constructor(\n scheduler: TweenScheduler,\n plan: ReturnType<typeof compile>,\n options: TweenPlayOptions,\n ) {\n this.scheduler = scheduler;\n this.tracks = plan.tracks;\n this.duration = plan.duration;\n this.complete = options.onComplete;\n this.cancelled = options.onCancel;\n this.channels = plan.bindings.map((binding) => {\n const expected = tweenFinite(\n synchronous(binding.options.read()),\n \"start value\",\n );\n synchronous(binding.options.validate?.(expected));\n return {\n binding,\n expected,\n stamp: synchronous(binding.options.stamp?.()),\n };\n });\n for (const track of this.tracks)\n track.channel = this.channels.find((c) =>\n same(c.binding, track.definition.binding),\n );\n }\n get state(): TweenState {\n return this.status;\n }\n get elapsed(): number {\n return this.time;\n }\n get reason(): TweenCancelReason | undefined {\n return this.cause;\n }\n pause(): void {\n if (this.status === \"playing\") this.status = \"paused\";\n }\n resume(): void {\n if (this.status === \"paused\") this.status = \"playing\";\n }\n cancel(): void {\n this.interrupt(\"cancelled\");\n }\n stop(): void {\n this.interrupt(\"stopped\");\n }\n /** Skip finite delays/iterations and apply terminal values. Infinite playback cannot finish. */\n finish(): void {\n if (this.terminal) return;\n if (this.updating)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Playback finish is not reentrant\",\n );\n if (this.duration === Infinity)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Cannot finish unbounded playback\",\n );\n const previous = this.status;\n this.status = \"playing\";\n try {\n this.updateTo(this.duration);\n } catch (error) {\n if (!this.terminal) this.interrupt(\"error\");\n throw error;\n }\n if (!this.terminal && this.status === \"playing\") this.status = previous;\n }\n private get terminal(): boolean {\n return this.status === \"completed\" || this.status === \"cancelled\";\n }\n /** @internal */ valid(scope: object | undefined): boolean {\n for (const { binding: b } of this.channels)\n if (\n b.options.owner?.disposed ||\n !(synchronous(b.options.valid?.()) ?? true) ||\n (scope !== undefined &&\n b.options.scope &&\n synchronous(b.options.scope()) !== scope)\n )\n return false;\n return true;\n }\n /** @internal */ own(owners: Iterable<LifetimeOwner>): void {\n for (const owner of owners) {\n if (this.terminal) break;\n const remove = owner.onDispose(() => this.interrupt(\"owner-disposed\"));\n if (this.terminal) remove();\n else this.removers.push(remove);\n }\n }\n /** @internal Claims are reserved before replaced-owner callbacks run. */\n claim(): Set<TweenPlayback> {\n const replaced = new Set<TweenPlayback>();\n for (const { binding: b } of this.channels) {\n let slots = claims.get(b.options.target);\n if (!slots) {\n slots = new Map();\n claims.set(b.options.target, slots);\n }\n const old = slots.get(b.key);\n if (old) replaced.add(old);\n slots.set(b.key, this);\n }\n return replaced;\n }\n /** @internal */ conflicts(): boolean {\n return this.channels.some(({ binding: b }) =>\n claims.get(b.options.target)?.has(b.key),\n );\n }\n /** @internal */ watch(): void {\n for (const { binding: b } of this.channels) {\n if (this.terminal) break;\n const remove = synchronous(\n b.options.watch?.((reason) =>\n this.interrupt(reason ?? \"external-write\"),\n ),\n );\n if (remove) {\n if (this.terminal) remove();\n else this.removers.push(remove);\n }\n }\n }\n private release(): void {\n const errors: unknown[] = [];\n for (const { binding: b } of this.channels) {\n const slots = claims.get(b.options.target);\n if (slots?.get(b.key) === this) {\n slots.delete(b.key);\n if (!slots.size) claims.delete(b.options.target);\n }\n }\n this.channels = [];\n this.tracks = [];\n const scheduler = this.scheduler;\n this.scheduler = undefined;\n scheduler?.remove(this);\n const removers = this.removers;\n this.removers = [];\n for (const remove of removers)\n try {\n synchronous(remove());\n } catch (error) {\n errors.push(error);\n }\n if (errors.length)\n throw new AggregateError(errors, \"Tween resource release failed\");\n }\n private end(\n state: \"completed\" | \"cancelled\",\n reason?: TweenCancelReason,\n ): void {\n if (this.terminal) return;\n this.status = state;\n this.cause = reason;\n const callback = state === \"completed\" ? this.complete : this.cancelled;\n this.complete = undefined;\n this.cancelled = undefined;\n const errors: unknown[] = [];\n try {\n this.release();\n } catch (error) {\n errors.push(error);\n }\n try {\n if (state === \"completed\")\n notify(() => (callback as TweenPlayOptions[\"onComplete\"])?.(this));\n else\n notify(() =>\n (callback as TweenPlayOptions[\"onCancel\"])?.(\n reason as TweenCancelReason,\n this,\n ),\n );\n } catch (error) {\n errors.push(error);\n }\n if (errors.length)\n throw new AggregateError(errors, \"Tween termination callbacks failed\");\n }\n /** @internal */ interrupt(reason: TweenCancelReason): void {\n this.end(\"cancelled\", reason);\n }\n /** @internal */ advance(delta: number): void {\n if (this.status !== \"playing\") return;\n const time =\n this.duration !== Infinity && delta >= this.duration - this.time\n ? this.duration\n : this.time + delta;\n tweenFinite(time, \"elapsed time\");\n this.updateTo(time);\n }\n private updateTo(time: number): void {\n if (this.updating)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Playback update is not reentrant\",\n );\n this.updating = true;\n try {\n this.advanceTo(time);\n } finally {\n this.updating = false;\n }\n }\n private advanceTo(time: number): void {\n if (!this.scheduler?.available || !this.valid(this.scheduler.scope)) {\n this.interrupt(\"target-unavailable\");\n return;\n }\n for (const c of this.channels)\n if (\n !Object.is(synchronous(c.binding.options.read()), c.expected) ||\n !Object.is(synchronous(c.binding.options.stamp?.()), c.stamp)\n ) {\n this.interrupt(\"external-write\");\n return;\n }\n this.time = time;\n for (const track of this.tracks) {\n if (this.status !== \"playing\") return;\n if (track.done || time < track.start) continue;\n const d = track.definition,\n b = d.binding;\n if (track.from === undefined)\n track.from =\n d.from ?? tweenFinite(synchronous(b.options.read()), \"start value\");\n const finished = time >= track.end,\n relative = Math.max(0, time - track.start);\n let progress: number;\n if (finished || d.duration === 0)\n progress = d.yoyo && d.repeat % 2 === 1 ? 0 : 1;\n else if (d.yoyo) {\n const period = d.duration * 2,\n phase = Number.isFinite(period) ? relative % period : relative;\n progress =\n phase <= d.duration\n ? phase / d.duration\n : 1 - (phase - d.duration) / d.duration;\n } else progress = (relative % d.duration) / d.duration;\n const eased =\n progress === 0\n ? 0\n : progress === 1\n ? 1\n : synchronous(d.easing(progress));\n if (!Number.isFinite(eased) || eased < 0 || eased > 1)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Easing must return a finite normalized value\",\n );\n const value =\n eased === 0\n ? track.from\n : eased === 1\n ? d.to\n : track.from * (1 - eased) + d.to * eased;\n tweenFinite(value, \"interpolated value\");\n synchronous(b.options.validate?.(value));\n if (\n !this.scheduler?.available ||\n b.options.owner?.disposed ||\n !(synchronous(b.options.valid?.()) ?? true) ||\n (this.scheduler.scope !== undefined &&\n b.options.scope &&\n synchronous(b.options.scope()) !== this.scheduler.scope)\n ) {\n this.interrupt(\"target-unavailable\");\n return;\n }\n const current = track.channel;\n if (\n current &&\n (!Object.is(synchronous(b.options.read()), current.expected) ||\n !Object.is(synchronous(b.options.stamp?.()), current.stamp))\n ) {\n this.interrupt(\"external-write\");\n return;\n }\n const written: unknown = Object.is(value, synchronous(b.options.read()))\n ? undefined\n : b.options.write(value);\n synchronous(written);\n if (this.terminal) return;\n if (written === false) {\n this.interrupt(\"external-write\");\n return;\n }\n const c = track.channel;\n if (c) {\n c.expected = tweenFinite(\n synchronous(b.options.read()),\n \"written value\",\n );\n c.stamp = synchronous(b.options.stamp?.());\n }\n track.done = finished;\n }\n if (this.status === \"playing\" && time >= this.duration)\n this.end(\"completed\");\n }\n}\n/** Explicit clock. Scene owns automatic clocks; standalone schedulers are advanced by their caller. */\nexport class TweenScheduler {\n private readonly entries = new Set<TweenPlayback>();\n private roster: readonly TweenPlayback[] = [];\n private dirty = true;\n private plan: readonly TweenPlayback[] = [];\n private advancing = false;\n private dead = false;\n private rate = 1;\n private owner: LifetimeOwner | undefined;\n private removeOwner: (() => void) | undefined;\n readonly scope: object | undefined;\n constructor(options: { owner?: LifetimeOwner; scope?: object } = {}) {\n this.owner = options.owner;\n this.scope = options.scope;\n this.removeOwner = this.owner?.onDispose(() => this.dispose());\n }\n get disposed(): boolean {\n return this.dead;\n }\n /** @internal */ get available(): boolean {\n return !this.dead && !this.owner?.disposed;\n }\n get diagnostics() {\n return { active: this.entries.size };\n }\n get speed(): number {\n return this.rate;\n }\n set speed(value: number) {\n tweenFinite(value, \"speed\");\n if (value < 0)\n throw new EngineError(\"INVALID_TWEEN\", \"speed must be nonnegative\");\n this.rate = value;\n }\n play(definition: TweenRecipe, options: TweenPlayOptions = {}): TweenPlayback {\n if (this.dead || this.owner?.disposed || options.owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Tween owner has been disposed\");\n if (\n options.conflict !== undefined &&\n options.conflict !== \"replace\" &&\n options.conflict !== \"error\"\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Unknown conflict policy\");\n for (const callback of [options.onComplete, options.onCancel])\n if (callback !== undefined && typeof callback !== \"function\")\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Tween callbacks must be functions\",\n );\n const plan = compile(definition),\n p = new TweenPlayback(this, plan, options);\n if (!p.valid(this.scope))\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Binding is unavailable or belongs to another scope\",\n );\n if (options.conflict === \"error\" && p.conflicts())\n throw new EngineError(\n \"TWEEN_CONFLICT\",\n \"A property channel is already owned\",\n );\n const owners = new Set<LifetimeOwner>();\n if (this.owner) owners.add(this.owner);\n if (options.owner) owners.add(options.owner);\n for (const b of plan.bindings)\n if (b.options.owner) owners.add(b.options.owner);\n try {\n p.own(owners);\n } catch (error) {\n p.interrupt(\"error\");\n throw error;\n }\n if (p.state === \"cancelled\") return p;\n this.entries.add(p);\n this.dirty = true;\n this.roster = [];\n const replaced = p.claim(),\n errors: unknown[] = [];\n for (const old of replaced)\n try {\n old.interrupt(\"replaced\");\n } catch (error) {\n errors.push(error);\n }\n try {\n p.watch();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length) {\n try {\n p.interrupt(\"error\");\n } catch (error) {\n errors.push(error);\n }\n throw new AggregateError(errors, \"Tween replacement failed\");\n }\n return p;\n }\n /** @internal Eligibility snapshot before the Scene input/update phases. */\n beginStep(): void {\n if (this.dirty) {\n this.roster = [...this.entries];\n this.dirty = false;\n }\n this.plan = this.roster;\n }\n advance(seconds: number): void {\n if (this.advancing)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Scheduler advance is not reentrant\",\n );\n this.beginStep();\n this.advanceCaptured(seconds);\n }\n /** @internal */ advanceCaptured(seconds: number): void {\n if (this.dead)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Tween scheduler has been disposed\",\n );\n tweenFinite(seconds, \"delta\");\n if (seconds < 0)\n throw new EngineError(\"INVALID_TWEEN\", \"delta must be nonnegative\");\n const delta = tweenFinite(seconds * this.rate, \"scaled delta\");\n if (this.advancing)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Scheduler advance is not reentrant\",\n );\n this.advancing = true;\n const plan = this.plan;\n this.plan = [];\n const errors: unknown[] = [];\n try {\n for (const p of plan) {\n if (this.dead) break;\n try {\n p.advance(delta);\n } catch (error) {\n errors.push(error);\n try {\n p.interrupt(\"error\");\n } catch (error) {\n errors.push(error);\n }\n }\n }\n } finally {\n this.advancing = false;\n }\n if (errors.length) throw new AggregateError(errors, \"Tween updates failed\");\n }\n /** @internal */ remove(p: TweenPlayback): void {\n this.entries.delete(p);\n this.dirty = true;\n this.roster = [];\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const plan = [...this.entries],\n errors: unknown[] = [];\n this.entries.clear();\n this.roster = [];\n this.plan = [];\n this.removeOwner?.();\n this.removeOwner = undefined;\n this.owner = undefined;\n for (const p of plan)\n try {\n p.interrupt(\"scheduler-disposed\");\n } catch (error) {\n errors.push(error);\n }\n if (errors.length)\n throw new AggregateError(errors, \"Tween scheduler disposal failed\");\n }\n}\n","import { EngineError } from \"./diagnostics\";\nexport interface LifetimeOwner {\n readonly disposed: boolean;\n onDispose(callback: () => void): () => void;\n}\n/** Lazy, removable LIFO cleanup. Disposed owners cannot acquire new resources. */\nexport class Lifetime implements LifetimeOwner {\n private callbacks: Set<() => void> | undefined;\n private dead = false;\n get disposed(): boolean {\n return this.dead;\n }\n onDispose(callback: () => void): () => void {\n if (this.dead)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Cannot register cleanup on a disposed owner\",\n );\n this.callbacks ??= new Set();\n this.callbacks.add(callback);\n return () => {\n this.callbacks?.delete(callback);\n };\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const callbacks = this.callbacks;\n this.callbacks = undefined;\n const errors: unknown[] = [];\n if (callbacks)\n for (const callback of [...callbacks].reverse()) {\n try {\n callback();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Owned resource cleanup failed\");\n }\n}\n/** Execute every cleanup even when one throws. */\nexport function cleanupAll(\n actions: Iterable<() => void>,\n message: string,\n): void {\n const errors: unknown[] = [];\n for (const action of actions) {\n try {\n action();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length) throw new AggregateError(errors, message);\n}\n","import { EngineError } from \"./diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"./lifetime\";\nexport interface EventType<T> {\n readonly id: symbol;\n readonly name: string;\n readonly payload?: (value: T) => T;\n}\nexport function defineEvent<T>(name: string): EventType<T> {\n return Object.freeze({ id: Symbol(name), name });\n}\ninterface Subscription {\n active: boolean;\n deliver(payload: unknown): void;\n off(): void;\n}\n/** Synchronous registration-order delivery. Recursive delivery of the same token is rejected. */\nexport class EventBus {\n private readonly listeners = new Map<symbol, Set<Subscription>>();\n private readonly dispatching = new Set<symbol>();\n private dead = false;\n private assertAlive(): void {\n if (this.dead)\n throw new EngineError(\n \"EVENT_BUS_DISPOSED\",\n \"Event bus has been disposed\",\n );\n }\n on<T>(\n type: EventType<T>,\n handler: (payload: T) => void,\n owner?: LifetimeOwner,\n ): () => void {\n this.assertAlive();\n if (owner?.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Cannot subscribe using a disposed owner\",\n { event: type.name },\n );\n let removeOwnership: (() => void) | undefined;\n const group = this.listeners.get(type.id) ?? new Set<Subscription>();\n this.listeners.set(type.id, group);\n const subscription: Subscription = {\n active: true,\n deliver: (value) => {\n const result: unknown = handler(value as T);\n if (\n result &&\n (typeof result === \"object\" || typeof result === \"function\") &&\n \"then\" in result &&\n typeof result.then === \"function\"\n ) {\n void Promise.resolve(result).catch(() => {});\n throw new EngineError(\n \"EVENT_ASYNC_HANDLER\",\n \"Event handlers must be synchronous; own asynchronous tasks explicitly\",\n { event: type.name },\n );\n }\n },\n off: () => {\n if (!subscription.active) return;\n subscription.active = false;\n group.delete(subscription);\n if (group.size === 0) this.listeners.delete(type.id);\n const remove = removeOwnership;\n removeOwnership = undefined;\n remove?.();\n },\n };\n group.add(subscription);\n if (owner) {\n try {\n removeOwnership = owner.onDispose(subscription.off);\n } catch (error) {\n subscription.off();\n throw error;\n }\n }\n return subscription.off;\n }\n emit<T>(type: EventType<T>, payload: NoInfer<T>): void {\n this.assertAlive();\n if (this.dispatching.has(type.id))\n throw new EngineError(\n \"EVENT_REENTRANT\",\n \"Recursive delivery of the same event is not allowed\",\n { event: type.name },\n );\n const group = this.listeners.get(type.id);\n if (!group?.size) return;\n const errors: unknown[] = [];\n this.dispatching.add(type.id);\n try {\n for (const subscription of [...group])\n if (subscription.active) {\n try {\n subscription.deliver(payload);\n } catch (error) {\n errors.push(error);\n }\n }\n } finally {\n this.dispatching.delete(type.id);\n }\n if (errors.length)\n throw new AggregateError(errors, `Event handlers failed: ${type.name}`);\n }\n listenerCount<T>(type?: EventType<T>): number {\n if (type) return this.listeners.get(type.id)?.size ?? 0;\n let count = 0;\n for (const group of this.listeners.values()) count += group.size;\n return count;\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const subscriptions = [...this.listeners.values()].flatMap((group) => [\n ...group,\n ]);\n try {\n cleanupAll(\n subscriptions.map((subscription) => subscription.off),\n \"Event bus cleanup failed\",\n );\n } finally {\n this.listeners.clear();\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus, type EventType } from \"../foundation/events\";\nimport { cleanupAll, Lifetime } from \"../foundation/lifetime\";\nimport type { Actor } from \"./actor\";\nimport type { Scene } from \"./scene\";\nexport const ComponentPhase = {\n Input: \"input\",\n Update: \"update\",\n Integrate: \"integrate\",\n LateUpdate: \"late-update\",\n} as const;\nexport type ComponentPhase =\n (typeof ComponentPhase)[keyof typeof ComponentPhase];\nexport interface UpdateContext {\n readonly delta: number;\n readonly scene: Scene;\n}\nexport interface ComponentType<T extends Component = Component> {\n readonly id: symbol;\n readonly name: string;\n readonly requires: readonly ComponentType[];\n readonly instance?: T;\n}\nexport function defineComponent<T extends Component>(\n name: string,\n requires: readonly ComponentType[] = [],\n): ComponentType<T> {\n return Object.freeze({\n id: Symbol(name),\n name,\n requires: Object.freeze([...requires]),\n });\n}\nexport abstract class Component {\n abstract readonly type: ComponentType;\n readonly phase: ComponentPhase = ComponentPhase.Update;\n private owner: Actor | undefined;\n private readonly lifetime = new Lifetime();\n private bus: EventBus | undefined;\n private on = true;\n get actor(): Actor {\n if (!this.owner)\n throw new EngineError(\"COMPONENT_DETACHED\", \"Component is not attached\", {\n component: this.type.name,\n });\n return this.owner;\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get enabled(): boolean {\n return this.on;\n }\n set enabled(value: boolean) {\n if (this.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"Component has been disposed\",\n );\n if (this.on === value) return;\n this.on = value;\n if (!value) this.onDisable();\n }\n get events(): EventBus {\n if (this.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"Component has been disposed\",\n );\n this.bus ??= new EventBus();\n return this.bus;\n }\n protected emit<T>(type: EventType<T>, payload: NoInfer<T>): void {\n this.bus?.emit(type, payload);\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n protected onAttach(): void {}\n protected onDisable(): void {}\n protected onDestroy(): void {}\n update(_context: UpdateContext): void {}\n /** @internal */ attachTo(actor: Actor): void {\n if (this.disposed || this.owner)\n throw new EngineError(\n \"COMPONENT_OWNERSHIP\",\n \"Component must be new and unowned\",\n { component: this.type.name },\n );\n this.owner = actor;\n try {\n this.onAttach();\n } catch (error) {\n try {\n this.destroyOwned();\n } catch {\n /* Preserve the attach error. */\n }\n throw error;\n }\n }\n /** @internal */ destroyOwned(): void {\n if (this.disposed) return;\n try {\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.bus?.dispose(),\n () => this.onDestroy(),\n ],\n \"Component cleanup failed\",\n );\n } finally {\n this.owner = undefined;\n this.bus = undefined;\n }\n }\n dispose(): void {\n if (this.disposed) return;\n if (this.owner) this.owner.remove(this.type);\n else this.destroyOwned();\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\n\nexport interface SpriteRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n/** Image pixels, origin at top left, x right and y down. */\nexport type SpriteFrame =\n | Readonly<{ kind: \"rect\" } & SpriteRect>\n | Readonly<{\n kind: \"grid\";\n index: number;\n frameWidth: number;\n frameHeight: number;\n }>;\nexport interface SpriteImage {\n readonly kind: \"image\";\n readonly url: string;\n readonly frame: SpriteFrame;\n}\nfunction integer(value: number, minimum: number, field: string): number {\n if (!Number.isSafeInteger(value) || value < minimum)\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n `${field} must be a safe integer >= ${minimum}`,\n );\n return value;\n}\n/** @internal Copies and validates public frame descriptions. */\nexport function spriteFrame(value: SpriteFrame): SpriteFrame {\n if (!value || typeof value !== \"object\")\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"Expected a frame description\",\n );\n if (value.kind === \"rect\")\n return Object.freeze({\n kind: \"rect\",\n x: integer(value.x, 0, \"x\"),\n y: integer(value.y, 0, \"y\"),\n width: integer(value.width, 1, \"width\"),\n height: integer(value.height, 1, \"height\"),\n });\n if (value.kind === \"grid\")\n return Object.freeze({\n kind: \"grid\",\n index: integer(value.index, 0, \"index\"),\n frameWidth: integer(value.frameWidth, 1, \"frameWidth\"),\n frameHeight: integer(value.frameHeight, 1, \"frameHeight\"),\n });\n throw new EngineError(\"SPRITE_FRAME_INVALID\", \"Unknown frame kind\");\n}\n/** Resolves a frame against decoded image dimensions; rejects partial grid cells. */\nexport function spriteFrameBounds(\n frame: SpriteFrame,\n width: number,\n height: number,\n): SpriteRect {\n integer(width, 1, \"image width\");\n integer(height, 1, \"image height\");\n const f = spriteFrame(frame);\n let rect: SpriteRect;\n if (f.kind === \"grid\") {\n const columns = width / f.frameWidth,\n rows = height / f.frameHeight;\n if (\n !Number.isInteger(columns) ||\n !Number.isInteger(rows) ||\n f.index >= columns * rows\n )\n throw new EngineError(\n \"SPRITE_FRAME_BOUNDS\",\n \"Grid must divide the image exactly and contain the frame\",\n );\n rect = {\n x: (f.index % columns) * f.frameWidth,\n y: Math.floor(f.index / columns) * f.frameHeight,\n width: f.frameWidth,\n height: f.frameHeight,\n };\n } else rect = f;\n if (rect.width > width - rect.x || rect.height > height - rect.y)\n throw new EngineError(\n \"SPRITE_FRAME_BOUNDS\",\n \"Frame extends outside the image\",\n );\n return rect;\n}\n\n/** Immutable metadata only: no load, GPU ownership or manual dispose required. */\nexport class SpriteSheet<Name extends string = never> {\n private readonly cache = new Map<number, SpriteImage>();\n private constructor(\n readonly url: string,\n private readonly makeFrame: (index: number) => SpriteFrame,\n private readonly names: ReadonlyMap<string, number>,\n readonly count: number | undefined,\n ) {\n if (typeof url !== \"string\" || !url.trim())\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"SpriteSheet requires a nonempty URL\",\n );\n Object.freeze(this);\n }\n static grid<\n const Names extends Record<string, number> = Record<never, never>,\n >(\n url: string,\n options: { frameWidth: number; frameHeight: number; names?: Names },\n ): SpriteSheet<Extract<keyof Names, string>> {\n const width = integer(options.frameWidth, 1, \"frameWidth\"),\n height = integer(options.frameHeight, 1, \"frameHeight\");\n const names = new Map(Object.entries(options.names ?? {}));\n for (const [name, index] of names) {\n if (!name)\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"Frame name cannot be empty\",\n );\n integer(index, 0, \"named frame index\");\n }\n return new SpriteSheet(\n url,\n (index) =>\n Object.freeze({\n kind: \"grid\",\n index,\n frameWidth: width,\n frameHeight: height,\n }),\n names,\n undefined,\n );\n }\n static rects<const Frames extends Record<string, SpriteRect>>(\n url: string,\n frames: Frames,\n ): SpriteSheet<Extract<keyof Frames, string>>;\n static rects(url: string, frames: readonly SpriteRect[]): SpriteSheet;\n static rects(\n url: string,\n frames: Readonly<Record<string, SpriteRect>> | readonly SpriteRect[],\n ): SpriteSheet<string> {\n const entries = Array.isArray(frames)\n ? Array.from(\n frames,\n (rect: SpriteRect, index) => [String(index), rect] as const,\n )\n : Object.entries(frames);\n if (!entries.length || entries.some(([name]) => !name))\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"SpriteSheet requires nonempty frame definitions\",\n );\n const rects = entries.map(([, rect]) =>\n spriteFrame({ ...rect, kind: \"rect\" }),\n );\n const names = new Map(entries.map(([name], index) => [name, index]));\n return new SpriteSheet(\n url,\n (index) => {\n const rect = rects[index];\n if (!rect)\n throw new EngineError(\"SPRITE_FRAME_BOUNDS\", \"Unknown frame index\");\n return rect;\n },\n names,\n rects.length,\n );\n }\n get(key: number | Name): SpriteImage {\n const index = typeof key === \"number\" ? key : this.names.get(key);\n if (index === undefined)\n throw new EngineError(\"SPRITE_FRAME_BOUNDS\", \"Unknown frame name\", {\n frame: key,\n });\n integer(index, 0, \"index\");\n let image = this.cache.get(index);\n if (!image) {\n image = Object.freeze({\n kind: \"image\",\n url: this.url,\n frame: this.makeFrame(index),\n });\n this.cache.set(index, image);\n }\n return image;\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nimport { type SpriteFrame, spriteFrame } from \"./sprite-sheet\";\n\nfunction finite(value: number, field: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${field} must be finite`, {\n field,\n });\n return value;\n}\nexport class Transform extends Component {\n static readonly type: ComponentType<Transform> =\n defineComponent<Transform>(\"Transform\");\n readonly type: ComponentType<Transform> = Transform.type;\n x: number;\n y: number;\n rotation: number;\n scaleX: number;\n scaleY: number;\n constructor(\n options: {\n x?: number;\n y?: number;\n rotation?: number;\n scaleX?: number;\n scaleY?: number;\n } = {},\n ) {\n super();\n this.x = finite(options.x ?? 0, \"x\");\n this.y = finite(options.y ?? 0, \"y\");\n this.rotation = finite(options.rotation ?? 0, \"rotation\");\n this.scaleX = finite(options.scaleX ?? 1, \"scaleX\");\n this.scaleY = finite(options.scaleY ?? 1, \"scaleY\");\n }\n}\nexport const Shape = {\n Box: \"box\",\n Character: \"character\",\n Circle: \"circle\",\n Triangle: \"triangle\",\n Hexagon: \"hexagon\",\n} as const;\nexport const SpriteFit = { Contain: \"contain\", Stretch: \"stretch\" } as const;\nexport type SpriteFit = (typeof SpriteFit)[keyof typeof SpriteFit];\nexport function imageSize(\n sourceWidth: number,\n sourceHeight: number,\n width: number,\n height: number,\n fit: SpriteFit = SpriteFit.Contain,\n) {\n positive(sourceWidth, \"sourceWidth\");\n positive(sourceHeight, \"sourceHeight\");\n positive(width, \"width\");\n positive(height, \"height\");\n if (fit === SpriteFit.Stretch) return { width, height };\n if (fit !== SpriteFit.Contain)\n throw new EngineError(\"INVALID_VALUE\", \"Unknown sprite fit\");\n const scale = Math.min(width / sourceWidth, height / sourceHeight);\n return { width: sourceWidth * scale, height: sourceHeight * scale };\n}\nexport type Shape = (typeof Shape)[keyof typeof Shape];\n/** Immutable, backend-independent description. Image fit defaults to Contain. */\nexport type VisualSource =\n | Readonly<{ kind: \"shape\"; shape: Shape }>\n | Readonly<{\n kind: \"image\";\n url: string;\n fit?: SpriteFit;\n frame?: SpriteFrame;\n }>;\n\nfunction visualSource(value: VisualSource): VisualSource {\n if (!value || typeof value !== \"object\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"source must be a visual description\",\n );\n if (value.kind === \"shape\") {\n if (\n !Object.values(Shape).includes(value.shape) ||\n \"url\" in value ||\n \"fit\" in value ||\n \"frame\" in value\n )\n throw new EngineError(\"INVALID_VALUE\", \"Invalid shape source\");\n return Object.freeze({ kind: \"shape\", shape: value.shape });\n }\n if (value.kind === \"image\") {\n if (typeof value.url !== \"string\" || !value.url.trim() || \"shape\" in value)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Image source requires a nonempty URL\",\n );\n const fit = value.fit === undefined ? SpriteFit.Contain : value.fit;\n if (!Object.values(SpriteFit).includes(fit))\n throw new EngineError(\"INVALID_VALUE\", \"Unknown sprite fit\");\n return Object.freeze({\n kind: \"image\",\n url: value.url,\n fit,\n ...(value.frame === undefined ? {} : { frame: spriteFrame(value.frame) }),\n });\n }\n throw new EngineError(\"INVALID_VALUE\", \"Unknown visual source kind\");\n}\nfunction equalFrame(\n a: SpriteFrame | undefined,\n b: SpriteFrame | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.kind === \"rect\"\n ? b.kind === \"rect\" &&\n a.x === b.x &&\n a.y === b.y &&\n a.width === b.width &&\n a.height === b.height\n : b.kind === \"grid\" &&\n a.index === b.index &&\n a.frameWidth === b.frameWidth &&\n a.frameHeight === b.frameHeight;\n}\nfunction equalSource(a: VisualSource, b: VisualSource): boolean {\n return a.kind === \"shape\"\n ? b.kind === \"shape\" && a.shape === b.shape\n : b.kind === \"image\" &&\n a.url === b.url &&\n a.fit === b.fit &&\n equalFrame(a.frame, b.frame);\n}\nconst defaultVisualSource: VisualSource = Object.freeze({\n kind: \"shape\",\n shape: Shape.Box,\n});\nexport interface RenderableOptions {\n /** Draw-only world-axis offset; does not move Transform or colliders. */\n offsetX?: number;\n offsetY?: number;\n /** Draw-only rotation in radians, added to Transform.rotation. */\n rotation?: number;\n scaleX?: number;\n scaleY?: number;\n width?: number;\n height?: number;\n color?: number;\n source?: VisualSource;\n opacity?: number;\n visible?: boolean;\n zIndex?: number;\n}\nexport class Renderable extends Component {\n static readonly type: ComponentType<Renderable> = defineComponent<Renderable>(\n \"Renderable\",\n [Transform.type],\n );\n readonly type: ComponentType<Renderable> = Renderable.type;\n private version = 0;\n private horizontal = 32;\n private vertical = 32;\n private rgb = 0x73e3c0;\n private visual: VisualSource = defaultVisualSource;\n private shown = true;\n private alpha = 1;\n private depth = 0;\n private drawX = 0;\n private drawY = 0;\n private drawRotation = 0;\n private drawScaleX = 1;\n private drawScaleY = 1;\n get offsetX(): number {\n return this.drawX;\n }\n set offsetX(value: number) {\n finite(value, \"Renderable.offsetX\");\n if (value !== this.drawX) {\n this.drawX = value;\n this.version++;\n }\n }\n get offsetY(): number {\n return this.drawY;\n }\n set offsetY(value: number) {\n finite(value, \"Renderable.offsetY\");\n if (value !== this.drawY) {\n this.drawY = value;\n this.version++;\n }\n }\n get rotation(): number {\n return this.drawRotation;\n }\n set rotation(value: number) {\n finite(value, \"Renderable.rotation\");\n if (value !== this.drawRotation) {\n this.drawRotation = value;\n this.version++;\n }\n }\n get scaleX(): number {\n return this.drawScaleX;\n }\n set scaleX(value: number) {\n finite(value, \"Renderable.scaleX\");\n if (value !== this.drawScaleX) {\n this.drawScaleX = value;\n this.version++;\n }\n }\n get scaleY(): number {\n return this.drawScaleY;\n }\n set scaleY(value: number) {\n finite(value, \"Renderable.scaleY\");\n if (value !== this.drawScaleY) {\n this.drawScaleY = value;\n this.version++;\n }\n }\n /** Changes only when a validated display value changes; independent of Scene revision. */\n get revision(): number {\n return this.version;\n }\n get width(): number {\n return this.horizontal;\n }\n set width(value: number) {\n positive(value, \"width\");\n if (this.horizontal !== value) {\n this.horizontal = value;\n this.version++;\n }\n }\n get height(): number {\n return this.vertical;\n }\n set height(value: number) {\n positive(value, \"height\");\n if (this.vertical !== value) {\n this.vertical = value;\n this.version++;\n }\n }\n get color(): number {\n return this.rgb;\n }\n set color(value: number) {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffff)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"color must be a 24-bit RGB integer\",\n );\n if (this.rgb !== value) {\n this.rgb = value;\n this.version++;\n }\n }\n get source(): VisualSource {\n return this.visual;\n }\n set source(value: VisualSource) {\n if (value === this.visual) return;\n const next = visualSource(value);\n if (!equalSource(this.visual, next)) {\n this.visual = next;\n this.version++;\n }\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"visible must be boolean\");\n if (this.shown !== value) {\n this.shown = value;\n this.version++;\n }\n }\n get opacity(): number {\n return this.alpha;\n }\n set opacity(value: number) {\n if (!Number.isFinite(value) || value < 0 || value > 1)\n throw new EngineError(\"INVALID_VALUE\", \"opacity must be between 0 and 1\");\n if (this.alpha !== value) {\n this.alpha = value;\n this.version++;\n }\n }\n get zIndex(): number {\n return this.depth;\n }\n set zIndex(value: number) {\n finite(value, \"zIndex\");\n if (this.depth !== value) {\n this.depth = value;\n this.version++;\n }\n }\n constructor(options: RenderableOptions = {}) {\n super();\n this.offsetX = options.offsetX ?? 0;\n this.offsetY = options.offsetY ?? 0;\n this.rotation = options.rotation ?? 0;\n this.scaleX = options.scaleX ?? 1;\n this.scaleY = options.scaleY ?? 1;\n if (options.source !== undefined) this.source = options.source;\n this.width = options.width === undefined ? 32 : options.width;\n this.height = options.height === undefined ? 32 : options.height;\n // Source chooses the initial default only. Later source changes retain color.\n this.color =\n options.color === undefined\n ? this.source.kind === \"image\"\n ? 0xffffff\n : 0x73e3c0\n : options.color;\n this.opacity = options.opacity === undefined ? 1 : options.opacity;\n this.zIndex = options.zIndex === undefined ? 0 : options.zIndex;\n this.visible = options.visible === undefined ? true : options.visible;\n this.version = 0;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Tween, tweenFinite } from \"../foundation/tween\";\nimport { Renderable } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\n/** Explicit draw-only channels. World Transform/Motion/CollisionBody are never tweened. */\nexport function actorTween(actor: Actor) {\n const view = actor.require(Renderable.type);\n const bind = (\n key: \"offsetX\" | \"offsetY\" | \"rotation\" | \"scaleX\" | \"scaleY\" | \"opacity\",\n ) =>\n Tween.bind({\n target: view,\n key,\n owner: view,\n scope: () => actor.scene,\n read: () => view[key],\n write: (value) => {\n view[key] = value;\n return Object.is(view[key], value);\n },\n valid: () => !actor.disposed && actor.get(Renderable.type) === view,\n validate: (value) => {\n tweenFinite(value, key);\n if (key === \"opacity\" && (value < 0 || value > 1))\n throw new EngineError(\"INVALID_TWEEN\", \"Opacity must be 0..1\");\n },\n });\n return Object.freeze({\n offsetX: bind(\"offsetX\"),\n offsetY: bind(\"offsetY\"),\n rotation: bind(\"rotation\"),\n scaleX: bind(\"scaleX\"),\n scaleY: bind(\"scaleY\"),\n opacity: bind(\"opacity\"),\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Renderable, type VisualSource } from \"../graphics/components\";\nimport type { SpriteImage, SpriteSheet } from \"../graphics/sprite-sheet\";\nimport {\n Component,\n ComponentPhase,\n type ComponentType,\n defineComponent,\n type UpdateContext,\n} from \"../scene/component\";\n\n/** Uniform frame timing in simulation seconds; default 8fps and loop=true. */\nexport type SpriteClip<FrameName extends string = never> = Readonly<\n {\n frames: readonly (number | FrameName)[];\n loop?: boolean;\n } & (\n | { fps?: number; frameSeconds?: never }\n | { fps?: never; frameSeconds: number }\n )\n>;\nexport const SpriteAnimationState = {\n Playing: \"playing\",\n Paused: \"paused\",\n Stopped: \"stopped\",\n Completed: \"completed\",\n} as const;\nexport type SpriteAnimationState =\n (typeof SpriteAnimationState)[keyof typeof SpriteAnimationState];\nexport interface SpriteAnimationOptions<\n Name extends string,\n FrameName extends string,\n> {\n sheet: SpriteSheet<FrameName>;\n clips: Readonly<Record<Name, SpriteClip<NoInfer<FrameName>>>>;\n initial?: NoInfer<Name>;\n onComplete?: (name: NoInfer<Name>) => void;\n}\ninterface CompiledClip {\n readonly images: readonly SpriteImage[];\n readonly frameSeconds: number;\n readonly duration: number;\n readonly loop: boolean;\n}\n/** One independent playback cursor per Actor. Requires an existing Renderable. */\nexport class SpriteAnimation<\n Name extends string = string,\n FrameName extends string = never,\n> extends Component {\n static readonly type: ComponentType<SpriteAnimation> =\n defineComponent<SpriteAnimation>(\"SpriteAnimation\", [Renderable.type]);\n readonly type = SpriteAnimation.type;\n readonly phase = ComponentPhase.LateUpdate;\n private readonly clips = new Map<Name, CompiledClip>();\n private readonly complete: ((name: Name) => void) | undefined;\n private selected: Name;\n private clip: CompiledClip;\n private status: SpriteAnimationState = SpriteAnimationState.Playing;\n private cursor = 0;\n private time = 0;\n private view: Renderable | undefined;\n private written: VisualSource | undefined;\n private image: SpriteImage | undefined;\n constructor(options: SpriteAnimationOptions<Name, FrameName>) {\n super();\n for (const [name, definition] of Object.entries(options.clips) as [\n Name,\n SpriteClip<FrameName>,\n ][]) {\n if (\n !name ||\n !definition ||\n !Array.isArray(definition.frames) ||\n !definition.frames.length\n )\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Clips need a name and at least one frame\",\n );\n if (definition.fps !== undefined && definition.frameSeconds !== undefined)\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Specify fps or frameSeconds, not both\",\n );\n const seconds = definition.frameSeconds ?? 1 / (definition.fps ?? 8);\n const duration = seconds * definition.frames.length;\n if (\n !Number.isFinite(seconds) ||\n seconds <= 0 ||\n !Number.isFinite(duration) ||\n duration <= 0 ||\n (definition.fps !== undefined &&\n (!Number.isFinite(definition.fps) || definition.fps <= 0)) ||\n (definition.loop !== undefined && typeof definition.loop !== \"boolean\")\n )\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Timing must be finite and positive; loop must be boolean\",\n );\n this.clips.set(\n name,\n Object.freeze({\n images: Object.freeze(\n Array.from(definition.frames, (key) => options.sheet.get(key)),\n ),\n frameSeconds: seconds,\n duration,\n loop: definition.loop ?? true,\n }),\n );\n }\n const initial = options.initial ?? this.clips.keys().next().value;\n const clip = initial === undefined ? undefined : this.clips.get(initial);\n if (initial === undefined || !clip)\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Expected a valid initial clip\",\n );\n if (\n options.onComplete !== undefined &&\n typeof options.onComplete !== \"function\"\n )\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"onComplete must be a function\",\n );\n this.selected = initial;\n this.clip = clip;\n this.complete = options.onComplete;\n }\n get current(): Name {\n return this.selected;\n }\n get state(): SpriteAnimationState {\n return this.status;\n }\n /** Zero-based position within the selected clip, not a sheet index. */\n get frameIndex(): number {\n return this.cursor;\n }\n /** Elapsed simulation seconds within the selected clip; wraps when looping. */\n get elapsed(): number {\n return this.time;\n }\n private assertAlive(): void {\n if (this.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"SpriteAnimation has been disposed\",\n );\n }\n private show(): void {\n const source = this.clip.images[this.cursor];\n if (\n this.view &&\n source &&\n (source !== this.image || this.view.source !== this.written)\n ) {\n this.view.source = source;\n this.written = this.view.source;\n this.image = source;\n }\n }\n protected onAttach(): void {\n this.view = this.actor.require(Renderable.type);\n this.show();\n }\n /** Same playing/paused clip is a no-op. restart=true or stopped/completed restarts. */\n play(name: Name, options: { restart?: boolean } = {}): void {\n this.assertAlive();\n const clip = this.clips.get(name);\n if (!clip)\n throw new EngineError(\"SPRITE_CLIP_INVALID\", \"Unknown animation clip\", {\n clip: name,\n });\n if (options.restart !== undefined && typeof options.restart !== \"boolean\")\n throw new EngineError(\"SPRITE_CLIP_INVALID\", \"restart must be boolean\");\n if (\n name === this.selected &&\n !options.restart &&\n (this.status === SpriteAnimationState.Playing ||\n this.status === SpriteAnimationState.Paused)\n )\n return;\n this.selected = name;\n this.clip = clip;\n this.time = 0;\n this.cursor = 0;\n this.status = SpriteAnimationState.Playing;\n this.show();\n }\n pause(): void {\n this.assertAlive();\n if (this.status === SpriteAnimationState.Playing)\n this.status = SpriteAnimationState.Paused;\n }\n resume(): void {\n this.assertAlive();\n if (this.status === SpriteAnimationState.Paused)\n this.status = SpriteAnimationState.Playing;\n }\n /** Reset to the first frame; does not emit completion. */\n stop(): void {\n this.assertAlive();\n this.status = SpriteAnimationState.Stopped;\n this.time = 0;\n this.cursor = 0;\n this.show();\n }\n update({ delta }: UpdateContext): void {\n if (this.disposed || this.status !== SpriteAnimationState.Playing) return;\n if (!Number.isFinite(delta) || delta < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Animation delta must be finite and nonnegative\",\n );\n const clip = this.clip;\n // Reduce before addition: bounded work and no overflow even for very large delta.\n const remaining = clip.duration - this.time;\n const finished =\n !clip.loop &&\n (delta >= remaining ||\n remaining - delta <= clip.duration * Number.EPSILON * 4);\n if (clip.loop) {\n const remainder = delta % clip.duration;\n this.time =\n this.time >= clip.duration - remainder\n ? this.time - (clip.duration - remainder)\n : this.time + remainder;\n if (clip.duration - this.time <= clip.duration * Number.EPSILON * 4)\n this.time = 0;\n } else this.time = finished ? clip.duration : this.time + delta;\n const position = this.time / clip.frameSeconds;\n this.cursor = finished\n ? clip.images.length - 1\n : Math.min(\n clip.images.length - 1,\n Math.floor(position + Math.max(1, position) * Number.EPSILON * 4),\n );\n if (finished) this.status = SpriteAnimationState.Completed;\n this.show();\n if (finished) this.complete?.(this.selected);\n }\n protected onDestroy(): void {\n this.status = SpriteAnimationState.Stopped;\n this.view = undefined;\n this.written = undefined;\n this.image = undefined;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Transform } from \"../graphics/components\";\nimport type { ActionReader } from \"../interaction/actions\";\nimport {\n Component,\n ComponentPhase,\n type ComponentType,\n defineComponent,\n type UpdateContext,\n} from \"../scene/component\";\n\nfunction finite(value: number, field: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${field} must be finite`, {\n field,\n });\n return value;\n}\n/** Integrates an input-independent direction × speed after command-producing Components. */\nexport class Motion extends Component {\n static readonly type: ComponentType<Motion> = defineComponent<Motion>(\n \"Motion\",\n [Transform.type],\n );\n readonly type: ComponentType<Motion> = Motion.type;\n readonly phase: ComponentPhase = ComponentPhase.Integrate;\n private readonly vector = { x: 0, y: 0 };\n get direction(): { x: number; y: number } {\n return this.vector;\n }\n private rate = 180;\n private transform: Transform | undefined;\n get speed(): number {\n return this.rate;\n }\n set speed(value: number) {\n if (!Number.isFinite(value) || value < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Motion.speed must be finite and nonnegative\",\n );\n this.rate = value;\n }\n constructor(options: { speed?: number; x?: number; y?: number } = {}) {\n super();\n this.speed = options.speed ?? 180;\n this.vector.x = finite(options.x ?? 0, \"Motion.direction.x\");\n this.vector.y = finite(options.y ?? 0, \"Motion.direction.y\");\n }\n protected onAttach(): void {\n this.transform = this.actor.require(Transform.type);\n }\n update(context: UpdateContext): void {\n if (!this.transform) return;\n const dx = finite(this.vector.x, \"Motion.direction.x\"),\n dy = finite(this.vector.y, \"Motion.direction.y\");\n const x = finite(\n this.transform.x + dx * this.rate * context.delta,\n \"Motion result x\",\n ),\n y = finite(\n this.transform.y + dy * this.rate * context.delta,\n \"Motion result y\",\n );\n this.transform.x = x;\n this.transform.y = y;\n }\n protected onDestroy(): void {\n this.transform = undefined;\n }\n}\n/** Optional Action-to-Motion adapter. Custom Update Components can replace it entirely. */\nexport class ActionMovement extends Component {\n static readonly type: ComponentType<ActionMovement> =\n defineComponent<ActionMovement>(\"ActionMovement\", [Motion.type]);\n readonly type = ActionMovement.type;\n readonly phase: ComponentPhase = ComponentPhase.Update;\n private motion: Motion | undefined;\n private factor = 1;\n get scale(): number {\n return this.factor;\n }\n set scale(value: number) {\n if (!Number.isFinite(value) || value < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"ActionMovement.scale must be finite and nonnegative\",\n );\n this.factor = value;\n }\n constructor(\n readonly input: ActionReader<\"axis2d\">,\n options: { scale?: number } = {},\n ) {\n super();\n this.scale = options.scale ?? 1;\n }\n protected onAttach(): void {\n this.motion = this.actor.require(Motion.type);\n }\n protected onDisable(): void {\n if (this.motion) {\n this.motion.direction.x = 0;\n this.motion.direction.y = 0;\n }\n }\n update(context: UpdateContext): void {\n if (this.input.scene !== context.scene)\n throw new EngineError(\n \"INPUT_SCENE\",\n \"Movement Action belongs to another Scene\",\n );\n if (this.input.disposed) {\n this.onDisable();\n return;\n }\n const value = this.input.value();\n if (this.motion) {\n this.motion.direction.x = value.x * this.factor;\n this.motion.direction.y = value.y * this.factor;\n }\n }\n protected onDestroy(): void {\n this.onDisable();\n this.motion = undefined;\n }\n}\n","import { cleanupAll } from \"./lifetime\";\n\n/** Owner cancellation, independent of browser AbortSignal and host event types. */\nexport interface CancellationSignal {\n readonly aborted: boolean;\n onCancel(callback: () => void): () => void;\n throwIfCancelled(): void;\n}\nexport class Cancellation {\n private dead = false;\n private readonly listeners = new Set<() => void>();\n readonly signal: CancellationSignal;\n constructor() {\n const owner = this;\n this.signal = Object.freeze({\n get aborted() {\n return owner.dead;\n },\n onCancel(callback: () => void): () => void {\n if (owner.dead) {\n callback();\n return () => {};\n }\n owner.listeners.add(callback);\n return () => {\n owner.listeners.delete(callback);\n };\n },\n throwIfCancelled(): void {\n if (owner.dead) throw new Error(\"Operation cancelled\");\n },\n });\n }\n cancel(): void {\n if (this.dead) return;\n this.dead = true;\n const callbacks = [...this.listeners];\n this.listeners.clear();\n cleanupAll(callbacks, \"Cancellation callbacks failed\");\n }\n}\n","import { EngineError } from \"./diagnostics\";\n\n// A deliberate dense-allocation limit, independent of the host's Array maximum.\nconst maxCells = 16_777_216;\nexport type GridVisitor<T> = (value: T, x: number, y: number) => void;\n\n/** Fixed-size, row-major data. Cells retain values/references without owning them. */\nexport class Grid<T> {\n readonly #width: number;\n readonly #height: number;\n readonly #cells: T[];\n\n static get maxCells(): number {\n return maxCells;\n }\n /** The same initial value/reference is stored in every cell, including functions. */\n constructor(width: number, height: number, initial: T) {\n if (\n !Number.isSafeInteger(width) ||\n !Number.isSafeInteger(height) ||\n width <= 0 ||\n height <= 0 ||\n !Number.isSafeInteger(width * height) ||\n width * height > maxCells\n )\n throw new EngineError(\n \"GRID_SIZE\",\n \"Grid dimensions must be positive safe integers within the dense cell limit\",\n { width, height, maxCells },\n );\n this.#width = width;\n this.#height = height;\n this.#cells = new Array<T>(width * height).fill(initial);\n }\n /** Calls initialize(x,y) once per cell, left-to-right then top-to-bottom. */\n static generate<T>(\n width: number,\n height: number,\n initialize: (x: number, y: number) => T,\n ): Grid<T> {\n if (typeof initialize !== \"function\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Grid initializer must be a function\",\n );\n // The partially initialized Grid is private until every callback succeeds.\n const grid = new Grid<T>(width, height, undefined as T);\n let index = 0;\n for (let y = 0; y < height; y++)\n for (let x = 0; x < width; x++) grid.#cells[index++] = initialize(x, y);\n return grid;\n }\n get width(): number {\n return this.#width;\n }\n get height(): number {\n return this.#height;\n }\n /** False for noninteger/nonfinite/out-of-range coordinates; never clips. */\n inBounds(x: number, y: number): boolean {\n return this.#contains(x, y);\n }\n #contains(x: number, y: number): boolean {\n return (\n Number.isInteger(x) &&\n Number.isInteger(y) &&\n x >= 0 &&\n y >= 0 &&\n x < this.#width &&\n y < this.#height\n );\n }\n #index(x: number, y: number, operation: string): number {\n if (!this.#contains(x, y))\n throw new EngineError(\n \"GRID_BOUNDS\",\n \"Grid coordinate is outside its bounds\",\n {\n x,\n y,\n width: this.#width,\n height: this.#height,\n operation,\n },\n );\n return y * this.#width + x;\n }\n get(x: number, y: number): T {\n // Every index exists, including cells whose legitimate value is undefined.\n return this.#cells[this.#index(x, y, \"get\")] as T;\n }\n set(x: number, y: number, value: T): void {\n this.#cells[this.#index(x, y, \"set\")] = value;\n }\n /** Replaces every cell with the same value/reference; does not dispose old values. */\n fill(value: T): void {\n this.#cells.fill(value);\n }\n /** Live row-major traversal; later cells observe writes made by earlier visits. */\n forEach(visit: GridVisitor<T>): void {\n this.forEachRect(0, 0, this.#width, this.#height, visit);\n }\n /** Fully contained rectangle, with nonnegative integer extents; empty is valid. */\n forEachRect(\n x: number,\n y: number,\n width: number,\n height: number,\n visit: GridVisitor<T>,\n ): void {\n if (\n !Number.isSafeInteger(x) ||\n !Number.isSafeInteger(y) ||\n !Number.isSafeInteger(width) ||\n !Number.isSafeInteger(height) ||\n x < 0 ||\n y < 0 ||\n width < 0 ||\n height < 0 ||\n x > this.#width ||\n y > this.#height ||\n width > this.#width - x ||\n height > this.#height - y\n )\n throw new EngineError(\n \"GRID_BOUNDS\",\n \"Grid rectangle is outside its bounds\",\n {\n x,\n y,\n rectWidth: width,\n rectHeight: height,\n width: this.#width,\n height: this.#height,\n operation: \"forEachRect\",\n },\n );\n if (typeof visit !== \"function\")\n throw new EngineError(\"INVALID_VALUE\", \"Grid visitor must be a function\");\n if (width === 0 || height === 0) return;\n const endX = x + width,\n endY = y + height;\n for (let cy = y; cy < endY; cy++) {\n let index = cy * this.#width + x;\n for (let cx = x; cx < endX; cx++)\n visit(this.#cells[index++] as T, cx, cy);\n }\n }\n}\n","import { EngineError } from \"./diagnostics\";\nexport const RANDOM_ALGORITHM = \"lcg32-fnv1a-utf16le-v1\";\nexport const DEFAULT_RANDOM_STREAM = \"$default\";\nexport interface RandomState {\n readonly name: string;\n readonly seed: number;\n readonly state: number;\n readonly calls: number;\n}\nexport interface RandomSnapshot {\n readonly algorithm: typeof RANDOM_ALGORITHM;\n readonly seed: number;\n readonly streams: readonly RandomState[];\n}\nfunction uint32(value: number): number {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffffff)\n throw new EngineError(\n \"INVALID_SEED\",\n \"Seed must be an unsigned 32-bit integer\",\n );\n return value;\n}\n/** Uses the cross-host Crypto capability when present; ES Math.random is the fallback. */\nfunction automaticSeed(): number {\n const capability = (\n globalThis as unknown as {\n crypto?: { getRandomValues(array: Uint32Array): Uint32Array };\n }\n ).crypto;\n if (capability?.getRandomValues) {\n try {\n const buffer = new Uint32Array(1);\n capability.getRandomValues(buffer);\n return buffer[0] ?? 0;\n } catch {\n /* Hosts may expose an unavailable capability; use the portable fallback. */\n }\n }\n return Math.floor(Math.random() * 4294967296);\n}\n/** FNV-1a over master seed (four LE bytes), then exact UTF-16 code units (two LE bytes each). */\nexport function deriveStreamSeed(seed: number, name: string): number {\n uint32(seed);\n let hash = 2166136261;\n const byte = (value: number) => {\n hash = Math.imul(hash ^ (value & 255), 16777619) >>> 0;\n };\n for (let shift = 0; shift < 32; shift += 8) byte(seed >>> shift);\n for (let index = 0; index < name.length; index++) {\n const code = name.charCodeAt(index);\n byte(code);\n byte(code >>> 8);\n }\n return hash;\n}\nexport class RandomStream {\n private current: number;\n private count = 0;\n private dead = false;\n /** @internal Streams are acquired from RandomManager.stream(). */\n constructor(private readonly initial: number) {\n this.current = uint32(initial);\n }\n get seed(): number {\n return this.initial;\n }\n get state(): number {\n return this.current;\n }\n get calls(): number {\n return this.count;\n }\n get disposed(): boolean {\n return this.dead;\n }\n next(): number {\n if (this.dead)\n throw new EngineError(\n \"RANDOM_DISPOSED\",\n \"Random stream has been disposed\",\n );\n this.current = (Math.imul(1664525, this.current) + 1013904223) >>> 0;\n this.count++;\n return this.current / 4294967296;\n }\n /** @internal */ dispose(): void {\n this.dead = true;\n }\n}\n/** Independent deterministic streams. State survives Scene replacement and ends with its owner. */\nexport class RandomManager {\n private readonly initial: number;\n private readonly streams = new Map<string, RandomStream>();\n private readonly defaultStream: RandomStream;\n private dead = false;\n constructor(seed?: number) {\n this.initial = uint32(seed ?? automaticSeed());\n this.defaultStream = new RandomStream(this.initial);\n this.streams.set(DEFAULT_RANDOM_STREAM, this.defaultStream);\n }\n get seed(): number {\n return this.initial;\n }\n get disposed(): boolean {\n return this.dead;\n }\n private alive(): void {\n if (this.dead)\n throw new EngineError(\n \"RANDOM_DISPOSED\",\n \"Random manager has been disposed\",\n );\n }\n next(): number {\n this.alive();\n return this.defaultStream.next();\n }\n stream(name: string): RandomStream {\n this.alive();\n if (typeof name !== \"string\" || !name.length || name.length > 256)\n throw new EngineError(\n \"INVALID_STREAM\",\n \"Stream name must contain 1 to 256 UTF-16 code units\",\n );\n let stream = this.streams.get(name);\n if (!stream) {\n stream = new RandomStream(deriveStreamSeed(this.seed, name));\n this.streams.set(name, stream);\n }\n return stream;\n }\n snapshot(): RandomSnapshot {\n return {\n algorithm: RANDOM_ALGORITHM,\n seed: this.seed,\n streams: [...this.streams]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, s]) => ({\n name,\n seed: s.seed,\n state: s.state,\n calls: s.calls,\n })),\n };\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n for (const stream of this.streams.values()) stream.dispose();\n }\n}\n","/** Source workspace version; checked against package.json by the build validator. */\nexport const ENGINE_VERSION = \"0.1.3\";\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus } from \"../foundation/events\";\nimport { cleanupAll, Lifetime } from \"../foundation/lifetime\";\nimport {\n Component,\n ComponentPhase,\n type ComponentType,\n type UpdateContext,\n} from \"./component\";\nimport type { Scene } from \"./scene\";\n\n// Fixed identifiers are resolved once, outside per-Actor dispatch loops.\nconst inputPhase = ComponentPhase.Input,\n updatePhase = ComponentPhase.Update,\n integratePhase = ComponentPhase.Integrate,\n latePhase = ComponentPhase.LateUpdate;\nexport const ActorState = {\n Detached: \"detached\",\n Attached: \"attached\",\n Disposed: \"disposed\",\n} as const;\nexport type ActorState = (typeof ActorState)[keyof typeof ActorState];\nexport interface ActorOptions {\n id?: string;\n enabled?: boolean;\n}\nconst emptyPlan: readonly Component[] = Object.freeze([]);\nconst phases = Object.values(ComponentPhase);\nexport class Actor {\n private identifier: string | undefined;\n private owner: Scene | undefined;\n private readonly components = new Map<symbol, Component>();\n private inputPlan = emptyPlan;\n private updatePlan = emptyPlan;\n private integratePlan = emptyPlan;\n private latePlan = emptyPlan;\n private frameInput = emptyPlan;\n private frameUpdates = emptyPlan;\n private frameIntegrate = emptyPlan;\n private frameLate = emptyPlan;\n private attaching = false;\n private frameEligible = false;\n private readonly lifetime = new Lifetime();\n private bus: EventBus | undefined;\n private on: boolean;\n private destroying = false;\n constructor(options: ActorOptions = {}) {\n if (options.id !== undefined && !options.id.trim())\n throw new EngineError(\"INVALID_ID\", \"Actor id cannot be empty\");\n this.identifier = options.id;\n this.on = options.enabled ?? true;\n }\n get id(): string | undefined {\n return this.identifier;\n }\n get scene(): Scene | undefined {\n return this.owner;\n }\n get state(): ActorState {\n return this.disposed\n ? ActorState.Disposed\n : this.owner\n ? ActorState.Attached\n : ActorState.Detached;\n }\n get disposed(): boolean {\n return this.destroying || this.lifetime.disposed;\n }\n get enabled(): boolean {\n return this.on;\n }\n set enabled(value: boolean) {\n this.assertAlive();\n this.on = value;\n }\n get events(): EventBus {\n this.assertAlive();\n this.bus ??= new EventBus();\n return this.bus;\n }\n onDispose(callback: () => void): () => void {\n this.assertAlive();\n return this.lifetime.onDispose(callback);\n }\n private assertAlive(): void {\n if (this.disposed)\n throw new EngineError(\"ACTOR_DISPOSED\", \"Actor has been disposed\", {\n actorId: this.id,\n });\n }\n get<T extends Component>(type: ComponentType<T>): T | undefined {\n return this.components.get(type.id) as T | undefined;\n }\n require<T extends Component>(type: ComponentType<T>): T {\n const value = this.get(type);\n if (!value)\n throw new EngineError(\n \"COMPONENT_MISSING\",\n \"Required component is missing\",\n { actorId: this.id, component: type.name },\n );\n return value;\n }\n private validate(\n type: ComponentType,\n visiting = new Set<symbol>(),\n visited = new Set<symbol>(),\n ): void {\n if (visiting.has(type.id))\n throw new EngineError(\n \"COMPONENT_CYCLE\",\n \"Cyclic component requirements\",\n { component: type.name, actorId: this.id },\n );\n if (visited.has(type.id)) return;\n visiting.add(type.id);\n for (const dependency of type.requires)\n this.validate(dependency, visiting, visited);\n visiting.delete(type.id);\n visited.add(type.id);\n }\n add<T extends Component>(component: T): T {\n this.assertAlive();\n if (this.attaching)\n throw new EngineError(\n \"COMPONENT_MUTATION_REENTRANT\",\n \"Do not change component structure from onAttach\",\n );\n this.validate(component.type);\n if (!phases.includes(component.phase))\n throw new EngineError(\"COMPONENT_PHASE\", \"Unknown Component phase\", {\n component: component.type.name,\n });\n if (this.components.has(component.type.id))\n throw new EngineError(\n \"COMPONENT_DUPLICATE\",\n \"Component type already exists\",\n { actorId: this.id, component: component.type.name },\n );\n for (const dependency of component.type.requires)\n if (!this.components.has(dependency.id))\n throw new EngineError(\n \"COMPONENT_MISSING\",\n \"Add required components before dependents\",\n {\n actorId: this.id,\n component: component.type.name,\n dependency: dependency.name,\n },\n );\n if (component.disposed)\n throw new EngineError(\n \"COMPONENT_OWNERSHIP\",\n \"Cannot add a disposed component\",\n );\n this.components.set(component.type.id, component);\n this.attaching = true;\n try {\n component.attachTo(this);\n this.assertAlive();\n if (component.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"Component was disposed during attachment\",\n );\n } catch (error) {\n this.components.delete(component.type.id);\n throw error;\n } finally {\n this.attaching = false;\n }\n this.rebuild();\n return component;\n }\n remove<T extends Component>(type: ComponentType<T>): boolean {\n this.assertAlive();\n if (this.attaching)\n throw new EngineError(\n \"COMPONENT_MUTATION_REENTRANT\",\n \"Do not change component structure from onAttach\",\n );\n const component = this.components.get(type.id);\n if (!component) return false;\n for (const other of this.components.values())\n if (other.type.requires.some((required) => required.id === type.id))\n throw new EngineError(\n \"COMPONENT_REQUIRED\",\n \"Remove dependents before their dependency\",\n {\n actorId: this.id,\n component: type.name,\n dependent: other.type.name,\n },\n );\n this.components.delete(type.id);\n this.rebuild();\n component.destroyOwned();\n return true;\n }\n private rebuild(): void {\n let input: Component[] | undefined,\n update: Component[] | undefined,\n integrate: Component[] | undefined,\n late: Component[] | undefined;\n for (const component of this.components.values())\n if (component.update !== Component.prototype.update) {\n switch (component.phase) {\n case inputPhase:\n input ??= [];\n input.push(component);\n break;\n case updatePhase:\n update ??= [];\n update.push(component);\n break;\n case integratePhase:\n integrate ??= [];\n integrate.push(component);\n break;\n case latePhase:\n late ??= [];\n late.push(component);\n break;\n }\n }\n this.inputPlan = input ?? emptyPlan;\n this.updatePlan = update ?? emptyPlan;\n this.integratePlan = integrate ?? emptyPlan;\n this.latePlan = late ?? emptyPlan;\n this.owner?.touch();\n }\n /** @internal */ attachTo(scene: Scene, id: string): void {\n this.assertAlive();\n if (this.owner)\n throw new EngineError(\n \"ACTOR_OWNERSHIP\",\n \"Actor already belongs to a scene\",\n { actorId: this.id },\n );\n this.identifier = id;\n this.owner = scene;\n }\n /** @internal */ get hasUpdates(): boolean {\n return (\n this.inputPlan.length > 0 ||\n this.updatePlan.length > 0 ||\n this.integratePlan.length > 0 ||\n this.latePlan.length > 0\n );\n }\n /** @internal */ beginStep(): void {\n this.frameInput = this.inputPlan;\n this.frameUpdates = this.updatePlan;\n this.frameIntegrate = this.integratePlan;\n this.frameLate = this.latePlan;\n this.frameEligible = this.enabled && !this.disposed;\n }\n /** @internal */ updatePhase(\n phase: ComponentPhase,\n context: UpdateContext,\n ): void {\n const plan =\n phase === inputPhase\n ? this.frameInput\n : phase === updatePhase\n ? this.frameUpdates\n : phase === integratePhase\n ? this.frameIntegrate\n : this.frameLate;\n if (!plan.length) return;\n if (\n !this.frameEligible ||\n !this.enabled ||\n this.disposed ||\n this.owner !== context.scene\n )\n return;\n for (const component of plan) {\n if (!this.enabled || this.disposed || this.owner !== context.scene) break;\n if (component.enabled && !component.disposed) component.update(context);\n }\n }\n /** @internal */ destroyOwned(): void {\n if (this.disposed) return;\n this.destroying = true;\n this.owner = undefined;\n const components = [...this.components.values()].reverse();\n this.inputPlan = emptyPlan;\n this.updatePlan = emptyPlan;\n this.integratePlan = emptyPlan;\n this.latePlan = emptyPlan;\n this.frameInput = emptyPlan;\n this.frameUpdates = emptyPlan;\n this.frameIntegrate = emptyPlan;\n this.frameLate = emptyPlan;\n try {\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.bus?.dispose(),\n ...components.map((component) => () => {\n try {\n component.destroyOwned();\n } finally {\n this.components.delete(component.type.id);\n }\n }),\n ],\n \"Actor cleanup failed\",\n );\n } finally {\n this.components.clear();\n this.bus = undefined;\n }\n }\n dispose(): void {\n if (this.disposed) return;\n if (this.owner) this.owner.remove(this);\n else this.destroyOwned();\n }\n}\n","import {\n Renderable,\n Shape,\n Transform,\n type VisualSource,\n} from \"../graphics/components\";\nimport type { ActionReader } from \"../interaction/actions\";\nimport { Actor } from \"../scene/actor\";\nimport { ActionMovement, Motion } from \"./motion\";\nexport interface CharacterOptions {\n id?: string;\n x?: number;\n y?: number;\n speed?: number;\n size?: number;\n color?: number;\n movement?: ActionReader<\"axis2d\">;\n source?: VisualSource;\n}\nexport class CharacterActor extends Actor {\n get x(): number {\n return this.require(Transform.type).x;\n }\n set x(value: number) {\n this.require(Transform.type).x = value;\n }\n get y(): number {\n return this.require(Transform.type).y;\n }\n set y(value: number) {\n this.require(Transform.type).y = value;\n }\n}\n/** Composition preset; the simulation has no knowledge of characters. */\nexport function Character(options: CharacterOptions = {}): CharacterActor {\n const actor = new CharacterActor(\n options.id === undefined ? {} : { id: options.id },\n );\n try {\n actor.add(new Transform({ x: options.x ?? 400, y: options.y ?? 225 }));\n actor.add(\n new Renderable({\n width: options.size ?? 32,\n height: options.size ?? 32,\n ...(options.color === undefined ? {} : { color: options.color }),\n source: options.source ?? { kind: \"shape\", shape: Shape.Character },\n }),\n );\n actor.add(new Motion({ speed: options.speed ?? 180 }));\n if (options.movement) actor.add(new ActionMovement(options.movement));\n return actor;\n } catch (error) {\n actor.dispose();\n throw error;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nexport const CollisionResponse = {\n Trigger: \"trigger\",\n Solid: \"solid\",\n} as const;\nexport type CollisionResponse =\n (typeof CollisionResponse)[keyof typeof CollisionResponse];\nexport interface CollisionPolicy {\n readonly response: CollisionResponse;\n readonly layer: number;\n readonly mask: number;\n}\nexport function collisionResponse(value: CollisionResponse): CollisionResponse {\n if (!Object.values(CollisionResponse).includes(value))\n throw new EngineError(\"INVALID_VALUE\", \"Unknown collision response\");\n return value;\n}\nexport function collisionBits(\n value: number,\n name: string,\n allowZero: boolean,\n): number {\n if (\n !Number.isInteger(value) ||\n value < (allowZero ? 0 : 1) ||\n value > 0xffffffff\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n `${name} must be an unsigned 32-bit ${allowZero ? \"mask\" : \"nonzero layer\"}`,\n );\n return value;\n}\nexport function allowsPair(a: CollisionPolicy, b: CollisionPolicy): boolean {\n return !!(a.mask & b.layer) && !!(b.mask & a.layer);\n}\nexport function pairResponse(\n a: CollisionPolicy,\n b: CollisionPolicy,\n): CollisionResponse {\n return a.response === CollisionResponse.Solid &&\n b.response === CollisionResponse.Solid\n ? CollisionResponse.Solid\n : CollisionResponse.Trigger;\n}\nexport function samePolicy(\n a: CollisionPolicy | null,\n b: CollisionPolicy | null,\n): boolean {\n return (\n a === b ||\n (a !== null &&\n b !== null &&\n a.response === b.response &&\n a.layer === b.layer &&\n a.mask === b.mask)\n );\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport {\n type CollisionPolicy,\n type CollisionResponse,\n collisionBits,\n collisionResponse,\n samePolicy,\n} from \"./collision-policy\";\n\nexport interface TileCollisionPolicy {\n readonly response: CollisionResponse;\n readonly layer?: number;\n readonly mask?: number;\n}\nexport type ResolvedTileCollision = Readonly<CollisionPolicy>;\nexport interface TileCollisionOptions<Name extends string> {\n readonly tiles: readonly (TileCollisionPolicy & {\n readonly tile: number | NoInfer<Name>;\n })[];\n}\n/** @internal Notifications invalidate collision state only, never presentation. */\nexport type TileCollisionChange<Name extends string> =\n | { readonly kind: \"cell\"; readonly index: number }\n | { readonly kind: \"tile\"; readonly tile: number | Name }\n | { readonly kind: \"all\" };\nfunction normalized(\n value: TileCollisionPolicy | null,\n): ResolvedTileCollision | null {\n if (value === null) return null;\n if (!value || typeof value !== \"object\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile collision requires a policy or null\",\n );\n return Object.freeze({\n response: collisionResponse(value.response),\n layer: collisionBits(\n value.layer === undefined ? 1 : value.layer,\n \"layer\",\n false,\n ),\n mask: collisionBits(\n value.mask === undefined ? 0xffffffff : value.mask,\n \"mask\",\n true,\n ),\n });\n}\n/** @internal Sparse overrides and copied ID policies; no geometry/Scene/renderer ownership. */\nexport class TileCollisionData<Name extends string> {\n private readonly defaults = new Map<number | Name, ResolvedTileCollision>();\n private readonly overrides = new Map<number, ResolvedTileCollision | null>();\n private positiveOverrides = 0;\n constructor(\n options?: TileCollisionOptions<Name>,\n validate?: (tile: number | Name) => void,\n ) {\n if (options !== undefined) {\n if (!options || !Array.isArray(options.tiles))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"collision.tiles must be an array\",\n );\n for (const rule of options.tiles) {\n if (!rule || typeof rule !== \"object\")\n throw new EngineError(\"INVALID_VALUE\", \"Invalid tile collision rule\");\n validate?.(rule.tile);\n if (this.defaults.has(rule.tile))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Duplicate tile collision rule\",\n );\n const policy = normalized(rule);\n if (policy) this.defaults.set(rule.tile, policy);\n }\n }\n }\n get configured(): boolean {\n return this.defaults.size > 0 || this.positiveOverrides > 0;\n }\n get(index: number, tile: number | Name | null): ResolvedTileCollision | null {\n if (this.overrides.has(index)) return this.overrides.get(index) ?? null;\n return tile === null ? null : (this.defaults.get(tile) ?? null);\n }\n set(index: number, value: TileCollisionPolicy | null): boolean {\n const policy = normalized(value),\n old = this.overrides.get(index);\n if (this.overrides.has(index) && samePolicy(old ?? null, policy))\n return false;\n if (old) this.positiveOverrides--;\n if (policy) this.positiveOverrides++;\n this.overrides.set(index, policy);\n return true;\n }\n reset(index: number): boolean {\n if (this.overrides.get(index)) this.positiveOverrides--;\n return this.overrides.delete(index);\n }\n setDefault(tile: number | Name, value: TileCollisionPolicy | null): boolean {\n const policy = normalized(value),\n old = this.defaults.get(tile) ?? null;\n if (samePolicy(old, policy)) return false;\n if (policy) this.defaults.set(tile, policy);\n else this.defaults.delete(tile);\n return true;\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nexport const Aspect = {\n Fit: \"fit\",\n Fill: \"fill\",\n Adaptive: \"adaptive\",\n} as const;\nexport type Aspect = (typeof Aspect)[keyof typeof Aspect];\nexport interface Point {\n readonly x: number;\n readonly y: number;\n}\nexport interface TilePoint extends Point {\n readonly space: \"tile\";\n}\nexport interface WorldPoint extends Point {\n readonly space: \"world\";\n}\nexport interface ScreenPoint extends Point {\n readonly space: \"screen\";\n}\nexport interface PhysicalPoint extends Point {\n readonly space: \"physical\";\n}\nexport interface LogicalResolution {\n readonly width: number;\n readonly height: number;\n}\nexport interface Viewport extends LogicalResolution {\n readonly x: number;\n readonly y: number;\n}\nfunction finite(value: number, field: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${field} must be finite`, {\n field,\n });\n return value;\n}\nexport function worldPoint(x: number, y: number): WorldPoint {\n return { space: \"world\", x: finite(x, \"x\"), y: finite(y, \"y\") };\n}\nexport function screenPoint(x: number, y: number): ScreenPoint {\n return { space: \"screen\", x: finite(x, \"x\"), y: finite(y, \"y\") };\n}\n/** Position is the nominal visible world's top-left; zoom is centered on that extent. */\nexport class Camera {\n private left: number;\n private top: number;\n private magnification: number;\n constructor(options: { x?: number; y?: number; zoom?: number } = {}) {\n this.left = finite(options.x ?? 0, \"camera.x\");\n this.top = finite(options.y ?? 0, \"camera.y\");\n this.magnification = positive(options.zoom ?? 1, \"camera.zoom\");\n }\n get x(): number {\n return this.left;\n }\n set x(value: number) {\n this.left = finite(value, \"camera.x\");\n }\n get y(): number {\n return this.top;\n }\n set y(value: number) {\n this.top = finite(value, \"camera.y\");\n }\n get zoom(): number {\n return this.magnification;\n }\n set zoom(value: number) {\n this.magnification = positive(value, \"camera.zoom\");\n }\n}\nexport interface ViewTransform {\n readonly scale: number;\n readonly x: number;\n readonly y: number;\n readonly logicalWidth: number;\n readonly logicalHeight: number;\n readonly viewport: Viewport;\n readonly clip: Viewport;\n}\nexport function createViewTransform(options: {\n viewport: Viewport;\n resolution?: LogicalResolution;\n camera?: Readonly<Pick<Camera, \"x\" | \"y\" | \"zoom\">>;\n aspect?: Aspect;\n}): ViewTransform {\n const { viewport } = options,\n aspect = options.aspect ?? Aspect.Fit,\n resolution = options.resolution ?? { width: 800, height: 450 };\n positive(viewport.width, \"viewport.width\");\n positive(viewport.height, \"viewport.height\");\n finite(viewport.x, \"viewport.x\");\n finite(viewport.y, \"viewport.y\");\n positive(resolution.width, \"resolution.width\");\n positive(resolution.height, \"resolution.height\");\n if (!Object.values(Aspect).includes(aspect))\n throw new EngineError(\"INVALID_ASPECT\", \"Unknown aspect policy\");\n const logicalWidth =\n aspect === Aspect.Adaptive ? viewport.width : resolution.width,\n logicalHeight =\n aspect === Aspect.Adaptive ? viewport.height : resolution.height;\n const base =\n aspect === Aspect.Adaptive\n ? 1\n : (aspect === Aspect.Fit ? Math.min : Math.max)(\n viewport.width / logicalWidth,\n viewport.height / logicalHeight,\n );\n const camera = options.camera ?? { x: 0, y: 0, zoom: 1 };\n finite(camera.x, \"camera.x\");\n finite(camera.y, \"camera.y\");\n const scale = base * positive(camera.zoom, \"camera.zoom\");\n const clip =\n aspect === Aspect.Fit\n ? {\n x: viewport.x + (viewport.width - logicalWidth * base) / 2,\n y: viewport.y + (viewport.height - logicalHeight * base) / 2,\n width: logicalWidth * base,\n height: logicalHeight * base,\n }\n : { ...viewport };\n return {\n scale,\n x: viewport.x + viewport.width / 2 - (camera.x + logicalWidth / 2) * scale,\n y:\n viewport.y + viewport.height / 2 - (camera.y + logicalHeight / 2) * scale,\n logicalWidth,\n logicalHeight,\n viewport: { ...viewport },\n clip,\n };\n}\nexport function worldToScreen(\n view: ViewTransform,\n point: WorldPoint,\n): ScreenPoint {\n return screenPoint(\n point.x * view.scale + view.x,\n point.y * view.scale + view.y,\n );\n}\nexport function screenToWorld(\n view: ViewTransform,\n point: ScreenPoint,\n): WorldPoint {\n return worldPoint(\n (point.x - view.x) / view.scale,\n (point.y - view.y) / view.scale,\n );\n}\nexport function screenToPhysical(\n point: ScreenPoint,\n devicePixelRatio: number,\n): PhysicalPoint {\n const ratio = positive(devicePixelRatio, \"devicePixelRatio\");\n return { space: \"physical\", x: point.x * ratio, y: point.y * ratio };\n}\nexport function containsScreenPoint(\n view: ViewTransform,\n point: ScreenPoint,\n): boolean {\n const c = view.clip;\n return (\n point.x >= c.x &&\n point.y >= c.y &&\n point.x < c.x + c.width &&\n point.y < c.y + c.height\n );\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport { Grid } from \"../foundation/grid\";\nimport { samePolicy } from \"../game/collision-policy\";\nimport {\n type ResolvedTileCollision,\n type TileCollisionChange,\n TileCollisionData,\n type TileCollisionOptions,\n type TileCollisionPolicy,\n} from \"../game/tilemap-collision\";\nimport {\n type TilePoint,\n type WorldPoint,\n worldPoint,\n} from \"../graphics/coordinates\";\nimport type { SpriteSheet } from \"../graphics/sprite-sheet\";\nimport { Actor, type ActorOptions } from \"../scene/actor\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nimport type { Scene } from \"../scene/scene\";\n\nexport type {\n ResolvedTileCollision,\n TileCollisionOptions,\n TileCollisionPolicy,\n} from \"../game/tilemap-collision\";\n\nexport type TileId<Name extends string = never> = number | Name | null;\nexport type { TilePoint } from \"../graphics/coordinates\";\nexport interface TilemapOptions<Name extends string> extends ActorOptions {\n sheet: SpriteSheet<Name>;\n tiles:\n | Grid<TileId<NoInfer<Name>>>\n | readonly (readonly TileId<NoInfer<Name>>[])[];\n tileWidth: number;\n tileHeight: number;\n x?: number;\n y?: number;\n zIndex?: number;\n visible?: boolean;\n collision?: TileCollisionOptions<NoInfer<Name>>;\n}\nfunction finite(value: number): number {\n if (!Number.isFinite(value))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tilemap position/depth must be finite\",\n );\n return value;\n}\n/** One Scene-owned placement, not one Actor per cell. Input grids/rows are copied. */\nexport class Tilemap<Name extends string = never> {\n private readonly owner: Actor;\n readonly sheet: SpriteSheet<Name>;\n readonly tileWidth: number;\n readonly tileHeight: number;\n private cells: Grid<TileId<Name>>;\n private readonly counts = new Map<number | Name, number>();\n private readonly listeners = new Set<(index: number | null) => void>();\n private version = 0;\n private collisionData: TileCollisionData<Name> | undefined;\n private collisionVersion = 0;\n private collidable = true;\n private readonly collisionListeners = new Set<\n (change: TileCollisionChange<string>) => void\n >();\n private left = 0;\n private top = 0;\n private depth = 0;\n private shown = true;\n constructor(options: TilemapOptions<Name>) {\n this.owner = new Actor(options);\n this.sheet = options.sheet;\n this.tileWidth = positive(options.tileWidth, \"tileWidth\");\n this.tileHeight = positive(options.tileHeight, \"tileHeight\");\n const input = options.tiles;\n if (input instanceof Grid) {\n this.cells = Grid.generate(input.width, input.height, (x, y) =>\n this.validateTile(input.get(x, y)),\n );\n } else {\n if (\n !Array.isArray(input) ||\n !input.length ||\n !Array.isArray(input[0]) ||\n !input[0].length ||\n input.some(\n (row) => !Array.isArray(row) || row.length !== input[0]?.length,\n )\n )\n throw new EngineError(\n \"GRID_SIZE\",\n \"Tilemap rows must form a nonempty rectangle\",\n );\n this.cells = Grid.generate(input[0].length, input.length, (x, y) =>\n this.validateTile(input[y]?.[x] as TileId<Name>),\n );\n }\n this.cells.forEach((tile) => {\n this.count(tile, 1);\n });\n positive(this.width * this.tileWidth, \"map world width\");\n positive(this.height * this.tileHeight, \"map world height\");\n this.x = options.x ?? 0;\n this.y = options.y ?? 0;\n this.zIndex = options.zIndex ?? 0;\n this.visible = options.visible ?? true;\n if (options.collision !== undefined)\n this.collisionData = new TileCollisionData(options.collision, (tile) => {\n this.sheet.get(tile);\n });\n this.owner.add(new TilemapLayer(this));\n }\n /** Uses existing Actor ownership without adding a second Scene collection. */\n place(scene: Scene): this {\n scene.add(this.owner);\n return this;\n }\n get scene(): Scene | undefined {\n return this.owner.scene;\n }\n get disposed(): boolean {\n return this.owner.disposed;\n }\n get enabled(): boolean {\n return this.owner.enabled;\n }\n set enabled(value: boolean) {\n this.owner.enabled = value;\n }\n dispose(): void {\n this.owner.dispose();\n }\n onDispose(callback: () => void): () => void {\n return this.owner.onDispose(callback);\n }\n private alive(): void {\n if (this.disposed)\n throw new EngineError(\"ACTOR_DISPOSED\", \"Tilemap has been disposed\");\n }\n private validateTile(tile: TileId<Name>): TileId<Name> {\n if (tile !== null) this.sheet.get(tile);\n return tile;\n }\n private count(tile: TileId<Name>, change: number): void {\n if (tile === null) return;\n const n = (this.counts.get(tile) ?? 0) + change;\n if (n) this.counts.set(tile, n);\n else this.counts.delete(tile);\n }\n get width(): number {\n return this.cells.width;\n }\n get height(): number {\n return this.cells.height;\n }\n get revision(): number {\n return this.version;\n }\n get x(): number {\n return this.left;\n }\n set x(value: number) {\n this.alive();\n finite(value);\n finite(value + this.width * this.tileWidth);\n this.left = value;\n }\n get y(): number {\n return this.top;\n }\n set y(value: number) {\n this.alive();\n finite(value);\n finite(value + this.height * this.tileHeight);\n this.top = value;\n }\n get zIndex(): number {\n return this.depth;\n }\n set zIndex(value: number) {\n this.alive();\n this.depth = finite(value);\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n this.alive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"visible must be boolean\");\n this.shown = value;\n }\n inBounds(x: number, y: number): boolean {\n return this.cells.inBounds(x, y);\n }\n get(x: number, y: number): TileId<Name> {\n return this.cells.get(x, y);\n }\n set(x: number, y: number, tile: TileId<Name>): void {\n this.alive();\n const previous = this.cells.get(x, y);\n this.validateTile(tile);\n if (previous === tile) return;\n const previousPolicy = this.getCollision(x, y);\n this.cells.set(x, y, tile);\n this.count(previous, -1);\n this.count(tile, 1);\n this.version++;\n if (!samePolicy(previousPolicy, this.getCollision(x, y)))\n this.collisionChanged({ kind: \"cell\", index: y * this.width + x });\n for (const notify of this.listeners) notify(y * this.width + x);\n }\n fill(tile: TileId<Name>): void {\n this.alive();\n this.validateTile(tile);\n let changed = false,\n collisionChanged = false;\n this.cells.forEach((old, x, y) => {\n if (old !== tile) changed = true;\n if (\n this.collisionData &&\n !samePolicy(\n this.collisionData.get(y * this.width + x, old),\n this.collisionData.get(y * this.width + x, tile),\n )\n )\n collisionChanged = true;\n });\n if (!changed) return;\n this.cells.fill(tile);\n this.counts.clear();\n this.count(tile, this.width * this.height);\n this.version++;\n if (collisionChanged) this.collisionChanged({ kind: \"all\" });\n for (const notify of this.listeners) notify(null);\n }\n get collisionRevision(): number {\n return this.collisionVersion;\n }\n get collisionEnabled(): boolean {\n return this.collidable;\n }\n set collisionEnabled(value: boolean) {\n this.alive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"collisionEnabled must be boolean\",\n );\n if (this.collidable !== value) {\n this.collidable = value;\n this.collisionChanged({ kind: \"all\" });\n }\n }\n getCollision(x: number, y: number): ResolvedTileCollision | null {\n const tile = this.cells.get(x, y);\n return this.collisionData?.get(y * this.width + x, tile) ?? null;\n }\n setCollision(x: number, y: number, policy: TileCollisionPolicy | null): void {\n this.alive();\n this.cells.get(x, y);\n this.collisionData ??= new TileCollisionData();\n if (this.collisionData.set(y * this.width + x, policy))\n this.collisionChanged({ kind: \"cell\", index: y * this.width + x });\n }\n resetCollision(x: number, y: number): void {\n this.alive();\n this.cells.get(x, y);\n if (this.collisionData?.reset(y * this.width + x))\n this.collisionChanged({ kind: \"cell\", index: y * this.width + x });\n }\n setTileCollision(\n tile: number | NoInfer<Name>,\n policy: TileCollisionPolicy | null,\n ): void {\n this.alive();\n this.sheet.get(tile);\n this.collisionData ??= new TileCollisionData();\n if (this.collisionData.setDefault(tile, policy))\n this.collisionChanged({ kind: \"tile\", tile });\n }\n /** @internal Constant-time gate; never scans rules/overrides/cells. */\n get hasCollision(): boolean {\n return this.collisionData?.configured ?? false;\n }\n private collisionChanged(change: TileCollisionChange<string>): void {\n this.collisionVersion++;\n for (const notify of this.collisionListeners) notify(change);\n }\n /** @internal Optional observers use the placement lifetime, not rendering readiness. */\n onCollisionChanged(\n notify: (change: TileCollisionChange<string>) => void,\n ): () => void {\n this.alive();\n this.collisionListeners.add(notify);\n const unregister = this.onDispose(() =>\n this.collisionListeners.delete(notify),\n );\n return () => {\n unregister();\n this.collisionListeners.delete(notify);\n };\n }\n /** Independent data snapshot, reusable after this placement/Scene is disposed. */\n copyTiles(): Grid<TileId<Name>> {\n return Grid.generate(this.width, this.height, (x, y) => this.get(x, y));\n }\n tileToWorld(\n x: number,\n y: number,\n options: { center?: boolean } = {},\n ): WorldPoint {\n this.cells.get(x, y);\n const offset = options.center ? 0.5 : 0;\n return worldPoint(\n this.x + (x + offset) * this.tileWidth,\n this.y + (y + offset) * this.tileHeight,\n );\n }\n /** World-space cell rectangle. Grid integer/bounds validation matches tileToWorld. */\n tileBounds(\n x: number,\n y: number,\n ): { x: number; y: number; width: number; height: number } {\n const origin = this.tileToWorld(x, y);\n return {\n x: origin.x,\n y: origin.y,\n width: this.tileWidth,\n height: this.tileHeight,\n };\n }\n /** Half-open bounds: left/top included, right/bottom excluded; outside returns undefined. */\n worldToTile(x: number, y: number): TilePoint | undefined {\n finite(x);\n finite(y);\n const tx = Math.floor((x - this.x) / this.tileWidth),\n ty = Math.floor((y - this.y) / this.tileHeight);\n return this.inBounds(tx, ty) ? { space: \"tile\", x: tx, y: ty } : undefined;\n }\n /** @internal Unique currently used IDs; no writable Grid/cache is exposed. */\n tileIds(): IterableIterator<number | Name> {\n return this.counts.keys();\n }\n /** @internal Presentation subscriptions are removed with their presentation or Actor. */\n onTilesChanged(notify: (index: number | null) => void): () => void {\n this.alive();\n this.listeners.add(notify);\n const unregister = this.onDispose(() => this.listeners.delete(notify));\n return () => {\n unregister();\n this.listeners.delete(notify);\n };\n }\n}\n\n/** @internal One passive placement Component, not one Component per tile. */\nexport class TilemapLayer extends Component {\n static readonly type: ComponentType<TilemapLayer> =\n defineComponent<TilemapLayer>(\"TilemapLayer\");\n readonly type = TilemapLayer.type;\n constructor(readonly map: Tilemap<string>) {\n super();\n }\n}\n","import { EngineError, positive } from \"./diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"./lifetime\";\n\ninterface Timer {\n remaining: number;\n interval: number;\n callback(): void;\n cancel(): void;\n removeOwner?: () => void;\n active: boolean;\n}\nexport class SimulationTimers {\n private readonly timers = new Set<Timer>();\n private dead = false;\n private plan: readonly Timer[] = [];\n schedule(\n seconds: number,\n callback: () => void,\n repeat: boolean,\n owner?: LifetimeOwner,\n ): () => void {\n if (this.dead || owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Timer owner has been disposed\");\n if (repeat) positive(seconds, \"interval\");\n else if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Timer delay must be finite and nonnegative\",\n );\n const timer: Timer = {\n remaining: seconds,\n interval: repeat ? seconds : 0,\n callback,\n active: true,\n cancel: () => {\n if (!timer.active) return;\n timer.active = false;\n this.timers.delete(timer);\n const remove = timer.removeOwner;\n delete timer.removeOwner;\n remove?.();\n },\n };\n this.timers.add(timer);\n if (owner) {\n try {\n timer.removeOwner = owner.onDispose(timer.cancel);\n } catch (error) {\n timer.cancel();\n throw error;\n }\n }\n return timer.cancel;\n }\n /** Capture eligibility before any Scene update phase. */\n beginStep(): void {\n this.plan = [...this.timers];\n }\n step(seconds: number): void {\n const plan = this.plan;\n this.plan = [];\n if (!plan.length) return;\n const errors: unknown[] = [];\n for (const timer of plan) {\n if (!timer.active) continue;\n timer.remaining -= seconds;\n if (timer.remaining > 1e-12) continue;\n if (timer.interval === 0) {\n try {\n timer.cancel();\n } catch (error) {\n errors.push(error);\n }\n } else {\n // Preserve phase, but deliver at most once after a long step.\n const remainder = Math.max(0, -timer.remaining) % timer.interval;\n timer.remaining = timer.interval - remainder;\n if (timer.remaining <= 1e-12) timer.remaining = timer.interval;\n }\n try {\n timer.callback();\n } catch (error) {\n errors.push(error);\n }\n if (this.dead) break;\n }\n if (errors.length)\n throw new AggregateError(errors, \"Timer callbacks failed\");\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const timers = [...this.timers];\n try {\n cleanupAll(\n timers.map((timer) => timer.cancel),\n \"Timer cleanup failed\",\n );\n } finally {\n this.timers.clear();\n this.plan = [];\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport { SimulationTimers } from \"../foundation/timers\";\nimport { TweenScheduler } from \"../foundation/tween\";\nimport type { InputSystem } from \"../interaction/input\";\nimport type { Actor } from \"./actor\";\nimport { ComponentPhase, type UpdateContext } from \"./component\";\n\n/** Identity and input ownership only; Scene does not depend on the Engine implementation. */\ninterface SceneEngineOwner {\n readonly input: InputSystem;\n}\n\n// Fixed identifiers are resolved once, outside per-Actor dispatch loops.\nconst inputPhase = ComponentPhase.Input,\n updatePhase = ComponentPhase.Update,\n integratePhase = ComponentPhase.Integrate,\n latePhase = ComponentPhase.LateUpdate;\nexport const SceneState = {\n Preparing: \"preparing\",\n Ready: \"ready\",\n Active: \"active\",\n Inactive: \"inactive\",\n Disposed: \"disposed\",\n} as const;\nexport type SceneState = (typeof SceneState)[keyof typeof SceneState];\nexport class Scene {\n private phase: SceneState = SceneState.Preparing;\n private engineOwner: SceneEngineOwner | undefined;\n private inputScope: InputSystem | undefined;\n private readonly members = new Map<string, Actor>();\n private roster: readonly Actor[] = [];\n private rosterDirty = false;\n private nextId = 0;\n private updateRevision = -1;\n private updateActors: readonly Actor[] = [];\n private frameActors: readonly Actor[] = [];\n private readonly postUpdates = new Set<(seconds: number) => void>();\n private postPlan: readonly ((seconds: number) => void)[] = [];\n private version = 0;\n private readonly lifetime = new Lifetime();\n private bus: EventBus | undefined;\n private timers: SimulationTimers | undefined;\n private simulationAnimation: TweenScheduler | undefined;\n private displayAnimation: TweenScheduler | undefined;\n private readonly updates = new Set<(seconds: number) => void>();\n private updatePlan: readonly ((seconds: number) => void)[] = [];\n private readonly activations = new Set<() => void>();\n private readonly deactivations = new Set<() => void>();\n constructor(readonly id: string) {\n if (!id.trim())\n throw new EngineError(\"INVALID_ID\", \"Scene id cannot be empty\");\n }\n get state(): SceneState {\n return this.phase;\n }\n get disposed(): boolean {\n return this.phase === SceneState.Disposed;\n }\n get revision(): number {\n return this.version;\n }\n get actors(): readonly Actor[] {\n if (this.rosterDirty) {\n this.roster = [...this.members.values()];\n this.rosterDirty = false;\n }\n return this.roster;\n }\n get events(): EventBus {\n this.assertAlive();\n this.bus ??= new EventBus();\n return this.bus;\n }\n /** Simulation clock, advanced after contacts and before timers. */\n get tweens(): TweenScheduler {\n this.assertAlive();\n this.simulationAnimation ??= new TweenScheduler({\n owner: this,\n scope: this,\n });\n return this.simulationAnimation;\n }\n /** Display clock: the Host supplies visible frame time, including during Engine pause. */\n get presentationTweens(): TweenScheduler {\n this.assertAlive();\n this.displayAnimation ??= new TweenScheduler({ owner: this, scope: this });\n return this.displayAnimation;\n }\n advancePresentation(seconds: number): void {\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Presentation delta must be finite and nonnegative\",\n );\n if (this.phase !== SceneState.Active)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Only active scenes advance presentation\",\n );\n this.displayAnimation?.advance(seconds);\n }\n private assertAlive(): void {\n if (this.disposed || this.phase === SceneState.Inactive)\n throw new EngineError(\n \"SCENE_DISPOSED\",\n \"Scene can no longer acquire resources\",\n { sceneId: this.id },\n );\n }\n add<T extends Actor>(actor: T): T {\n this.assertAlive();\n if (actor.disposed || actor.scene)\n throw new EngineError(\n \"ACTOR_OWNERSHIP\",\n \"Actor must be new and unowned\",\n { sceneId: this.id, actorId: actor.id },\n );\n let id = actor.id;\n if (id === undefined)\n do {\n id = `actor-${++this.nextId}`;\n } while (this.members.has(id));\n if (this.members.has(id))\n throw new EngineError(\"DUPLICATE_ACTOR\", \"Actor id already exists\", {\n sceneId: this.id,\n actorId: id,\n });\n actor.attachTo(this, id);\n this.members.set(id, actor);\n this.rosterDirty = true;\n this.touch();\n return actor;\n }\n find(id: string): Actor | undefined {\n return this.members.get(id);\n }\n remove(actorOrId: Actor | string): boolean {\n const actor =\n typeof actorOrId === \"string\" ? this.members.get(actorOrId) : actorOrId;\n if (\n !actor ||\n actor.scene !== this ||\n actor.id === undefined ||\n this.members.get(actor.id) !== actor\n )\n return false;\n this.members.delete(actor.id);\n this.rosterDirty = true;\n this.touch();\n actor.destroyOwned();\n return true;\n }\n /** @internal */ touch(): void {\n this.version++;\n }\n onUpdate(callback: (seconds: number) => void): () => void {\n this.assertAlive();\n this.updates.add(callback);\n this.updatePlan = [...this.updates];\n return () => {\n this.updates.delete(callback);\n this.updatePlan = [...this.updates];\n };\n }\n /** Runs after every captured Actor component update and before timers/onUpdate. */\n onPostUpdate(callback: (seconds: number) => void): () => void {\n this.assertAlive();\n this.postUpdates.add(callback);\n this.postPlan = [...this.postUpdates];\n return () => {\n this.postUpdates.delete(callback);\n this.postPlan = [...this.postUpdates];\n };\n }\n onActivate(callback: () => void): () => void {\n this.assertAlive();\n if (this.phase !== SceneState.Preparing && this.phase !== SceneState.Ready)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Register activation callbacks before activation\",\n { sceneId: this.id },\n );\n this.activations.add(callback);\n return () => {\n this.activations.delete(callback);\n };\n }\n onDeactivate(callback: () => void): () => void {\n this.assertAlive();\n this.deactivations.add(callback);\n return () => {\n this.deactivations.delete(callback);\n };\n }\n onDispose(callback: () => void): () => void {\n this.assertAlive();\n return this.lifetime.onDispose(callback);\n }\n after(\n seconds: number,\n callback: () => void,\n owner?: LifetimeOwner,\n ): () => void {\n this.assertAlive();\n this.timers ??= new SimulationTimers();\n return this.timers.schedule(seconds, callback, false, owner);\n }\n every(\n seconds: number,\n callback: () => void,\n owner?: LifetimeOwner,\n ): () => void {\n this.assertAlive();\n this.timers ??= new SimulationTimers();\n return this.timers.schedule(seconds, callback, true, owner);\n }\n markReady(): void {\n this.assertAlive();\n if (this.phase !== SceneState.Preparing)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Only a preparing scene can become ready\",\n { sceneId: this.id },\n );\n this.phase = SceneState.Ready;\n }\n /** @internal */ get inputOwner(): InputSystem | undefined {\n return this.engineOwner?.input;\n }\n /** @internal */ claimInput(input: InputSystem): void {\n this.assertAlive();\n if (\n (this.inputScope && this.inputScope !== input) ||\n (this.engineOwner && this.engineOwner.input !== input)\n )\n throw new EngineError(\n \"SCENE_OWNERSHIP\",\n \"Action input must belong to the Scene's Engine\",\n { sceneId: this.id },\n );\n this.inputScope = input;\n }\n /** @internal */ validateOwner(engine: SceneEngineOwner): void {\n this.assertAlive();\n if (\n (this.engineOwner && this.engineOwner !== engine) ||\n (this.inputScope && this.inputScope !== engine.input)\n )\n throw new EngineError(\n \"SCENE_OWNERSHIP\",\n \"Scene belongs to another engine\",\n { sceneId: this.id },\n );\n }\n /** @internal */ claim(engine: SceneEngineOwner): void {\n this.validateOwner(engine);\n this.engineOwner = engine;\n }\n /** @internal */ activateOwned(): void {\n this.phase = SceneState.Active;\n }\n /** @internal */ notifyActivated(): void {\n if (!this.disposed)\n cleanupAll(this.activations, \"Scene activation callbacks failed\");\n }\n /** @internal */ deactivateOwned(): void {\n if (this.phase !== SceneState.Active) return;\n this.phase = SceneState.Inactive;\n cleanupAll(this.deactivations, \"Scene deactivation callbacks failed\");\n }\n /** @internal */ beginStep(): void {\n if (this.phase !== SceneState.Active)\n throw new EngineError(\"SCENE_STATE\", \"Only active scenes can update\", {\n sceneId: this.id,\n });\n this.timers?.beginStep();\n this.simulationAnimation?.beginStep();\n if (this.updateRevision !== this.revision) {\n this.updateActors = this.actors.filter((actor) => actor.hasUpdates);\n this.updateRevision = this.revision;\n }\n this.frameActors = this.updateActors;\n for (const actor of this.frameActors) actor.beginStep();\n }\n /** @internal */ step(context: UpdateContext): void {\n const actors = this.frameActors;\n for (const actor of actors) actor.updatePhase(inputPhase, context);\n for (const actor of actors) actor.updatePhase(updatePhase, context);\n for (const actor of actors) actor.updatePhase(integratePhase, context);\n for (const actor of actors) actor.updatePhase(latePhase, context);\n if (this.disposed) return;\n for (const callback of this.postPlan) {\n if (this.disposed) return;\n if (this.postUpdates.has(callback)) callback(context.delta);\n }\n if (this.disposed) return;\n this.simulationAnimation?.advanceCaptured(context.delta);\n if (this.disposed) return;\n this.timers?.step(context.delta);\n // Callback plans change only on subscription changes; iteration stays stable.\n if (this.updates.size)\n for (const callback of this.updatePlan) {\n if (this.disposed) break;\n if (this.updates.has(callback)) callback(context.delta);\n }\n }\n dispose(): void {\n if (this.disposed) return;\n const wasActive = this.phase === SceneState.Active;\n this.phase = SceneState.Disposed;\n const actors = this.actors;\n this.engineOwner = undefined;\n this.inputScope = undefined;\n this.members.clear();\n this.roster = [];\n this.rosterDirty = false;\n this.touch();\n try {\n cleanupAll(\n [\n ...(wasActive\n ? [\n () =>\n cleanupAll(\n this.deactivations,\n \"Scene deactivation callbacks failed\",\n ),\n ]\n : []),\n () => this.simulationAnimation?.dispose(),\n () => this.displayAnimation?.dispose(),\n () => this.timers?.dispose(),\n () => this.bus?.dispose(),\n ...[...actors].reverse().map((actor) => () => actor.destroyOwned()),\n () => this.lifetime.dispose(),\n ],\n \"Scene cleanup failed\",\n );\n } finally {\n this.updateActors = [];\n this.frameActors = [];\n this.postUpdates.clear();\n this.postPlan = [];\n this.updates.clear();\n this.updatePlan = [];\n this.activations.clear();\n this.deactivations.clear();\n this.bus = undefined;\n this.timers = undefined;\n this.simulationAnimation = undefined;\n this.displayAnimation = undefined;\n }\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport { defineEvent, type EventType } from \"../foundation/events\";\nimport { Transform } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nexport const CollisionShape = { Box: \"box\", Circle: \"circle\" } as const;\nexport type CollisionShape =\n (typeof CollisionShape)[keyof typeof CollisionShape];\n\nimport {\n CollisionResponse,\n collisionBits,\n collisionResponse,\n} from \"./collision-policy\";\n\nexport { CollisionResponse } from \"./collision-policy\";\n\ntype ShapeOptions =\n | { shape?: typeof CollisionShape.Box; width?: number; height?: number }\n | { shape: typeof CollisionShape.Circle; radius?: number };\nexport type ColliderOptions = ShapeOptions & {\n response?: CollisionResponse;\n offsetX?: number;\n offsetY?: number;\n layer?: number;\n mask?: number;\n};\nexport interface ContactGeometry {\n /** Unit normal from self toward other at detection, before position correction. */\n readonly normalX: number;\n readonly normalY: number;\n readonly depth: number;\n readonly response: CollisionResponse;\n readonly resolved: boolean;\n}\nexport interface Contact extends ContactGeometry {\n readonly self: Collider;\n readonly other: Collider;\n readonly selfActor: Actor;\n readonly otherActor: Actor;\n}\nexport const ContactEnter = defineEvent<Contact>(\"ContactEnter\");\nexport const ContactStay = defineEvent<Contact>(\"ContactStay\");\nexport const ContactExit = defineEvent<Contact>(\"ContactExit\");\nfunction finite(value: number, name: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${name} must be finite`, {\n field: name,\n });\n return value;\n}\n/** Geometry and contact policy. CollisionBody separately controls position correction. */\nexport class Collider extends Component {\n static readonly type: ComponentType<Collider> = defineComponent<Collider>(\n \"Collider\",\n [Transform.type],\n );\n readonly type = Collider.type;\n readonly response: CollisionResponse;\n readonly shape: CollisionShape;\n readonly width: number;\n readonly height: number;\n readonly radius: number;\n readonly offsetX: number;\n readonly offsetY: number;\n readonly layer: number;\n readonly mask: number;\n constructor(options: ColliderOptions = {}) {\n super();\n this.response = collisionResponse(\n options.response ?? CollisionResponse.Trigger,\n );\n this.shape = options.shape ?? CollisionShape.Box;\n if (\n this.shape !== CollisionShape.Box &&\n this.shape !== CollisionShape.Circle\n )\n throw new EngineError(\"INVALID_VALUE\", \"Unknown collider shape\");\n this.width =\n options.shape === CollisionShape.Circle\n ? 0\n : positive(options.width ?? 32, \"width\");\n this.height =\n options.shape === CollisionShape.Circle\n ? 0\n : positive(options.height ?? 32, \"height\");\n this.radius =\n options.shape === CollisionShape.Circle\n ? positive(options.radius ?? 16, \"radius\")\n : 0;\n this.offsetX = finite(options.offsetX ?? 0, \"offsetX\");\n this.offsetY = finite(options.offsetY ?? 0, \"offsetY\");\n this.layer = collisionBits(options.layer ?? 1, \"layer\", false);\n this.mask = collisionBits(options.mask ?? 0xffffffff, \"mask\", true);\n }\n /** @internal */ notify<T>(type: EventType<T>, contact: T): void {\n this.emit(type, contact);\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport { Transform } from \"../graphics/components\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nexport const BodyType = { Static: \"static\", Dynamic: \"dynamic\" } as const;\nexport type BodyType = (typeof BodyType)[keyof typeof BodyType];\n/** Position-correction participation, not velocity integration or a rigid body. */\nexport class CollisionBody extends Component {\n static readonly type: ComponentType<CollisionBody> =\n defineComponent<CollisionBody>(\"CollisionBody\", [Transform.type]);\n readonly type = CollisionBody.type;\n readonly motion: BodyType;\n readonly mass: number;\n constructor(options: { motion?: BodyType; mass?: number } = {}) {\n super();\n this.motion = options.motion ?? BodyType.Dynamic;\n this.mass = positive(options.mass ?? 1, \"mass\");\n if (\n !Object.values(BodyType).includes(this.motion) ||\n !Number.isFinite(1 / this.mass)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Invalid collision body motion or mass\",\n );\n }\n get inverseMass(): number {\n return this.motion === BodyType.Dynamic ? 1 / this.mass : 0;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { ContactGeometry } from \"./collider\";\nimport type { Manifold } from \"./collision-geometry\";\nimport type { CollisionResponse } from \"./collision-policy\";\nexport type Mutable<T> = { -readonly [K in keyof T]: T[K] };\nexport interface ContactObservation {\n seen: number;\n readonly aContact: Mutable<ContactGeometry>;\n readonly bContact?: Mutable<ContactGeometry>;\n}\n/** One observation path for both public payload families. */\nexport function observeContact(\n pair: ContactObservation,\n pass: number,\n manifold: Manifold,\n response: CollisionResponse,\n sign = 1,\n): void {\n if (\n !Number.isFinite(manifold.depth) ||\n !Number.isFinite(manifold.normalX) ||\n !Number.isFinite(manifold.normalY)\n )\n throw new EngineError(\"INVALID_VALUE\", \"Contact geometry overflowed\");\n const a = pair.aContact,\n b = pair.bContact;\n if (pair.seen !== pass) {\n a.depth = -1;\n a.resolved = false;\n if (b) b.resolved = false;\n }\n if (manifold.depth >= a.depth) {\n a.normalX = sign * manifold.normalX;\n a.normalY = sign * manifold.normalY;\n a.depth = manifold.depth;\n if (b) {\n b.normalX = -a.normalX;\n b.normalY = -a.normalY;\n b.depth = manifold.depth;\n }\n }\n a.response = response;\n if (b) b.response = response;\n pair.seen = pass;\n}\nexport type ContactPhase = \"enter\" | \"stay\" | \"exit\";\nexport function contactPhase(entered: boolean, active: boolean): ContactPhase {\n return active ? (entered ? \"stay\" : \"enter\") : \"exit\";\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { Transform } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\nimport { type Collider, CollisionShape } from \"./collider\";\n\nfunction finite(value: number, name: string): void {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${name} must be finite`);\n}\nexport interface GeometryEntry {\n readonly actor: Actor;\n readonly collider: Collider;\n readonly transform: Transform;\n readonly geometry: Geometry;\n}\n/** Narrow phase needs shape data only, not Actor ownership or a Transform. */\nexport interface ManifoldEntry {\n readonly collider: Pick<Collider, \"shape\">;\n readonly geometry: Geometry;\n}\nexport interface Manifold {\n normalX: number;\n normalY: number;\n depth: number;\n}\nexport function createGeometry(): Geometry {\n return {\n x: 0,\n y: 0,\n hx: 0,\n hy: 0,\n radius: 0,\n cos: 1,\n sin: 0,\n minX: 0,\n maxX: 0,\n minY: 0,\n maxY: 0,\n };\n}\nexport interface Geometry {\n x: number;\n y: number;\n hx: number;\n hy: number;\n radius: number;\n cos: number;\n sin: number;\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\nexport function updateGeometry(entry: GeometryEntry): boolean {\n const t = entry.transform,\n c = entry.collider,\n g = entry.geometry;\n finite(t.x, \"transform.x\");\n finite(t.y, \"transform.y\");\n finite(t.rotation, \"transform.rotation\");\n finite(t.scaleX, \"transform.scaleX\");\n finite(t.scaleY, \"transform.scaleY\");\n const sx = Math.abs(t.scaleX),\n sy = Math.abs(t.scaleY);\n if (sx === 0 || sy === 0) return false;\n if (\n c.shape === CollisionShape.Circle &&\n Math.abs(sx - sy) > 1e-9 * Math.max(sx, sy)\n )\n throw new EngineError(\n \"COLLIDER_SCALE_UNSUPPORTED\",\n \"Circle colliders require uniform absolute scale\",\n { actorId: entry.actor.id },\n );\n g.cos = Math.cos(t.rotation);\n g.sin = Math.sin(t.rotation);\n g.x = t.x + g.cos * c.offsetX * t.scaleX - g.sin * c.offsetY * t.scaleY;\n g.y = t.y + g.sin * c.offsetX * t.scaleX + g.cos * c.offsetY * t.scaleY;\n g.hx = (c.width * sx) / 2;\n g.hy = (c.height * sy) / 2;\n g.radius = c.radius * sx;\n const ex =\n c.shape === CollisionShape.Circle\n ? g.radius\n : Math.abs(g.cos) * g.hx + Math.abs(g.sin) * g.hy;\n const ey =\n c.shape === CollisionShape.Circle\n ? g.radius\n : Math.abs(g.sin) * g.hx + Math.abs(g.cos) * g.hy;\n g.minX = g.x - ex;\n g.maxX = g.x + ex;\n g.minY = g.y - ey;\n g.maxY = g.y + ey;\n if (\n !Number.isFinite(g.x) ||\n !Number.isFinite(g.y) ||\n !Number.isFinite(g.hx) ||\n !Number.isFinite(g.hy) ||\n !Number.isFinite(g.radius) ||\n !Number.isFinite(g.minX) ||\n !Number.isFinite(g.maxX) ||\n !Number.isFinite(g.minY) ||\n !Number.isFinite(g.maxY)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Collider world geometry must be finite\",\n );\n return true;\n}\n\nfunction boxCircle(\n box: Geometry,\n circle: Geometry,\n out: Manifold,\n tolerance: number,\n): boolean {\n const dx = circle.x - box.x,\n dy = circle.y - box.y;\n const x = dx * box.cos + dy * box.sin,\n y = -dx * box.sin + dy * box.cos;\n const cx = Math.max(-box.hx, Math.min(box.hx, x)),\n cy = Math.max(-box.hy, Math.min(box.hy, y));\n const ox = x - cx,\n oy = y - cy,\n distance = Math.hypot(ox, oy);\n let nx: number, ny: number;\n if (distance > 0) {\n if (distance > circle.radius + tolerance) return false;\n nx = ox / distance;\n ny = oy / distance;\n out.depth = Math.max(0, circle.radius - distance);\n } else if (box.hx - Math.abs(x) <= box.hy - Math.abs(y)) {\n nx = x >= 0 ? 1 : -1;\n ny = 0;\n out.depth = circle.radius + box.hx - Math.abs(x);\n } else {\n nx = 0;\n ny = y >= 0 ? 1 : -1;\n out.depth = circle.radius + box.hy - Math.abs(y);\n }\n out.normalX = nx * box.cos - ny * box.sin;\n out.normalY = nx * box.sin + ny * box.cos;\n return true;\n}\nfunction axis(\n a: Geometry,\n b: Geometry,\n x: number,\n y: number,\n out: Manifold,\n tolerance: number,\n): boolean {\n const distance = (b.x - a.x) * x + (b.y - a.y) * y;\n const ar =\n a.hx * Math.abs(a.cos * x + a.sin * y) +\n a.hy * Math.abs(-a.sin * x + a.cos * y);\n const br =\n b.hx * Math.abs(b.cos * x + b.sin * y) +\n b.hy * Math.abs(-b.sin * x + b.cos * y);\n const depth = ar + br - Math.abs(distance);\n if (depth < -tolerance) return false;\n if (depth < out.depth) {\n out.depth = Math.max(0, depth);\n const sign = distance >= 0 ? 1 : -1;\n out.normalX = x * sign;\n out.normalY = y * sign;\n }\n return true;\n}\n/** Exact existing circle/OBB tests, extended to return a minimum translation normal. */\nexport function contactManifold(\n a: ManifoldEntry,\n b: ManifoldEntry,\n out: Manifold,\n tolerance = 0,\n): boolean {\n const ag = a.geometry,\n bg = b.geometry;\n if (a.collider.shape === CollisionShape.Circle) {\n if (b.collider.shape === CollisionShape.Circle) {\n const dx = bg.x - ag.x,\n dy = bg.y - ag.y,\n distance = Math.hypot(dx, dy),\n r = ag.radius + bg.radius;\n if (distance > r + tolerance) return false;\n out.normalX = distance ? dx / distance : 1;\n out.normalY = distance ? dy / distance : 0;\n out.depth = Math.max(0, r - distance);\n return true;\n }\n const hit = boxCircle(bg, ag, out, tolerance);\n out.normalX = -out.normalX;\n out.normalY = -out.normalY;\n return hit;\n }\n if (b.collider.shape === CollisionShape.Circle)\n return boxCircle(ag, bg, out, tolerance);\n out.depth = Infinity;\n return (\n axis(ag, bg, ag.cos, ag.sin, out, tolerance) &&\n axis(ag, bg, -ag.sin, ag.cos, out, tolerance) &&\n axis(ag, bg, bg.cos, bg.sin, out, tolerance) &&\n axis(ag, bg, -bg.sin, bg.cos, out, tolerance)\n );\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { Transform } from \"../graphics/components\";\nimport type { Manifold } from \"./collision-geometry\";\n/** Translate along the minimum separation axis, preserving tangential movement intent. */\nexport function correctPositions(\n a: Pick<Transform, \"x\" | \"y\">,\n b: Pick<Transform, \"x\" | \"y\">,\n contact: Manifold,\n ia: number,\n ib: number,\n): boolean {\n const scale = Math.max(ia, ib);\n if (scale === 0 || contact.depth === 0) return false;\n const total = ia / scale + ib / scale,\n wa = ia / scale / total,\n wb = ib / scale / total;\n const dx = contact.normalX * contact.depth,\n dy = contact.normalY * contact.depth;\n const ax = a.x - dx * wa,\n ay = a.y - dy * wa,\n bx = b.x + dx * wb,\n by = b.y + dy * wb;\n if (\n !Number.isFinite(ax) ||\n !Number.isFinite(ay) ||\n !Number.isFinite(bx) ||\n !Number.isFinite(by)\n )\n throw new EngineError(\"INVALID_VALUE\", \"Position correction overflowed\");\n a.x = ax;\n a.y = ay;\n b.x = bx;\n b.y = by;\n return true;\n}\n","import type { Tilemap } from \"../game/tilemap\";\nimport { CollisionShape } from \"./collider\";\nimport {\n contactManifold,\n type Geometry,\n type Manifold,\n type ManifoldEntry,\n} from \"./collision-geometry\";\nimport { samePolicy } from \"./collision-policy\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n\nexport interface TileRange {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n/** Closed, tolerance-expanded contact bounds; intentionally not worldToTile's point contract. */\nexport function tileRange(\n map: Tilemap<string>,\n g: Geometry,\n tolerance: number,\n out: TileRange,\n): boolean {\n out.x0 = Math.max(\n 0,\n Math.ceil((g.minX - map.x - tolerance) / map.tileWidth) - 1,\n );\n out.y0 = Math.max(\n 0,\n Math.ceil((g.minY - map.y - tolerance) / map.tileHeight) - 1,\n );\n out.x1 = Math.min(\n map.width - 1,\n Math.floor((g.maxX - map.x + tolerance) / map.tileWidth),\n );\n out.y1 = Math.min(\n map.height - 1,\n Math.floor((g.maxY - map.y + tolerance) / map.tileHeight),\n );\n return out.x0 <= out.x1 && out.y0 <= out.y1;\n}\nexport function tileGeometry(\n map: Tilemap<string>,\n x: number,\n y: number,\n g: Geometry,\n): void {\n g.minX = map.x + x * map.tileWidth;\n g.maxX = map.x + (x + 1) * map.tileWidth;\n g.minY = map.y + y * map.tileHeight;\n g.maxY = map.y + (y + 1) * map.tileHeight;\n g.x = g.minX + map.tileWidth / 2;\n g.y = g.minY + map.tileHeight / 2;\n g.hx = map.tileWidth / 2;\n g.hy = map.tileHeight / 2;\n g.radius = 0;\n g.cos = 1;\n g.sin = 0;\n}\n/** @internal Box enclosing an exact rectangular union of cells. */\nexport function tileRegionGeometry(\n map: Tilemap<string>,\n region: TileRange,\n g: Geometry,\n): void {\n tileGeometry(map, region.x0, region.y0, g);\n g.maxX = map.x + (region.x1 + 1) * map.tileWidth;\n g.maxY = map.y + (region.y1 + 1) * map.tileHeight;\n g.hx = (g.maxX - g.minX) / 2;\n g.hy = (g.maxY - g.minY) / 2;\n g.x = g.minX + g.hx;\n g.y = g.minY + g.hy;\n}\nexport const TileFace = {\n Left: 1,\n Right: 2,\n Top: 4,\n Bottom: 8,\n All: 15,\n} as const;\n/** Only equal full policies share topology. No merge/index/cache or renderer dependency. */\nexport function exposedFaces(\n map: Tilemap<string>,\n x: number,\n y: number,\n policy: ResolvedTileCollision,\n): number {\n const equal = (nx: number, ny: number) =>\n map.inBounds(nx, ny) && samePolicy(policy, map.getCollision(nx, ny));\n return (\n (equal(x - 1, y) ? 0 : TileFace.Left) |\n (equal(x + 1, y) ? 0 : TileFace.Right) |\n (equal(x, y - 1) ? 0 : TileFace.Top) |\n (equal(x, y + 1) ? 0 : TileFace.Bottom)\n );\n}\n/** Does a finite boundary segment intersect the OBB? Slabs in Actor-local coordinates. */\nfunction segmentBox(\n g: Geometry,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n tolerance: number,\n): boolean {\n const ax = (x0 - g.x) * g.cos + (y0 - g.y) * g.sin;\n const ay = -(x0 - g.x) * g.sin + (y0 - g.y) * g.cos;\n const bx = (x1 - g.x) * g.cos + (y1 - g.y) * g.sin;\n const by = -(x1 - g.x) * g.sin + (y1 - g.y) * g.cos;\n let low = 0,\n high = 1;\n for (const [p, d, half] of [\n [ax, bx - ax, g.hx],\n [ay, by - ay, g.hy],\n ]) {\n if (p === undefined || d === undefined || half === undefined) return false;\n if (Math.abs(d) < 1e-15) {\n if (Math.abs(p) > half + tolerance) return false;\n } else {\n const a = (-half - tolerance - p) / d,\n b = (half + tolerance - p) / d;\n low = Math.max(low, Math.min(a, b));\n high = Math.min(high, Math.max(a, b));\n if (low > high) return false;\n }\n }\n return true;\n}\n/**\n * Keep the exact circle/OBB manifold at exposed faces and convex corners.\n * A manifold using an internal face/vertex is replaced only by a real exposed\n * face intersection. Its axis is geometric, not a rounded arbitrary normal.\n */\nexport function tileResponseManifold(\n a: ManifoldEntry,\n b: ManifoldEntry,\n faces: number,\n out: Manifold,\n tolerance: number,\n): boolean {\n if (!contactManifold(a, b, out, tolerance)) return false;\n if (faces === TileFace.All) return true;\n const nx = out.normalX,\n ny = out.normalY;\n const xFace =\n Math.abs(nx) <= 1e-10 ? 0 : nx > 0 ? TileFace.Left : TileFace.Right;\n const yFace =\n Math.abs(ny) <= 1e-10 ? 0 : ny > 0 ? TileFace.Top : TileFace.Bottom;\n if ((!xFace || faces & xFace) && (!yFace || faces & yFace)) return true;\n const g = a.geometry,\n tile = b.geometry;\n const inside =\n g.x >= tile.minX &&\n g.x <= tile.maxX &&\n g.y >= tile.minY &&\n g.y <= tile.maxY;\n let best = Infinity,\n bestX = 0,\n bestY = 0;\n const face = (\n flag: number,\n depth: number,\n x: number,\n y: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n ) => {\n if (!(faces & flag) || depth < -tolerance || depth >= best) return;\n const intersects =\n a.collider.shape === CollisionShape.Circle\n ? x !== 0\n ? g.y >= y0 - tolerance && g.y <= y1 + tolerance\n : g.x >= x0 - tolerance && g.x <= x1 + tolerance\n : segmentBox(g, x0, y0, x1, y1, tolerance);\n if (!inside && !intersects) return;\n best = Math.max(0, depth);\n bestX = x;\n bestY = y;\n };\n face(\n TileFace.Left,\n g.maxX - tile.minX,\n 1,\n 0,\n tile.minX,\n tile.minY,\n tile.minX,\n tile.maxY,\n );\n face(\n TileFace.Right,\n tile.maxX - g.minX,\n -1,\n 0,\n tile.maxX,\n tile.minY,\n tile.maxX,\n tile.maxY,\n );\n face(\n TileFace.Top,\n g.maxY - tile.minY,\n 0,\n 1,\n tile.minX,\n tile.minY,\n tile.maxX,\n tile.minY,\n );\n face(\n TileFace.Bottom,\n tile.maxY - g.minY,\n 0,\n -1,\n tile.minX,\n tile.maxY,\n tile.maxX,\n tile.maxY,\n );\n if (!Number.isFinite(best)) return false;\n out.normalX = bestX;\n out.normalY = bestY;\n out.depth = best;\n return true;\n}\n","import { samePolicy } from \"./collision-policy\";\nimport type { TileRange } from \"./tile-collision-geometry\";\nimport type { Tilemap } from \"./tilemap\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n\nconst chunkSize = 16;\n/** @internal Inclusive tile bounds, independent of placement translation and image frames. */\nexport interface TileCollisionRegion extends TileRange {\n readonly policy: ResolvedTileCollision;\n}\ninterface Chunk {\n readonly regions: TileCollisionRegion[];\n readonly ids: Set<number | string>;\n readonly cells: number;\n}\n/**\n * Optional candidate index. Equal-policy horizontal runs extend vertically only\n * when their extents match. Cell manifolds/events remain the World's authority.\n */\nexport class TileCollisionIndex {\n private readonly chunks = new Map<number, Chunk>();\n private readonly columns: number;\n private readonly off: (() => void)[];\n private builds = 0;\n private builtCells = 0;\n private disposed = false;\n constructor(private readonly map: Tilemap<string>) {\n this.columns = Math.ceil(map.width / chunkSize);\n this.off = [\n map.onCollisionChanged((change) => {\n if (change.kind === \"cell\") this.invalidate(change.index);\n else if (change.kind === \"all\") this.chunks.clear();\n else\n for (const [key, chunk] of this.chunks)\n if (chunk.ids.has(change.tile)) this.chunks.delete(key);\n }),\n // Equal-policy image edits still change which future ID-default edits matter.\n map.onTilesChanged((index) => {\n if (index === null) this.chunks.clear();\n else this.invalidate(index);\n }),\n map.onDispose(() => this.dispose()),\n ];\n }\n private key(x: number, y: number): number {\n return Math.floor(y / chunkSize) * this.columns + Math.floor(x / chunkSize);\n }\n private invalidate(index: number): void {\n this.chunks.delete(\n this.key(index % this.map.width, Math.floor(index / this.map.width)),\n );\n }\n private build(cx: number, cy: number): Chunk {\n const map = this.map;\n const x0 = cx * chunkSize,\n y0 = cy * chunkSize;\n const x1 = Math.min(map.width, x0 + chunkSize),\n y1 = Math.min(map.height, y0 + chunkSize);\n const regions: TileCollisionRegion[] = [],\n ids = new Set<number | string>();\n let previous = new Map<string, TileCollisionRegion>();\n let cells = 0;\n for (let y = y0; y < y1; y++) {\n const current = new Map<string, TileCollisionRegion>();\n for (let x = x0; x < x1; ) {\n const start = x,\n policy = map.getCollision(x, y);\n const remember = (tx: number) => {\n const id = map.get(tx, y);\n if (id !== null) ids.add(id);\n };\n remember(x++);\n if (!policy) continue;\n while (x < x1 && samePolicy(policy, map.getCollision(x, y)))\n remember(x++);\n cells += x - start;\n const key = `${start}:${x}:${policy.response}:${policy.layer}:${policy.mask}`;\n let region = previous.get(key);\n if (region) region.y1 = y;\n else {\n region = { x0: start, x1: x - 1, y0: y, y1: y, policy };\n regions.push(region);\n }\n current.set(key, region);\n }\n previous = current;\n }\n this.builds++;\n this.builtCells += (x1 - x0) * (y1 - y0);\n return { regions, ids, cells };\n }\n /** @internal Produces each eligible cell once, in the same row-major order as direct search. */\n query(\n range: TileRange,\n accept: (region: TileCollisionRegion) => boolean,\n out: number[],\n ): void {\n out.length = 0;\n if (this.disposed) return;\n for (\n let cy = Math.floor(range.y0 / chunkSize);\n cy <= Math.floor(range.y1 / chunkSize);\n cy++\n )\n for (\n let cx = Math.floor(range.x0 / chunkSize);\n cx <= Math.floor(range.x1 / chunkSize);\n cx++\n ) {\n const key = cy * this.columns + cx;\n let chunk = this.chunks.get(key);\n if (!chunk) {\n chunk = this.build(cx, cy);\n this.chunks.set(key, chunk);\n }\n for (const region of chunk.regions) {\n const x0 = Math.max(range.x0, region.x0),\n x1 = Math.min(range.x1, region.x1);\n const y0 = Math.max(range.y0, region.y0),\n y1 = Math.min(range.y1, region.y1);\n if (x0 > x1 || y0 > y1 || !accept(region)) continue;\n for (let y = y0; y <= y1; y++)\n for (let x = x0; x <= x1; x++) out.push(y * this.map.width + x);\n }\n }\n out.sort((a, b) => a - b);\n }\n get diagnostics() {\n let regions = 0,\n cells = 0;\n for (const chunk of this.chunks.values()) {\n regions += chunk.regions.length;\n cells += chunk.cells;\n }\n return {\n chunks: this.chunks.size,\n regions,\n cells,\n builds: this.builds,\n builtCells: this.builtCells,\n };\n }\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const off of this.off) off();\n this.chunks.clear();\n }\n}\n","import { defineEvent } from \"../foundation/events\";\nimport type { Tilemap } from \"../game/tilemap\";\nimport type { Actor } from \"../scene/actor\";\nimport type { Collider, ContactGeometry } from \"./collider\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n/** Cell observation at detection; delivered after all position correction. */\nexport interface TileContact extends ContactGeometry {\n readonly self: Collider;\n readonly selfActor: Actor;\n readonly map: Tilemap<string>;\n readonly tileX: number;\n readonly tileY: number;\n readonly tileId: number | string | null;\n /** Frozen normalized cell policy at observation, distinct from the pair response. */\n readonly policy: ResolvedTileCollision;\n}\nexport const TileContactEnter = defineEvent<TileContact>(\"TileContactEnter\");\nexport const TileContactStay = defineEvent<TileContact>(\"TileContactStay\");\nexport const TileContactExit = defineEvent<TileContact>(\"TileContactExit\");\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { EventType } from \"../foundation/events\";\nimport { Lifetime } from \"../foundation/lifetime\";\nimport { type Tilemap, TilemapLayer } from \"../game/tilemap\";\nimport { Transform } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\nimport { type Scene, SceneState } from \"../scene/scene\";\nimport {\n Collider,\n CollisionResponse,\n CollisionShape,\n type Contact,\n ContactEnter,\n ContactExit,\n ContactStay,\n} from \"./collider\";\nimport { CollisionBody } from \"./collision-body\";\nimport {\n contactPhase,\n type Mutable,\n observeContact,\n} from \"./collision-contact\";\nimport {\n contactManifold,\n createGeometry,\n type Geometry,\n type Manifold,\n updateGeometry,\n} from \"./collision-geometry\";\nimport { allowsPair, pairResponse } from \"./collision-policy\";\nimport { correctPositions } from \"./collision-response\";\nimport {\n exposedFaces,\n tileGeometry,\n tileRange,\n tileRegionGeometry,\n tileResponseManifold,\n} from \"./tile-collision-geometry\";\nimport { TileCollisionIndex } from \"./tile-collision-index\";\nimport {\n type TileContact,\n TileContactEnter,\n TileContactExit,\n TileContactStay,\n} from \"./tile-contact\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n\nexport * from \"./collider\";\nexport * from \"./collision-body\";\nexport * from \"./tile-contact\";\n\ninterface Entry {\n readonly id: number;\n readonly collider: Collider;\n readonly actor: Actor;\n readonly transform: Transform;\n readonly geometry: Geometry;\n}\ninterface MapEntry {\n readonly id: number;\n readonly map: Tilemap<string>;\n /** Geometry records exist only for observed cells, shared by their contact pairs. */\n readonly targets: Map<number, TileTarget>;\n readonly index?: TileCollisionIndex;\n}\ninterface TileTarget {\n readonly owner: MapEntry;\n readonly index: number;\n readonly x: number;\n readonly y: number;\n readonly collider: { readonly shape: typeof CollisionShape.Box };\n readonly geometry: Geometry;\n policy: ResolvedTileCollision;\n users: number;\n}\ninterface PairState {\n seen: number;\n aEntered: boolean;\n bEntered: boolean;\n}\ninterface ActorPair extends PairState {\n readonly kind: \"actor\";\n readonly a: Entry;\n readonly b: Entry;\n readonly aContact: Mutable<Contact>;\n readonly bContact: Mutable<Contact>;\n}\ninterface TilePair extends PairState {\n readonly kind: \"tile\";\n readonly a: Entry;\n readonly b: TileTarget;\n readonly aContact: Mutable<TileContact>;\n previous: TileContact | undefined;\n}\ntype Pair = ActorPair | TilePair;\nexport interface CollisionWorldOptions {\n /** Direct cells suit small Actors; rectangles cache equal-policy 16x16 chunks. */\n tileSearch?: \"cells\" | \"rectangles\";\n iterations?: number;\n tolerance?: number;\n}\nconst sceneWorlds = new WeakMap<Scene, CollisionWorld>();\nconst actorEvents = {\n enter: ContactEnter,\n stay: ContactStay,\n exit: ContactExit,\n};\nconst tileEvents = {\n enter: TileContactEnter,\n stay: TileContactStay,\n exit: TileContactExit,\n};\nconst tileShape = { shape: CollisionShape.Box } as const;\n/** One Scene-owned candidate/response/contact pipeline, with typed delivery at its boundary. */\nexport class CollisionWorld {\n private readonly lifetime = new Lifetime();\n private readonly entries = new Map<Collider, Entry>();\n private readonly maps = new Map<Tilemap<string>, MapEntry>();\n private readonly pairs = new Map<Entry, Map<Entry | TileTarget, Pair>>();\n private readonly sorted: Entry[] = [];\n private readonly activeMaps: MapEntry[] = [];\n private readonly delivery: Pair[] = [];\n private readonly solving: Pair[] = [];\n private readonly manifold: Manifold = { normalX: 0, normalY: 0, depth: 0 };\n private readonly scratchTile = {\n collider: tileShape,\n geometry: createGeometry(),\n };\n private readonly range = { x0: 0, y0: 0, x1: 0, y1: 0 };\n private readonly tileSearch: \"cells\" | \"rectangles\";\n private readonly tileCells: number[] = [];\n private regionTests = 0;\n private regionNarrowTests = 0;\n private readonly iterations: number;\n private readonly tolerance: number;\n private corrections = 0;\n private solverPasses = 0;\n private unresolved = 0;\n private revision = -1;\n private serial = 0;\n private mapSerial = 0;\n private pass = 0;\n private stepping = false;\n private contactCount = 0;\n private candidates = 0;\n private tests = 0;\n private tileCount = 0;\n private tileCandidates = 0;\n private policyRejected = 0;\n private tileTests = 0;\n private tileCorrections = 0;\n private tileResponseTests = 0;\n private tileUnresolved = 0;\n private neighborProbes = 0;\n constructor(\n readonly scene: Scene,\n options: CollisionWorldOptions = {},\n ) {\n this.tileSearch = options.tileSearch ?? \"cells\";\n if (this.tileSearch !== \"cells\" && this.tileSearch !== \"rectangles\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"tileSearch must be cells or rectangles\",\n );\n this.iterations = options.iterations ?? 6;\n this.tolerance = options.tolerance ?? 1e-7;\n if (\n !Number.isInteger(this.iterations) ||\n this.iterations < 1 ||\n this.iterations > 32 ||\n !Number.isFinite(this.tolerance) ||\n this.tolerance < 0\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Collision iterations must be 1..32 and tolerance must be finite and nonnegative\",\n );\n if (sceneWorlds.has(scene))\n throw new EngineError(\n \"COLLISION_WORLD_DUPLICATE\",\n \"Only one automatic collision world may own a scene\",\n );\n this.lifetime.onDispose(scene.onPostUpdate(() => this.step()));\n this.lifetime.onDispose(scene.onDispose(() => this.dispose()));\n sceneWorlds.set(scene, this);\n this.lifetime.onDispose(() => {\n sceneWorlds.delete(scene);\n });\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n /** Actor broad-phase counters retain their existing meaning; terrain is separate below. */\n get diagnostics() {\n return {\n colliders: this.entries.size,\n contacts: this.contactCount,\n candidates: this.candidates,\n narrowTests: this.tests,\n };\n }\n get responseDiagnostics() {\n return {\n passes: this.solverPasses,\n corrections: this.corrections,\n unresolved: this.unresolved,\n };\n }\n get tileDiagnostics() {\n let retainedCells = 0;\n for (const entry of this.maps.values()) retainedCells += entry.targets.size;\n return {\n maps: this.maps.size,\n candidateCells: this.tileCandidates,\n policyRejected: this.policyRejected,\n narrowTests: this.tileTests,\n contacts: this.tileCount,\n corrections: this.tileCorrections,\n responseTests: this.tileResponseTests,\n unresolved: this.tileUnresolved,\n neighborProbes: this.neighborProbes,\n retainedCells,\n };\n }\n /** Cached candidate geometry only; not public contact/response shape counts. */\n get tileIndexDiagnostics() {\n let chunks = 0,\n regions = 0,\n cells = 0,\n builds = 0,\n builtCells = 0;\n for (const entry of this.maps.values()) {\n const d = entry.index?.diagnostics;\n if (!d) continue;\n chunks += d.chunks;\n regions += d.regions;\n cells += d.cells;\n builds += d.builds;\n builtCells += d.builtCells;\n }\n return {\n mode: this.tileSearch,\n chunks,\n regions,\n cells,\n builds,\n builtCells,\n regionTests: this.regionTests,\n regionNarrowTests: this.regionNarrowTests,\n };\n }\n contactsFor(collider: Collider): readonly Contact[] {\n const contacts: Contact[] = [];\n for (const group of this.pairs.values())\n for (const pair of group.values())\n if (\n pair.kind === \"actor\" &&\n pair.seen === this.pass &&\n this.valid(pair)\n ) {\n if (pair.a.collider === collider) contacts.push({ ...pair.aContact });\n else if (pair.b.collider === collider)\n contacts.push({ ...pair.bContact });\n }\n return contacts;\n }\n tileContactsFor(collider: Collider): readonly TileContact[] {\n const entry = this.entries.get(collider),\n contacts: TileContact[] = [];\n if (entry)\n for (const pair of this.pairs.get(entry)?.values() ?? [])\n if (pair.kind === \"tile\" && pair.seen === this.pass && this.valid(pair))\n contacts.push({ ...pair.aContact });\n return contacts;\n }\n private inverseMass(entry: Entry): number {\n const body = entry.actor.get(CollisionBody.type);\n return body?.enabled ? body.inverseMass : 0;\n }\n private eligible(entry: Entry): boolean {\n return (\n !entry.collider.disposed &&\n entry.collider.enabled &&\n !entry.actor.disposed &&\n entry.actor.enabled &&\n entry.actor.scene === this.scene &&\n entry.actor.get(Collider.type) === entry.collider\n );\n }\n private mapEligible(map: Tilemap<string>): boolean {\n return (\n !map.disposed &&\n map.enabled &&\n map.collisionEnabled &&\n map.scene === this.scene\n );\n }\n private valid(pair: Pair): boolean {\n return (\n this.eligible(pair.a) &&\n (pair.kind === \"actor\"\n ? this.eligible(pair.b)\n : this.mapEligible(pair.b.owner.map))\n );\n }\n private reconcile(): void {\n if (this.revision === this.scene.revision) return;\n this.revision = this.scene.revision;\n for (const [collider, entry] of this.entries)\n if (\n collider.disposed ||\n entry.actor.scene !== this.scene ||\n entry.actor.get(Collider.type) !== collider\n )\n this.entries.delete(collider);\n for (const [map] of this.maps)\n if (map.disposed || map.scene !== this.scene) {\n this.maps.get(map)?.index?.dispose();\n this.maps.delete(map);\n }\n for (const actor of this.scene.actors) {\n const collider = actor.get(Collider.type);\n if (collider && !this.entries.has(collider))\n this.entries.set(collider, {\n id: ++this.serial,\n collider,\n actor,\n transform: actor.require(Transform.type),\n geometry: createGeometry(),\n });\n const map = actor.get(TilemapLayer.type)?.map;\n if (map && !this.maps.has(map))\n this.maps.set(map, {\n id: ++this.mapSerial,\n map,\n targets: new Map(),\n ...(this.tileSearch === \"rectangles\"\n ? { index: new TileCollisionIndex(map) }\n : {}),\n });\n }\n }\n private group(a: Entry): Map<Entry | TileTarget, Pair> {\n let group = this.pairs.get(a);\n if (!group) {\n group = new Map();\n this.pairs.set(a, group);\n }\n return group;\n }\n private actorPair(a: Entry, b: Entry): ActorPair {\n let sign = 1;\n if (a.id > b.id) {\n const swap = a;\n a = b;\n b = swap;\n sign = -1;\n }\n const group = this.group(a);\n let pair = group.get(b) as ActorPair | undefined;\n if (!pair) {\n pair = {\n kind: \"actor\",\n a,\n b,\n seen: this.pass,\n aEntered: false,\n bEntered: false,\n aContact: {\n normalX: 0,\n normalY: 0,\n depth: 0,\n response: CollisionResponse.Trigger,\n resolved: false,\n self: a.collider,\n other: b.collider,\n selfActor: a.actor,\n otherActor: b.actor,\n },\n bContact: {\n normalX: 0,\n normalY: 0,\n depth: 0,\n response: CollisionResponse.Trigger,\n resolved: false,\n self: b.collider,\n other: a.collider,\n selfActor: b.actor,\n otherActor: a.actor,\n },\n };\n group.set(b, pair);\n this.contactCount++;\n }\n observeContact(\n pair,\n this.pass,\n this.manifold,\n pairResponse(a.collider, b.collider),\n sign,\n );\n return pair;\n }\n private tilePair(\n a: Entry,\n owner: MapEntry,\n x: number,\n y: number,\n policy: ResolvedTileCollision,\n ): TilePair {\n const index = y * owner.map.width + x;\n let target = owner.targets.get(index);\n if (!target) {\n target = {\n owner,\n index,\n x,\n y,\n collider: tileShape,\n geometry: createGeometry(),\n policy,\n users: 0,\n };\n owner.targets.set(index, target);\n }\n target.policy = policy;\n tileGeometry(owner.map, x, y, target.geometry);\n const group = this.group(a);\n let pair = group.get(target) as TilePair | undefined;\n const response = pairResponse(a.collider, policy);\n if (!pair) {\n pair = {\n kind: \"tile\",\n a,\n b: target,\n seen: this.pass,\n aEntered: false,\n bEntered: false,\n previous: undefined,\n aContact: {\n normalX: 0,\n normalY: 0,\n depth: 0,\n response,\n resolved: false,\n self: a.collider,\n selfActor: a.actor,\n map: owner.map,\n tileX: x,\n tileY: y,\n tileId: owner.map.get(x, y),\n policy,\n },\n };\n group.set(target, pair);\n target.users++;\n this.tileCount++;\n }\n if (pair.seen !== this.pass && pair.aContact.response !== response) {\n if (pair.aEntered) pair.previous = { ...pair.aContact };\n pair.aEntered = false;\n }\n observeContact(pair, this.pass, this.manifold, response);\n pair.aContact.tileId = owner.map.get(x, y);\n pair.aContact.policy = policy;\n return pair;\n }\n private remove(pair: Pair): void {\n const group = this.pairs.get(pair.a);\n if (group?.delete(pair.b)) {\n if (pair.kind === \"actor\") this.contactCount--;\n else {\n this.tileCount--;\n if (--pair.b.users === 0) pair.b.owner.targets.delete(pair.b.index);\n }\n }\n if (!group?.size) this.pairs.delete(pair.a);\n }\n private capture(): void {\n this.sorted.length = 0;\n for (const entry of this.entries.values())\n if (this.eligible(entry) && updateGeometry(entry))\n this.sorted.push(entry);\n this.sorted.sort(\n (a, b) => a.geometry.minX - b.geometry.minX || a.id - b.id,\n );\n this.activeMaps.length = 0;\n for (const entry of this.maps.values())\n if (this.mapEligible(entry.map) && entry.map.hasCollision)\n this.activeMaps.push(entry);\n }\n private scanActors(solidOnly: boolean): void {\n for (let i = 0; i < this.sorted.length; i++) {\n const a = this.sorted[i];\n if (!a) continue;\n for (let j = i + 1; j < this.sorted.length; j++) {\n const b = this.sorted[j];\n if (!b || b.geometry.minX > a.geometry.maxX + this.tolerance) break;\n this.candidates++;\n const solid =\n pairResponse(a.collider, b.collider) === CollisionResponse.Solid;\n if (\n (solidOnly && !solid) ||\n a.geometry.maxY + this.tolerance < b.geometry.minY ||\n b.geometry.maxY + this.tolerance < a.geometry.minY ||\n !allowsPair(a.collider, b.collider)\n )\n continue;\n this.tests++;\n if (contactManifold(a, b, this.manifold, this.tolerance)) {\n const pair = this.actorPair(a, b);\n if (solidOnly) this.solving.push(pair);\n else if (\n solid &&\n this.manifold.depth > this.tolerance &&\n (this.inverseMass(a) > 0 || this.inverseMass(b) > 0)\n )\n this.unresolved++;\n }\n }\n }\n }\n private scanTiles(solidOnly: boolean): void {\n for (const a of this.sorted)\n for (const owner of this.activeMaps) {\n const map = owner.map;\n if (!tileRange(map, a.geometry, this.tolerance, this.range)) continue;\n if (owner.index) {\n owner.index.query(\n this.range,\n (region) => {\n this.regionTests++;\n if (\n (solidOnly &&\n pairResponse(a.collider, region.policy) !==\n CollisionResponse.Solid) ||\n !allowsPair(a.collider, region.policy)\n )\n return false;\n this.regionNarrowTests++;\n tileRegionGeometry(map, region, this.scratchTile.geometry);\n return contactManifold(\n a,\n this.scratchTile,\n this.manifold,\n this.tolerance,\n );\n },\n this.tileCells,\n );\n for (const index of this.tileCells)\n this.scanTile(\n a,\n owner,\n index % map.width,\n Math.floor(index / map.width),\n solidOnly,\n );\n } else {\n for (let y = this.range.y0; y <= this.range.y1; y++)\n for (let x = this.range.x0; x <= this.range.x1; x++)\n this.scanTile(a, owner, x, y, solidOnly);\n }\n }\n }\n private scanTile(\n a: Entry,\n owner: MapEntry,\n x: number,\n y: number,\n solidOnly: boolean,\n ): void {\n this.tileCandidates++;\n const policy = owner.map.getCollision(x, y);\n const solid =\n policy && pairResponse(a.collider, policy) === CollisionResponse.Solid;\n if (!policy || (solidOnly && !solid) || !allowsPair(a.collider, policy)) {\n this.policyRejected++;\n return;\n }\n this.tileTests++;\n tileGeometry(owner.map, x, y, this.scratchTile.geometry);\n if (!contactManifold(a, this.scratchTile, this.manifold, this.tolerance))\n return;\n const pair = this.tilePair(a, owner, x, y, policy);\n if (solidOnly) this.solving.push(pair);\n else if (\n solid &&\n this.manifold.depth > this.tolerance &&\n this.inverseMass(a) > 0\n ) {\n this.unresolved++;\n this.tileUnresolved++;\n }\n }\n private compare(a: Pair, b: Pair): number {\n if (a.kind !== b.kind) return a.kind === \"actor\" ? -1 : 1;\n if (a.kind === \"actor\" && b.kind === \"actor\")\n return a.a.id - b.a.id || a.b.id - b.b.id;\n if (a.kind === \"tile\" && b.kind === \"tile\")\n return (\n a.a.id - b.a.id || a.b.owner.id - b.b.owner.id || a.b.index - b.b.index\n );\n return 0;\n }\n private correct(pair: Pair): boolean {\n updateGeometry(pair.a);\n let hit: boolean;\n if (pair.kind === \"actor\") {\n updateGeometry(pair.b);\n hit = contactManifold(pair.a, pair.b, this.manifold, this.tolerance);\n } else {\n tileGeometry(pair.b.owner.map, pair.b.x, pair.b.y, pair.b.geometry);\n this.tileResponseTests++;\n this.neighborProbes += 4;\n hit = tileResponseManifold(\n pair.a,\n pair.b,\n exposedFaces(pair.b.owner.map, pair.b.x, pair.b.y, pair.b.policy),\n this.manifold,\n this.tolerance,\n );\n }\n if (!hit || this.manifold.depth <= this.tolerance) return false;\n const moved = correctPositions(\n pair.a.transform,\n pair.kind === \"actor\" ? pair.b.transform : pair.b.geometry,\n this.manifold,\n this.inverseMass(pair.a),\n pair.kind === \"actor\" ? this.inverseMass(pair.b) : 0,\n );\n if (moved) {\n this.corrections++;\n pair.aContact.resolved = true;\n if (pair.kind === \"actor\") pair.bContact.resolved = true;\n else this.tileCorrections++;\n }\n return moved;\n }\n private notify<T>(\n collider: Collider,\n type: EventType<T>,\n contact: T,\n errors: unknown[],\n ): void {\n try {\n collider.notify(type, contact);\n } catch (error) {\n errors.push(error);\n }\n }\n private deliver(errors: unknown[]): void {\n this.delivery.length = 0;\n for (const group of this.pairs.values())\n for (const pair of group.values()) this.delivery.push(pair);\n this.delivery.sort((a, b) => this.compare(a, b));\n for (const pair of this.delivery) {\n if (this.disposed) break;\n if (pair.kind === \"tile\" && pair.previous) {\n const previous = pair.previous;\n pair.previous = undefined;\n if (!pair.a.collider.disposed)\n this.notify(pair.a.collider, TileContactExit, previous, errors);\n if (this.disposed) break;\n }\n const active = pair.seen === this.pass && this.valid(pair);\n const phase = contactPhase(pair.aEntered, active);\n if (!active) {\n this.remove(pair);\n if (pair.aEntered && !pair.a.collider.disposed) {\n if (pair.kind === \"actor\")\n this.notify(\n pair.a.collider,\n actorEvents[phase],\n pair.aContact,\n errors,\n );\n else\n this.notify(\n pair.a.collider,\n tileEvents[phase],\n pair.aContact,\n errors,\n );\n }\n if (\n !this.disposed &&\n pair.kind === \"actor\" &&\n pair.bEntered &&\n !pair.b.collider.disposed\n )\n this.notify(pair.b.collider, ContactExit, pair.bContact, errors);\n continue;\n }\n pair.aEntered = true;\n if (pair.kind === \"actor\")\n this.notify(pair.a.collider, actorEvents[phase], pair.aContact, errors);\n else\n this.notify(pair.a.collider, tileEvents[phase], pair.aContact, errors);\n if (this.disposed || !this.valid(pair)) continue;\n if (pair.kind === \"actor\") {\n const bPhase = contactPhase(pair.bEntered, true);\n pair.bEntered = true;\n this.notify(\n pair.b.collider,\n actorEvents[bPhase],\n pair.bContact,\n errors,\n );\n }\n }\n }\n step(): void {\n if (this.disposed)\n throw new EngineError(\n \"COLLISION_WORLD_DISPOSED\",\n \"Collision world has been disposed\",\n );\n if (this.stepping)\n throw new EngineError(\n \"COLLISION_REENTRANT\",\n \"Contact delivery cannot recursively step the same world\",\n );\n if (this.scene.state !== SceneState.Active)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Contact detection requires an active scene\",\n );\n this.stepping = true;\n this.pass++;\n this.regionTests = this.regionNarrowTests = 0;\n this.candidates =\n this.tests =\n this.tileCandidates =\n this.policyRejected =\n this.tileTests =\n this.tileResponseTests =\n this.neighborProbes =\n 0;\n this.corrections =\n this.solverPasses =\n this.unresolved =\n this.tileCorrections =\n this.tileUnresolved =\n 0;\n const errors: unknown[] = [];\n try {\n this.reconcile();\n this.capture(); // Validate all Actor geometry before any translation.\n if (\n this.sorted.some(\n (entry) =>\n entry.collider.response === CollisionResponse.Solid &&\n this.inverseMass(entry) > 0,\n )\n ) {\n for (let iteration = 0; iteration < this.iterations; iteration++) {\n this.solving.length = 0;\n this.scanActors(true);\n this.scanTiles(true);\n this.solving.sort((a, b) => this.compare(a, b));\n let changed = false;\n this.solverPasses++;\n for (const pair of this.solving)\n changed = this.correct(pair) || changed;\n if (!changed) break;\n this.capture();\n }\n }\n // Triggers sample final positions; encountered Solid pairs remain observed for this pass.\n this.scanActors(false);\n this.scanTiles(false);\n this.deliver(errors);\n if (errors.length)\n throw new AggregateError(errors, \"Contact handlers failed\");\n } finally {\n this.stepping = false;\n this.sorted.length =\n this.activeMaps.length =\n this.solving.length =\n this.delivery.length =\n 0;\n }\n }\n dispose(): void {\n if (this.disposed) return;\n try {\n this.lifetime.dispose();\n } finally {\n this.entries.clear();\n for (const entry of this.maps.values()) entry.index?.dispose();\n this.maps.clear();\n this.pairs.clear();\n this.sorted.length =\n this.activeMaps.length =\n this.solving.length =\n this.delivery.length =\n 0;\n this.tileCells.length = 0;\n this.contactCount = this.tileCount = 0;\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Grid } from \"../foundation/grid\";\nimport {\n containsScreenPoint,\n type ScreenPoint,\n screenToWorld,\n type ViewTransform,\n type WorldPoint,\n worldPoint,\n} from \"../graphics/coordinates\";\nimport type { TileBounds, TileGeometry } from \"../graphics/tile-geometry\";\nimport { Actor, type ActorOptions } from \"../scene/actor\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nimport type { Scene } from \"../scene/scene\";\nimport type { TilePoint } from \"./tilemap\";\n\nexport type TileColor = number | null;\nexport interface GeometryTilemapOptions extends ActorOptions {\n geometry: TileGeometry;\n tiles: Grid<TileColor> | readonly (readonly TileColor[])[];\n x?: number;\n y?: number;\n zIndex?: number;\n visible?: boolean;\n}\nfunction color(value: TileColor): TileColor {\n if (\n value !== null &&\n (!Number.isInteger(value) || value < 0 || value > 0xffffff)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile color must be a 24-bit RGB integer or null\",\n );\n return value;\n}\nfunction finite(value: number): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", \"Map placement must be finite\");\n return value;\n}\n/** One Scene-owned color layer. Geometry is independent of copied finite Grid data.\n * Hex x/y indices mean axial q/r; the finite map is a q/r parallelogram.\n * No sheet/image ownership or automatic terrain collision is attached.\n */\nexport class GeometryTilemap {\n private readonly owner: Actor;\n readonly geometry: TileGeometry;\n private readonly cells: Grid<TileColor>;\n private readonly extent: TileBounds;\n private readonly listeners = new Set<(index: number | null) => void>();\n private version = 0;\n private left = 0;\n private top = 0;\n private depth = 0;\n private shown = true;\n constructor(options: GeometryTilemapOptions) {\n this.owner = new Actor(options);\n this.geometry = options.geometry;\n const input = options.tiles;\n if (input instanceof Grid) {\n this.cells = Grid.generate(input.width, input.height, (x, y) =>\n color(input.get(x, y)),\n );\n } else {\n if (\n !Array.isArray(input) ||\n !input.length ||\n !Array.isArray(input[0]) ||\n !input[0].length ||\n input.some(\n (row) => !Array.isArray(row) || row.length !== input[0]?.length,\n )\n )\n throw new EngineError(\n \"GRID_SIZE\",\n \"GeometryTilemap rows must form a nonempty rectangle\",\n );\n this.cells = Grid.generate(input[0].length, input.length, (x, y) =>\n color(input[y]?.[x] as TileColor),\n );\n }\n const first = this.geometry.bounds(0, 0),\n last = this.geometry.bounds(this.width - 1, this.height - 1);\n this.extent = {\n x: first.x,\n y: first.y,\n width: finite(last.x + last.width - first.x),\n height: finite(last.y + last.height - first.y),\n };\n this.x = options.x ?? 0;\n this.y = options.y ?? 0;\n this.zIndex = options.zIndex ?? 0;\n this.visible = options.visible ?? true;\n this.owner.add(new GeometryTilemapLayer(this));\n }\n place(scene: Scene): this {\n scene.add(this.owner);\n return this;\n }\n get scene(): Scene | undefined {\n return this.owner.scene;\n }\n get disposed(): boolean {\n return this.owner.disposed;\n }\n get enabled(): boolean {\n return this.owner.enabled;\n }\n set enabled(value: boolean) {\n this.owner.enabled = value;\n }\n dispose(): void {\n this.owner.dispose();\n }\n onDispose(callback: () => void): () => void {\n return this.owner.onDispose(callback);\n }\n private alive(): void {\n if (this.disposed)\n throw new EngineError(\n \"ACTOR_DISPOSED\",\n \"GeometryTilemap has been disposed\",\n );\n }\n get width(): number {\n return this.cells.width;\n }\n get height(): number {\n return this.cells.height;\n }\n get revision(): number {\n return this.version;\n }\n get x(): number {\n return this.left;\n }\n set x(value: number) {\n this.alive();\n finite(value);\n const b = this.extent;\n finite(value + b.x);\n finite(value + b.x + b.width);\n this.left = value;\n }\n get y(): number {\n return this.top;\n }\n set y(value: number) {\n this.alive();\n finite(value);\n const b = this.extent;\n finite(value + b.y);\n finite(value + b.y + b.height);\n this.top = value;\n }\n get zIndex(): number {\n return this.depth;\n }\n set zIndex(value: number) {\n this.alive();\n this.depth = finite(value);\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n this.alive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"visible must be boolean\");\n this.shown = value;\n }\n inBounds(x: number, y: number): boolean {\n return this.cells.inBounds(x, y);\n }\n get(x: number, y: number): TileColor {\n return this.cells.get(x, y);\n }\n set(x: number, y: number, value: TileColor): void {\n this.alive();\n const previous = this.cells.get(x, y);\n color(value);\n if (previous === value) return;\n this.cells.set(x, y, value);\n this.version++;\n for (const notify of this.listeners) notify(y * this.width + x);\n }\n fill(value: TileColor): void {\n this.alive();\n color(value);\n let changed = false;\n this.cells.forEach((old) => {\n if (old !== value) changed = true;\n });\n if (!changed) return;\n this.cells.fill(value);\n this.version++;\n for (const notify of this.listeners) notify(null);\n }\n copyTiles(): Grid<TileColor> {\n return Grid.generate(this.width, this.height, (x, y) => this.get(x, y));\n }\n /** Bounding-box origin by default; center is the polygon centroid. */\n tileToWorld(\n x: number,\n y: number,\n options: { center?: boolean } = {},\n ): WorldPoint {\n this.cells.get(x, y);\n const p = options.center\n ? this.geometry.center(x, y)\n : this.geometry.bounds(x, y);\n return worldPoint(p.x + this.x, p.y + this.y);\n }\n tileBounds(x: number, y: number): TileBounds {\n this.cells.get(x, y);\n const b = this.geometry.bounds(x, y);\n return { ...b, x: b.x + this.x, y: b.y + this.y };\n }\n tileVertices(x: number, y: number): readonly WorldPoint[] {\n this.cells.get(x, y);\n return this.geometry\n .vertices(x, y)\n .map((p) => worldPoint(p.x + this.x, p.y + this.y));\n }\n /** Hidden/null cells are still selectable. Infinite-tiling ties resolve before map clipping. */\n worldToTile(x: number, y: number): TilePoint | undefined {\n finite(x);\n finite(y);\n const b = this.extent,\n lx = x - this.x,\n ly = y - this.y;\n if (lx < b.x || ly < b.y || lx > b.x + b.width || ly > b.y + b.height)\n return undefined;\n const t = this.geometry.worldToTile(finite(x) - this.x, finite(y) - this.y);\n return this.inBounds(t.x, t.y) ? t : undefined;\n }\n screenToTile(view: ViewTransform, point: ScreenPoint): TilePoint | undefined {\n if (!containsScreenPoint(view, point)) return undefined;\n const p = screenToWorld(view, point);\n return this.worldToTile(p.x, p.y);\n }\n neighbors(x: number, y: number): readonly TilePoint[] {\n this.cells.get(x, y);\n return this.geometry.neighbors(x, y).filter((t) => this.inBounds(t.x, t.y));\n }\n /** World-space bounding candidates clipped to finite storage. */\n tilesInBounds(bounds: TileBounds): IterableIterator<TilePoint> {\n return this.geometry.tilesInBounds(\n { ...bounds, x: bounds.x - this.x, y: bounds.y - this.y },\n { x: 0, y: 0, width: this.width, height: this.height },\n );\n }\n /** @internal Same changed-cell/lifetime contract as textured Tilemap. */\n onTilesChanged(notify: (index: number | null) => void): () => void {\n this.alive();\n this.listeners.add(notify);\n const unregister = this.onDispose(() => this.listeners.delete(notify));\n return () => {\n unregister();\n this.listeners.delete(notify);\n };\n }\n}\n/** @internal Passive placement component; not a collider. */\nexport class GeometryTilemapLayer extends Component {\n static readonly type: ComponentType<GeometryTilemapLayer> =\n defineComponent<GeometryTilemapLayer>(\"GeometryTilemapLayer\");\n readonly type = GeometryTilemapLayer.type;\n constructor(readonly map: GeometryTilemap) {\n super();\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport type { Camera, LogicalResolution, Point } from \"./coordinates\";\n\nfunction clampCenter(\n value: number,\n origin: number,\n size: number,\n half: number,\n): number {\n return size <= 2 * half\n ? origin + size / 2\n : Math.max(origin + half, Math.min(origin + size - half, value));\n}\nexport interface WorldBounds extends Point, LogicalResolution {}\nexport interface CameraFollowOptions {\n resolution?: LogicalResolution;\n bounds?: WorldBounds;\n /** Exponential response per simulation second. Zero snaps immediately. */\n responsiveness?: number;\n}\n/** World-space tracking, called after movement/response; independent of host pixels and DOM. */\nexport class CameraFollow {\n private readonly width: number;\n private readonly height: number;\n private readonly bounds: WorldBounds | undefined;\n private readonly responsiveness: number;\n constructor(\n readonly camera: Camera,\n options: CameraFollowOptions = {},\n ) {\n this.width = positive(options.resolution?.width ?? 800, \"resolution.width\");\n this.height = positive(\n options.resolution?.height ?? 450,\n \"resolution.height\",\n );\n this.responsiveness = options.responsiveness ?? 0;\n if (!Number.isFinite(this.responsiveness) || this.responsiveness < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Camera responsiveness must be finite and nonnegative\",\n );\n if (options.bounds) {\n const b = options.bounds;\n positive(b.width, \"bounds.width\");\n positive(b.height, \"bounds.height\");\n if (\n !Number.isFinite(b.x) ||\n !Number.isFinite(b.y) ||\n !Number.isFinite(b.x + b.width) ||\n !Number.isFinite(b.y + b.height)\n )\n throw new EngineError(\"INVALID_VALUE\", \"Camera bounds must be finite\");\n this.bounds = { ...b };\n }\n }\n update(target: Point, seconds: number): void {\n if (\n !Number.isFinite(target.x) ||\n !Number.isFinite(target.y) ||\n !Number.isFinite(seconds) ||\n seconds < 0\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Camera target/time must be finite; time must be nonnegative\",\n );\n const b = this.bounds,\n hx = this.width / this.camera.zoom / 2,\n hy = this.height / this.camera.zoom / 2;\n const x = b ? clampCenter(target.x, b.x, b.width, hx) : target.x,\n y = b ? clampCenter(target.y, b.y, b.height, hy) : target.y;\n const alpha =\n this.responsiveness === 0\n ? 1\n : -Math.expm1(-this.responsiveness * seconds);\n let cx = this.camera.x + this.width / 2,\n cy = this.camera.y + this.height / 2;\n cx += (x - cx) * alpha;\n cy += (y - cy) * alpha;\n if (b) {\n cx = clampCenter(cx, b.x, b.width, hx);\n cy = clampCenter(cy, b.y, b.height, hy);\n }\n const left = cx - this.width / 2,\n top = cy - this.height / 2;\n if (!Number.isFinite(left) || !Number.isFinite(top))\n throw new EngineError(\"INVALID_VALUE\", \"Camera tracking overflowed\");\n this.camera.x = left;\n this.camera.y = top;\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport type { Point, TilePoint } from \"./coordinates\";\n\nexport interface TileBounds extends Point {\n readonly width: number;\n readonly height: number;\n}\nexport const HexOrientation = { Pointy: \"pointy\", Flat: \"flat\" } as const;\nexport type HexOrientation =\n (typeof HexOrientation)[keyof typeof HexOrientation];\nexport type TileGeometryKind = \"square\" | \"triangle\" | \"hex\";\nfunction finite(...values: number[]): void {\n if (values.some((v) => !Number.isFinite(v)))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile geometry coordinates must be finite\",\n );\n}\nfunction integer(x: number, y: number): void {\n if (!Number.isSafeInteger(x) || !Number.isSafeInteger(y))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile coordinates must be safe integers\",\n );\n}\nfunction rect(b: TileBounds): void {\n finite(b.x, b.y, b.width, b.height, b.x + b.width, b.y + b.height);\n if (b.width < 0 || b.height < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile query extents must be nonnegative\",\n );\n}\nconst tile = (x: number, y: number): TilePoint => {\n integer(x, y);\n return { space: \"tile\", x: x || 0, y: y || 0 };\n};\nconst directions = [\n [1, 0],\n [1, -1],\n [0, -1],\n [-1, 0],\n [-1, 1],\n [0, 1],\n] as const;\n\n/** Immutable local-space tiling; x/y are axial q/r for hexagons. No cell storage. */\nexport class TileGeometry {\n private constructor(\n readonly kind: TileGeometryKind,\n readonly width: number,\n readonly height: number,\n readonly orientation: HexOrientation = HexOrientation.Pointy,\n ) {\n positive(width, \"tile width\");\n positive(height, \"tile height\");\n Object.freeze(this);\n }\n static square(options: { width: number; height?: number }): TileGeometry {\n return new TileGeometry(\n \"square\",\n options.width,\n options.height ?? options.width,\n );\n }\n static triangle(options: { width: number; height?: number }): TileGeometry {\n return new TileGeometry(\n \"triangle\",\n options.width,\n options.height ?? (options.width * Math.sqrt(3)) / 2,\n );\n }\n static hex(options: {\n radius: number;\n orientation?: HexOrientation;\n }): TileGeometry {\n const radius = positive(options.radius, \"hex radius\");\n const orientation = options.orientation ?? HexOrientation.Pointy;\n if (!Object.values(HexOrientation).includes(orientation))\n throw new EngineError(\"INVALID_VALUE\", \"Unknown hex orientation\");\n return new TileGeometry(\n \"hex\",\n radius * (orientation === HexOrientation.Pointy ? Math.sqrt(3) : 2),\n radius * (orientation === HexOrientation.Pointy ? 2 : Math.sqrt(3)),\n orientation,\n );\n }\n /** Triangle orientation is invariant under negative coordinates too. */\n pointsUp(x: number, y: number): boolean {\n integer(x, y);\n if (this.kind !== \"triangle\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"pointsUp requires triangle geometry\",\n );\n return (x + y) % 2 === 0;\n }\n center(x: number, y: number): Point {\n integer(x, y);\n let cx: number, cy: number;\n if (this.kind === \"hex\") {\n cx =\n this.width *\n (this.orientation === HexOrientation.Pointy ? x + y / 2 : 0.75 * x);\n cy =\n this.height *\n (this.orientation === HexOrientation.Pointy ? 0.75 * y : y + x / 2);\n } else {\n cx = (x * (this.kind === \"triangle\" ? 0.5 : 1) + 0.5) * this.width;\n cy =\n (y +\n (this.kind === \"triangle\"\n ? this.pointsUp(x, y)\n ? 2 / 3\n : 1 / 3\n : 0.5)) *\n this.height;\n }\n finite(cx, cy);\n return { x: cx, y: cy };\n }\n bounds(x: number, y: number): TileBounds {\n const c = this.center(x, y);\n const top =\n this.kind === \"triangle\" ? y * this.height : c.y - this.height / 2;\n return {\n x: c.x - this.width / 2,\n y: top,\n width: this.width,\n height: this.height,\n };\n }\n vertices(x: number, y: number): readonly Point[] {\n const b = this.bounds(x, y),\n w = this.width,\n h = this.height;\n const coords =\n this.kind === \"square\"\n ? [\n [0, 0],\n [w, 0],\n [w, h],\n [0, h],\n ]\n : this.kind === \"triangle\"\n ? this.pointsUp(x, y)\n ? [\n [w / 2, 0],\n [w, h],\n [0, h],\n ]\n : [\n [0, 0],\n [w, 0],\n [w / 2, h],\n ]\n : this.orientation === HexOrientation.Pointy\n ? [\n [w / 2, 0],\n [w, h / 4],\n [w, (3 * h) / 4],\n [w / 2, h],\n [0, (3 * h) / 4],\n [0, h / 4],\n ]\n : [\n [w / 4, 0],\n [(3 * w) / 4, 0],\n [w, h / 2],\n [(3 * w) / 4, h],\n [w / 4, h],\n [0, h / 2],\n ];\n return coords.map(([dx, dy]) => ({\n x: b.x + (dx ?? 0),\n y: b.y + (dy ?? 0),\n }));\n }\n neighbors(x: number, y: number): readonly TilePoint[] {\n integer(x, y);\n if (this.kind === \"hex\")\n return directions.map(([dx, dy]) => tile(x + dx, y + dy));\n if (this.kind === \"triangle\")\n return [\n tile(x - 1, y),\n tile(x + 1, y),\n tile(x, y + (this.pointsUp(x, y) ? 1 : -1)),\n ];\n return [tile(x + 1, y), tile(x, y + 1), tile(x - 1, y), tile(x, y - 1)];\n }\n /** Hex graph distance; square/triangle do not silently use a different metric. */\n distance(a: Point, b: Point): number {\n integer(a.x, a.y);\n integer(b.x, b.y);\n if (this.kind !== \"hex\")\n throw new EngineError(\"INVALID_VALUE\", \"distance requires hex geometry\");\n const x = a.x - b.x,\n y = a.y - b.y;\n return (Math.abs(x) + Math.abs(y) + Math.abs(x + y)) / 2;\n }\n /** Infinite tiling ownership. Square is half-open; polygon ties use lowest y then x. */\n worldToTile(x: number, y: number): TilePoint {\n finite(x, y);\n if (this.kind === \"square\")\n return tile(Math.floor(x / this.width), Math.floor(y / this.height));\n let q = (x * 2) / this.width,\n r = y / this.height;\n if (this.kind === \"hex\") {\n if (this.orientation === HexOrientation.Pointy) {\n r = y / (this.height * 0.75);\n q = x / this.width - r / 2;\n } else {\n q = x / (this.width * 0.75);\n r = y / this.height - q / 2;\n }\n }\n const col = Math.floor(q),\n row = Math.floor(r);\n integer(col, row);\n // A small closed-polygon search handles shared edges/vertices deterministically.\n for (let ty = row - 1; ty <= row + 1; ty++)\n for (let tx = col - 2; tx <= col + 1; tx++) {\n const v = this.vertices(tx, ty);\n let inside = true;\n for (let i = 0; i < v.length; i++) {\n const a = v[i],\n b = v[(i + 1) % v.length];\n if (!a || !b) continue;\n const cross = (b.x - a.x) * (y - a.y) - (b.y - a.y) * (x - a.x);\n if (cross < -1e-10 * this.width * this.height) {\n inside = false;\n break;\n }\n }\n if (inside) return tile(tx, ty);\n }\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Point exceeds reliable tile geometry precision\",\n );\n }\n /** Bounding-box candidates, row-major, optionally clipped to a finite coordinate rectangle.\n * Touching bounds are included. No full-map scan; exact polygon picking uses worldToTile.\n */\n *tilesInBounds(\n bounds: TileBounds,\n limit?: TileBounds,\n ): IterableIterator<TilePoint> {\n rect(bounds);\n if (limit) {\n rect(limit);\n integer(limit.x, limit.y);\n integer(limit.width, limit.height);\n }\n if (\n !bounds.width ||\n !bounds.height ||\n (limit && (!limit.width || !limit.height))\n )\n return;\n const w = this.width,\n h = this.height;\n let top: number, bottom: number;\n if (this.kind !== \"hex\") {\n top = Math.ceil(bounds.y / h) - 1;\n bottom = Math.floor((bounds.y + bounds.height) / h);\n } else if (this.orientation === HexOrientation.Pointy) {\n top = Math.ceil((bounds.y - h / 2) / (h * 0.75));\n bottom = Math.floor((bounds.y + bounds.height + h / 2) / (h * 0.75));\n } else {\n top = Math.ceil(\n (bounds.y - h / 2) / h - (bounds.x + bounds.width + w / 2) / (w * 1.5),\n );\n bottom = Math.floor(\n (bounds.y + bounds.height + h / 2) / h - (bounds.x - w / 2) / (w * 1.5),\n );\n }\n if (limit) {\n top = Math.max(top, limit.y);\n bottom = Math.min(bottom, limit.y + limit.height - 1);\n }\n integer(top, bottom);\n for (let y = top; y <= bottom; y++) {\n let left: number, right: number;\n if (this.kind !== \"hex\") {\n const step = w * (this.kind === \"triangle\" ? 0.5 : 1);\n left = Math.ceil((bounds.x - w) / step);\n right = Math.floor((bounds.x + bounds.width) / step);\n } else if (this.orientation === HexOrientation.Pointy) {\n left = Math.ceil((bounds.x - w / 2) / w - y / 2);\n right = Math.floor((bounds.x + bounds.width + w / 2) / w - y / 2);\n } else {\n left = Math.max(\n Math.ceil((bounds.x - w / 2) / (w * 0.75)),\n Math.ceil(2 * ((bounds.y - h / 2) / h - y)),\n );\n right = Math.min(\n Math.floor((bounds.x + bounds.width + w / 2) / (w * 0.75)),\n Math.floor(2 * ((bounds.y + bounds.height + h / 2) / h - y)),\n );\n }\n if (limit) {\n left = Math.max(left, limit.x);\n right = Math.min(right, limit.x + limit.width - 1);\n }\n integer(left, right);\n for (let x = left; x <= right; x++) yield tile(x, y);\n }\n }\n /** Inclusive axial disk, row-major, including its center. */\n *withinRadius(\n x: number,\n y: number,\n radius: number,\n ): IterableIterator<TilePoint> {\n integer(x, y);\n integer(radius, 0);\n if (this.kind !== \"hex\" || radius < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"withinRadius requires hex geometry and a nonnegative integer radius\",\n );\n for (let dy = -radius; dy <= radius; dy++)\n for (\n let dx = Math.max(-radius, -dy - radius);\n dx <= Math.min(radius, -dy + radius);\n dx++\n )\n yield tile(x + dx, y + dy);\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\n\n/** Physical UI Events code values plus F13–F24; Unidentified is not bindable. */\nexport const KeyCode = {\n A: \"KeyA\",\n B: \"KeyB\",\n C: \"KeyC\",\n D: \"KeyD\",\n E: \"KeyE\",\n F: \"KeyF\",\n G: \"KeyG\",\n H: \"KeyH\",\n I: \"KeyI\",\n J: \"KeyJ\",\n K: \"KeyK\",\n L: \"KeyL\",\n M: \"KeyM\",\n N: \"KeyN\",\n O: \"KeyO\",\n P: \"KeyP\",\n Q: \"KeyQ\",\n R: \"KeyR\",\n S: \"KeyS\",\n T: \"KeyT\",\n U: \"KeyU\",\n V: \"KeyV\",\n W: \"KeyW\",\n X: \"KeyX\",\n Y: \"KeyY\",\n Z: \"KeyZ\",\n Digit0: \"Digit0\",\n Digit1: \"Digit1\",\n Digit2: \"Digit2\",\n Digit3: \"Digit3\",\n Digit4: \"Digit4\",\n Digit5: \"Digit5\",\n Digit6: \"Digit6\",\n Digit7: \"Digit7\",\n Digit8: \"Digit8\",\n Digit9: \"Digit9\",\n Space: \"Space\",\n Enter: \"Enter\",\n Escape: \"Escape\",\n Tab: \"Tab\",\n Backspace: \"Backspace\",\n ArrowLeft: \"ArrowLeft\",\n ArrowRight: \"ArrowRight\",\n ArrowUp: \"ArrowUp\",\n ArrowDown: \"ArrowDown\",\n ShiftLeft: \"ShiftLeft\",\n ShiftRight: \"ShiftRight\",\n ControlLeft: \"ControlLeft\",\n ControlRight: \"ControlRight\",\n AltLeft: \"AltLeft\",\n AltRight: \"AltRight\",\n MetaLeft: \"MetaLeft\",\n MetaRight: \"MetaRight\",\n CapsLock: \"CapsLock\",\n NumLock: \"NumLock\",\n ScrollLock: \"ScrollLock\",\n ContextMenu: \"ContextMenu\",\n Insert: \"Insert\",\n Delete: \"Delete\",\n Home: \"Home\",\n End: \"End\",\n PageUp: \"PageUp\",\n PageDown: \"PageDown\",\n Backquote: \"Backquote\",\n Minus: \"Minus\",\n Equal: \"Equal\",\n BracketLeft: \"BracketLeft\",\n BracketRight: \"BracketRight\",\n Backslash: \"Backslash\",\n Semicolon: \"Semicolon\",\n Quote: \"Quote\",\n Comma: \"Comma\",\n Period: \"Period\",\n Slash: \"Slash\",\n IntlBackslash: \"IntlBackslash\",\n IntlRo: \"IntlRo\",\n IntlYen: \"IntlYen\",\n Convert: \"Convert\",\n NonConvert: \"NonConvert\",\n KanaMode: \"KanaMode\",\n Lang1: \"Lang1\",\n Lang2: \"Lang2\",\n Lang3: \"Lang3\",\n Lang4: \"Lang4\",\n Lang5: \"Lang5\",\n F1: \"F1\",\n F2: \"F2\",\n F3: \"F3\",\n F4: \"F4\",\n F5: \"F5\",\n F6: \"F6\",\n F7: \"F7\",\n F8: \"F8\",\n F9: \"F9\",\n F10: \"F10\",\n F11: \"F11\",\n F12: \"F12\",\n F13: \"F13\",\n F14: \"F14\",\n F15: \"F15\",\n F16: \"F16\",\n F17: \"F17\",\n F18: \"F18\",\n F19: \"F19\",\n F20: \"F20\",\n F21: \"F21\",\n F22: \"F22\",\n F23: \"F23\",\n F24: \"F24\",\n Numpad0: \"Numpad0\",\n Numpad1: \"Numpad1\",\n Numpad2: \"Numpad2\",\n Numpad3: \"Numpad3\",\n Numpad4: \"Numpad4\",\n Numpad5: \"Numpad5\",\n Numpad6: \"Numpad6\",\n Numpad7: \"Numpad7\",\n Numpad8: \"Numpad8\",\n Numpad9: \"Numpad9\",\n NumpadAdd: \"NumpadAdd\",\n NumpadSubtract: \"NumpadSubtract\",\n NumpadMultiply: \"NumpadMultiply\",\n NumpadDivide: \"NumpadDivide\",\n NumpadDecimal: \"NumpadDecimal\",\n NumpadEnter: \"NumpadEnter\",\n NumpadEqual: \"NumpadEqual\",\n NumpadComma: \"NumpadComma\",\n PrintScreen: \"PrintScreen\",\n Pause: \"Pause\",\n Help: \"Help\",\n AudioVolumeMute: \"AudioVolumeMute\",\n AudioVolumeDown: \"AudioVolumeDown\",\n AudioVolumeUp: \"AudioVolumeUp\",\n MediaPlayPause: \"MediaPlayPause\",\n MediaStop: \"MediaStop\",\n MediaTrackNext: \"MediaTrackNext\",\n MediaTrackPrevious: \"MediaTrackPrevious\",\n BrowserBack: \"BrowserBack\",\n BrowserForward: \"BrowserForward\",\n BrowserRefresh: \"BrowserRefresh\",\n BrowserStop: \"BrowserStop\",\n BrowserSearch: \"BrowserSearch\",\n BrowserFavorites: \"BrowserFavorites\",\n BrowserHome: \"BrowserHome\",\n NumpadBackspace: \"NumpadBackspace\",\n NumpadClear: \"NumpadClear\",\n NumpadClearEntry: \"NumpadClearEntry\",\n NumpadHash: \"NumpadHash\",\n NumpadMemoryAdd: \"NumpadMemoryAdd\",\n NumpadMemoryClear: \"NumpadMemoryClear\",\n NumpadMemoryRecall: \"NumpadMemoryRecall\",\n NumpadMemoryStore: \"NumpadMemoryStore\",\n NumpadMemorySubtract: \"NumpadMemorySubtract\",\n NumpadParenLeft: \"NumpadParenLeft\",\n NumpadParenRight: \"NumpadParenRight\",\n NumpadStar: \"NumpadStar\",\n Fn: \"Fn\",\n FnLock: \"FnLock\",\n Eject: \"Eject\",\n LaunchApp1: \"LaunchApp1\",\n LaunchApp2: \"LaunchApp2\",\n LaunchMail: \"LaunchMail\",\n MediaSelect: \"MediaSelect\",\n Power: \"Power\",\n Sleep: \"Sleep\",\n WakeUp: \"WakeUp\",\n Again: \"Again\",\n Copy: \"Copy\",\n Cut: \"Cut\",\n Find: \"Find\",\n Open: \"Open\",\n Paste: \"Paste\",\n Props: \"Props\",\n Select: \"Select\",\n Undo: \"Undo\",\n Abort: \"Abort\",\n Resume: \"Resume\",\n Suspend: \"Suspend\",\n Hiragana: \"Hiragana\",\n Katakana: \"Katakana\",\n Hyper: \"Hyper\",\n Super: \"Super\",\n Turbo: \"Turbo\",\n} as const;\nexport type KeyCode = (typeof KeyCode)[keyof typeof KeyCode];\nconst knownCodes = new Set<string>(Object.values(KeyCode));\nexport function isKeyCode(value: unknown): value is KeyCode {\n return typeof value === \"string\" && knownCodes.has(value);\n}\nexport function parseKeyCode(value: unknown): KeyCode {\n if (!isKeyCode(value))\n throw new EngineError(\n \"INVALID_KEY_CODE\",\n \"Unknown physical keyboard code\",\n { value },\n );\n return value;\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { ActionKind, ActionSet, ActionToken } from \"./action-types\";\nimport { KeyCode, parseKeyCode } from \"./key-code\";\nexport interface ButtonBinding {\n readonly keys?: readonly KeyCode[];\n}\nexport interface Axis1DBinding {\n readonly negative?: readonly KeyCode[];\n readonly positive?: readonly KeyCode[];\n}\nexport interface Axis2DBinding {\n readonly x?: Axis1DBinding;\n readonly y?: Axis1DBinding;\n}\nexport interface Axis3DBinding extends Axis2DBinding {\n readonly z?: Axis1DBinding;\n}\nexport type ActionBinding<K extends ActionKind> = K extends \"button\"\n ? ButtonBinding\n : K extends \"axis1d\"\n ? Axis1DBinding\n : K extends \"axis2d\"\n ? Axis2DBinding\n : Axis3DBinding;\nexport type ActionBindings<A extends ActionSet> = {\n readonly [N in keyof A]?: ActionBinding<A[N][\"kind\"]>;\n};\ntype Binding = ButtonBinding | Axis1DBinding | Axis2DBinding | Axis3DBinding;\nexport function checkedBinding(action: ActionToken, value: unknown): Binding {\n const record = (v: unknown, allowed: readonly string[]) => {\n if (!v || typeof v !== \"object\" || Array.isArray(v))\n throw new EngineError(\"INVALID_BINDING\", \"Binding must be an object\");\n const r = v as Record<string, unknown>;\n if (Object.keys(r).some((k) => !allowed.includes(k)))\n throw new EngineError(\"INVALID_BINDING\", \"Unknown binding field\", {\n action: action.name,\n });\n return r;\n };\n const codes = (v: unknown): readonly KeyCode[] => {\n if (v === undefined) return Object.freeze([]);\n if (!Array.isArray(v))\n throw new EngineError(\"INVALID_BINDING\", \"Key list must be an array\");\n return Object.freeze([...new Set(v.map(parseKeyCode))]);\n };\n const axis = (v: unknown): Axis1DBinding => {\n const r = record(v ?? {}, [\"negative\", \"positive\"]);\n return Object.freeze({\n negative: codes(r.negative),\n positive: codes(r.positive),\n });\n };\n if (action.kind === \"button\")\n return Object.freeze({ keys: codes(record(value, [\"keys\"]).keys) });\n if (action.kind === \"axis1d\") return axis(value);\n const r = record(\n value,\n action.kind === \"axis2d\" ? [\"x\", \"y\"] : [\"x\", \"y\", \"z\"],\n );\n return Object.freeze(\n action.kind === \"axis2d\"\n ? { x: axis(r.x), y: axis(r.y) }\n : { x: axis(r.x), y: axis(r.y), z: axis(r.z) },\n );\n}\nexport function keyLists(\n binding: Binding,\n path = \"\",\n): Array<{ path: string; keys: readonly KeyCode[] }> {\n const lists: Array<{ path: string; keys: readonly KeyCode[] }> = [];\n for (const [key, value] of Object.entries(binding)) {\n if (Array.isArray(value)) lists.push({ path: path + key, keys: value });\n else lists.push(...keyLists(value, `${path}${key}.`));\n }\n return lists;\n}\nexport function editBinding(\n current: Binding,\n patch: Binding,\n remove: boolean,\n): Binding {\n const result: Record<string, unknown> = { ...current };\n for (const [name, value] of Object.entries(patch)) {\n const old = (current as Record<string, unknown>)[name];\n if (Array.isArray(value))\n result[name] = remove\n ? (old as KeyCode[]).filter((k) => !value.includes(k))\n : [...new Set([...(old as KeyCode[]), ...value])];\n else result[name] = editBinding(old as Binding, value as Binding, remove);\n }\n return result as Binding;\n}\n\n/** Physical keyboard presets for any user-defined Axis2D Action. */\nexport const KeyboardBindings = Object.freeze({\n WASD: Object.freeze({\n x: Object.freeze({\n negative: Object.freeze([KeyCode.A]),\n positive: Object.freeze([KeyCode.D]),\n }),\n y: Object.freeze({\n negative: Object.freeze([KeyCode.W]),\n positive: Object.freeze([KeyCode.S]),\n }),\n }),\n Arrows: Object.freeze({\n x: Object.freeze({\n negative: Object.freeze([KeyCode.ArrowLeft]),\n positive: Object.freeze([KeyCode.ArrowRight]),\n }),\n y: Object.freeze({\n negative: Object.freeze([KeyCode.ArrowUp]),\n positive: Object.freeze([KeyCode.ArrowDown]),\n }),\n }),\n});\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { ActionKind, ActionValue } from \"./action-types\";\nexport interface ActionSchema {\n readonly name: string;\n readonly kind: ActionKind;\n readonly normalize: boolean;\n}\nexport interface ActionFrame {\n readonly values: Readonly<Record<string, ActionValue<ActionKind>>>;\n readonly events: readonly { readonly name: string; readonly down: boolean }[];\n}\n/** Shared validation for device-independent Action values, including JSON imports. */\nexport function checkedActionValue(\n action: { readonly kind: ActionKind; readonly normalize?: boolean },\n value: unknown,\n): ActionValue<ActionKind> {\n if (action.kind === \"button\") {\n if (typeof value !== \"boolean\")\n throw new EngineError(\n \"INVALID_ACTION_VALUE\",\n \"Button requires a boolean\",\n );\n return value;\n }\n const number = (v: unknown) => {\n if (typeof v !== \"number\" || !Number.isFinite(v) || Math.abs(v) > 1)\n throw new EngineError(\n \"INVALID_ACTION_VALUE\",\n \"Axis components must be finite and between -1 and 1\",\n );\n return v;\n };\n if (action.kind === \"axis1d\") return number(value);\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new EngineError(\"INVALID_ACTION_VALUE\", \"Axis requires a vector\");\n const v = value as Record<string, unknown>,\n expected = action.kind === \"axis2d\" ? [\"x\", \"y\"] : [\"x\", \"y\", \"z\"];\n if (\n Object.keys(v).length !== expected.length ||\n Object.keys(v).some((k) => !expected.includes(k))\n )\n throw new EngineError(\n \"INVALID_ACTION_VALUE\",\n \"Unexpected vector component\",\n );\n return Object.freeze(\n action.kind === \"axis2d\"\n ? { x: number(v.x), y: number(v.y) }\n : { x: number(v.x), y: number(v.y), z: number(v.z) },\n );\n}\nexport function parseActionFrame(\n value: unknown,\n schema: readonly ActionSchema[],\n): ActionFrame {\n const invalid = () => {\n throw new EngineError(\"REPLAY_DATA\", \"Malformed Action frame\");\n };\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return invalid();\n const f = value as Record<string, unknown>;\n if (\n Object.keys(f).length !== 2 ||\n !f.values ||\n typeof f.values !== \"object\" ||\n Array.isArray(f.values) ||\n !Array.isArray(f.events) ||\n f.events.length > 10000\n )\n return invalid();\n const raw = f.values as Record<string, unknown>,\n values: Record<string, ActionValue<ActionKind>> = Object.create(null),\n definitions = new Map(schema.map((s) => [s.name, s]));\n if (\n Object.keys(raw).length !== schema.length ||\n Object.keys(raw).some((n) => !definitions.has(n))\n )\n return invalid();\n for (const s of schema) {\n const v = checkedActionValue(s, raw[s.name]);\n if (\n typeof v === \"object\" &&\n s.normalize &&\n Math.hypot(v.x, v.y, \"z\" in v ? v.z : 0) > 1 + 1e-12\n )\n return invalid();\n values[s.name] = v;\n }\n const held = new Map<string, boolean>();\n const events = f.events.map((event: unknown) => {\n if (!event || typeof event !== \"object\" || Array.isArray(event))\n return invalid();\n const e = event as Record<string, unknown>;\n if (\n Object.keys(e).length !== 2 ||\n typeof e.name !== \"string\" ||\n typeof e.down !== \"boolean\" ||\n definitions.get(e.name)?.kind !== \"button\"\n )\n return invalid();\n if (held.has(e.name) && held.get(e.name) === e.down) return invalid();\n held.set(e.name, e.down);\n return Object.freeze({ name: e.name, down: e.down });\n });\n for (const [name, down] of held) if (values[name] !== down) return invalid();\n return Object.freeze({\n values: Object.freeze(values),\n events: Object.freeze(events),\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nexport type ActionKind = \"button\" | \"axis1d\" | \"axis2d\" | \"axis3d\";\nexport interface Axis2DValue {\n readonly x: number;\n readonly y: number;\n}\nexport interface Axis3DValue extends Axis2DValue {\n readonly z: number;\n}\nexport type ActionValue<K extends ActionKind> = K extends \"button\"\n ? boolean\n : K extends \"axis1d\"\n ? number\n : K extends \"axis2d\"\n ? Axis2DValue\n : Axis3DValue;\n/** Axis2D writes reject a third component even when supplied through a typed variable. */\nexport type ActionInputValue<K extends ActionKind> = K extends \"axis2d\"\n ? Axis2DValue & { readonly z?: never }\n : ActionValue<K>;\nexport interface ActionDefinition<K extends ActionKind = ActionKind> {\n readonly kind: K;\n readonly normalize: boolean;\n}\nexport interface ActionToken<\n K extends ActionKind = ActionKind,\n N extends string = string,\n> extends ActionDefinition<K> {\n readonly id: symbol;\n readonly name: N;\n}\nexport const Action = {\n button: (): ActionDefinition<\"button\"> =>\n Object.freeze({ kind: \"button\", normalize: false }),\n axis1D: (): ActionDefinition<\"axis1d\"> =>\n Object.freeze({ kind: \"axis1d\", normalize: false }),\n axis2D: (options: { normalize?: boolean } = {}): ActionDefinition<\"axis2d\"> =>\n Object.freeze({ kind: \"axis2d\", normalize: options.normalize ?? true }),\n axis3D: (options: { normalize?: boolean } = {}): ActionDefinition<\"axis3d\"> =>\n Object.freeze({ kind: \"axis3d\", normalize: options.normalize ?? true }),\n};\nexport type ActionSet = Readonly<Record<string, ActionToken>>;\nexport function defineActions<const D extends Record<string, ActionDefinition>>(\n definitions: D,\n): { readonly [N in keyof D]: ActionToken<D[N][\"kind\"], N & string> } {\n const result: Record<string, ActionToken> = Object.create(null);\n for (const [name, definition] of Object.entries(definitions)) {\n if (\n !name.trim() ||\n ![\"button\", \"axis1d\", \"axis2d\", \"axis3d\"].includes(definition.kind) ||\n typeof definition.normalize !== \"boolean\"\n )\n throw new EngineError(\"INVALID_ACTION\", \"Invalid action definition\", {\n name,\n });\n result[name] = Object.freeze({ ...definition, id: Symbol(name), name });\n }\n return Object.freeze(result) as {\n readonly [N in keyof D]: ActionToken<D[N][\"kind\"], N & string>;\n };\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"../foundation/lifetime\";\n/** @internal Shared lifetime for logical and device contributions. */\nexport abstract class OwnedInputSource {\n private dead = false;\n private removeOwner: (() => void) | undefined;\n get disposed(): boolean {\n return this.dead;\n }\n /** @internal */ own(owner: LifetimeOwner): void {\n if (owner.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input owner has been disposed\");\n this.removeOwner = owner.onDispose(() => this.dispose());\n }\n protected writable(neutral: boolean): boolean {\n if (!this.dead) return true;\n if (neutral) return false;\n throw new EngineError(\"OWNER_DISPOSED\", \"Input source has been disposed\");\n }\n protected abstract release(remove: boolean): void;\n clear(): void {\n if (!this.dead) this.release(false);\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const remove = this.removeOwner;\n this.removeOwner = undefined;\n cleanupAll(\n [() => this.release(true), () => remove?.()],\n \"Input source cleanup failed\",\n );\n }\n}\n","import {\n type ActionBinding,\n type ActionBindings,\n type Axis1DBinding,\n type Axis2DBinding,\n type Axis3DBinding,\n type ButtonBinding,\n checkedBinding,\n editBinding,\n keyLists,\n} from \"./action-bindings\";\nimport {\n type ActionFrame,\n type ActionSchema,\n checkedActionValue,\n} from \"./action-frame\";\nimport type {\n ActionInputValue,\n ActionKind,\n ActionSet,\n ActionToken,\n ActionValue,\n Axis2DValue,\n Axis3DValue,\n} from \"./action-types\";\n\nexport type {\n ActionBinding,\n ActionBindings,\n Axis1DBinding,\n Axis2DBinding,\n Axis3DBinding,\n ButtonBinding,\n} from \"./action-bindings\";\nexport { KeyboardBindings } from \"./action-bindings\";\nexport type {\n ActionDefinition,\n ActionInputValue,\n ActionKind,\n ActionSet,\n ActionToken,\n ActionValue,\n Axis2DValue,\n Axis3DValue,\n} from \"./action-types\";\nexport { Action, defineActions } from \"./action-types\";\n\nimport { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent, EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport { type Scene, SceneState } from \"../scene/scene\";\nimport type { ActionInputPort, InputSystem } from \"./input\";\nimport { OwnedInputSource } from \"./input-source\";\nimport type { KeyCode } from \"./key-code\";\n\ntype Token<A extends ActionSet> = A[keyof A];\ntype ButtonToken<A extends ActionSet> = Extract<Token<A>, { kind: \"button\" }>;\ntype Value = boolean | number | Axis2DValue | Axis3DValue;\ntype Binding = ButtonBinding | Axis1DBinding | Axis2DBinding | Axis3DBinding;\nexport interface ButtonState {\n readonly held: boolean;\n readonly pressed: boolean;\n readonly released: boolean;\n readonly pressCount: number;\n readonly releaseCount: number;\n}\nexport type ActionSnapshot<A extends ActionSet> = {\n readonly [N in keyof A]: {\n readonly kind: A[N][\"kind\"];\n readonly value: ActionValue<A[N][\"kind\"]>;\n } & (A[N][\"kind\"] extends \"button\"\n ? { readonly button: ButtonState }\n : unknown);\n};\nexport interface ButtonTransition<\n T extends ActionToken = ActionToken<\"button\">,\n> {\n readonly action: T;\n readonly down: boolean;\n}\ninterface Entry {\n value: Value;\n frame: Value;\n button: ButtonState;\n binding: Binding;\n defaults: Binding;\n}\nconst noButton: ButtonState = Object.freeze({\n held: false,\n pressed: false,\n released: false,\n pressCount: 0,\n releaseCount: 0,\n});\nconst pressedEvent = defineEvent<ActionToken>(\"ActionPressed\");\nconst clamp = (n: number) => Math.max(-1, Math.min(1, n));\nfunction neutral(action: ActionToken): Value {\n if (action.kind === \"button\") return false;\n if (action.kind === \"axis1d\") return 0;\n return Object.freeze(\n action.kind === \"axis2d\" ? { x: 0, y: 0 } : { x: 0, y: 0, z: 0 },\n );\n}\nfunction isNeutral(value: Value): boolean {\n return typeof value === \"boolean\"\n ? !value\n : typeof value === \"number\"\n ? value === 0\n : value.x === 0 && value.y === 0 && (!(\"z\" in value) || value.z === 0);\n}\n/** Scene-owned logical input, sampled automatically at each Engine.step boundary. */\nexport class ActionController<A extends ActionSet>\n implements LifetimeOwner, ActionInputPort\n{\n private readonly lifetime = new Lifetime();\n private readonly entries = new Map<ActionToken, Entry>();\n private readonly sources = new Map<\n ActionSource<A>,\n Map<ActionToken, Value>\n >();\n private readonly bus = new EventBus();\n private pending: ButtonTransition[] = [];\n private transitions: readonly ButtonTransition[] = [];\n constructor(\n readonly actions: A,\n private readonly options: {\n scene: Scene;\n input: InputSystem;\n bindings?: ActionBindings<A>;\n },\n ) {\n for (const action of Object.values(actions)) {\n const binding = checkedBinding(\n action,\n options.bindings?.[action.name] ?? {},\n );\n const value = neutral(action);\n this.entries.set(action, {\n value,\n frame: value,\n button: noButton,\n binding,\n defaults: binding,\n });\n }\n if (\n Object.keys(options.bindings ?? {}).some(\n (name) => !Object.hasOwn(actions, name),\n )\n )\n throw new EngineError(\"INVALID_ACTION\", \"Unknown action in bindings\");\n const off = options.input.registerActions(this);\n try {\n options.scene.claimInput(options.input);\n this.lifetime.onDispose(options.scene.onDispose(() => this.dispose()));\n } catch (error) {\n off();\n throw error;\n }\n this.lifetime.onDispose(off);\n this.keyChanged();\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get active(): boolean {\n return (\n !this.disposed &&\n this.options.scene.state === SceneState.Active &&\n this.options.scene.inputOwner === this.options.input\n );\n }\n get sourceCount(): number {\n return this.sources.size;\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n private entry(action: ActionToken): Entry {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Action controller has been disposed\",\n );\n const entry = this.entries.get(action);\n if (!entry)\n throw new EngineError(\n \"INVALID_ACTION\",\n \"Action belongs to another definition\",\n { action: action.name },\n );\n return entry;\n }\n value<T extends Token<A>>(action: T): ActionValue<T[\"kind\"]> {\n return this.entry(action).frame as ActionValue<T[\"kind\"]>;\n }\n schema(): readonly ActionSchema[] {\n return Object.freeze(\n [...this.entries.keys()]\n .map(({ name, kind, normalize }) =>\n Object.freeze({ name, kind, normalize }),\n )\n .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)),\n );\n }\n frame(): ActionFrame {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Action controller has been disposed\",\n );\n return Object.freeze({\n values: Object.freeze(\n Object.fromEntries(\n [...this.entries].map(([a, e]) => [a.name, e.frame]),\n ),\n ),\n events: Object.freeze(\n this.transitions.map((e) =>\n Object.freeze({ name: e.action.name, down: e.down }),\n ),\n ),\n });\n }\n reader<T extends Token<A>>(action: T): ActionReader<T[\"kind\"]> {\n this.entry(action);\n const controller = this;\n return Object.freeze({\n scene: this.options.scene,\n kind: action.kind,\n get disposed() {\n return controller.disposed;\n },\n value: () => controller.value(action),\n });\n }\n button(action: ButtonToken<A>): ButtonState {\n return this.entry(action).button;\n }\n pressed(action: ButtonToken<A>): boolean {\n return this.button(action).pressed;\n }\n released(action: ButtonToken<A>): boolean {\n return this.button(action).released;\n }\n get events(): readonly ButtonTransition<ButtonToken<A>>[] {\n return this.transitions as readonly ButtonTransition<ButtonToken<A>>[];\n }\n snapshot(): ActionSnapshot<A> {\n return Object.fromEntries(\n [...this.entries].map(([action, entry]) => [\n action.name,\n {\n kind: action.kind,\n value:\n typeof entry.frame === \"object\" ? { ...entry.frame } : entry.frame,\n ...(action.kind === \"button\" ? { button: { ...entry.button } } : {}),\n },\n ]),\n ) as ActionSnapshot<A>;\n }\n onPressed(action: ButtonToken<A>, handler: () => void): () => void {\n this.entry(action);\n return this.bus.on(pressedEvent, (token) => {\n if (token === action) return handler();\n });\n }\n createSource(owner?: LifetimeOwner): ActionSource<A> {\n if (this.disposed || owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input owner has been disposed\");\n const source = new ActionSource(this);\n this.sources.set(source, new Map());\n try {\n if (owner) source.own(owner);\n } catch (error) {\n source.dispose();\n throw error;\n }\n return source;\n }\n /** @internal */ write(\n source: ActionSource<A>,\n action: ActionToken,\n value: Value,\n ): void {\n this.options.input.assertWrite(isNeutral(value));\n this.entry(action);\n const values = this.sources.get(source);\n if (!values)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Action source has been disposed\",\n );\n values.set(action, value);\n this.recompute(action);\n }\n /** @internal */ clearSource(source: ActionSource<A>, remove: boolean): void {\n const values = this.sources.get(source);\n if (!values) return;\n const actions = [...values.keys()];\n values.clear();\n if (remove) this.sources.delete(source);\n if (!this.disposed) for (const action of actions) this.recompute(action);\n }\n private keyboard(action: ActionToken): Value {\n const binding = this.entry(action).binding;\n const held = (keys: readonly KeyCode[] | undefined) =>\n keys?.some((k) => this.options.input.keyDown(k)) ?? false;\n const axis = (b: Axis1DBinding | undefined) =>\n Number(held(b?.positive)) - Number(held(b?.negative));\n if (action.kind === \"button\") return held((binding as ButtonBinding).keys);\n if (action.kind === \"axis1d\") return axis(binding as Axis1DBinding);\n const b = binding as Axis3DBinding;\n return action.kind === \"axis2d\"\n ? { x: axis(b.x), y: axis(b.y) }\n : { x: axis(b.x), y: axis(b.y), z: axis(b.z) };\n }\n private recompute(action: ActionToken, edges = true): void {\n const entry = this.entry(action);\n let value = this.keyboard(action);\n for (const values of this.sources.values()) {\n const contribution = values.get(action);\n if (contribution === undefined) continue;\n if (typeof value === \"boolean\") value ||= contribution as boolean;\n else if (typeof value === \"number\") value += contribution as number;\n else {\n const v = contribution as Axis3DValue;\n value =\n \"z\" in value\n ? { x: value.x + v.x, y: value.y + v.y, z: value.z + v.z }\n : { x: value.x + v.x, y: value.y + v.y };\n }\n }\n if (typeof value === \"number\") value = clamp(value);\n else if (typeof value === \"object\") {\n const x = clamp(value.x),\n y = clamp(value.y),\n z = \"z\" in value ? clamp(value.z) : 0;\n const length = action.normalize ? Math.max(1, Math.hypot(x, y, z)) : 1;\n value = Object.freeze(\n \"z\" in value\n ? { x: x / length, y: y / length, z: z / length }\n : { x: x / length, y: y / length },\n );\n }\n if (edges && action.kind === \"button\" && value !== entry.value)\n this.pending.push(\n Object.freeze({\n action: action as ActionToken<\"button\">,\n down: value as boolean,\n }),\n );\n entry.value = value;\n }\n /** @internal */ keyChanged(): void {\n // Only the Engine-owned default Scene can retain pre-activation physical taps.\n // Staged Scenes do not accumulate another Scene's keyboard history.\n if (\n this.active ||\n (!this.disposed &&\n this.options.scene.inputOwner === this.options.input &&\n (this.options.scene.state === SceneState.Preparing ||\n this.options.scene.state === SceneState.Ready))\n )\n for (const action of this.entries.keys()) this.recompute(action);\n }\n /** @internal */ accepts(code: KeyCode): boolean {\n return (\n this.active &&\n [...this.entries.values()].some((e) =>\n keyLists(e.binding).some((list) => list.keys.includes(code)),\n )\n );\n }\n /** @internal */ capture(override?: ActionFrame): void {\n if (!this.active) return;\n const tokens = override\n ? new Map([...this.entries.keys()].map((a) => [a.name, a]))\n : undefined;\n this.transitions = override\n ? Object.freeze(\n override.events.map((e) =>\n Object.freeze({\n action: tokens?.get(e.name) as ActionToken<\"button\">,\n down: e.down,\n }),\n ),\n )\n : Object.freeze(this.pending);\n this.pending = [];\n for (const [action, entry] of this.entries) {\n entry.frame = override\n ? (override.values[action.name] as Value)\n : entry.value;\n if (action.kind === \"button\") {\n let pressCount = 0,\n releaseCount = 0;\n for (const event of this.transitions)\n if (event.action === action) {\n if (event.down) pressCount++;\n else releaseCount++;\n }\n entry.button = Object.freeze({\n held: entry.frame as boolean,\n pressed: pressCount > 0,\n released: releaseCount > 0,\n pressCount,\n releaseCount,\n });\n }\n }\n }\n /** @internal */ dispatch(): void {\n const errors: unknown[] = [];\n for (const event of this.transitions) {\n if (!this.active) break;\n if (event.down)\n try {\n this.bus.emit(pressedEvent, event.action);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Action input handlers failed\");\n }\n /** Clears held contributions and unconsumed edges; no synthetic button release. */\n reset(): void {\n for (const values of this.sources.values()) values.clear();\n this.pending = [];\n for (const [action, entry] of this.entries) entry.value = neutral(action);\n }\n getBinding<T extends Token<A>>(action: T): ActionBinding<T[\"kind\"]> {\n return this.entry(action).binding as ActionBinding<T[\"kind\"]>;\n }\n rebind<T extends Token<A>>(\n action: T,\n binding: NoInfer<ActionBinding<T[\"kind\"]>>,\n ): void {\n const checked = checkedBinding(action, binding),\n entry = this.entry(action);\n entry.binding = checked;\n this.pending = this.pending.filter((event) => event.action !== action);\n this.recompute(action, false);\n }\n addBindings<T extends Token<A>>(\n action: T,\n binding: NoInfer<ActionBinding<T[\"kind\"]>>,\n ): void {\n this.rebind(\n action,\n editBinding(\n this.entry(action).binding,\n checkedBinding(action, binding),\n false,\n ) as ActionBinding<T[\"kind\"]>,\n );\n }\n removeBindings<T extends Token<A>>(\n action: T,\n binding: NoInfer<ActionBinding<T[\"kind\"]>>,\n ): void {\n this.rebind(\n action,\n editBinding(\n this.entry(action).binding,\n checkedBinding(action, binding),\n true,\n ) as ActionBinding<T[\"kind\"]>,\n );\n }\n resetBindings(action?: Token<A>): void {\n for (const token of action ? [action] : this.entries.keys())\n this.rebind(\n token as Token<A>,\n this.entry(token).defaults as ActionBinding<Token<A>[\"kind\"]>,\n );\n }\n conflicts(): ReadonlyArray<{\n readonly key: KeyCode;\n readonly bindings: ReadonlyArray<{\n readonly action: Token<A>;\n readonly path: string;\n }>;\n }> {\n const keys = new Map<KeyCode, Array<{ action: Token<A>; path: string }>>();\n for (const [action, entry] of this.entries)\n for (const list of keyLists(entry.binding))\n for (const key of list.keys) {\n const group = keys.get(key) ?? [];\n group.push({ action: action as Token<A>, path: list.path });\n keys.set(key, group);\n }\n return [...keys]\n .filter(([, bindings]) => bindings.length > 1)\n .map(([key, bindings]) => ({ key, bindings }));\n }\n exportBindings(): { version: 1; bindings: ActionBindings<A> } {\n return {\n version: 1,\n bindings: Object.fromEntries(\n [...this.entries].map(([action, entry]) => [\n action.name,\n entry.binding,\n ]),\n ) as ActionBindings<A>,\n };\n }\n importBindings(value: unknown): void {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"version\" in value) ||\n value.version !== 1 ||\n !(\"bindings\" in value) ||\n !value.bindings ||\n typeof value.bindings !== \"object\" ||\n Array.isArray(value.bindings) ||\n Object.keys(value).some((key) => key !== \"version\" && key !== \"bindings\")\n )\n throw new EngineError(\n \"INVALID_BINDING\",\n \"Expected version 1 binding configuration\",\n );\n const data = value.bindings as Record<string, unknown>;\n if (\n Object.keys(data).length !== this.entries.size ||\n Object.keys(data).some((name) => !Object.hasOwn(this.actions, name))\n )\n throw new EngineError(\n \"INVALID_ACTION\",\n \"Binding configuration must contain exactly the defined actions\",\n );\n const checked = [...this.entries.keys()].map(\n (action) => [action, checkedBinding(action, data[action.name])] as const,\n );\n for (const [action, binding] of checked)\n this.rebind(\n action as Token<A>,\n binding as ActionBinding<Token<A>[\"kind\"]>,\n );\n }\n dispose(): void {\n if (this.disposed) return;\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.bus.dispose(),\n ...[...this.sources.keys()].map((source) => () => source.dispose()),\n () => {\n this.entries.clear();\n this.pending = [];\n this.transitions = [];\n },\n ],\n \"Action input cleanup failed\",\n );\n }\n}\n\n/** Read-only, typed dependency injected into Components; no hidden global lookup. */\nexport interface ActionReader<K extends ActionKind> {\n readonly kind: K;\n readonly scene: Scene;\n readonly disposed: boolean;\n value(): ActionValue<K>;\n}\nexport class ActionSource<A extends ActionSet> extends OwnedInputSource {\n /** @internal */ constructor(\n private readonly controller: ActionController<A>,\n ) {\n super();\n }\n set<T extends Token<A>>(\n action: T,\n value: NoInfer<ActionInputValue<T[\"kind\"]>>,\n ): void {\n const checked = checkedActionValue(action, value);\n if (this.writable(isNeutral(checked)))\n this.controller.write(this, action, checked);\n }\n protected release(remove: boolean): void {\n this.controller.clearSource(this, remove);\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"../foundation/lifetime\";\nimport type { ActionFrame } from \"./action-frame\";\nimport { OwnedInputSource } from \"./input-source\";\nimport { type KeyCode, parseKeyCode } from \"./key-code\";\n/** @internal Engine boundary participant, implemented by ActionController. */\nexport interface ActionInputPort {\n readonly active: boolean;\n readonly sourceCount: number;\n accepts(code: KeyCode): boolean;\n keyChanged(): void;\n capture(frame?: ActionFrame): void;\n dispatch(): void;\n reset(): void;\n dispose(): void;\n}\n/** A keyboard device contribution, not a game-facing state reader.\n * Use ActionSource for touch, automation and game logic. */\nexport class KeyboardSource extends OwnedInputSource {\n /** @internal */ constructor(private readonly input: InputSystem) {\n super();\n }\n set(code: KeyCode, pressed: boolean): void {\n parseKeyCode(code);\n if (typeof pressed !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"Keyboard state must be boolean\");\n if (this.writable(!pressed)) this.input.writeKey(this, code, pressed);\n }\n protected release(remove: boolean): void {\n this.input.releaseKeyboard(this, remove);\n }\n}\n/** Engine-owned routing and update boundary. No raw game-state/alternate movement API. */\nexport class InputSystem {\n private readonly actions = new Set<ActionInputPort>();\n private readonly keyboards = new Map<KeyboardSource, Set<KeyCode>>();\n private dead = false;\n private playback = false;\n private frames: ReadonlyMap<object, ActionFrame> | undefined;\n get sourceCount(): number {\n let count = this.keyboards.size;\n for (const actions of this.actions) count += actions.sourceCount;\n return count;\n }\n /** @internal */ registerActions(actions: ActionInputPort): () => void {\n if (this.dead)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input has been disposed\");\n this.actions.add(actions);\n return () => {\n this.actions.delete(actions);\n };\n }\n acceptsKey(code: KeyCode): boolean {\n if (this.playback) return false;\n for (const actions of this.actions) if (actions.accepts(code)) return true;\n return false;\n }\n private notify(): void {\n for (const actions of this.actions) actions.keyChanged();\n }\n /** @internal Device state is resolved only through Action bindings. */\n keyDown(code: KeyCode): boolean {\n for (const keys of this.keyboards.values()) if (keys.has(code)) return true;\n return false;\n }\n /** @internal Freeze every controller before invoking any callbacks. */\n beginStep(captured?: () => void): void {\n if (!this.actions.size) {\n captured?.();\n return;\n }\n const plan = [...this.actions].filter((actions) => actions.active);\n for (const actions of plan) actions.capture(this.frames?.get(actions));\n captured?.();\n const errors: unknown[] = [];\n for (const actions of plan) {\n if (!this.actions.has(actions) || !actions.active) continue;\n try {\n actions.dispatch();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Input callbacks failed\");\n }\n createKeyboardSource(owner?: LifetimeOwner): KeyboardSource {\n if (this.dead || owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input owner has been disposed\");\n const source = new KeyboardSource(this);\n this.keyboards.set(source, new Set());\n try {\n if (owner) source.own(owner);\n } catch (error) {\n source.dispose();\n throw error;\n }\n return source;\n }\n /** @internal */ writeKey(\n source: KeyboardSource,\n code: KeyCode,\n pressed: boolean,\n ): void {\n this.assertWrite(!pressed);\n const keys = this.keyboards.get(source);\n if (!keys || this.dead)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input has been disposed\");\n if (keys.has(code) === pressed) return;\n const before = this.keyDown(code);\n if (pressed) keys.add(code);\n else keys.delete(code);\n if (before !== this.keyDown(code)) this.notify();\n }\n /** @internal */ releaseKeyboard(\n source: KeyboardSource,\n remove: boolean,\n ): void {\n const keys = this.keyboards.get(source);\n if (!keys) return;\n const changed = keys.size > 0;\n keys.clear();\n if (remove) this.keyboards.delete(source);\n if (changed && !this.dead) this.notify();\n }\n /** @internal */ hasController(controller: object): boolean {\n return this.actions.has(controller as ActionInputPort);\n }\n /** @internal */ verifyControllers(controllers: readonly object[]): void {\n const active = [...this.actions].filter((a) => a.active);\n if (\n active.length !== controllers.length ||\n active.some((a) => !controllers.includes(a))\n )\n throw new EngineError(\n \"REPLAY_CONTROLLERS\",\n \"Replay must bind exactly the active Scene controllers\",\n );\n }\n /** @internal */ assertWrite(neutral: boolean): void {\n if (this.playback && !neutral)\n throw new EngineError(\n \"REPLAY_INPUT_LOCKED\",\n \"Live Action/device writes are disabled during Replay playback\",\n );\n }\n /** @internal */ lockPlayback(): void {\n if (this.playback)\n throw new EngineError(\n \"REPLAY_STATE\",\n \"Input already has a playback driver\",\n );\n this.clear();\n this.playback = true;\n }\n /** @internal */ playbackFrames(\n frames: ReadonlyMap<object, ActionFrame>,\n ): void {\n if (!this.playback)\n throw new EngineError(\"REPLAY_STATE\", \"Playback is not active\");\n this.frames = frames;\n }\n /** @internal */ unlockPlayback(): void {\n this.frames = undefined;\n this.playback = false;\n this.clear();\n }\n clear(): void {\n for (const keys of this.keyboards.values()) keys.clear();\n for (const actions of this.actions) actions.reset();\n }\n /** Device diagnostics only; game state is ActionController.snapshot(). */\n snapshot(): readonly KeyCode[] {\n const keys = new Set<KeyCode>();\n for (const contribution of this.keyboards.values())\n for (const key of contribution) keys.add(key);\n return [...keys].sort();\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n try {\n cleanupAll(\n [\n ...[...this.actions].map((a) => () => a.dispose()),\n ...[...this.keyboards.keys()].map((s) => () => s.dispose()),\n ],\n \"Input cleanup failed\",\n );\n } finally {\n this.actions.clear();\n this.keyboards.clear();\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { CanvasNode, UIBounds, UISize } from \"./canvas-node\";\nexport interface UISizeValue {\n width: number;\n height: number;\n}\nexport type MeasureText = (\n node: CanvasNode,\n contentWidth?: number,\n) => UISizeValue;\nconst finite = (v: number) => {\n if (!Number.isFinite(v) || v < 0)\n throw new EngineError(\"INVALID_UI\", \"UI layout overflow\");\n return v;\n};\nconst size = (v: UISize | undefined, parent: number): number | undefined =>\n v === undefined\n ? undefined\n : finite(\n typeof v === \"number\" ? v : (Number(v.slice(0, -1)) / 100) * parent,\n );\n// A conflicting minimum wins, including percentage constraints after parent resolution.\nconst unbounded = Object.freeze({ min: 0, max: Infinity });\nconst limits = (node: CanvasNode, axis: \"Width\" | \"Height\", parent: number) => {\n const s = node.style;\n const minimum = axis === \"Width\" ? s.minWidth : s.minHeight;\n const maximum = axis === \"Width\" ? s.maxWidth : s.maxHeight;\n if (minimum === undefined && maximum === undefined) return unbounded;\n const min = size(minimum, parent) ?? 0;\n return { min, max: Math.max(min, size(maximum, parent) ?? Infinity) };\n};\nconst clamp = (value: number, range: { min: number; max: number }) =>\n finite(Math.max(range.min, Math.min(range.max, value)));\ninterface Item {\n min: number;\n max: number;\n node: CanvasNode;\n main: number;\n cross: number;\n explicitCross: boolean;\n}\ninterface Line {\n items: Item[];\n main: number;\n cross: number;\n}\n/** Bounded Flex with iterative constraint freezing and width-aware leaf measurement. */\nexport function layoutCanvas(\n root: CanvasNode,\n width: number,\n height: number,\n measure: MeasureText,\n): { nodes: number; intrinsicVisits: number; constrainVisits: number } {\n finite(width);\n finite(height);\n let visited = 0,\n intrinsicVisits = 0,\n constrainVisits = 0;\n const naturalCache = new Map<CanvasNode, UISizeValue>();\n const natural = (node: CanvasNode, depth: number): UISizeValue => {\n intrinsicVisits++;\n if (depth > 64)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI trees support at most 64 nested levels\",\n );\n const previous = naturalCache.get(node);\n if (previous) return previous;\n const s = node.style,\n pad = s.padding * 2;\n let w = 0,\n h = 0;\n if (node.kind !== \"panel\") {\n if (typeof s.width !== \"number\" || typeof s.height !== \"number\")\n ({ width: w, height: h } = measure(node));\n } else {\n const children = node.children.filter((n) => n.visible && !n.disposed),\n row = s.direction === \"row\";\n for (const c of children) {\n const n = natural(c, depth + 1),\n cw = n.width,\n ch = n.height;\n w = row ? w + cw : Math.max(w, cw);\n h = row ? Math.max(h, ch) : h + ch;\n }\n if (row) w += Math.max(0, children.length - 1) * s.gap;\n else h += Math.max(0, children.length - 1) * s.gap;\n }\n const result = {\n width: finite(typeof s.width === \"number\" ? s.width : w + pad),\n height: finite(typeof s.height === \"number\" ? s.height : h + pad),\n };\n for (const axis of [\"Width\", \"Height\"] as const) {\n const key = axis === \"Width\" ? \"width\" : \"height\";\n const min = s[`min${axis}`],\n max = s[`max${axis}`];\n if (min === undefined && max === undefined) continue;\n result[key] = clamp(result[key], {\n min: typeof min === \"number\" ? min : 0,\n max: Math.max(\n typeof min === \"number\" ? min : 0,\n typeof max === \"number\" ? max : Infinity,\n ),\n });\n }\n naturalCache.set(node, result);\n return result;\n };\n const constrainedCache = new Map<CanvasNode, Map<string, UISizeValue>>();\n // Auto cross size of a wrapped container depends on its constrained main size.\n const constrained = (\n node: CanvasNode,\n aw: number,\n ah: number,\n stretchWidth: boolean,\n stretchHeight: boolean,\n depth: number,\n forcedWidth?: number,\n forcedHeight?: number,\n ): UISizeValue => {\n constrainVisits++;\n if (depth > 64)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI trees support at most 64 nested levels\",\n );\n const s = node.style,\n n = natural(node, depth),\n row = s.direction === \"row\";\n let w = forcedWidth ?? size(s.width, aw) ?? (stretchWidth ? aw : n.width),\n h = forcedHeight ?? size(s.height, ah) ?? (stretchHeight ? ah : n.height);\n if (\n node.kind !== \"panel\" &&\n s.textWrap &&\n s.width === undefined &&\n forcedWidth === undefined\n )\n w = Math.min(w, aw);\n w = clamp(w, limits(node, \"Width\", aw));\n h = clamp(h, limits(node, \"Height\", ah));\n if (node.kind !== \"panel\") {\n if (\n s.height === undefined &&\n !stretchHeight &&\n forcedHeight === undefined\n )\n h = clamp(\n measure(node, Math.max(0, w - s.padding * 2)).height + s.padding * 2,\n limits(node, \"Height\", ah),\n );\n return { width: w, height: h };\n }\n const key = `${aw},${ah},${stretchWidth},${stretchHeight},${forcedWidth},${forcedHeight}`;\n let cache = constrainedCache.get(node);\n const cached = cache?.get(key);\n if (cached) return cached;\n if (!cache) {\n cache = new Map();\n constrainedCache.set(node, cache);\n }\n const saved = (value: UISizeValue) => {\n cache?.set(key, value);\n return value;\n };\n const lines = linesFor(\n node,\n Math.max(0, w - s.padding * 2),\n Math.max(0, h - s.padding * 2),\n depth,\n );\n const totalCross =\n lines.reduce((sum, line) => sum + line.cross, 0) +\n s.gap * Math.max(0, lines.length - 1);\n const totalMain = Math.max(\n 0,\n ...lines.map(\n (line) =>\n line.items.reduce((sum, i) => sum + i.main, 0) +\n s.gap * Math.max(0, line.items.length - 1),\n ),\n );\n if (\n row &&\n s.height === undefined &&\n !stretchHeight &&\n forcedHeight === undefined\n )\n h = totalCross + s.padding * 2;\n if (\n !row &&\n s.width === undefined &&\n !stretchWidth &&\n forcedWidth === undefined\n )\n w = totalCross + s.padding * 2;\n if (\n !row &&\n !s.wrap &&\n s.height === undefined &&\n !stretchHeight &&\n forcedHeight === undefined\n )\n h = totalMain + s.padding * 2;\n return saved({\n width: clamp(w, limits(node, \"Width\", aw)),\n height: clamp(h, limits(node, \"Height\", ah)),\n });\n };\n const linesFor = (\n node: CanvasNode,\n cw: number,\n ch: number,\n depth: number,\n ): Line[] => {\n const s = node.style,\n row = s.direction === \"row\",\n main = row ? cw : ch;\n const lines: Line[] = [{ items: [], main: 0, cross: 0 }];\n for (const child of node.children) {\n if (!child.visible || child.disposed) continue;\n const align = child.style.alignSelf ?? s.align;\n const n = constrained(\n child,\n cw,\n ch,\n !row && align === \"stretch\" && child.style.width === undefined,\n row &&\n !s.wrap &&\n align === \"stretch\" &&\n child.style.height === undefined,\n depth + 1,\n ),\n a = n.width,\n b = n.height;\n const range = limits(child, row ? \"Width\" : \"Height\", main);\n const item: Item = {\n ...range,\n node: child,\n main: row ? a : b,\n cross: row ? b : a,\n explicitCross:\n (row ? child.style.height : child.style.width) !== undefined,\n };\n let line = lines[lines.length - 1] as Line;\n if (s.wrap && line.items.length && line.main + s.gap + item.main > main) {\n line = { items: [], main: 0, cross: 0 };\n lines.push(line);\n }\n if (line.items.length) line.main += s.gap;\n line.items.push(item);\n line.main += item.main;\n line.cross = Math.max(line.cross, item.cross);\n }\n\n for (const line of lines) {\n // Freeze min/max-limited items and redistribute remaining free space.\n const growing = main >= line.main;\n const scrolling =\n s.scroll === \"both\" || s.scroll === (row ? \"horizontal\" : \"vertical\");\n let remaining = line.items.filter((i) =>\n growing\n ? i.node.style.grow > 0 && i.main < i.max\n : !scrolling && i.node.style.shrink > 0 && i.main > i.min,\n );\n const bases =\n !growing && remaining.length\n ? new Map(line.items.map((i) => [i, i.main]))\n : undefined;\n while (remaining.length) {\n const free =\n main -\n line.items.reduce((sum, i) => sum + i.main, 0) -\n s.gap * Math.max(0, line.items.length - 1);\n if (Math.abs(free) < 1e-9 || (growing ? free < 0 : free > 0)) break;\n const weightOf = (i: Item) =>\n growing\n ? i.node.style.grow\n : i.node.style.shrink * (bases?.get(i) ?? 0);\n const weight = remaining.reduce((sum, i) => sum + weightOf(i), 0);\n if (weight === 0) break;\n let changed = 0;\n for (const i of remaining) {\n const previous = i.main;\n i.main = clamp(previous + (free * weightOf(i)) / weight, i);\n changed += Math.abs(i.main - previous);\n }\n remaining = remaining.filter((i) =>\n growing ? i.main < i.max - 1e-9 : i.main > i.min + 1e-9,\n );\n if (changed < 1e-9) break;\n }\n // Wrapped descendants remeasure their auto cross extent after flex main allocation.\n for (const i of line.items)\n if (!i.explicitCross) {\n const measured = constrained(\n i.node,\n cw,\n ch,\n false,\n false,\n depth + 1,\n row ? i.main : undefined,\n row ? undefined : i.main,\n );\n i.cross = row ? measured.height : measured.width;\n }\n line.cross = line.items.reduce((v, i) => Math.max(v, i.cross), 0);\n }\n return lines;\n };\n const arrange = (\n node: CanvasNode,\n x: number,\n y: number,\n w: number,\n h: number,\n depth: number,\n ) => {\n if (depth > 64)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI trees support at most 64 nested levels\",\n );\n visited++;\n const s = node.style;\n node.boundsValue = Object.freeze({\n x: finite(x),\n y: finite(y),\n width: finite(w),\n height: finite(h),\n });\n if (node.kind !== \"panel\") return;\n const row = s.direction === \"row\",\n cw = Math.max(0, w - 2 * s.padding),\n ch = Math.max(0, h - 2 * s.padding),\n main = row ? cw : ch,\n cross = row ? ch : cw;\n const lines = linesFor(node, cw, ch, depth);\n if (!s.wrap) (lines[0] as Line).cross = cross;\n let lineOffset = 0;\n for (const line of lines) {\n const left = Math.max(\n 0,\n main -\n line.items.reduce((sum, i) => sum + i.main, 0) -\n s.gap * Math.max(0, line.items.length - 1),\n );\n let gap = s.gap,\n offset = 0;\n if (s.justify === \"end\") offset = left;\n if (s.justify === \"center\") offset = left / 2;\n if (s.justify === \"space-between\" && line.items.length > 1)\n gap += left / (line.items.length - 1);\n if (s.justify === \"space-around\" && line.items.length) {\n gap += left / line.items.length;\n offset = left / line.items.length / 2;\n }\n for (const i of line.items) {\n const align = i.node.style.alignSelf ?? s.align;\n if (!i.explicitCross && align === \"stretch\")\n i.cross = clamp(\n line.cross,\n limits(i.node, row ? \"Height\" : \"Width\", cross),\n );\n let c =\n align === \"end\"\n ? line.cross - i.cross\n : align === \"center\"\n ? (line.cross - i.cross) / 2\n : 0;\n c = Math.max(0, c);\n arrange(\n i.node,\n x + s.padding + (row ? offset : lineOffset + c),\n y + s.padding + (row ? lineOffset + c : offset),\n row ? i.main : i.cross,\n row ? i.cross : i.main,\n depth + 1,\n );\n offset += i.main + gap;\n }\n lineOffset += line.cross + s.gap;\n }\n };\n natural(root, 0);\n arrange(\n root,\n 0,\n 0,\n clamp(size(root.style.width, width) ?? width, limits(root, \"Width\", width)),\n clamp(\n size(root.style.height, height) ?? height,\n limits(root, \"Height\", height),\n ),\n 0,\n );\n return { nodes: visited, intrinsicVisits, constrainVisits };\n}\nexport function containsUI(box: UIBounds, x: number, y: number): boolean {\n return (\n x >= box.x && y >= box.y && x < box.x + box.width && y < box.y + box.height\n );\n}\nexport function intersectUI(a: UIBounds, b: UIBounds): UIBounds {\n const x = Math.max(a.x, b.x),\n y = Math.max(a.y, b.y);\n return {\n x,\n y,\n width: Math.max(0, Math.min(a.x + a.width, b.x + b.width) - x),\n height: Math.max(0, Math.min(a.y + a.height, b.y + b.height) - y),\n };\n}\n","import { containsUI, intersectUI } from \"./canvas-layout\";\nimport type { CanvasNode, UIBounds } from \"./canvas-node\";\nexport type ScrollbarAxis = \"vertical\" | \"horizontal\";\nexport interface CanvasScrollbar {\n readonly node: CanvasNode;\n readonly axis: ScrollbarAxis;\n readonly track: UIBounds;\n readonly thumb: UIBounds;\n readonly enabled: boolean;\n}\nconst empty: readonly CanvasScrollbar[] = Object.freeze([]);\n/** Overlay geometry, independent of layout metrics and Renderer objects. */\nexport function canvasScrollbars(node: CanvasNode): readonly CanvasScrollbar[] {\n const s = node.style,\n b = node.bounds;\n if (!s.scroll || s.scrollbar === \"hidden\") return empty;\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n if (p.disposed || !p.visible) return empty;\n const axes: ScrollbarAxis[] =\n s.scroll === \"both\" ? [\"vertical\", \"horizontal\"] : [s.scroll];\n const result: CanvasScrollbar[] = [];\n for (const axis of axes) {\n const vertical = axis === \"vertical\",\n maximum = vertical ? node.maxScrollY : node.maxScrollX;\n if (maximum === 0 && s.scrollbar !== \"always\") continue;\n const corner = s.scroll === \"both\" ? 10 : 0;\n const track = vertical\n ? {\n x: b.x + Math.max(0, b.width - 10),\n y: b.y + 2,\n width: Math.min(8, b.width),\n height: Math.max(0, b.height - 4 - corner),\n }\n : {\n x: b.x + 2,\n y: b.y + Math.max(0, b.height - 10),\n width: Math.max(0, b.width - 4 - corner),\n height: Math.min(8, b.height),\n };\n const length = vertical ? track.height : track.width,\n viewport = vertical ? b.height : b.width;\n const thumbLength =\n maximum > 0\n ? Math.min(\n length,\n Math.max(24, (length * viewport) / (viewport + maximum)),\n )\n : length;\n const offset =\n (maximum > 0 ? (vertical ? node.scrollY : node.scrollX) / maximum : 0) *\n (length - thumbLength);\n const thumb = vertical\n ? { ...track, y: track.y + offset, height: thumbLength }\n : { ...track, x: track.x + offset, width: thumbLength };\n result.push({\n node,\n axis,\n track,\n thumb,\n enabled: node.available && maximum > 0 && length > thumbLength,\n });\n }\n return result;\n}\n/** Minimum 24 Host-unit cross-axis hit region, intersected with the node/ancestor clip. */\nexport function scrollbarContains(\n bar: CanvasScrollbar,\n x: number,\n y: number,\n scale: number,\n clip: UIBounds,\n thumb = false,\n): boolean {\n const b = thumb ? bar.thumb : bar.track;\n const pad =\n bar.axis === \"vertical\"\n ? Math.max(0, (24 / scale - b.width) / 2)\n : Math.max(0, (24 / scale - b.height) / 2);\n const hit =\n bar.axis === \"vertical\"\n ? { x: b.x - pad, y: b.y, width: b.width + 2 * pad, height: b.height }\n : { x: b.x, y: b.y - pad, width: b.width, height: b.height + 2 * pad };\n return containsUI(intersectUI(hit, clip), x, y);\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent, EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport type { ScreenPoint, WorldPoint } from \"../graphics/coordinates\";\nimport type { Scene } from \"../scene/scene\";\nimport type { CanvasNode } from \"../ui/canvas-node\";\nimport type { CanvasUI } from \"../ui/canvas-ui\";\nimport {\n type CanvasScrollbar,\n canvasScrollbars,\n scrollbarContains,\n} from \"../ui/scrollbar\";\n/** Snapshot coordinates at DOM delivery. Screen is host CSS units; world includes the current Camera. */\nexport interface PointerInfo {\n readonly pointerId: number;\n readonly pointerType: string;\n readonly button: number;\n readonly buttons: number;\n readonly screen: ScreenPoint;\n readonly world: WorldPoint;\n /** Inside the original UI target's current clipped hit area, or the world viewport clip. */\n readonly inside: boolean;\n /** Monotonic Host seconds; omit when unavailable (momentum then stays off). */\n readonly time?: number;\n}\nexport const PointerDown = defineEvent<PointerInfo>(\"PointerDown\");\nexport const PointerMove = defineEvent<PointerInfo>(\"PointerMove\");\nexport const PointerUp = defineEvent<PointerInfo>(\"PointerUp\");\nexport const PointerCancel = defineEvent<PointerInfo>(\"PointerCancel\");\nexport const PointerEnter = defineEvent<PointerInfo>(\"PointerEnter\");\nexport const PointerLeave = defineEvent<PointerInfo>(\"PointerLeave\");\nexport const PointerClick = defineEvent<PointerInfo>(\"PointerClick\");\n/** Scene-scoped world input. UI gestures are never delivered here. */\nexport class ScenePointer implements LifetimeOwner {\n private readonly lifetime = new Lifetime();\n readonly events = new EventBus();\n private readonly removeScene: () => void;\n constructor(readonly scene: Scene) {\n this.removeScene = scene.onDispose(() => this.dispose());\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n dispose(): void {\n if (this.disposed) return;\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.events.dispose(),\n this.removeScene,\n ],\n \"Scene pointer cleanup failed\",\n );\n }\n}\ninterface Gesture {\n channel: ScenePointer;\n node?: CanvasNode;\n ui?: CanvasUI;\n last: PointerInfo;\n primary: boolean;\n off?: () => void;\n start: PointerInfo;\n scale: number;\n candidates: readonly CanvasNode[];\n candidateRevisions: readonly number[];\n scroll?: CanvasNode;\n axis?: \"vertical\" | \"horizontal\" | \"both\";\n revision?: number;\n bar?: { axis: CanvasScrollbar[\"axis\"]; grab: number; thumb: boolean };\n control?: CanvasNode;\n controlRevision?: number;\n controlLocked?: boolean;\n vx: number;\n vy: number;\n}\n/** @internal Device-independent routing state; DOM is only an adapter. */\nexport class PointerRouting {\n private readonly controlOwners = new Map<CanvasNode, number>();\n private readonly scrollOwners = new Map<CanvasNode, number>();\n private readonly suppressed = new Set<number>();\n private readonly gestures = new Map<number, Gesture>();\n private readonly hovering = new Map<\n number,\n { node: CanvasNode; info: PointerInfo }\n >();\n private readonly holds = new Map<CanvasNode, Set<number | string>>();\n private readonly keyRevisions = new Map<CanvasNode, number>();\n private readonly keys = new Map<CanvasNode, Set<string>>();\n private channel: ScenePointer | undefined;\n private ui: CanvasUI | undefined;\n private subscriptions: Array<() => void> = [];\n private deliveries = 0;\n constructor(private readonly released: (id: number) => void = () => {}) {}\n get diagnostics() {\n return {\n captures: this.gestures.size,\n suppressedPointers: this.suppressed.size,\n hoverPointers: this.hovering.size,\n heldNodes: this.holds.size,\n keyboardNodes: this.keys.size,\n deliveries: this.deliveries,\n scrollDrags: this.scrollOwners.size,\n controlDrags: this.controlOwners.size,\n };\n }\n setScene(channel: ScenePointer, ui?: CanvasUI): void {\n this.reset();\n this.channel = channel;\n this.ui = ui;\n this.subscriptions.push(channel.onDispose(() => this.reset()));\n if (ui) {\n this.subscriptions.push(ui.onDispose(() => this.reset()));\n this.subscriptions.push(ui.subscribe(() => this.prune()));\n }\n }\n private hold(node: CanvasNode, key: number | string, down: boolean): void {\n const set = this.holds.get(node) ?? new Set<number | string>();\n if (down) set.add(key);\n else set.delete(key);\n if (set.size) this.holds.set(node, set);\n else this.holds.delete(node);\n if (node.kind === \"hold-button\") node.setHeld(set.size > 0);\n else if (node.held !== set.size > 0) {\n node.held = set.size > 0;\n node.changed();\n }\n }\n private emit(\n gesture: Gesture,\n type: typeof PointerDown,\n info: PointerInfo,\n ): void {\n if (gesture.channel.disposed || gesture.node?.disposed) return;\n this.deliveries++;\n (gesture.node?.events ?? gesture.channel.events).emit(type, info);\n }\n private inside(g: Gesture, data: PointerInfo): PointerInfo {\n return Object.freeze({\n ...data,\n inside:\n g.scroll && g.ui\n ? g.ui.containsNode(\n g.scroll,\n data.screen.x / g.ui.scale,\n data.screen.y / g.ui.scale,\n )\n : g.node\n ? g.ui?.hitTest(\n data.screen.x / g.ui.scale,\n data.screen.y / g.ui.scale,\n ) === g.node\n : data.inside,\n });\n }\n down(data: PointerInfo): CanvasNode | undefined {\n this.validate(data);\n if (!this.channel || this.channel.disposed) return;\n if (this.gestures.has(data.pointerId)) this.cancel(data.pointerId);\n this.suppressed.delete(data.pointerId);\n const pick = this.ui?.pick(\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n );\n const node = pick?.node,\n bar = pick?.bar;\n if (\n bar &&\n data.button === 0 &&\n (!bar.enabled || this.scrollOwners.has(bar.node))\n ) {\n this.suppressed.add(data.pointerId);\n return node;\n }\n if (node && data.button === 0 && this.controlOwners.has(node)) {\n this.suppressed.add(data.pointerId);\n return node;\n }\n if (!node && !data.inside) return;\n const g: Gesture = {\n channel: this.channel,\n last: data,\n primary: data.button === 0,\n start: data,\n scale: this.ui?.scale ?? 1,\n candidates:\n this.ui?.scrollTargets(\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n ) ?? [],\n candidateRevisions: [],\n vx: 0,\n vy: 0,\n ...(node ? { node, ui: this.ui as CanvasUI } : {}),\n };\n g.candidateRevisions = g.candidates.map((n) => n.scrollRevision);\n for (const candidate of g.candidates) candidate.stopScroll();\n if (bar && this.ui && g.primary) {\n const pos =\n (bar.axis === \"vertical\" ? data.screen.y : data.screen.x) /\n this.ui.scale;\n const thumb = scrollbarContains(\n bar,\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n this.ui.scale,\n bar.node.bounds,\n true,\n );\n const length =\n bar.axis === \"vertical\" ? bar.thumb.height : bar.thumb.width,\n start = bar.axis === \"vertical\" ? bar.thumb.y : bar.thumb.x;\n g.scroll = bar.node;\n g.axis = bar.node.style.scroll ?? bar.axis;\n g.revision = bar.node.scrollRevision;\n g.bar = {\n axis: bar.axis,\n grab: length > 0 ? (pos - start) / length : 0,\n thumb,\n };\n this.scrollOwners.set(bar.node, data.pointerId);\n }\n if (node?.control) g.controlRevision = node.control.revision;\n this.gestures.set(data.pointerId, g);\n if (node) g.off = node.onDispose(() => this.cancel(data.pointerId));\n cleanupAll(\n [\n () => {\n const port = node?.control;\n if (!node || !port?.pointerAxis || !g.primary) return;\n g.control = node;\n g.controlRevision = port.revision;\n this.controlOwners.set(node, data.pointerId);\n if (\n !port.beginPointer(\n data.screen.x / g.scale,\n data.screen.y / g.scale,\n ) &&\n this.gestures.get(data.pointerId) === g\n ) {\n this.controlOwners.delete(node);\n delete g.control;\n }\n },\n () => {\n if (\n this.gestures.get(data.pointerId) === g &&\n node?.interactive &&\n g.primary\n )\n this.hold(node, data.pointerId, true);\n },\n () => {\n if (\n this.gestures.get(data.pointerId) === g &&\n (!node || node.available)\n )\n this.emit(g, PointerDown, this.inside(g, data));\n },\n () => {\n if (\n bar &&\n g.bar &&\n !g.bar.thumb &&\n this.gestures.get(data.pointerId) === g\n ) {\n const vertical = bar.axis === \"vertical\",\n pos =\n (vertical ? data.screen.y : data.screen.x) / (g.ui?.scale ?? 1),\n start = vertical ? bar.thumb.y : bar.thumb.x;\n const direction = pos < start ? -1 : 1;\n bar.node.setScrollPosition(\n bar.node.scrollX +\n (!vertical ? direction * bar.node.bounds.width * 0.9 : 0),\n bar.node.scrollY +\n (vertical ? direction * bar.node.bounds.height * 0.9 : 0),\n );\n }\n },\n ],\n \"Pointer down handlers failed\",\n );\n return node;\n }\n private validate(data: PointerInfo): void {\n if (\n !Number.isInteger(data.pointerId) ||\n !Number.isFinite(data.screen.x) ||\n !Number.isFinite(data.screen.y)\n ) {\n this.cancel(data.pointerId, false);\n throw new EngineError(\n \"INVALID_UI\",\n \"Pointer identity and coordinates must be finite\",\n );\n }\n }\n /** Host-local screen units, normalized by the UI scale. */\n scroll(x: number, y: number, dx: number, dy: number): boolean {\n const ui = this.ui;\n return (\n ui?.scrollAt(x / ui.scale, y / ui.scale, dx / ui.scale, dy / ui.scale) ??\n false\n );\n }\n hasHover(id: number): boolean {\n return this.hovering.has(id);\n }\n has(id: number): boolean {\n return this.gestures.has(id);\n }\n owns(id: number): boolean {\n return this.gestures.has(id) || this.suppressed.has(id);\n }\n move(data: PointerInfo): void {\n this.validate(data);\n if (this.suppressed.has(data.pointerId)) return;\n const g = this.gestures.get(data.pointerId);\n if (g) {\n if (g.control && !g.controlLocked) {\n const dx = Math.abs(data.screen.x - g.start.screen.x),\n dy = Math.abs(data.screen.y - g.start.screen.y);\n if (dx >= g.control.style.dragThreshold && dx > dy)\n g.controlLocked = true;\n }\n if (!g.scroll && g.primary && !g.controlLocked) this.claimScroll(g, data);\n if (this.gestures.get(data.pointerId) !== g) return;\n if (g.bar && g.scroll && g.ui) {\n const bar = canvasScrollbars(g.scroll).find(\n (b) => b.axis === g.bar?.axis,\n );\n if (!bar) {\n this.cancel(data.pointerId);\n return;\n }\n if (g.bar.thumb && bar.enabled) {\n const vertical = bar.axis === \"vertical\",\n position = (vertical ? data.screen.y : data.screen.x) / g.ui.scale;\n const start = vertical ? bar.track.y : bar.track.x,\n thumb = vertical ? bar.thumb.height : bar.thumb.width,\n travel = (vertical ? bar.track.height : bar.track.width) - thumb;\n const offset =\n ((position - start - g.bar.grab * thumb) / travel) *\n (vertical ? g.scroll.maxScrollY : g.scroll.maxScrollX);\n g.scroll.setScrollPosition(\n vertical ? g.scroll.scrollX : offset,\n vertical ? offset : g.scroll.scrollY,\n );\n }\n g.last = data;\n } else if (g.scroll && g.ui) {\n const dx = (g.last.screen.x - data.screen.x) / g.ui.scale,\n dy = (g.last.screen.y - data.screen.y) / g.ui.scale;\n this.sampleVelocity(g, data, dx, dy);\n g.last = data;\n g.scroll.setScrollPosition(\n g.scroll.scrollX + dx,\n g.scroll.scrollY + dy,\n );\n } else {\n g.last = data;\n g.control?.control?.movePointer(\n data.screen.x / g.scale,\n data.screen.y / g.scale,\n );\n }\n if (this.gestures.get(data.pointerId) === g)\n this.emit(g, PointerMove, this.inside(g, data));\n return;\n }\n if (!this.channel || this.channel.disposed) return;\n const node = this.ui?.hitTest(\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n );\n this.hover(data.pointerId, node, data);\n if (node?.available) {\n this.deliveries++;\n node.events.emit(PointerMove, Object.freeze({ ...data, inside: true }));\n } else if (!node && data.inside) {\n this.deliveries++;\n this.channel.events.emit(PointerMove, data);\n }\n }\n private sampleVelocity(\n g: Gesture,\n data: PointerInfo,\n dx: number,\n dy: number,\n ): void {\n const dt =\n data.time !== undefined && g.last.time !== undefined\n ? data.time - g.last.time\n : 0;\n if (!Number.isFinite(dt) || dt <= 0 || dt > 0.15) {\n g.vx = 0;\n g.vy = 0;\n return;\n }\n const a = 1 - Math.exp(-dt / 0.045);\n g.vx += (Math.max(-3000, Math.min(3000, dx / dt)) - g.vx) * a;\n g.vy += (Math.max(-3000, Math.min(3000, dy / dt)) - g.vy) * a;\n }\n private claimScroll(g: Gesture, data: PointerInfo): void {\n const ui = this.ui;\n if (!ui) return;\n const dx = (g.start.screen.x - data.screen.x) / ui.scale,\n dy = (g.start.screen.y - data.screen.y) / ui.scale;\n const candidate = g.candidates.find((n) => {\n if (n.ui !== ui || !n.available || !n.style.dragScroll) return false;\n const x =\n n.style.scroll !== \"vertical\" &&\n n.maxScrollX > 0 &&\n Math.abs(dx) * ui.scale >= n.style.dragThreshold;\n const y =\n n.style.scroll !== \"horizontal\" &&\n n.maxScrollY > 0 &&\n Math.abs(dy) * ui.scale >= n.style.dragThreshold;\n return (\n (x &&\n ((dx < 0 && n.scrollX > 0) ||\n (dx > 0 && n.scrollX < n.maxScrollX))) ||\n (y &&\n ((dy < 0 && n.scrollY > 0) || (dy > 0 && n.scrollY < n.maxScrollY)))\n );\n });\n const axis = candidate?.style.scroll;\n if (!candidate || !axis) return;\n if (this.scrollOwners.has(candidate)) {\n this.cancel(data.pointerId);\n return;\n }\n const previous = { ...g };\n if (g.control) this.controlOwners.delete(g.control);\n delete g.control;\n delete g.controlRevision;\n delete g.controlLocked;\n g.off?.();\n g.scroll = candidate;\n g.node = candidate;\n g.ui = ui;\n g.axis = axis;\n g.revision = candidate.scrollRevision;\n this.scrollOwners.set(candidate, data.pointerId);\n g.off = candidate.onDispose(() => this.cancel(data.pointerId));\n cleanupAll(\n [\n () => previous.control?.control?.endPointer(true),\n () => {\n if (previous.node?.interactive)\n this.hold(previous.node, data.pointerId, false);\n },\n () =>\n this.emit(\n previous,\n PointerCancel,\n Object.freeze({ ...data, inside: false }),\n ),\n () => {\n if (this.gestures.get(data.pointerId) === g)\n this.emit(g, PointerDown, this.inside(g, data));\n },\n ],\n \"Scroll ownership transfer failed\",\n );\n }\n leave(data: PointerInfo): void {\n if (!this.gestures.has(data.pointerId))\n this.hover(data.pointerId, undefined, data);\n }\n private hover(\n id: number,\n node: CanvasNode | undefined,\n info: PointerInfo,\n ): void {\n const previous = this.hovering.get(id);\n if (previous?.node === node) {\n if (node) this.hovering.set(id, { node, info });\n return;\n }\n this.hovering.delete(id);\n if (node) this.hovering.set(id, { node, info });\n cleanupAll(\n [\n () => {\n if (previous) {\n previous.node.hovered = [...this.hovering.values()].some(\n (h) => h.node === previous.node,\n );\n previous.node.changed();\n if (!previous.node.disposed)\n previous.node.events.emit(\n PointerLeave,\n Object.freeze({ ...info, inside: false }),\n );\n }\n },\n () => {\n if (node?.available) {\n node.hovered = true;\n node.changed();\n node.events.emit(\n PointerEnter,\n Object.freeze({ ...info, inside: true }),\n );\n }\n },\n ],\n \"Pointer hover handlers failed\",\n );\n }\n up(data: PointerInfo): void {\n this.validate(data);\n if (this.suppressed.delete(data.pointerId)) return;\n let g = this.gestures.get(data.pointerId);\n if (!g) return;\n if (data.screen.x !== g.last.screen.x || data.screen.y !== g.last.screen.y)\n this.move(data);\n g = this.gestures.get(data.pointerId);\n if (!g) return;\n this.gestures.delete(data.pointerId);\n if (g.control) this.controlOwners.delete(g.control);\n if (g.scroll) {\n this.scrollOwners.delete(g.scroll);\n const fresh =\n data.time !== undefined &&\n g.last.time !== undefined &&\n Number.isFinite(data.time) &&\n data.time >= g.last.time &&\n data.time - g.last.time <= 0.08;\n if (fresh && !g.bar) g.scroll.startScroll(g.vx, g.vy);\n }\n const info = this.inside(g, data);\n cleanupAll(\n [\n () => g.off?.(),\n () => this.released(data.pointerId),\n () => g.control?.control?.endPointer(false),\n () => {\n if (g.node?.interactive) this.hold(g.node, data.pointerId, false);\n },\n () => {\n if (!g.node || g.node.available) this.emit(g, PointerUp, info);\n },\n () => {\n if (\n !g.scroll &&\n g.primary &&\n info.inside &&\n (!g.node || g.node.available)\n )\n this.emit(g, PointerClick, info);\n },\n () => {\n if (!g.scroll && g.primary && info.inside && g.node?.available)\n g.node.activate(\"pointer\");\n },\n ],\n \"Pointer up handlers failed\",\n );\n }\n cancel(id: number, retainOwnership = true): void {\n if (!retainOwnership) this.suppressed.delete(id);\n const g = this.gestures.get(id);\n if (!g) return;\n this.gestures.delete(id);\n if (g.control) this.controlOwners.delete(g.control);\n if (g.scroll) {\n this.scrollOwners.delete(g.scroll);\n g.scroll.stopScroll();\n }\n if (retainOwnership) this.suppressed.add(id);\n cleanupAll(\n [\n () => g.off?.(),\n () => this.released(id),\n () => g.control?.control?.endPointer(true),\n () => {\n if (g.node?.interactive) this.hold(g.node, id, false);\n },\n () =>\n this.emit(\n g,\n PointerCancel,\n Object.freeze({ ...g.last, inside: false }),\n ),\n ],\n \"Pointer cancel handlers failed\",\n );\n }\n /** Control-specific keys take priority over ancestor scrolling. Hosts preserve Tab and native editor input. */\n controlKey(node: CanvasNode, code: string): boolean {\n const port = node.control;\n if (!port?.keys.includes(code) || node.ui !== this.ui || !node.available)\n return false;\n port.key(code);\n return true;\n }\n hasKey(node: CanvasNode, code: string): boolean {\n return this.keys.get(node)?.has(code) ?? false;\n }\n key(node: CanvasNode, code: string, down: boolean): void {\n if (code !== \"Space\" && code !== \"Enter\") return;\n if (down && !node.available) return;\n const set = this.keys.get(node) ?? new Set<string>();\n const activate = !down && set.has(code);\n if (down) {\n if (node.control && !this.keys.has(node))\n this.keyRevisions.set(node, node.control.revision);\n set.add(code);\n this.keys.set(node, set);\n } else {\n set.delete(code);\n if (!set.size) {\n this.keys.delete(node);\n this.keyRevisions.delete(node);\n }\n }\n cleanupAll(\n [\n () => this.hold(node, `key:${code}`, down),\n () => {\n if (activate && node.kind !== \"hold-button\" && node.available)\n node.activate(\"keyboard\");\n },\n ],\n \"UI keyboard handlers failed\",\n );\n }\n releaseKeys(node: CanvasNode): void {\n const keys = [...(this.keys.get(node) ?? [])];\n this.keys.delete(node);\n this.keyRevisions.delete(node);\n cleanupAll(\n keys.map((code) => () => this.hold(node, `key:${code}`, false)),\n \"Keyboard hold cleanup failed\",\n );\n }\n private prune(): void {\n cleanupAll(\n [\n ...[...this.gestures]\n .filter(\n ([, g]) =>\n (g.node && !g.node.available) ||\n (g.node?.control &&\n g.controlRevision !== undefined &&\n g.node.control.revision !== g.controlRevision) ||\n (!g.scroll &&\n g.candidates.some(\n (n, i) => n.scrollRevision !== g.candidateRevisions[i],\n )) ||\n (g.ui && g.scale !== g.ui.scale) ||\n (g.scroll &&\n ((!g.bar && !g.scroll.style.dragScroll) ||\n (g.bar &&\n !canvasScrollbars(g.scroll).some(\n (b) => b.axis === g.bar?.axis && b.enabled,\n )) ||\n g.axis !== g.scroll.style.scroll ||\n g.revision !== g.scroll.scrollRevision)),\n )\n .map(\n ([id]) =>\n () =>\n this.cancel(id),\n ),\n ...[...this.hovering]\n .filter(([, h]) => !h.node.available)\n .map(\n ([id, h]) =>\n () =>\n this.hover(id, undefined, h.info),\n ),\n ...[...this.keys.keys()]\n .filter(\n (n) =>\n !n.available ||\n (n.control && this.keyRevisions.get(n) !== n.control.revision),\n )\n .map((n) => () => this.releaseKeys(n)),\n ],\n \"Invalid pointer cleanup failed\",\n );\n }\n release(): void {\n this.ui?.stopMotion();\n cleanupAll(\n [\n ...[...this.gestures.keys()].map((id) => () => this.cancel(id)),\n ...[...this.hovering].map(\n ([id, h]) =>\n () =>\n this.hover(id, undefined, h.info),\n ),\n ...[...this.keys.keys()].map((n) => () => this.releaseKeys(n)),\n ],\n \"Pointer release failed\",\n );\n }\n dispose(): void {\n try {\n this.reset();\n } finally {\n this.suppressed.clear();\n }\n }\n reset(): void {\n const off = this.subscriptions.splice(0);\n this.ui?.stopMotion();\n this.channel = undefined;\n this.ui = undefined;\n cleanupAll(\n [...off, () => this.release()],\n \"Pointer routing cleanup failed\",\n );\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { cleanupAll } from \"../foundation/lifetime\";\nimport { RandomManager } from \"../foundation/random\";\nimport { Transform } from \"../graphics/components\";\nimport { InputSystem } from \"../interaction/input\";\nimport type { ExecutionPort } from \"../scene/execution\";\nimport { Scene, SceneState } from \"../scene/scene\";\nexport class Engine {\n readonly input = new InputSystem();\n private active = new Scene(\"default\");\n private dead = false;\n private stepping = false;\n private transitioning = false;\n private suspended = false;\n private elapsed = 0;\n private count = 0;\n private execution: ExecutionPort | undefined;\n get stepCount(): number {\n return this.count;\n }\n /** @internal Replay owns this single optional execution boundary. */\n attachExecution(port: ExecutionPort): () => void {\n this.assertAlive();\n if (this.execution || this.stepping || this.transitioning)\n throw new EngineError(\n \"REPLAY_STATE\",\n \"An execution driver is already attached or Engine is stepping\",\n );\n this.execution = port;\n return () => {\n if (this.execution === port) this.execution = undefined;\n };\n }\n readonly random: RandomManager;\n private readonly context: {\n delta: number;\n scene: Scene;\n };\n constructor(options: { seed?: number } = {}) {\n this.random = new RandomManager(options.seed);\n this.active.claim(this);\n this.context = {\n delta: 0,\n scene: this.active,\n };\n }\n get scene(): Scene {\n return this.active;\n }\n get disposed(): boolean {\n return this.dead;\n }\n private assertAlive(): void {\n if (this.dead)\n throw new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\");\n }\n get paused(): boolean {\n return this.suspended;\n }\n pause(): void {\n this.assertAlive();\n if (!this.suspended) {\n this.suspended = true;\n this.input.clear();\n }\n }\n resume(): void {\n this.assertAlive();\n if (this.suspended) {\n this.suspended = false;\n this.input.clear();\n }\n }\n activate(scene: Scene): void {\n this.assertAlive();\n if (this.stepping || this.transitioning)\n throw new EngineError(\n \"TRANSITION_REENTRANT\",\n \"Cannot activate during a synchronous update or transition\",\n );\n scene.validateOwner(this);\n this.execution?.validateScene(scene);\n if (scene === this.active && scene.state === SceneState.Active) return;\n if (scene.state === SceneState.Preparing) scene.markReady();\n if (scene.state !== SceneState.Ready)\n throw new EngineError(\"SCENE_STATE\", \"Only ready scenes can activate\", {\n sceneId: scene.id,\n });\n scene.claim(this);\n const previous = this.active;\n this.transitioning = true;\n this.active = scene;\n this.context.scene = scene;\n scene.activateOwned();\n if (previous !== scene) this.input.clear();\n try {\n cleanupAll(\n [\n ...(previous !== scene\n ? [() => previous.deactivateOwned(), () => previous.dispose()]\n : []),\n () => scene.notifyActivated(),\n ],\n \"Scene transition callbacks failed\",\n );\n } finally {\n this.transitioning = false;\n }\n }\n step(seconds: number): void {\n this.assertAlive();\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Delta seconds must be finite and nonnegative\",\n );\n if (this.stepping || this.transitioning)\n throw new EngineError(\n \"STEP_REENTRANT\",\n \"Cannot step during an update or transition\",\n );\n if (\n !this.suspended &&\n (this.active.state === SceneState.Preparing ||\n this.active.state === SceneState.Ready)\n ) {\n try {\n this.activate(this.active);\n } catch (error) {\n this.execution?.failed(error);\n throw error;\n }\n // Activation hooks may synchronously terminate this first step.\n if (this.dead || this.active.disposed) return;\n }\n this.stepping = true;\n const execution = this.execution;\n try {\n execution?.beforeStep(seconds);\n this.count++;\n if (!this.suspended || this.active.state === SceneState.Active)\n this.active.beginStep();\n this.context.delta = seconds;\n this.input.beginStep(execution?.captured);\n this.context.scene = this.active;\n // Logical input callbacks remain available for pause/resume controls.\n if (!this.dead && !this.suspended && !this.active.disposed) {\n this.elapsed += seconds;\n this.active.step(this.context);\n }\n execution?.afterStep();\n } catch (error) {\n execution?.failed(error);\n throw error;\n } finally {\n this.stepping = false;\n }\n }\n snapshot() {\n return {\n stepCount: this.count,\n sceneId: this.active.id,\n sceneState: this.active.state,\n elapsed: this.elapsed,\n paused: this.suspended,\n random: this.random.snapshot(),\n input: this.input.snapshot(),\n actors: this.active.actors.map((actor) => {\n const transform = actor.get(Transform.type);\n return {\n id: actor.id,\n enabled: actor.enabled,\n ...(transform\n ? {\n transform: {\n x: transform.x,\n y: transform.y,\n rotation: transform.rotation,\n scaleX: transform.scaleX,\n scaleY: transform.scaleY,\n },\n }\n : {}),\n };\n }),\n };\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n cleanupAll(\n [\n () => this.execution?.dispose(),\n () => this.input.dispose(),\n () => this.active.dispose(),\n () => this.random.dispose(),\n ],\n \"Engine cleanup failed\",\n );\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { Engine } from \"./engine\";\nexport interface FixedStepOptions {\n readonly step?: number;\n readonly maxSteps?: number;\n readonly maxFrameDelta?: number;\n}\nexport interface FixedStepResult {\n readonly steps: number;\n readonly alpha: number;\n readonly droppedSeconds: number;\n readonly inputPumps: number;\n}\n/** Bounded host-time accumulator. Rendering and interpolation remain host responsibilities. */\nexport class FixedStepRunner {\n readonly step: number;\n readonly maxSteps: number;\n readonly maxFrameDelta: number;\n private accumulator = 0;\n private scene: Engine[\"scene\"];\n private advancing = false;\n constructor(\n private readonly engine: Engine,\n options: FixedStepOptions = {},\n ) {\n this.step = options.step ?? 1 / 60;\n this.maxSteps = options.maxSteps ?? 8;\n this.maxFrameDelta = options.maxFrameDelta ?? 0.25;\n this.scene = engine.scene;\n if (\n !Number.isFinite(this.step) ||\n this.step < 1e-6 ||\n this.step > 1 ||\n !Number.isInteger(this.maxSteps) ||\n this.maxSteps < 1 ||\n this.maxSteps > 1000 ||\n !Number.isFinite(this.maxFrameDelta) ||\n this.maxFrameDelta < this.step ||\n this.maxFrameDelta > 60\n )\n throw new EngineError(\n \"INVALID_FIXED_STEP\",\n \"step must be 1e-6..1 seconds, maxSteps 1..1000, and maxFrameDelta step..60 seconds\",\n );\n }\n reset(): void {\n this.accumulator = 0;\n this.scene = this.engine.scene;\n }\n advance(seconds: number): FixedStepResult {\n if (this.engine.disposed)\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Cannot advance a disposed Engine\",\n );\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Frame delta must be finite and nonnegative\",\n );\n if (this.advancing)\n throw new EngineError(\n \"STEP_REENTRANT\",\n \"FixedStepRunner.advance is not reentrant\",\n );\n this.advancing = true;\n try {\n if (this.scene !== this.engine.scene) this.reset();\n if (this.engine.paused) {\n this.reset();\n this.engine.step(0);\n return { steps: 0, alpha: 0, droppedSeconds: 0, inputPumps: 1 };\n }\n const accepted = Math.min(seconds, this.maxFrameDelta);\n let dropped = seconds - accepted,\n steps = 0;\n this.accumulator += accepted;\n const epsilon = this.step * 1e-9;\n while (this.accumulator + epsilon >= this.step && steps < this.maxSteps) {\n this.accumulator = Math.max(0, this.accumulator - this.step);\n this.engine.step(this.step);\n steps++;\n if (\n this.engine.disposed ||\n this.engine.paused ||\n this.scene !== this.engine.scene\n ) {\n this.reset();\n break;\n }\n }\n if (this.accumulator + epsilon >= this.step) {\n const discarded =\n Math.floor((this.accumulator + epsilon) / this.step) * this.step;\n dropped += discarded;\n this.accumulator = Math.max(0, this.accumulator - discarded);\n }\n return {\n steps,\n alpha: this.accumulator / this.step,\n droppedSeconds: dropped,\n inputPumps: 0,\n };\n } finally {\n this.advancing = false;\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport {\n DEFAULT_RANDOM_STREAM,\n deriveStreamSeed,\n RANDOM_ALGORITHM,\n type RandomSnapshot,\n} from \"../foundation/random\";\nimport {\n type ActionFrame,\n type ActionSchema,\n parseActionFrame,\n} from \"../interaction/action-frame\";\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\nexport interface ReplayControllerSchema {\n readonly id: string;\n readonly actions: readonly ActionSchema[];\n}\nexport interface ReplayStep {\n readonly index: number;\n readonly dt: number;\n readonly pausedBefore: boolean;\n readonly pausedAfter: boolean;\n readonly inputs: Readonly<Record<string, ActionFrame>>;\n}\nexport interface ReplayEvent {\n readonly step: number;\n readonly phase: \"between\" | \"step\";\n readonly order: number;\n readonly type: string;\n readonly payload: JsonValue;\n}\nexport interface ReplayData {\n readonly formatVersion: 1;\n readonly engineVersion: string;\n readonly random: RandomSnapshot;\n readonly sceneId: string;\n readonly controllers: readonly ReplayControllerSchema[];\n readonly metadata: Readonly<Record<string, JsonValue>>;\n readonly steps: readonly ReplayStep[];\n readonly events: readonly ReplayEvent[];\n}\nfunction bad(message: string): never {\n throw new EngineError(\"REPLAY_DATA\", message);\n}\nfunction object(v: unknown): Record<string, unknown> {\n if (\n !v ||\n typeof v !== \"object\" ||\n Array.isArray(v) ||\n (Object.getPrototypeOf(v) !== Object.prototype &&\n Object.getPrototypeOf(v) !== null)\n )\n return bad(\"Expected a plain JSON object\");\n return v as Record<string, unknown>;\n}\nfunction keys(v: Record<string, unknown>, names: readonly string[]): void {\n if (\n Object.keys(v).length !== names.length ||\n Object.keys(v).some((k) => !names.includes(k))\n )\n bad(\"Unexpected or missing Replay fields\");\n}\nfunction text(v: unknown): string {\n if (typeof v !== \"string\" || !v.length || v.length > 256)\n return bad(\"Identifier must contain 1 to 256 code units\");\n return v;\n}\nfunction integer(v: unknown, max = Number.MAX_SAFE_INTEGER): number {\n if (typeof v !== \"number\" || !Number.isSafeInteger(v) || v < 0 || v > max)\n return bad(\"Expected a bounded nonnegative integer\");\n return v;\n}\nfunction array(v: unknown, max: number): unknown[] {\n if (!Array.isArray(v) || v.length > max)\n return bad(\"Expected a bounded array\");\n return v;\n}\n/** Clones JSON-only payloads; rejects nonfinite numbers, cycles, class instances and undefined. */\nexport function copyJson(value: unknown): JsonValue {\n const ancestors = new Set<object>();\n let nodes = 0;\n const copy = (v: unknown, depth: number): JsonValue => {\n if (++nodes > 100000 || depth > 32)\n return bad(\"JSON payload exceeds size/depth limit\");\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") return v;\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return bad(\"JSON numbers must be finite\");\n return v;\n }\n if (typeof v !== \"object\" || !v)\n return bad(\"Expected JSON data, not executable/host values\");\n if (Object.getOwnPropertySymbols(v).length)\n return bad(\"Symbol keys are not JSON payloads\");\n if (ancestors.has(v)) return bad(\"Cyclic JSON payload\");\n ancestors.add(v);\n let result: JsonValue;\n if (Array.isArray(v)) {\n if (Object.keys(v).length !== v.length)\n return bad(\"Sparse or extended arrays are not JSON payloads\");\n result = Object.freeze(v.map((x) => copy(x, depth + 1)));\n } else\n result = Object.freeze(\n Object.fromEntries(\n Object.entries(object(v))\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, x]) => [k, copy(x, depth + 1)]),\n ),\n );\n ancestors.delete(v);\n return result;\n };\n return copy(value, 0);\n}\n/** @internal Shared one-time validation for recording headers and imported Replay data. */\nexport type ReplayHeader = Omit<ReplayData, \"steps\" | \"events\">;\nexport function parseReplayHeader(value: unknown): ReplayHeader {\n const d = object(value);\n if (d.formatVersion !== 1) return bad(\"Unsupported Replay formatVersion\");\n const engineVersion = text(d.engineVersion),\n sceneId = text(d.sceneId),\n r = object(d.random);\n keys(r, [\"algorithm\", \"seed\", \"streams\"]);\n if (r.algorithm !== RANDOM_ALGORITHM)\n return bad(\"Unsupported random algorithm\");\n const seed = integer(r.seed, 0xffffffff),\n streamNames = new Set<string>();\n const streams = array(r.streams, 4096).map((v) => {\n const s = object(v);\n keys(s, [\"name\", \"seed\", \"state\", \"calls\"]);\n const name = text(s.name);\n if (streamNames.has(name)) return bad(\"Duplicate random stream\");\n streamNames.add(name);\n const initial = integer(s.seed, 0xffffffff);\n if (\n initial !==\n (name === DEFAULT_RANDOM_STREAM ? seed : deriveStreamSeed(seed, name))\n )\n return bad(\"Incompatible random stream seed\");\n return Object.freeze({\n name,\n seed: initial,\n state: integer(s.state, 0xffffffff),\n calls: integer(s.calls),\n });\n });\n streams.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n if (!streamNames.has(DEFAULT_RANDOM_STREAM))\n return bad(\"Missing default random stream\");\n const ids = new Set<string>();\n const controllers = array(d.controllers, 64).map((v) => {\n const c = object(v);\n keys(c, [\"id\", \"actions\"]);\n const id = text(c.id);\n if (ids.has(id)) return bad(\"Duplicate controller ID\");\n ids.add(id);\n const names = new Set<string>();\n const actions = array(c.actions, 256).map((v) => {\n const a = object(v);\n keys(a, [\"name\", \"kind\", \"normalize\"]);\n const name = text(a.name);\n if (\n names.has(name) ||\n typeof a.kind !== \"string\" ||\n ![\"button\", \"axis1d\", \"axis2d\", \"axis3d\"].includes(a.kind) ||\n typeof a.normalize !== \"boolean\"\n )\n return bad(\"Invalid or duplicate Action schema\");\n names.add(name);\n if ((a.kind === \"button\" || a.kind === \"axis1d\") && a.normalize)\n return bad(\"Unexpected normalization policy\");\n return Object.freeze({\n name,\n kind: a.kind as ActionSchema[\"kind\"],\n normalize: a.normalize,\n });\n });\n actions.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n return Object.freeze({ id, actions: Object.freeze(actions) });\n });\n controllers.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n const metadata = copyJson(object(d.metadata)) as Readonly<\n Record<string, JsonValue>\n >;\n return Object.freeze({\n formatVersion: 1,\n engineVersion,\n random: Object.freeze({\n algorithm: RANDOM_ALGORITHM,\n seed,\n streams: Object.freeze(streams),\n }),\n sceneId,\n controllers: Object.freeze(controllers),\n metadata,\n });\n}\nexport function parseReplayData(value: unknown): ReplayData {\n const d = object(value);\n keys(d, [\n \"formatVersion\",\n \"engineVersion\",\n \"random\",\n \"sceneId\",\n \"controllers\",\n \"metadata\",\n \"steps\",\n \"events\",\n ]);\n const header = parseReplayHeader(d),\n controllers = header.controllers,\n ids = controllers.map((c) => c.id);\n const steps = array(d.steps, 1000000).map((value, index) => {\n const s = object(value);\n keys(s, [\"index\", \"dt\", \"pausedBefore\", \"pausedAfter\", \"inputs\"]);\n if (\n s.index !== index ||\n typeof s.dt !== \"number\" ||\n !Number.isFinite(s.dt) ||\n s.dt < 0 ||\n typeof s.pausedBefore !== \"boolean\" ||\n typeof s.pausedAfter !== \"boolean\"\n )\n return bad(\"Invalid step number, delta or pause state\");\n const raw = object(s.inputs);\n keys(raw, [...ids]);\n const inputs = Object.fromEntries(\n controllers.map((c) => [c.id, parseActionFrame(raw[c.id], c.actions)]),\n );\n return Object.freeze({\n index,\n dt: s.dt,\n pausedBefore: s.pausedBefore,\n pausedAfter: s.pausedAfter,\n inputs: Object.freeze(inputs),\n });\n });\n if (!steps.length)\n return bad(\"Replay requires at least one completed input boundary\");\n let lastStep = -1,\n lastPhase = -1;\n const events = array(d.events, 1000000).map((value, index) => {\n const e = object(value);\n keys(e, [\"step\", \"phase\", \"order\", \"type\", \"payload\"]);\n const step = integer(e.step, steps.length);\n if (\n e.order !== index ||\n (e.phase !== \"between\" && e.phase !== \"step\") ||\n (e.phase === \"step\" && step === steps.length)\n )\n return bad(\"Invalid auxiliary event position\");\n const phase = e.phase === \"between\" ? 0 : 1;\n if (step < lastStep || (step === lastStep && phase < lastPhase))\n return bad(\"Auxiliary event order is not monotonic\");\n lastStep = step;\n lastPhase = phase;\n return Object.freeze({\n step,\n phase: e.phase,\n order: index,\n type: text(e.type),\n payload: copyJson(e.payload),\n });\n });\n return Object.freeze({\n ...header,\n steps: Object.freeze(steps),\n events: Object.freeze(events),\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { ENGINE_VERSION } from \"../foundation/version\";\nimport type { ActionFrame, ActionSchema } from \"../interaction/action-frame\";\nimport type { ExecutionPort } from \"../scene/execution\";\nimport type { Engine } from \"./engine\";\nimport {\n copyJson,\n type JsonValue,\n parseReplayData,\n parseReplayHeader,\n type ReplayControllerSchema,\n type ReplayData,\n type ReplayEvent,\n type ReplayHeader,\n type ReplayStep,\n} from \"./replay-data\";\n\nexport type {\n JsonValue,\n ReplayData,\n ReplayEvent,\n ReplayStep,\n} from \"./replay-data\";\nexport { parseReplayData } from \"./replay-data\";\nexport interface ReplayController {\n readonly disposed: boolean;\n readonly active: boolean;\n schema(): readonly ActionSchema[];\n frame(): ActionFrame;\n}\nexport type ReplayControllers = Readonly<Record<string, ReplayController>>;\nfunction state(message: string): never {\n throw new EngineError(\"REPLAY_STATE\", message);\n}\nfunction bindings(\n engine: Engine,\n controllers: ReplayControllers,\n): [string, ReplayController][] {\n if (engine.disposed || engine.stepCount !== 0)\n state(\n \"Replay requires a new Engine before its first step; rebuild game state with the recorded seed\",\n );\n const result = Object.entries(controllers).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n ),\n seen = new Set<ReplayController>();\n if (result.length > 64) state(\"Too many Replay controllers\");\n for (const [id, c] of result) {\n if (\n !id.length ||\n id.length > 256 ||\n c.disposed ||\n seen.has(c) ||\n !engine.input.hasController(c)\n )\n state(\"Replay IDs must uniquely bind controllers owned by this Engine\");\n seen.add(c);\n }\n return result;\n}\nfunction compatible(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n/** Opt-in capture of one fresh Engine/Scene run, not a save-state serializer. */\nexport class ReplayRecorder implements ExecutionPort {\n private readonly bound: readonly [string, ReplayController][];\n private readonly schemas: readonly ReplayControllerSchema[];\n private readonly metadata: Readonly<Record<string, JsonValue>>;\n private readonly maxSteps: number;\n private steps: ReplayStep[] = [];\n private events: ReplayEvent[] = [];\n private header: ReplayHeader | undefined;\n private scene: Engine[\"scene\"] | undefined;\n private completed = 0;\n private current:\n | {\n dt: number;\n pausedBefore: boolean;\n inputs?: Readonly<Record<string, ActionFrame>>;\n }\n | undefined;\n private failure: unknown;\n private closed = false;\n private readonly detach: () => void = () => {};\n constructor(\n private readonly engine: Engine,\n options: {\n controllers: ReplayControllers;\n metadata?: Readonly<Record<string, JsonValue>>;\n maxSteps?: number;\n },\n ) {\n this.bound = bindings(engine, options.controllers);\n this.schemas = this.bound.map(([id, c]) => ({ id, actions: c.schema() }));\n if (\n options.metadata !== undefined &&\n (!options.metadata ||\n typeof options.metadata !== \"object\" ||\n Array.isArray(options.metadata))\n )\n state(\"Replay metadata must be a JSON object\");\n this.metadata = copyJson(options.metadata ?? {}) as Readonly<\n Record<string, JsonValue>\n >;\n this.maxSteps = options.maxSteps ?? 100000;\n if (\n !Number.isSafeInteger(this.maxSteps) ||\n this.maxSteps < 1 ||\n this.maxSteps > 1000000\n )\n state(\"maxSteps must be an integer from 1 to 1000000\");\n this.detach = engine.attachExecution(this);\n }\n get disposed(): boolean {\n return this.closed;\n }\n get length(): number {\n return this.completed;\n }\n validateScene(scene: Engine[\"scene\"]): void {\n if (this.scene && this.scene !== scene)\n state(\n \"Replay supports one Scene; finish/dispose it before Scene replacement\",\n );\n }\n beforeStep(seconds: number): void {\n if (this.closed) return;\n if (this.failure)\n state(\"Recording failed; dispose it and rebuild the game\");\n if (this.steps.length >= this.maxSteps)\n state(\"Replay recording reached maxSteps; finish before advancing again\");\n this.engine.input.verifyControllers(this.bound.map(([, c]) => c));\n if (!this.header) {\n this.header = parseReplayHeader({\n formatVersion: 1,\n engineVersion: ENGINE_VERSION,\n random: this.engine.random.snapshot(),\n sceneId: this.engine.scene.id,\n controllers: this.schemas,\n metadata: this.metadata,\n });\n this.scene = this.engine.scene;\n }\n if (this.scene !== this.engine.scene)\n state(\n \"Replay records one Scene; start a fresh Engine to record a different Scene\",\n );\n this.current = { dt: seconds, pausedBefore: this.engine.paused };\n }\n readonly captured = (): void => {\n if (this.closed || !this.current) return;\n this.current.inputs = Object.freeze(\n Object.fromEntries(\n this.bound.map(([id, c]) => {\n const frame = c.frame();\n if (frame.events.length > 10000)\n state(\"Too many Button transitions in one Replay boundary\");\n return [id, frame];\n }),\n ),\n );\n };\n afterStep(): void {\n if (this.closed) return;\n const c = this.current;\n if (!c?.inputs) state(\"Input capture did not complete\");\n this.steps.push(\n Object.freeze({\n index: this.steps.length,\n dt: c.dt,\n pausedBefore: c.pausedBefore,\n pausedAfter: this.engine.paused,\n inputs: c.inputs,\n }),\n );\n this.completed = this.steps.length;\n this.current = undefined;\n }\n failed(error: unknown): void {\n this.failure = error;\n this.current = undefined;\n }\n record(type: string, payload: JsonValue): void {\n if (this.closed || this.failure)\n state(\"Cannot append to a closed or failed recording\");\n if (typeof type !== \"string\" || !type.length || type.length > 256)\n state(\"Event type must contain 1 to 256 code units\");\n if (this.events.length >= 1000000) state(\"Too many auxiliary events\");\n this.events.push(\n Object.freeze({\n step: this.steps.length,\n phase: this.current ? \"step\" : \"between\",\n order: this.events.length,\n type,\n payload: copyJson(payload),\n }),\n );\n }\n finish(): ReplayData {\n if (\n this.closed ||\n this.current ||\n this.failure ||\n this.engine.scene.disposed ||\n !this.header ||\n !this.steps.length\n )\n state(\n \"Finish requires a healthy recording with completed steps, outside Engine.step\",\n );\n // Headers/payloads were validated once and captured Action frames are immutable.\n // Transfer the frozen buffers rather than cloning the full recording on export.\n const result: ReplayData = Object.freeze({\n ...this.header,\n steps: Object.freeze(this.steps),\n events: Object.freeze(this.events),\n });\n this.steps = [];\n this.events = [];\n this.dispose();\n return result;\n }\n dispose(): void {\n if (this.closed) return;\n this.closed = true;\n this.detach();\n this.current = undefined;\n this.steps.length = 0;\n this.events.length = 0;\n }\n}\n/** Exclusive logical-frame playback. Auxiliary events are data and are never executed. */\nexport class ReplayPlayer implements ExecutionPort {\n readonly data: ReplayData;\n private readonly bound: readonly [string, ReplayController][];\n private readonly detach: () => void = () => {};\n private position = 0;\n private clock = 0;\n private advancing = false;\n private scene: Engine[\"scene\"] | undefined;\n private closed = false;\n private failure: unknown;\n constructor(\n private readonly engine: Engine,\n data: unknown,\n options: {\n controllers: ReplayControllers;\n expectedMetadata?: Readonly<Record<string, JsonValue>>;\n },\n ) {\n this.data = parseReplayData(data);\n this.bound = bindings(engine, options.controllers);\n if (\n this.data.engineVersion !== ENGINE_VERSION ||\n engine.random.seed !== this.data.random.seed\n )\n throw new EngineError(\n \"REPLAY_INCOMPATIBLE\",\n \"Engine version or initial seed does not match Replay\",\n );\n const schemas = this.bound.map(([id, c]) => ({ id, actions: c.schema() }));\n if (!compatible(schemas, this.data.controllers))\n throw new EngineError(\n \"REPLAY_INCOMPATIBLE\",\n \"Controller IDs or Action names/kinds/normalization do not match Replay\",\n );\n for (const [key, value] of Object.entries(options.expectedMetadata ?? {}))\n if (!compatible(copyJson(value), this.data.metadata[key]))\n throw new EngineError(\n \"REPLAY_INCOMPATIBLE\",\n `Metadata mismatch: ${key}`,\n );\n this.detach = engine.attachExecution(this);\n try {\n engine.input.lockPlayback();\n } catch (error) {\n this.detach();\n throw error;\n }\n }\n get disposed(): boolean {\n return this.closed;\n }\n get done(): boolean {\n return this.position === this.data.steps.length;\n }\n get index(): number {\n return this.position;\n }\n step(): boolean {\n if (this.closed || this.failure) state(\"Playback is closed or failed\");\n if (this.done) return false;\n const frame = this.data.steps[this.position];\n if (!frame) return false;\n this.engine.step(frame.dt);\n return true;\n }\n /** Host-time pacing; bounded catch-up slows playback rather than skipping recorded steps. */\n advance(seconds: number, maxSteps = 8): number {\n if (\n !Number.isFinite(seconds) ||\n seconds < 0 ||\n !Number.isInteger(maxSteps) ||\n maxSteps < 1 ||\n maxSteps > 1000\n )\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Playback advance requires nonnegative finite seconds and maxSteps 1..1000\",\n );\n if (this.closed || this.failure) state(\"Playback is closed or failed\");\n if (this.advancing)\n throw new EngineError(\n \"STEP_REENTRANT\",\n \"Replay advance is not reentrant\",\n );\n this.advancing = true;\n try {\n const next = this.data.steps[this.position]?.dt ?? 0;\n this.clock = Math.min(\n Math.max(0.25, next),\n this.clock + Math.min(seconds, 0.25),\n );\n let count = 0;\n while (!this.done && count < maxSteps) {\n const dt = this.data.steps[this.position]?.dt ?? 0;\n if (this.clock + 1e-12 < dt) break;\n this.clock = Math.max(0, this.clock - dt);\n this.step();\n count++;\n }\n return count;\n } finally {\n this.advancing = false;\n }\n }\n validateScene(scene: Engine[\"scene\"]): void {\n if (\n (this.scene && this.scene !== scene) ||\n (!this.scene && scene.id !== this.data.sceneId)\n )\n state(\n \"Replay supports one matching Scene; dispose playback before Scene replacement\",\n );\n }\n beforeStep(seconds: number): void {\n if (this.closed || this.failure) state(\"Playback is closed or failed\");\n const frame = this.data.steps[this.position];\n if (!frame)\n throw new EngineError(\n \"REPLAY_COMPLETE\",\n \"Replay has reached its end; dispose playback before live stepping\",\n );\n if (seconds !== frame.dt)\n throw new EngineError(\n \"REPLAY_DELTA\",\n \"Step delta differs from the recorded boundary\",\n { step: this.position, expected: frame.dt, actual: seconds },\n );\n this.engine.input.verifyControllers(this.bound.map(([, c]) => c));\n if (\n (this.scene && this.scene !== this.engine.scene) ||\n this.engine.scene.id !== this.data.sceneId ||\n (!this.position &&\n !compatible(this.engine.random.snapshot(), this.data.random))\n )\n throw new EngineError(\n \"REPLAY_INITIAL_STATE\",\n \"Rebuild the same Scene and initial random consumption before playback\",\n );\n this.scene = this.engine.scene;\n if (this.engine.paused !== frame.pausedBefore) {\n if (frame.pausedBefore) this.engine.pause();\n else this.engine.resume();\n }\n this.engine.input.playbackFrames(\n new Map(\n this.bound.map(([id, c]) => [c, frame.inputs[id] as ActionFrame]),\n ),\n );\n }\n readonly captured = (): void => {};\n afterStep(): void {\n if (this.closed) return;\n const frame = this.data.steps[this.position];\n if (this.engine.paused !== frame?.pausedAfter)\n throw new EngineError(\n \"REPLAY_DIVERGED\",\n \"Pause behavior differs from Replay\",\n { step: this.position },\n );\n this.position++;\n }\n failed(error: unknown): void {\n this.failure = error;\n }\n dispose(): void {\n if (this.closed) return;\n this.closed = true;\n this.detach();\n this.engine.input.unlockPlayback();\n }\n}\n","import type { CanvasNode, UIBounds } from \"./canvas-node\";\nimport type { CanvasNativeControl } from \"./native-edit\";\n\nexport type CanvasActivation = \"pointer\" | \"keyboard\" | \"accessibility\";\nexport type CanvasControlModel =\n | {\n readonly kind: \"checkbox\";\n readonly checked: boolean;\n readonly readOnly: boolean;\n }\n | {\n readonly kind: \"slider\";\n readonly value: number;\n readonly min: number;\n readonly max: number;\n readonly step: number;\n readonly ratio: number;\n readonly readOnly: boolean;\n }\n | {\n readonly kind: \"select\";\n readonly options: readonly {\n readonly label: string;\n readonly disabled: boolean;\n }[];\n readonly selectedIndex: number;\n readonly readOnly: boolean;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n readonly placeholder: string;\n readonly maxLength: number | undefined;\n readonly inputMode: \"text\" | \"numeric\" | \"decimal\";\n readonly numeric?: Readonly<{\n value: number;\n min: number;\n max: number;\n step: number;\n }>;\n readonly readOnly: boolean;\n };\n/** Core control commands/data consumed by input routing and Host presentations. Coordinates are UI units. */\nexport interface CanvasControlPort {\n readonly model: CanvasControlModel;\n readonly revision: number;\n readonly keys: readonly string[];\n readonly pointerAxis?: \"horizontal\";\n readonly native?: CanvasNativeControl | undefined;\n key(code: string): void;\n beginPointer(x: number, y: number): boolean;\n movePointer(x: number, y: number): void;\n endPointer(cancelled: boolean): void;\n}\n/** Shared paint/input geometry; the whole node remains the clipped pointer hit area. */\nexport function canvasSliderGeometry(\n node: CanvasNode,\n): { track: UIBounds; thumb: UIBounds } | undefined {\n const model = node.control?.model;\n if (model?.kind !== \"slider\") return;\n const b = node.bounds;\n const inset = Math.min(node.style.padding + 8, b.width / 2);\n const width = Math.max(0, b.width - inset * 2);\n const y =\n b.y + Math.max(0, Math.min(b.height, b.height - node.style.padding - 8));\n const radius = Math.min(8, b.height / 2, b.width / 2);\n return {\n track: { x: b.x + inset, y: y - 2, width, height: 4 },\n thumb: {\n x: b.x + inset + width * model.ratio - radius,\n y: y - radius,\n width: radius * 2,\n height: radius * 2,\n },\n };\n}\n/** Hosts measure/paint this exact string. Slider size is fixed by style, so value changes are paint-only. */\nexport function canvasControlText(node: CanvasNode): string {\n const model = node.control?.model;\n return model?.kind === \"slider\"\n ? `${node.text}: ${model.value}`\n : model?.kind === \"select\"\n ? (model.options[model.selectedIndex]?.label ?? \"\")\n : model?.kind === \"text\"\n ? model.text || model.placeholder\n : node.text;\n}\n\n/** Hover events/hit ownership remain independent of this presentation-only policy. */\nexport function canvasHoverHighlight(node: CanvasNode): boolean {\n return (\n node.hovered &&\n (node.style.hoverEffect === \"highlight\" ||\n (node.style.hoverEffect === \"auto\" && node.interactive))\n );\n}\n\n/** Inherited paint opacity; input availability excludes fully transparent ancestors. */\nexport function canvasOpacity(node: CanvasNode): number {\n let opacity = 1;\n for (\n let current: CanvasNode | undefined = node;\n current;\n current = current.parent\n )\n opacity *= current.presentation.opacity;\n return opacity;\n}\n","import {\n Cancellation,\n type CancellationSignal,\n} from \"../foundation/cancellation\";\nimport type { CanvasActivation, CanvasControlPort } from \"./canvas-control\";\nexport interface CanvasNodeOwner {\n readonly disposed: boolean;\n readonly scene?: LifetimeOwner;\n invalidate(layout?: boolean): void;\n report(error: unknown): void;\n scrollChanged(node: CanvasNode): void;\n motionChanged(node: CanvasNode, active: boolean): void;\n}\n\nimport { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\n\nexport type UISize = number | `${number}%`;\nexport type UIAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type UIJustify =\n | \"start\"\n | \"center\"\n | \"end\"\n | \"space-between\"\n | \"space-around\";\nexport interface CanvasStyle {\n width?: UISize;\n height?: UISize;\n minWidth?: UISize;\n maxWidth?: UISize;\n minHeight?: UISize;\n maxHeight?: UISize;\n /** Wrap text at the allocated content width. Default true. */\n textWrap?: boolean;\n direction?: \"row\" | \"column\";\n gap?: number;\n padding?: number;\n grow?: number;\n shrink?: number;\n align?: UIAlign;\n alignSelf?: UIAlign;\n justify?: UIJustify;\n wrap?: boolean;\n clip?: boolean;\n /** Preserve overflowing content on the selected axes; always clips descendants. */\n scroll?: \"vertical\" | \"horizontal\" | \"both\";\n /** Content dragging. Default true; only scroll containers use it. */\n dragScroll?: boolean;\n /** Coast after a content drag. Default true. */\n inertia?: boolean;\n /** Overlay bars; hiding bars does not disable scrolling. Default auto. */\n scrollbar?: \"auto\" | \"always\" | \"hidden\";\n /** Gesture threshold in Host screen units, independent of UI scale and DPR. Default 8. */\n dragThreshold?: number;\n /** auto blocks world input, children permits empty-space pass-through, none excludes subtree. */\n pointerEvents?: \"auto\" | \"children\" | \"none\";\n /** Hover paint only: auto highlights controls; highlight also opts containers in. */\n hoverEffect?: \"auto\" | \"none\" | \"highlight\";\n background?: number;\n color?: number;\n fontSize?: number;\n fontFamily?: string;\n radius?: number;\n}\n/** Paint-space translation, independent of Flex allocation. Rotation/scaling are not supported here. */\nexport interface CanvasPresentationStyle {\n readonly offsetX: number;\n readonly offsetY: number;\n readonly opacity: number;\n}\n/** Portable text semantics; headings require a document level. */\nexport type CanvasLabelOptions = { readonly text: string } & (\n | { readonly role?: \"status\" | \"alert\"; readonly level?: never }\n | { readonly role: \"heading\"; readonly level: 1 | 2 | 3 | 4 | 5 | 6 }\n);\nexport interface UIBounds {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\nexport const defaultCanvasStyle = Object.freeze({\n direction: \"column\",\n gap: 0,\n padding: 0,\n grow: 0,\n shrink: 1,\n align: \"stretch\",\n justify: \"start\",\n wrap: false,\n textWrap: true,\n clip: false,\n dragScroll: true,\n inertia: true,\n scrollbar: \"auto\",\n dragThreshold: 8,\n pointerEvents: \"children\",\n hoverEffect: \"auto\",\n color: 0xeff7f6,\n fontSize: 18,\n fontFamily: \"system-ui, sans-serif\",\n radius: 6,\n} as const);\ntype OptionalStyle =\n | \"width\"\n | \"height\"\n | \"minWidth\"\n | \"maxWidth\"\n | \"minHeight\"\n | \"maxHeight\"\n | \"background\"\n | \"alignSelf\"\n | \"scroll\";\nexport type ResolvedCanvasStyle = Readonly<\n Required<Omit<CanvasStyle, OptionalStyle>> & Pick<CanvasStyle, OptionalStyle>\n>;\nfunction checkedStyle(value: CanvasStyle): ResolvedCanvasStyle {\n const result = { ...defaultCanvasStyle, ...value };\n const fields = new Set([\n ...Object.keys(defaultCanvasStyle),\n \"width\",\n \"height\",\n \"minWidth\",\n \"maxWidth\",\n \"minHeight\",\n \"maxHeight\",\n \"background\",\n \"alignSelf\",\n \"scroll\",\n ]);\n for (const [key, v] of Object.entries(result)) {\n if (!fields.has(key) || v === undefined)\n throw new EngineError(\n \"INVALID_UI\",\n `Unknown or undefined UI style: ${key}`,\n );\n if (\n [\n \"width\",\n \"height\",\n \"minWidth\",\n \"maxWidth\",\n \"minHeight\",\n \"maxHeight\",\n ].includes(key)\n ) {\n if (\n typeof v === \"string\" &&\n /^(?:\\d+(?:\\.\\d+)?|\\.\\d+)%$/.test(v) &&\n Number.isFinite(Number(v.slice(0, -1)))\n )\n continue;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < 0)\n throw new EngineError(\n \"INVALID_UI\",\n `${key} must be nonnegative or a percentage`,\n );\n } else if (\n [\n \"gap\",\n \"padding\",\n \"grow\",\n \"shrink\",\n \"radius\",\n \"fontSize\",\n \"dragThreshold\",\n \"background\",\n \"color\",\n ].includes(key)\n ) {\n if (\n typeof v !== \"number\" ||\n !Number.isFinite(v) ||\n v < 0 ||\n (key === \"fontSize\" && v === 0) ||\n ([\"color\", \"background\"].includes(key) &&\n (!Number.isInteger(v) || v > 0xffffff))\n )\n throw new EngineError(\"INVALID_UI\", `Invalid UI ${key}`);\n } else if (\n [\"wrap\", \"clip\", \"textWrap\", \"dragScroll\", \"inertia\"].includes(key)\n ) {\n if (typeof v !== \"boolean\")\n throw new EngineError(\"INVALID_UI\", `Invalid UI ${key}`);\n } else {\n const choices: Record<string, readonly string[]> = {\n scroll: [\"vertical\", \"horizontal\", \"both\"],\n scrollbar: [\"auto\", \"always\", \"hidden\"],\n direction: [\"row\", \"column\"],\n align: [\"start\", \"center\", \"end\", \"stretch\"],\n alignSelf: [\"start\", \"center\", \"end\", \"stretch\"],\n justify: [\"start\", \"center\", \"end\", \"space-between\", \"space-around\"],\n pointerEvents: [\"auto\", \"children\", \"none\"],\n hoverEffect: [\"auto\", \"none\", \"highlight\"],\n };\n if (\n typeof v !== \"string\" ||\n (choices[key] ? !choices[key].includes(v) : !v.length)\n )\n throw new EngineError(\"INVALID_UI\", `Invalid UI ${key}`);\n }\n }\n return Object.freeze(result);\n}\nexport type CanvasNodeKind =\n | \"panel\"\n | \"label\"\n | \"button\"\n | \"hold-button\"\n | \"select\"\n | \"text-input\"\n | \"number-input\"\n | \"checkbox\"\n | \"slider\";\n/** Host-independent UI model. Single-parent ownership; removing a child disposes that subtree. */\nexport class CanvasNode implements LifetimeOwner {\n private readonly lifetime = new Lifetime();\n readonly events = new EventBus();\n readonly signal: CancellationSignal;\n private readonly abort = new Cancellation();\n private list: readonly CanvasNode[] = Object.freeze([]);\n private parentNode: CanvasNode | undefined;\n /** @internal Only a root can be claimed by a Scene UI. */ owner:\n | CanvasNodeOwner\n | undefined;\n private config: ResolvedCanvasStyle;\n private captionValue: string;\n private shown = true;\n private active = true;\n private working = false;\n /** @internal */ hovered = false;\n /** @internal */ focused = false;\n /** @internal */ held = false;\n /** @internal */ paintRevision = 0;\n /** @internal */ boundsValue: UIBounds = Object.freeze({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n });\n private offsetX = 0;\n private offsetY = 0;\n private maximumX = 0;\n private maximumY = 0;\n get scrollX(): number {\n return this.offsetX;\n }\n get scrollY(): number {\n return this.offsetY;\n }\n get maxScrollX(): number {\n return this.maximumX;\n }\n get maxScrollY(): number {\n return this.maximumY;\n }\n private velocityX = 0;\n private velocityY = 0;\n private command = 0;\n /** @internal External commands invalidate an in-flight drag's ownership. */\n get scrollRevision(): number {\n return this.command;\n }\n get coasting(): boolean {\n return this.velocityX !== 0 || this.velocityY !== 0;\n }\n /** UI units; commands stop momentum and invalidate active drag ownership, including no-ops. */\n scrollTo(x: number, y: number): boolean {\n this.assertAlive();\n if (!Number.isFinite(x) || !Number.isFinite(y))\n throw new EngineError(\"INVALID_UI\", \"Scroll coordinates must be finite\");\n this.command++;\n this.stopScroll();\n const changed = this.setScrollPosition(x, y);\n if (!changed) this.ui?.invalidate();\n return changed;\n }\n scrollBy(x: number, y: number): boolean {\n return this.scrollTo(this.offsetX + x, this.offsetY + y);\n }\n /** Stop momentum; explicit position commands also cancel pointer ownership. */\n stopScroll(): void {\n this.velocityX = 0;\n this.velocityY = 0;\n this.ui?.motionChanged(this, false);\n }\n /** @internal Gesture/animation write; does not cancel its own ownership. */\n setScrollPosition(x: number, y: number): boolean {\n if (this.disposed) return false;\n if (!Number.isFinite(x) || !Number.isFinite(y))\n throw new EngineError(\"INVALID_UI\", \"Scroll coordinates must be finite\");\n const nx = Math.max(0, Math.min(this.maximumX, x)),\n ny = Math.max(0, Math.min(this.maximumY, y));\n if (nx === this.offsetX && ny === this.offsetY) return false;\n this.offsetX = nx;\n this.offsetY = ny;\n this.ui?.scrollChanged(this);\n return true;\n }\n /** @internal UI units/second. Exponential decay rate 8/s, cutoff 10, cap 3000. */\n startScroll(vx: number, vy: number): void {\n this.stopScroll();\n if (!this.available || !this.config.scroll || !this.config.inertia) return;\n const speed = (v: number) =>\n Number.isFinite(v) && Math.abs(v) >= 10\n ? Math.max(-3000, Math.min(3000, v))\n : 0;\n this.velocityX =\n this.maximumX > 0 && this.config.scroll !== \"vertical\" ? speed(vx) : 0;\n this.velocityY =\n this.maximumY > 0 && this.config.scroll !== \"horizontal\" ? speed(vy) : 0;\n this.ui?.motionChanged(this, this.coasting);\n }\n /** @internal Exact integration for a bounded elapsed interval supplied by the Host. */\n advanceScroll(seconds: number): void {\n if (!this.available || !this.config.inertia) {\n this.stopScroll();\n return;\n }\n const tx =\n Math.abs(this.velocityX) > 10\n ? Math.min(seconds, Math.log(Math.abs(this.velocityX) / 10) / 8)\n : 0;\n const ty =\n Math.abs(this.velocityY) > 10\n ? Math.min(seconds, Math.log(Math.abs(this.velocityY) / 10) / 8)\n : 0;\n const dx = (this.velocityX * (1 - Math.exp(-8 * tx))) / 8,\n dy = (this.velocityY * (1 - Math.exp(-8 * ty))) / 8;\n this.velocityX = tx < seconds ? 0 : this.velocityX * Math.exp(-8 * seconds);\n this.velocityY = ty < seconds ? 0 : this.velocityY * Math.exp(-8 * seconds);\n const x = this.offsetX + dx,\n y = this.offsetY + dy;\n if (x <= 0 || x >= this.maximumX || Math.abs(this.velocityX) < 10)\n this.velocityX = 0;\n if (y <= 0 || y >= this.maximumY || Math.abs(this.velocityY) < 10)\n this.velocityY = 0;\n this.setScrollPosition(x, y);\n if (!this.coasting) this.ui?.motionChanged(this, false);\n }\n /** @internal Layout updates ranges/clamps after resize or mutation. */\n setScrollRange(x: number, y: number): void {\n this.maximumX = x;\n this.maximumY = y;\n this.offsetX = Math.min(this.offsetX, x);\n this.offsetY = Math.min(this.offsetY, y);\n if (x === 0) this.velocityX = 0;\n if (y === 0) this.velocityY = 0;\n if (!this.coasting) this.ui?.motionChanged(this, false);\n }\n private click:\n | ((signal: CancellationSignal) => void | Promise<void>)\n | undefined;\n private hold: ((held: boolean) => void) | undefined;\n /** @internal Text semantics supplied by CanvasLabel. */\n readonly labelSemantics:\n | Readonly<{ role?: \"heading\" | \"status\" | \"alert\"; level?: number }>\n | undefined;\n /** @internal Prefer CanvasPanel/Label/Button/HoldButton. */\n constructor(\n readonly kind: CanvasNodeKind,\n options: {\n text?: string;\n label?: Omit<CanvasLabelOptions, \"text\">;\n style?: CanvasStyle;\n click?: (signal: CancellationSignal) => void | Promise<void>;\n hold?: (held: boolean) => void;\n } = {},\n ) {\n this.captionValue = options.text ?? \"\";\n if (typeof this.captionValue !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"UI text must be a string\");\n if (options.label) {\n const { role, level } = options.label;\n if (\n kind !== \"label\" ||\n (role !== undefined &&\n ![\"heading\", \"status\", \"alert\"].includes(role)) ||\n (role === \"heading\"\n ? typeof level !== \"number\" ||\n !Number.isInteger(level) ||\n level < 1 ||\n level > 6\n : level !== undefined)\n )\n throw new EngineError(\"INVALID_UI\", \"Invalid label semantics\");\n this.labelSemantics = Object.freeze({ ...options.label });\n }\n this.config = checkedStyle(options.style ?? {});\n this.click = options.click;\n this.hold = options.hold;\n this.signal = this.abort.signal;\n }\n private presentationValue: CanvasPresentationStyle = Object.freeze({\n offsetX: 0,\n offsetY: 0,\n opacity: 1,\n });\n private mutationObservers: Set<() => void> | undefined;\n get presentation(): CanvasPresentationStyle {\n return this.presentationValue;\n }\n setPresentation(patch: Partial<CanvasPresentationStyle>): void {\n this.assertAlive();\n const next = { ...this.presentationValue, ...patch };\n if (\n !Number.isFinite(next.offsetX) ||\n !Number.isFinite(next.offsetY) ||\n !Number.isFinite(next.opacity) ||\n next.opacity < 0 ||\n next.opacity > 1\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Presentation offsets must be finite and opacity 0..1\",\n );\n const moved =\n next.offsetX !== this.presentationValue.offsetX ||\n next.offsetY !== this.presentationValue.offsetY;\n if (!moved && next.opacity === this.presentationValue.opacity) return;\n this.presentationValue = Object.freeze(next);\n this.changed(false, moved);\n }\n /** @internal Scoped adapter observations; not a second input/event system. */\n observeMutation(callback: () => void): () => void {\n this.assertAlive();\n this.mutationObservers ??= new Set();\n this.mutationObservers.add(callback);\n return () => {\n this.mutationObservers?.delete(callback);\n };\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get parent(): CanvasNode | undefined {\n return this.parentNode;\n }\n get children(): readonly CanvasNode[] {\n return this.list;\n }\n get style(): ResolvedCanvasStyle {\n return this.config;\n }\n get text(): string {\n return this.captionValue;\n }\n get bounds(): UIBounds {\n return this.boundsValue;\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n this.setFlag(\"visible\", value);\n }\n get enabled(): boolean {\n return this.active;\n }\n set enabled(value: boolean) {\n this.setFlag(\"enabled\", value);\n }\n get busy(): boolean {\n return this.working;\n }\n get ui(): CanvasNodeOwner | undefined {\n return this.owner ?? this.parentNode?.ui;\n }\n /** Optional portable control commands and drawing model. */\n get control(): CanvasControlPort | undefined {\n return undefined;\n }\n get interactive(): boolean {\n return (\n this.kind === \"button\" ||\n this.kind === \"hold-button\" ||\n this.control !== undefined\n );\n }\n get available(): boolean {\n for (\n let node: CanvasNode | undefined = this;\n node;\n node = node.parentNode\n ) {\n if (\n node.disposed ||\n !node.shown ||\n !node.active ||\n node.working ||\n node.presentationValue.opacity === 0 ||\n node.config.pointerEvents === \"none\" ||\n node.owner?.disposed\n )\n return false;\n }\n return true;\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n private assertAlive(): void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI node has been disposed\");\n }\n private setFlag(key: \"visible\" | \"enabled\", value: boolean): void {\n this.assertAlive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_UI\", `${key} must be boolean`);\n if (this[key] === value) return;\n if (!value) this.stopScroll();\n if (key === \"visible\") this.shown = value;\n else this.active = value;\n this.changed(key === \"visible\");\n }\n setStyle(value: CanvasStyle): void {\n this.assertAlive();\n const next = checkedStyle({ ...this.config, ...value });\n if (\n Object.keys(next).every(\n (k) =>\n next[k as keyof CanvasStyle] === this.config[k as keyof CanvasStyle],\n )\n )\n return;\n const geometry: readonly (keyof CanvasStyle)[] = [\n \"width\",\n \"height\",\n \"minWidth\",\n \"maxWidth\",\n \"minHeight\",\n \"maxHeight\",\n \"textWrap\",\n \"direction\",\n \"gap\",\n \"padding\",\n \"grow\",\n \"shrink\",\n \"align\",\n \"alignSelf\",\n \"justify\",\n \"wrap\",\n \"fontSize\",\n \"fontFamily\",\n \"scroll\",\n ];\n const layout = geometry.some((key) => next[key] !== this.config[key]);\n if (next.scroll !== this.config.scroll || !next.inertia || !next.dragScroll)\n this.stopScroll();\n this.config = next;\n this.changed(layout);\n }\n setText(text: string): void {\n this.assertAlive();\n if (typeof text !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"UI text must be a string\");\n if (text === this.captionValue) return;\n this.captionValue = text;\n this.changed(true);\n }\n /** Appending claims and eventually disposes children; nodes cannot belong to two trees. */\n add(...nodes: CanvasNode[]): this {\n this.assertAlive();\n if (this.kind !== \"panel\")\n throw new EngineError(\"INVALID_UI\", \"Only panels contain children\");\n const unique = new Set(nodes);\n if (unique.size !== nodes.length)\n throw new EngineError(\"UI_OWNERSHIP\", \"Duplicate UI child\");\n for (const node of nodes) {\n if (node.disposed || node.parentNode || node.owner)\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"UI child already owned or disposed\",\n );\n for (let p: CanvasNode | undefined = this; p; p = p.parentNode)\n if (p === node) throw new EngineError(\"UI_OWNERSHIP\", \"UI tree cycle\");\n }\n for (const node of nodes) node.parentNode = this;\n this.list = Object.freeze([...this.list, ...nodes]);\n this.changed(true);\n return this;\n }\n /** Reorder an existing child without disposal, subscriptions or identity changes. */\n move(node: CanvasNode, index: number): this {\n this.assertAlive();\n if (\n node.parentNode !== this ||\n !Number.isInteger(index) ||\n index < 0 ||\n index >= this.list.length\n )\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"Move requires an existing child and valid final index\",\n );\n if (this.list.indexOf(node) === index) return this;\n const next = this.list.filter((n) => n !== node);\n next.splice(index, 0, node);\n this.list = Object.freeze(next);\n this.changed(true);\n return this;\n }\n /** Dispose every child, continuing even when cleanup handlers throw. */\n clear(): void {\n this.assertAlive();\n cleanupAll(\n this.list.map((node) => () => node.dispose()),\n \"UI children cleanup failed\",\n );\n }\n remove(node: CanvasNode): boolean {\n this.assertAlive();\n if (node.parentNode !== this) return false;\n node.dispose();\n return true;\n }\n /** @internal */ changed(layout = false, projection = false): void {\n this.paintRevision++;\n const invalidate = () => {\n if (projection) this.ui?.scrollChanged(this);\n else this.ui?.invalidate(layout);\n };\n if (this.mutationObservers?.size)\n cleanupAll(\n [invalidate, ...this.mutationObservers],\n \"UI mutation observers failed\",\n );\n else invalidate();\n }\n /** @internal */ setHeld(value: boolean): void {\n if (value === this.held) return;\n this.held = value;\n this.changed();\n const result: unknown = this.hold?.(value);\n if (\n result &&\n (typeof result === \"object\" || typeof result === \"function\") &&\n \"then\" in result &&\n typeof result.then === \"function\"\n ) {\n void Promise.resolve(result).catch(() => {});\n throw new EngineError(\n \"UI_ASYNC_HOLD\",\n \"Hold handlers must be synchronous; own asynchronous work separately\",\n );\n }\n }\n /** @internal Async callbacks are cancellable and disable this button until settled. */\n activate(_source: CanvasActivation = \"accessibility\"): void {\n if (!this.available || this.kind !== \"button\" || !this.click) return;\n const result = this.click(this.signal);\n if (result && typeof result.then === \"function\") {\n this.working = true;\n this.changed();\n void result\n .catch((error) => {\n if (!this.signal.aborted) this.ui?.report(error);\n })\n .finally(() => {\n this.working = false;\n if (!this.disposed) this.changed();\n });\n }\n }\n dispose(): void {\n if (this.disposed) return;\n const ui = this.ui;\n this.stopScroll();\n const children = this.list;\n this.list = Object.freeze([]);\n if (this.parentNode) {\n this.parentNode.list = Object.freeze(\n this.parentNode.list.filter((n) => n !== this),\n );\n this.parentNode = undefined;\n }\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.abort.cancel(),\n () => ui?.invalidate(true),\n () => this.setHeld(false),\n ...children.map((n) => () => n.dispose()),\n () => this.events.dispose(),\n () => this.mutationObservers?.clear(),\n () => {\n this.owner = undefined;\n this.click = undefined;\n this.hold = undefined;\n },\n ],\n \"Canvas node cleanup failed\",\n );\n }\n}\nexport function CanvasPanel(\n children: readonly CanvasNode[] = [],\n style: CanvasStyle = {},\n): CanvasNode {\n return new CanvasNode(\"panel\", { style }).add(...children);\n}\nexport function CanvasRow(\n children: readonly CanvasNode[],\n style: CanvasStyle = {},\n): CanvasNode {\n return CanvasPanel(children, { ...style, direction: \"row\" });\n}\nexport function CanvasColumn(\n children: readonly CanvasNode[],\n style: CanvasStyle = {},\n): CanvasNode {\n return CanvasPanel(children, { ...style, direction: \"column\" });\n}\nexport function CanvasLabel(\n content: string | CanvasLabelOptions,\n style: CanvasStyle = {},\n): CanvasNode {\n if (typeof content === \"string\")\n return new CanvasNode(\"label\", { text: content, style });\n if (!content || typeof content !== \"object\")\n throw new EngineError(\"INVALID_UI\", \"UI label must be text or options\");\n const { text, ...label } = content;\n if (typeof text !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"UI text must be a string\");\n return new CanvasNode(\"label\", { text, label, style });\n}\nexport function CanvasButton(\n text: string,\n click: (signal: CancellationSignal) => void | Promise<void>,\n style: CanvasStyle = {},\n): CanvasNode {\n return new CanvasNode(\"button\", {\n text,\n click,\n style: {\n padding: 12,\n background: 0x23594e,\n pointerEvents: \"auto\",\n ...style,\n },\n });\n}\nexport function CanvasHoldButton(\n text: string,\n hold: (held: boolean) => void,\n style: CanvasStyle = {},\n): CanvasNode {\n return new CanvasNode(\"hold-button\", {\n text,\n hold,\n style: {\n padding: 12,\n background: 0x23594e,\n pointerEvents: \"auto\",\n ...style,\n },\n });\n}\n\n/** Clipped overflowing panel. Give the viewport a bounded size or grow allocation. */\nexport function CanvasScroll(\n children: readonly CanvasNode[] = [],\n style: CanvasStyle = {},\n): CanvasNode {\n return CanvasPanel(children, {\n scroll: \"vertical\",\n pointerEvents: \"auto\",\n ...style,\n clip: true,\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent } from \"../foundation/events\";\nimport { cleanupAll, type LifetimeOwner } from \"../foundation/lifetime\";\nimport type {\n CanvasActivation,\n CanvasControlModel,\n CanvasControlPort,\n} from \"./canvas-control\";\nimport { canvasSliderGeometry } from \"./canvas-control\";\nimport {\n CanvasNode,\n type CanvasNodeKind,\n type CanvasStyle,\n} from \"./canvas-node\";\nimport type { CanvasNativeControl } from \"./native-edit\";\n\nexport type CanvasValueSource = CanvasActivation | \"program\";\nexport interface CanvasValueChange<T> {\n readonly node: CanvasInputNode<T>;\n readonly previous: T;\n readonly value: T;\n readonly source: CanvasValueSource;\n}\nexport interface CanvasEditEnd<T> {\n readonly node: CanvasInputNode<T>;\n readonly previous: T;\n readonly value: T;\n readonly source: CanvasActivation;\n}\nconst boolean = (value: boolean): boolean => {\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_UI\", \"Control flag must be boolean\");\n return value;\n};\n/** Small value/lifetime foundation. Existing buttons and panels do not inherit it. */\nexport abstract class CanvasInputNode<T> extends CanvasNode {\n private current: T;\n private locked: boolean;\n private inputRevision = 0;\n private edit: { previous: T; source: CanvasActivation } | undefined;\n private readonly changeEvent =\n defineEvent<CanvasValueChange<T>>(\"CanvasValueChange\");\n private readonly commitEvent =\n defineEvent<CanvasEditEnd<T>>(\"CanvasValueCommit\");\n private readonly cancelEvent =\n defineEvent<CanvasEditEnd<T>>(\"CanvasValueCancel\");\n private readonly port: CanvasControlPort;\n protected constructor(\n kind: CanvasNodeKind,\n text: string,\n initial: T,\n private readonly normalize: (value: T) => T,\n readOnly: boolean,\n style: CanvasStyle,\n keys: readonly string[] = [],\n pointerAxis?: \"horizontal\",\n ) {\n const value = normalize(initial),\n locked = boolean(readOnly);\n super(kind, {\n text,\n style: {\n padding: 12,\n minHeight: 44,\n pointerEvents: \"auto\",\n background: 0x23594e,\n ...style,\n },\n });\n this.current = value;\n this.locked = locked;\n const self = this;\n this.port = Object.freeze({\n get model() {\n return self.model();\n },\n get revision() {\n return self.inputRevision;\n },\n get native() {\n return self.nativeControl;\n },\n keys,\n ...(pointerAxis ? { pointerAxis } : {}),\n key: (code: string) => self.controlKey(code),\n beginPointer: (x: number, y: number) => self.beginPointer(x, y),\n movePointer: (x: number, y: number) => self.movePointer(x, y),\n endPointer: (cancelled: boolean) => self.endPointer(cancelled),\n });\n this.onDispose(() => this.endPointer(true));\n }\n override get control(): CanvasControlPort {\n return this.port;\n }\n private intentVersion = 0;\n private intentObservers: Set<() => void> | undefined;\n /** @internal Changes on authoritative commands, including equal writes and edit start. */\n get animationRevision(): number {\n return this.intentVersion;\n }\n /** @internal */ observeValueIntent(callback: () => void): () => void {\n this.assertInputAlive();\n this.intentObservers ??= new Set();\n this.intentObservers.add(callback);\n return () => {\n this.intentObservers?.delete(callback);\n };\n }\n protected valueIntent(): void {\n this.intentVersion++;\n this.animationInterrupted();\n if (this.intentObservers?.size)\n cleanupAll(\n [...this.intentObservers],\n \"Value animation interruption failed\",\n );\n }\n protected animationInterrupted(): void {}\n /** @internal Program semantics without interrupting its own animation capability. */\n writeAnimatedValue(value: T): boolean {\n this.assertInputAlive();\n const next = this.normalize(value),\n version = this.intentVersion;\n if (!Object.is(next, this.current)) this.writeValue(next);\n return this.intentVersion === version;\n }\n protected abstract model(): CanvasControlModel;\n protected get nativeControl(): CanvasNativeControl | undefined {\n return undefined;\n }\n protected valueReplaced(): void {}\n protected controlKey(_code: string): void {}\n protected beginPointer(_x: number, _y: number): boolean {\n return false;\n }\n protected movePointer(_x: number, _y: number): void {}\n protected assertInputAlive(): void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI control has been disposed\");\n }\n get value(): T {\n return this.current;\n }\n set value(value: T) {\n this.setValue(value);\n }\n get readOnly(): boolean {\n return this.locked;\n }\n set readOnly(value: boolean) {\n this.assertInputAlive();\n const next = boolean(value);\n if (next === this.locked) return;\n this.valueIntent();\n this.assertInputAlive();\n this.nativeControl?.end(\"interrupt\");\n this.locked = next;\n this.inputRevision++;\n const edit = this.takeEdit();\n cleanupAll(\n [() => this.changed(), () => this.cancelled(edit)],\n \"Control read-only change failed\",\n );\n }\n get editing(): boolean {\n return this.edit !== undefined;\n }\n onChange(\n handler: (event: CanvasValueChange<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.changeEvent, handler, owner);\n }\n onCommit(\n handler: (event: CanvasEditEnd<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.commitEvent, handler, owner);\n }\n onCancel(\n handler: (event: CanvasEditEnd<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.cancelEvent, handler, owner);\n }\n /** Validated program command, even for disabled/read-only controls; cancels pending pointer editing, including equal writes. */\n setValue(value: T): void {\n this.assertInputAlive();\n const next = this.normalize(value);\n this.valueIntent();\n this.assertInputAlive();\n this.writeValue(next);\n }\n private writeValue(next: T): void {\n const previous = this.current;\n this.nativeControl?.end(\"interrupt\");\n const edit = this.takeEdit();\n this.current = next;\n this.inputRevision++;\n this.valueReplaced();\n cleanupAll(\n [\n () => this.changed(),\n () => this.notify(previous, next, \"program\"),\n () => this.cancelled(edit),\n ],\n \"Program control update failed\",\n );\n }\n protected userValue(value: T, source: CanvasActivation, commit = true): void {\n if (!this.available || this.readOnly) return;\n this.valueIntent();\n if (!this.available || this.readOnly) return;\n const next = this.normalize(value),\n previous = this.current;\n if (Object.is(previous, next)) return;\n this.current = next;\n const revision = this.inputRevision;\n cleanupAll(\n [\n () => this.changed(),\n () => this.notify(previous, next, source),\n () => {\n if (\n commit &&\n !this.disposed &&\n this.inputRevision === revision &&\n Object.is(this.current, next)\n )\n this.events.emit(\n this.commitEvent,\n Object.freeze({ node: this, previous, value: next, source }),\n );\n },\n ],\n \"User control update failed\",\n );\n }\n protected beginEdit(source: CanvasActivation = \"pointer\"): boolean {\n if (!this.available || this.readOnly || this.edit) return false;\n this.valueIntent();\n if (!this.available || this.readOnly || this.edit) return false;\n this.edit = { previous: this.current, source };\n this.changed();\n return true;\n }\n private takeEdit(): { previous: T; source: CanvasActivation } | undefined {\n const edit = this.edit;\n this.edit = undefined;\n return edit;\n }\n private notify(previous: T, value: T, source: CanvasValueSource): void {\n if (!this.disposed && !Object.is(previous, value))\n this.events.emit(\n this.changeEvent,\n Object.freeze({ node: this, previous, value, source }),\n );\n }\n private cancelled(\n edit: { previous: T; source: CanvasActivation } | undefined,\n ): void {\n if (edit)\n this.events.emit(\n this.cancelEvent,\n Object.freeze({\n node: this,\n previous: edit.previous,\n value: this.current,\n source: edit.source,\n }),\n );\n }\n /** Cancellation retains the latest immediate value; it never creates a commit or rolls back application state. */\n protected endPointer(cancelled: boolean): void {\n const edit = this.takeEdit();\n if (!edit) return;\n const value = this.current,\n revision = this.inputRevision;\n cleanupAll(\n [\n () => {\n if (!this.disposed && !this.ui?.disposed) this.changed();\n },\n () => {\n if (cancelled) this.cancelled(edit);\n else if (\n !this.disposed &&\n this.inputRevision === revision &&\n Object.is(this.current, value) &&\n !Object.is(edit.previous, value)\n )\n this.events.emit(\n this.commitEvent,\n Object.freeze({\n node: this,\n previous: edit.previous,\n value,\n source: edit.source,\n }),\n );\n },\n ],\n \"Control edit completion failed\",\n );\n }\n}\nexport interface CanvasCheckboxOptions {\n checked?: boolean;\n readOnly?: boolean;\n}\nexport class CanvasCheckboxNode extends CanvasInputNode<boolean> {\n constructor(\n text: string,\n options: CanvasCheckboxOptions = {},\n style: CanvasStyle = {},\n ) {\n super(\n \"checkbox\",\n text,\n options.checked === undefined ? false : options.checked,\n boolean,\n options.readOnly === undefined ? false : options.readOnly,\n style,\n );\n }\n get checked(): boolean {\n return this.value;\n }\n set checked(value: boolean) {\n this.setValue(value);\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"checkbox\",\n checked: this.value,\n readOnly: this.readOnly,\n });\n }\n override activate(source: CanvasActivation = \"accessibility\"): void {\n this.userValue(!this.value, source);\n }\n}\nexport function CanvasCheckbox(\n text: string,\n options: CanvasCheckboxOptions = {},\n style: CanvasStyle = {},\n): CanvasCheckboxNode {\n return new CanvasCheckboxNode(text, options, style);\n}\n\nexport interface CanvasSliderRange {\n min?: number;\n max?: number;\n step?: number;\n}\nexport interface CanvasSliderOptions extends CanvasSliderRange {\n label?: string;\n value?: number;\n readOnly?: boolean;\n}\ninterface Range {\n min: number;\n max: number;\n step: number;\n}\nexport function canvasNumericRange(options: CanvasSliderRange): Range {\n const { min = 0, max = 100, step = 1 } = options;\n if (\n ![min, max, step].every(Number.isFinite) ||\n max <= min ||\n step <= 0 ||\n !Number.isFinite(max - min) ||\n !Number.isFinite((max - min) / step) ||\n (max - min) / step > Number.MAX_SAFE_INTEGER ||\n (step < max - min && (min + step === min || max - step === max))\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Slider requires finite min < max and a positive, representable step\",\n );\n return { min, max, step };\n}\nexport function canvasNumericValue(value: number, range: Range): number {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new EngineError(\"INVALID_UI\", \"Slider value must be finite\");\n const { min, max, step } = range;\n if (value <= min) return min;\n if (value >= max) return max;\n const raw = min + Math.round((value - min) / step) * step;\n const rounded = Number(raw.toPrecision(15));\n return Math.max(\n min,\n Math.min(\n max,\n Math.abs(raw - rounded) <= Math.max(1, Math.abs(raw)) * Number.EPSILON * 2\n ? rounded\n : raw,\n ),\n );\n}\nconst sliderKeys = Object.freeze([\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"PageUp\",\n \"PageDown\",\n \"Home\",\n \"End\",\n]);\nexport class CanvasSliderNode extends CanvasInputNode<number> {\n private readonly range: Range;\n constructor(options: CanvasSliderOptions = {}, style: CanvasStyle = {}) {\n const range = canvasNumericRange(options);\n super(\n \"slider\",\n options.label === undefined ? \"Value\" : options.label,\n options.value === undefined ? range.min : options.value,\n (value) => canvasNumericValue(value, range),\n options.readOnly === undefined ? false : options.readOnly,\n { width: 260, maxWidth: \"100%\", height: 76, ...style },\n sliderKeys,\n \"horizontal\",\n );\n this.range = range;\n }\n private displayed: number | undefined;\n /** Smooth visual value; logical value and ARIA remain authoritative. */\n get displayValue(): number {\n return this.displayed ?? this.value;\n }\n set displayValue(value: number) {\n const next = this.displayNumber(value);\n this.valueIntent();\n this.assertInputAlive();\n this.writeAnimatedDisplayValue(next);\n }\n private displayNumber(value: number): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_UI\", \"Display value must be finite\");\n return Math.max(this.min, Math.min(this.max, value));\n }\n /** @internal */ writeAnimatedDisplayValue(value: number): boolean {\n this.assertInputAlive();\n const next = this.displayNumber(value);\n if (next !== this.displayValue) {\n this.displayed = next;\n this.changed();\n }\n return true;\n }\n protected override valueReplaced(): void {\n this.displayed = undefined;\n }\n protected override animationInterrupted(): void {\n if (this.displayed !== undefined) {\n this.displayed = undefined;\n this.changed();\n }\n }\n get min(): number {\n return this.range.min;\n }\n get max(): number {\n return this.range.max;\n }\n get step(): number {\n return this.range.step;\n }\n /** Atomic range validation; clamps/snaps the value and cancels active pointer editing. */\n setRange(patch: CanvasSliderRange): void {\n this.assertInputAlive();\n const next = canvasNumericRange({ ...this.range, ...patch });\n Object.assign(this.range, next);\n this.setValue(this.value);\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"slider\",\n value: this.value,\n ...this.range,\n ratio: (this.displayValue - this.min) / (this.max - this.min),\n readOnly: this.readOnly,\n });\n }\n protected override controlKey(code: string): void {\n if (this.editing || !sliderKeys.includes(code)) return;\n const direction = [\"ArrowRight\", \"ArrowUp\", \"PageUp\"].includes(code)\n ? 1\n : -1;\n this.userValue(\n code === \"Home\"\n ? this.min\n : code === \"End\"\n ? this.max\n : Math.max(\n this.min,\n Math.min(\n this.max,\n this.value +\n direction * this.step * (code.startsWith(\"Page\") ? 10 : 1),\n ),\n ),\n \"keyboard\",\n );\n }\n protected override beginPointer(x: number, y: number): boolean {\n if (!this.beginEdit()) return false;\n if (this.editing) this.movePointer(x, y);\n return this.editing;\n }\n protected override movePointer(x: number, _y: number): void {\n if (!this.editing || !Number.isFinite(x)) return;\n const geometry = canvasSliderGeometry(this);\n if (geometry && geometry.track.width > 0)\n this.userValue(\n this.min +\n Math.max(\n 0,\n Math.min(1, (x - geometry.track.x) / geometry.track.width),\n ) *\n (this.max - this.min),\n \"pointer\",\n false,\n );\n }\n}\nexport function CanvasSlider(\n options: CanvasSliderOptions = {},\n style: CanvasStyle = {},\n): CanvasSliderNode {\n return new CanvasSliderNode(options, style);\n}\n","import type { CanvasActivation } from \"./canvas-control\";\n\n/** UTF-16 offsets, matching native editors; the Host owns grapheme navigation and painting. */\nexport interface CanvasTextSnapshot {\n readonly text: string;\n readonly selectionStart: number;\n readonly selectionEnd: number;\n readonly direction: \"forward\" | \"backward\" | \"none\";\n readonly composing: boolean;\n}\nexport interface CanvasNativeSession<D> {\n readonly id: number;\n readonly active: boolean;\n update(draft: D): boolean;\n commit(): boolean;\n cancel(): void;\n}\nexport interface CanvasNativePort<D> {\n begin(source: CanvasActivation): CanvasNativeSession<D> | undefined;\n /** Blur accepts a valid noncomposing draft; all other interruptions cancel. */\n end(reason: \"blur\" | \"interrupt\"): void;\n}\nexport type CanvasNativeControl =\n | ({ readonly kind: \"select\" } & CanvasNativePort<number>)\n | ({ readonly kind: \"text\" } & CanvasNativePort<CanvasTextSnapshot>);\n\nlet nextSession = 0;\n/** @internal Every callback is bound to this session and its original control generation. */\nexport function nativeSession<D>(\n valid: () => boolean,\n update: (draft: D) => void,\n finish: (commit: boolean) => boolean,\n): CanvasNativeSession<D> {\n let ended = false;\n const active = () => !ended && valid();\n return Object.freeze({\n id: ++nextSession,\n get active() {\n return active();\n },\n update(draft: D) {\n if (!active()) return false;\n update(draft);\n return active();\n },\n commit() {\n if (!active()) return false;\n ended = true;\n return finish(true);\n },\n cancel() {\n if (ended) return;\n ended = true;\n finish(false);\n },\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent } from \"../foundation/events\";\nimport type { LifetimeOwner } from \"../foundation/lifetime\";\nimport type { CanvasActivation, CanvasControlModel } from \"./canvas-control\";\nimport { CanvasInputNode } from \"./canvas-input\";\nimport type { CanvasNodeKind, CanvasStyle } from \"./canvas-node\";\nimport {\n type CanvasNativeControl,\n type CanvasNativeSession,\n type CanvasTextSnapshot,\n nativeSession,\n} from \"./native-edit\";\n\nfunction snapshot(text: string): CanvasTextSnapshot {\n return Object.freeze({\n text,\n selectionStart: text.length,\n selectionEnd: text.length,\n direction: \"none\",\n composing: false,\n });\n}\nfunction checkedSnapshot(value: CanvasTextSnapshot): CanvasTextSnapshot {\n if (\n typeof value.text !== \"string\" ||\n /[\\r\\n]/.test(value.text) ||\n !Number.isInteger(value.selectionStart) ||\n !Number.isInteger(value.selectionEnd) ||\n value.selectionStart < 0 ||\n value.selectionStart > value.selectionEnd ||\n value.selectionEnd > value.text.length ||\n ![\"forward\", \"backward\", \"none\"].includes(value.direction) ||\n typeof value.composing !== \"boolean\"\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Native editor requires single-line text and bounded UTF-16 selection\",\n );\n return Object.freeze({ ...value });\n}\nexport interface CanvasDraftChange<T> {\n readonly node: CanvasTextEditorNode<T>;\n readonly draft: CanvasTextSnapshot;\n}\n/** Shared portable native text session. Values are accepted state; drafts include composition and incomplete numbers. */\nexport abstract class CanvasTextEditorNode<T> extends CanvasInputNode<T> {\n private buffer: CanvasTextSnapshot;\n private session: CanvasNativeSession<CanvasTextSnapshot> | undefined;\n private readonly draftEvent =\n defineEvent<CanvasDraftChange<T>>(\"CanvasDraftChange\");\n private hint: string;\n protected constructor(\n kind: CanvasNodeKind,\n label: string,\n value: T,\n normalize: (value: T) => T,\n readOnly: boolean,\n placeholder: string,\n initialText: string,\n style: CanvasStyle,\n keys: readonly string[] = [],\n ) {\n if (typeof placeholder !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"Placeholder must be text\");\n super(\n kind,\n label,\n value,\n normalize,\n readOnly,\n { width: 260, maxWidth: \"100%\", height: 48, textWrap: false, ...style },\n keys,\n );\n this.hint = placeholder;\n this.buffer = snapshot(initialText);\n this.onDispose(() => this.session?.cancel());\n }\n protected abstract format(value: T): string;\n protected abstract parse(text: string): { value: T } | undefined;\n protected get inputMode(): \"text\" | \"numeric\" | \"decimal\" {\n return this.kind === \"number-input\" ? \"decimal\" : \"text\";\n }\n protected get limit(): number | undefined {\n return undefined;\n }\n get draft(): CanvasTextSnapshot {\n return this.buffer;\n }\n get placeholder(): string {\n return this.hint;\n }\n set placeholder(value: string) {\n this.assertInputAlive();\n if (typeof value !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"Placeholder must be text\");\n this.hint = value;\n this.changed();\n }\n onDraftChange(\n handler: (event: CanvasDraftChange<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.draftEvent, handler, owner);\n }\n protected override valueReplaced(): void {\n this.buffer = snapshot(this.format(this.value));\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"text\",\n text: this.editing ? this.buffer.text : this.format(this.value),\n placeholder: this.hint,\n maxLength: this.limit,\n inputMode: this.inputMode,\n readOnly: this.readOnly,\n });\n }\n protected override get nativeControl(): CanvasNativeControl & {\n kind: \"text\";\n } {\n return {\n kind: \"text\",\n begin: (source) => this.beginTextEdit(source),\n end: (reason) => {\n if (\n reason === \"blur\" &&\n this.available &&\n !this.readOnly &&\n !this.buffer.composing\n )\n this.session?.commit();\n else this.session?.cancel();\n },\n };\n }\n beginTextEdit(\n source: CanvasActivation = \"keyboard\",\n ): CanvasNativeSession<CanvasTextSnapshot> | undefined {\n if (this.session?.active) return this.session;\n if (!this.beginEdit(source)) return;\n this.buffer = snapshot(this.format(this.value));\n const revision = this.control.revision;\n const session: CanvasNativeSession<CanvasTextSnapshot> =\n nativeSession<CanvasTextSnapshot>(\n () =>\n this.available &&\n !this.readOnly &&\n this.control.revision === revision &&\n this.session === session,\n (draft) => {\n const next = checkedSnapshot(draft);\n if (\n next.text === this.buffer.text &&\n next.selectionStart === this.buffer.selectionStart &&\n next.selectionEnd === this.buffer.selectionEnd &&\n next.direction === this.buffer.direction &&\n next.composing === this.buffer.composing\n )\n return;\n this.buffer = next;\n this.changed();\n this.events.emit(\n this.draftEvent,\n Object.freeze({ node: this, draft: next }),\n );\n },\n (commit) => {\n this.session = undefined;\n const parsed =\n commit && !this.buffer.composing\n ? this.parse(this.buffer.text)\n : undefined;\n const accepted = !!parsed && this.available && !this.readOnly;\n this.buffer = snapshot(this.format(parsed?.value ?? this.value));\n try {\n if (accepted && parsed) this.userValue(parsed.value, source, false);\n } finally {\n this.endPointer(!accepted);\n }\n return accepted;\n },\n );\n this.session = session;\n return session;\n }\n /** Explicit form boundary; composition cannot be committed as a form value. */\n commit(): boolean {\n return this.session?.commit() ?? true;\n }\n cancel(): void {\n this.session?.cancel();\n }\n override changed(layout = false): void {\n if (!this.available) this.session?.cancel();\n super.changed(layout);\n }\n}\n","import type { CanvasControlModel } from \"./canvas-control\";\nimport { CanvasTextEditorNode } from \"./canvas-editor\";\nimport {\n type CanvasSliderRange,\n canvasNumericRange,\n canvasNumericValue,\n} from \"./canvas-input\";\nimport type { CanvasStyle } from \"./canvas-node\";\nexport interface CanvasNumberInputOptions extends CanvasSliderRange {\n label?: string;\n value?: number;\n placeholder?: string;\n readOnly?: boolean;\n}\n/** Locale-independent decimal/exponent input. Incomplete drafts never become numeric values. */\nexport class CanvasNumberInputNode extends CanvasTextEditorNode<number> {\n private readonly range: ReturnType<typeof canvasNumericRange>;\n constructor(options: CanvasNumberInputOptions = {}, style: CanvasStyle = {}) {\n const range = canvasNumericRange(options),\n initial = canvasNumericValue(options.value ?? range.min, range);\n super(\n \"number-input\",\n options.label ?? \"Number\",\n initial,\n (value) => canvasNumericValue(value, range),\n options.readOnly ?? false,\n options.placeholder ?? \"\",\n String(initial),\n style,\n [\"ArrowUp\", \"ArrowDown\", \"PageUp\", \"PageDown\"],\n );\n this.range = range;\n }\n get min(): number {\n return this.range.min;\n }\n get max(): number {\n return this.range.max;\n }\n get step(): number {\n return this.range.step;\n }\n setRange(patch: CanvasSliderRange): void {\n this.assertInputAlive();\n const next = canvasNumericRange({ ...this.range, ...patch });\n this.cancel();\n Object.assign(this.range, next);\n this.setValue(this.value);\n }\n protected override format(value: number): string {\n return String(value);\n }\n protected override parse(text: string): { value: number } | undefined {\n const trimmed = text.trim();\n if (!/^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(trimmed)) return;\n const value = Number(trimmed);\n return Number.isFinite(value)\n ? { value: canvasNumericValue(value, this.range) }\n : undefined;\n }\n protected override model(): CanvasControlModel {\n const model = super.model();\n if (model.kind !== \"text\") return model;\n return Object.freeze({\n ...model,\n numeric: Object.freeze({ value: this.value, ...this.range }),\n });\n }\n protected override controlKey(code: string): void {\n if (\n !this.available ||\n this.readOnly ||\n this.draft.composing ||\n !this.control.keys.includes(code)\n )\n return;\n const base = this.editing\n ? (this.parse(this.draft.text)?.value ?? this.value)\n : this.value;\n this.cancel();\n const direction = code === \"ArrowUp\" || code === \"PageUp\" ? 1 : -1;\n const next = Math.max(\n this.min,\n Math.min(\n this.max,\n base + direction * this.step * (code.startsWith(\"Page\") ? 10 : 1),\n ),\n );\n this.userValue(next, \"keyboard\");\n this.valueReplaced();\n }\n}\nexport function CanvasNumberInput(\n options: CanvasNumberInputOptions = {},\n style: CanvasStyle = {},\n): CanvasNumberInputNode {\n return new CanvasNumberInputNode(options, style);\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { CanvasActivation, CanvasControlModel } from \"./canvas-control\";\nimport { CanvasInputNode } from \"./canvas-input\";\nimport type { CanvasStyle } from \"./canvas-node\";\nimport {\n type CanvasNativeControl,\n type CanvasNativeSession,\n nativeSession,\n} from \"./native-edit\";\n\nexport interface CanvasSelectOption<T> {\n readonly label: string;\n readonly value: T;\n readonly disabled?: boolean;\n}\nexport interface CanvasSelectOptions<T> {\n label?: string;\n value?: T;\n readOnly?: boolean;\n}\nfunction copyOptions<T>(options: readonly CanvasSelectOption<T>[]) {\n const result = options.map((option, index) => {\n if (\n typeof option.label !== \"string\" ||\n option.value === undefined ||\n (option.disabled !== undefined && typeof option.disabled !== \"boolean\") ||\n options.some((o, i) => i < index && Object.is(o.value, option.value))\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Select requires labels and unique defined values\",\n );\n return Object.freeze({\n label: option.label,\n value: option.value,\n disabled: option.disabled ?? false,\n });\n });\n return Object.freeze(result);\n}\n/** Native popup presentation is Host-owned; typed values/options and transactions are portable. */\nexport class CanvasSelectNode<T> extends CanvasInputNode<T | undefined> {\n private readonly state: { options: ReturnType<typeof copyOptions<T>> };\n private session: CanvasNativeSession<number> | undefined;\n private draftIndex = -1;\n constructor(\n options: readonly CanvasSelectOption<T>[],\n config: CanvasSelectOptions<T> = {},\n style: CanvasStyle = {},\n ) {\n const state = { options: copyOptions(options) };\n const first = () =>\n (state.options.find((o) => !o.disabled) ?? state.options[0])?.value;\n super(\n \"select\",\n config.label ?? \"Select\",\n config.value === undefined ? first() : config.value,\n (value) => {\n if (value === undefined && state.options.length === 0) return value;\n if (!state.options.some((o) => Object.is(o.value, value)))\n throw new EngineError(\n \"INVALID_UI\",\n \"Select value must belong to its options\",\n );\n return value;\n },\n config.readOnly ?? false,\n { width: 260, maxWidth: \"100%\", height: 48, textWrap: false, ...style },\n );\n this.state = state;\n this.onDispose(() => this.session?.cancel());\n }\n get options(): readonly CanvasSelectOption<T>[] {\n return this.state.options;\n }\n /** Atomically replace copied options. Missing values fall back to the first enabled option (then first option). */\n setOptions(options: readonly CanvasSelectOption<T>[]): void {\n this.assertInputAlive();\n const next = copyOptions(options);\n this.nativeControl.end(\"interrupt\");\n this.state.options = next;\n this.setValue(\n next.some((o) => Object.is(o.value, this.value))\n ? this.value\n : (next.find((o) => !o.disabled) ?? next[0])?.value,\n );\n }\n private get selectedIndex(): number {\n return this.state.options.findIndex((o) => Object.is(o.value, this.value));\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"select\",\n options: this.state.options,\n selectedIndex: this.selectedIndex,\n readOnly: this.readOnly,\n });\n }\n protected override get nativeControl(): CanvasNativeControl & {\n kind: \"select\";\n } {\n return {\n kind: \"select\",\n begin: (source) => this.beginSelection(source),\n end: (reason) => {\n if (reason === \"blur\" && this.available && !this.readOnly)\n this.session?.commit();\n else this.session?.cancel();\n },\n };\n }\n beginSelection(\n source: CanvasActivation = \"keyboard\",\n ): CanvasNativeSession<number> | undefined {\n if (this.session?.active) return this.session;\n if (!this.beginEdit(source)) return;\n this.draftIndex = this.selectedIndex;\n const revision = this.control.revision;\n const session: CanvasNativeSession<number> = nativeSession<number>(\n () =>\n this.available &&\n !this.readOnly &&\n this.control.revision === revision &&\n this.session === session,\n (index) => {\n if (\n !Number.isInteger(index) ||\n !this.state.options[index] ||\n this.state.options[index]?.disabled\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Selection requires an enabled option index\",\n );\n this.draftIndex = index;\n },\n (commit) => {\n this.session = undefined;\n const option = this.state.options[this.draftIndex];\n try {\n if (\n commit &&\n option &&\n !option.disabled &&\n this.available &&\n !this.readOnly\n )\n this.userValue(option.value, source, false);\n } finally {\n this.endPointer(!commit);\n }\n return commit;\n },\n );\n this.session = session;\n return session;\n }\n override changed(layout = false): void {\n if (!this.available) this.session?.cancel();\n super.changed(layout);\n }\n}\nexport function CanvasSelect<T>(\n options: readonly CanvasSelectOption<T>[],\n config: CanvasSelectOptions<T> = {},\n style: CanvasStyle = {},\n): CanvasSelectNode<T> {\n return new CanvasSelectNode(options, config, style);\n}\n","/** Width-aware wrapping shared by measurement and paint; no global Pixi hooks. */\nconst graphemes = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst words = new Intl.Segmenter(undefined, { granularity: \"word\" });\nconst opening = /[(〔[{〈《「『【([{]$/u;\nconst closing =\n /^[、。,.?!:;)〕]}〉》」』】)\\]!,.:;?ー々ぁぃぅぇぉっゃゅょァィゥェォッャュョ]/u;\nconst cjk = /[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}]/u;\nconst space = /^\\s+$/u;\n\n/** Preserve explicit lines/spaces. Soft-wrap separators are omitted at the line edge.\n * Common Japanese punctuation is kept with its neighbor when a fitting break exists.\n * An indivisible grapheme wider than the box is retained and presentation clips it.\n */\nexport function wrapCanvasText(\n text: string,\n width: number,\n measure: (text: string) => number,\n): string {\n const lines: string[] = [];\n for (const paragraph of text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\")) {\n if (!paragraph || measure(paragraph) <= width) {\n lines.push(paragraph);\n continue;\n }\n const chars = Array.from(graphemes.segment(paragraph), (s) => s.segment);\n const offsets = [0];\n for (const c of chars) offsets.push((offsets.at(-1) ?? 0) + c.length);\n const boundaries = new Set(\n Array.from(words.segment(paragraph), (s) => s.index),\n );\n let start = 0;\n const part = (end: number) => paragraph.slice(offsets[start], offsets[end]);\n while (start < chars.length) {\n let low = start + 1,\n high = chars.length,\n fit = start;\n // Measure complete substrings, preserving kerning/ligature shaping.\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (measure(part(mid)) <= width) {\n fit = mid;\n low = mid + 1;\n } else high = mid - 1;\n }\n if (fit === chars.length) {\n lines.push(part(fit));\n break;\n }\n let end = Math.max(start + 1, fit);\n const legal = (i: number) =>\n !opening.test(chars[i - 1] ?? \"\") && !closing.test(chars[i] ?? \"\");\n const preferred = (i: number) =>\n boundaries.has(offsets[i] ?? -1) ||\n cjk.test(chars[i - 1] ?? \"\") ||\n cjk.test(chars[i] ?? \"\") ||\n space.test(chars[i] ?? \"\");\n let candidate = end;\n while (candidate > start && !(legal(candidate) && preferred(candidate)))\n candidate--;\n if (candidate === start) {\n candidate = end;\n while (candidate > start && !legal(candidate)) candidate--;\n }\n if (candidate > start) end = candidate;\n lines.push(part(end).replace(/[\\t \\u3000]+$/u, \"\"));\n start = end;\n while (start < chars.length && space.test(chars[start] ?? \"\")) start++;\n }\n }\n return lines.join(\"\\n\");\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { CanvasTextEditorNode } from \"./canvas-editor\";\nimport type { CanvasStyle } from \"./canvas-node\";\nexport type CanvasTextInputMode = \"text\" | \"numeric\" | \"decimal\";\nexport interface CanvasTextInputOptions {\n /** Keyboard hint only; accepted text and IME remain unchanged. Default text. */\n inputMode?: CanvasTextInputMode;\n label?: string;\n value?: string;\n placeholder?: string;\n /** Maximum UTF-16 length, matching native maxlength. Composition drafts may temporarily exceed it. */\n maxLength?: number;\n readOnly?: boolean;\n}\nfunction lengthLimit(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))\n throw new EngineError(\n \"INVALID_UI\",\n \"maxLength must be a nonnegative safe integer\",\n );\n return value;\n}\nfunction validText(value: string, limit: number | undefined): string {\n if (\n typeof value !== \"string\" ||\n /[\\r\\n]/.test(value) ||\n (limit !== undefined && value.length > limit)\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Text value must be single-line and within maxLength\",\n );\n return value;\n}\nexport class CanvasTextInputNode extends CanvasTextEditorNode<string> {\n private readonly constraints: {\n maxLength: number | undefined;\n inputMode: CanvasTextInputMode;\n };\n constructor(options: CanvasTextInputOptions = {}, style: CanvasStyle = {}) {\n const inputMode = options.inputMode ?? \"text\";\n if (![\"text\", \"numeric\", \"decimal\"].includes(inputMode))\n throw new EngineError(\"INVALID_UI\", \"Invalid text keyboard hint\");\n const constraints = {\n maxLength: lengthLimit(options.maxLength),\n inputMode,\n },\n initial = validText(options.value ?? \"\", constraints.maxLength);\n super(\n \"text-input\",\n options.label ?? \"Text\",\n initial,\n (value) => validText(value, constraints.maxLength),\n options.readOnly ?? false,\n options.placeholder ?? \"\",\n initial,\n style,\n );\n this.constraints = constraints;\n }\n protected override format(value: string): string {\n return value;\n }\n protected override parse(text: string): { value: string } | undefined {\n if (this.maxLength !== undefined && text.length > this.maxLength) return;\n return { value: text };\n }\n protected override get inputMode(): CanvasTextInputMode {\n return this.constraints.inputMode;\n }\n protected override get limit(): number | undefined {\n return this.maxLength;\n }\n get maxLength(): number | undefined {\n return this.constraints.maxLength;\n }\n /** Atomic: shrinking below the accepted value is rejected. Valid changes supersede active editing. */\n setMaxLength(value: number | undefined): void {\n this.assertInputAlive();\n const next = lengthLimit(value);\n validText(this.value, next);\n this.constraints.maxLength = next;\n this.setValue(this.value);\n }\n}\nexport function CanvasTextInput(\n options: CanvasTextInputOptions = {},\n style: CanvasStyle = {},\n): CanvasTextInputNode {\n return new CanvasTextInputNode(options, style);\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Tween, tweenFinite } from \"../foundation/tween\";\nimport type { CanvasSliderNode } from \"./canvas-input\";\nimport type { CanvasNode } from \"./canvas-node\";\n/** Translation is projected together with scroll and inherited by descendants; no Flex property is written. */\nexport function canvasTween(node: CanvasNode) {\n const bind = (key: \"offsetX\" | \"offsetY\" | \"opacity\") =>\n Tween.bind({\n target: node,\n key: `presentation.${key}`,\n owner: node,\n scope: () => node.ui?.scene,\n read: () => node.presentation[key],\n write: (value) => {\n node.setPresentation({ [key]: value });\n return Object.is(node.presentation[key], value);\n },\n validate: (value) => {\n tweenFinite(value, key);\n if (key === \"opacity\" && (value < 0 || value > 1))\n throw new EngineError(\"INVALID_TWEEN\", \"Opacity must be 0..1\");\n },\n });\n return Object.freeze({\n offsetX: bind(\"offsetX\"),\n offsetY: bind(\"offsetY\"),\n opacity: bind(\"opacity\"),\n });\n}\n/** Presentation transparency hides interaction, not program-driven animation. */\nfunction sliderAvailable(node: CanvasNode): boolean {\n for (\n let current: CanvasNode | undefined = node;\n current;\n current = current.parent\n )\n if (\n current.disposed ||\n !current.visible ||\n !current.enabled ||\n current.busy ||\n current.style.pointerEvents === \"none\" ||\n current.ui?.disposed\n )\n return false;\n return true;\n}\n/** Logical and display modes reserve the same channel, so a Slider has one animation authority. */\nexport function sliderTween(\n node: CanvasSliderNode,\n mode: \"value\" | \"display\" = \"value\",\n) {\n if (mode !== \"value\" && mode !== \"display\")\n throw new EngineError(\"INVALID_TWEEN\", \"Unknown Slider animation mode\");\n return Tween.bind({\n target: node,\n key: \"slider-value\",\n owner: node,\n scope: () => node.ui?.scene,\n read: () => (mode === \"value\" ? node.value : node.displayValue),\n write: (value) =>\n mode === \"value\"\n ? node.writeAnimatedValue(value)\n : node.writeAnimatedDisplayValue(value),\n valid: () => sliderAvailable(node) && !node.editing,\n stamp: () => node.animationRevision,\n watch: (invalidate) => {\n const removers = [\n node.observeValueIntent(() => invalidate(\"external-write\")),\n ];\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n removers.push(\n p.observeMutation(() => {\n if (!sliderAvailable(node)) invalidate(\"target-unavailable\");\n }),\n );\n return () => {\n for (const remove of removers) remove();\n };\n },\n });\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport {\n containsUI,\n intersectUI,\n layoutCanvas,\n type MeasureText,\n} from \"./canvas-layout\";\nimport type { CanvasNode, UIBounds } from \"./canvas-node\";\nimport {\n type CanvasScrollbar,\n canvasScrollbars,\n scrollbarContains,\n} from \"./scrollbar\";\nexport interface CanvasUIOptions {\n /** Host CSS pixels per UI unit, independent of Camera and DPR. Default 1. */ scale?: number;\n}\n/** A single Scene-owned screen UI tree, prepared detached and mounted at Scene commit. */\nexport class CanvasUI implements LifetimeOwner {\n private readonly lifetime = new Lifetime();\n private focusNode: CanvasNode | undefined;\n private factor: number;\n private dirty = true;\n private measure: MeasureText | undefined;\n private projectionDirty = true;\n private readonly baseBounds = new WeakMap<CanvasNode, UIBounds>();\n private readonly moving = new Set<CanvasNode>();\n private projections = 0;\n private width = -1;\n private height = -1;\n private readonly listeners = new Set<() => void>();\n private removeScene: (() => void) | undefined;\n private visits = 0;\n private layouts = 0;\n private intrinsicVisits = 0;\n private constrainVisits = 0;\n private hits = 0;\n private hitVisits = 0;\n private nodes = 0;\n private errors: (error: unknown) => void = () => {};\n constructor(\n readonly scene: LifetimeOwner,\n readonly root: CanvasNode,\n options: CanvasUIOptions = {},\n ) {\n this.factor = positive(options.scale ?? 1, \"ui.scale\");\n if (scene.disposed || root.disposed || root.parent || root.owner)\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"UI root must be alive and unowned\",\n );\n root.owner = this;\n try {\n this.removeScene = scene.onDispose(() => this.dispose());\n } catch (error) {\n root.owner = undefined;\n throw error;\n }\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get scale(): number {\n return this.factor;\n }\n set scale(value: number) {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI has been disposed\");\n const next = positive(value, \"ui.scale\");\n if (next !== this.factor) {\n this.stopMotion();\n this.factor = next;\n this.invalidate(true);\n }\n }\n get diagnostics() {\n return {\n layouts: this.layouts,\n scrollProjections: this.projections,\n activeMomentum: this.moving.size,\n layoutVisits: this.visits,\n intrinsicVisits: this.intrinsicVisits,\n constrainVisits: this.constrainVisits,\n nodes: this.nodes,\n hitTests: this.hits,\n hitVisits: this.hitVisits,\n subscriptions: this.listeners.size,\n };\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n /** @internal */ setErrorHandler(handler: (error: unknown) => void): void {\n this.errors = handler;\n }\n /** @internal */ report(error: unknown): void {\n try {\n this.errors(error);\n } catch {\n /* Observers cannot block release. */\n }\n }\n /** @internal */ subscribe(listener: () => void): () => void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI has been disposed\");\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n get focusedNode(): CanvasNode | undefined {\n return this.focusNode;\n }\n /** Logical focus; Hosts mirror it to native controls where available. */\n focus(node?: CanvasNode): void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI has been disposed\");\n this.syncFocusLayout();\n if (node && !this.canFocus(node))\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"Focus requires a reachable interactive node in this UI\",\n );\n if (this.focusNode === node) {\n if (node) this.reveal(node);\n return;\n }\n const previous = this.focusNode;\n this.focusNode = node;\n if (previous) {\n previous.focused = false;\n previous.changed();\n }\n if (node) {\n node.focused = true;\n this.reveal(node);\n node.changed();\n }\n previous?.control?.native?.end(\"blur\");\n }\n /** Ordered traversal, including offscreen controls. Undefined leaves focus at the boundary. */\n focusNext(reverse = false): CanvasNode | undefined {\n this.syncFocusLayout();\n const order: CanvasNode[] = [];\n this.walk((node) => {\n if (this.canFocus(node)) order.push(node);\n });\n const index = this.focusNode ? order.indexOf(this.focusNode) : -1;\n const node =\n order[\n index < 0\n ? reverse\n ? order.length - 1\n : 0\n : index + (reverse ? -1 : 1)\n ];\n if (node) this.focus(node);\n return node;\n }\n /** Reuse the Host's last metrics after a dynamic form/list mutation. */\n private syncFocusLayout(): void {\n if (this.measure && (this.dirty || this.projectionDirty))\n this.layout(this.width, this.height, this.measure);\n }\n /** Project scroll reveal before testing clips; static clipped controls must not trap Tab. */\n private canFocus(node: CanvasNode): boolean {\n if (\n node.ui !== this ||\n !node.available ||\n !node.interactive ||\n node.style.pointerEvents !== \"auto\"\n )\n return false;\n let box: UIBounds = node.bounds;\n for (let parent = node.parent; parent; parent = parent.parent) {\n const b = parent.bounds,\n pad = parent.style.padding;\n if (parent.style.scroll) {\n const dx =\n box.x < b.x + pad\n ? box.x - b.x - pad\n : Math.max(0, box.x + box.width - b.x - b.width + pad);\n const dy =\n box.y < b.y + pad\n ? box.y - b.y - pad\n : Math.max(0, box.y + box.height - b.y - b.height + pad);\n const sx =\n Math.max(0, Math.min(parent.maxScrollX, parent.scrollX + dx)) -\n parent.scrollX;\n const sy =\n Math.max(0, Math.min(parent.maxScrollY, parent.scrollY + dy)) -\n parent.scrollY;\n box = { ...box, x: box.x - sx, y: box.y - sy };\n }\n if (parent.style.clip || parent.style.scroll) box = intersectUI(box, b);\n if (box.width <= 0 || box.height <= 0) return false;\n }\n const visible = intersectUI(box, {\n x: 0,\n y: 0,\n width: Math.max(0, this.width / this.factor),\n height: Math.max(0, this.height / this.factor),\n });\n return visible.width > 0 && visible.height > 0;\n }\n /** Scroll ancestors just enough to reveal a focused descendant. */\n private reveal(node: CanvasNode): void {\n let x = node.bounds.x,\n y = node.bounds.y;\n for (let parent = node.parent; parent; parent = parent.parent) {\n if (!parent.style.scroll) continue;\n const b = parent.bounds,\n pad = parent.style.padding;\n const dx =\n x < b.x + pad\n ? x - b.x - pad\n : Math.max(0, x + node.bounds.width - b.x - b.width + pad);\n const dy =\n y < b.y + pad\n ? y - b.y - pad\n : Math.max(0, y + node.bounds.height - b.y - b.height + pad);\n const oldX = parent.scrollX,\n oldY = parent.scrollY;\n parent.scrollBy(dx, dy);\n x -= parent.scrollX - oldX;\n y -= parent.scrollY - oldY;\n }\n }\n /** UI units. Nested scrollers consume only when their offset can change. */\n scrollAt(x: number, y: number, dx: number, dy: number): boolean {\n const targets = this.scrollTargets(x, y);\n for (const node of targets) if (node.scrollBy(dx, dy)) return true;\n return false;\n }\n /** @internal Offset-only invalidation; Flex/text measurements remain cached. */\n scrollChanged(_node: CanvasNode): void {\n this.projectionDirty = true;\n this.invalidate();\n }\n /** @internal Maintain only live animated nodes, never a per-frame scan of the tree. */\n motionChanged(node: CanvasNode, active: boolean): void {\n if (active) this.moving.add(node);\n else this.moving.delete(node);\n }\n stopMotion(): void {\n for (const node of this.moving) node.stopScroll();\n this.moving.clear();\n }\n /** Presentation seconds, independent of simulation timers. Gaps >250ms stop stale motion. */\n advance(seconds: number): void {\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI elapsed time must be finite and nonnegative\",\n );\n if (this.disposed) return;\n if (seconds > 0.25) {\n this.stopMotion();\n return;\n }\n if (seconds === 0) return;\n for (const node of this.moving) {\n if (node.ui !== this || !node.available) {\n this.moving.delete(node);\n node.stopScroll();\n continue;\n }\n node.advanceScroll(seconds);\n }\n }\n /** @internal */ invalidate(layout = false): void {\n if (this.disposed) return;\n if (\n this.focusNode &&\n (this.focusNode.ui !== this || !this.focusNode.available)\n )\n this.focus();\n for (const node of this.moving)\n if (node.ui !== this || !node.available || !node.style.inertia) {\n this.moving.delete(node);\n node.stopScroll();\n }\n if (layout) this.dirty = true;\n cleanupAll([...this.listeners], \"UI invalidation failed\");\n }\n /** @internal Rendering supplies exact text metrics; unchanged frames do no layout. */\n layout(width: number, height: number, measure: MeasureText): boolean {\n if (this.disposed) return false;\n this.measure = measure;\n const geometry =\n this.dirty || this.width !== width || this.height !== height;\n if (!geometry && !this.projectionDirty) return false;\n if (geometry) {\n const visits = layoutCanvas(\n this.root,\n width / this.factor,\n height / this.factor,\n measure,\n );\n this.captureLayout(this.root);\n this.width = width;\n this.height = height;\n this.dirty = false;\n this.layouts++;\n this.visits += visits.nodes;\n this.intrinsicVisits += visits.intrinsicVisits;\n this.constrainVisits += visits.constrainVisits;\n this.nodes = visits.nodes;\n }\n this.projectScroll(this.root, 0, 0);\n this.projectionDirty = false;\n this.projections++;\n if (geometry) this.invalidate();\n return true;\n }\n private captureLayout(node: CanvasNode): void {\n const b = node.bounds;\n this.baseBounds.set(node, b);\n let x = 0,\n y = 0;\n for (const child of node.children) {\n if (!child.visible || child.disposed) continue;\n if (node.style.scroll) {\n x = Math.max(\n x,\n child.bounds.x +\n child.bounds.width -\n b.x -\n b.width +\n node.style.padding,\n );\n y = Math.max(\n y,\n child.bounds.y +\n child.bounds.height -\n b.y -\n b.height +\n node.style.padding,\n );\n }\n this.captureLayout(child);\n }\n node.setScrollRange(\n node.style.scroll && node.style.scroll !== \"vertical\" ? x : 0,\n node.style.scroll && node.style.scroll !== \"horizontal\" ? y : 0,\n );\n }\n private projectScroll(node: CanvasNode, dx: number, dy: number): void {\n if (node.disposed || !node.visible) return;\n const b = this.baseBounds.get(node);\n if (!b) return;\n const x = b.x - dx + node.presentation.offsetX,\n y = b.y - dy + node.presentation.offsetY;\n if (!Number.isFinite(x) || !Number.isFinite(y))\n throw new EngineError(\"INVALID_UI\", \"Composed UI offset must be finite\");\n if (\n node.bounds.x !== x ||\n node.bounds.y !== y ||\n node.bounds.width !== b.width ||\n node.bounds.height !== b.height\n )\n node.boundsValue = Object.freeze({\n x,\n y,\n width: b.width,\n height: b.height,\n });\n for (const child of node.children)\n this.projectScroll(\n child,\n dx + node.scrollX - node.presentation.offsetX,\n dy + node.scrollY - node.presentation.offsetY,\n );\n }\n /** Deepest ancestor path for the original hit; overlays cannot scroll content behind them. */\n scrollTargets(x: number, y: number): CanvasNode[] {\n let hit = this.hitTest(x, y);\n if (!hit) return [];\n const targets: CanvasNode[] = [];\n for (; hit; hit = hit.parent)\n if (hit.style.scroll && hit.available) targets.push(hit);\n return targets;\n }\n containsNode(node: CanvasNode, x: number, y: number): boolean {\n let b = node.bounds;\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n if (p.style.clip || p.style.scroll) b = intersectUI(b, p.bounds);\n return (\n node.available &&\n containsUI(\n intersectUI(b, {\n x: 0,\n y: 0,\n width: this.width / this.factor,\n height: this.height / this.factor,\n }),\n x,\n y,\n )\n );\n }\n /** @internal Same clipped paint order as Pixi and keyboard mirror. */\n walk(\n visit: (node: CanvasNode, clip: UIBounds) => void,\n after?: (node: CanvasNode, clip: UIBounds) => void,\n ): void {\n if (this.disposed) return;\n const walk = (node: CanvasNode, clip: UIBounds) => {\n if (node.disposed || !node.visible) return;\n const c =\n node.style.clip || node.style.scroll\n ? intersectUI(clip, node.bounds)\n : clip;\n visit(node, c);\n for (const child of node.children) walk(child, c);\n after?.(node, c);\n };\n walk(this.root, {\n x: 0,\n y: 0,\n width: Math.max(0, this.width / this.factor),\n height: Math.max(0, this.height / this.factor),\n });\n }\n /** Scroll keyboard commands remain scoped to the focused native/portable control. */\n scrollKey(node: CanvasNode, code: string): boolean {\n for (let p: CanvasNode | undefined = node; p; p = p.parent) {\n if (!p.style.scroll || !p.available) continue;\n const vertical = p.style.scroll !== \"horizontal\";\n let dx = 0,\n dy = 0;\n if (code === \"ArrowDown\") dy = 40;\n else if (code === \"ArrowUp\") dy = -40;\n else if (code === \"ArrowRight\") dx = 40;\n else if (code === \"ArrowLeft\") dx = -40;\n else if (code === \"PageDown\") {\n if (vertical) dy = p.bounds.height * 0.9;\n else dx = p.bounds.width * 0.9;\n } else if (code === \"PageUp\") {\n if (vertical) dy = -p.bounds.height * 0.9;\n else dx = -p.bounds.width * 0.9;\n } else if (code === \"Home\") {\n if (vertical) dy = -p.scrollY;\n else dx = -p.scrollX;\n } else if (code === \"End\") {\n if (vertical) dy = p.maxScrollY - p.scrollY;\n else dx = p.maxScrollX - p.scrollX;\n } else return false;\n if (p.scrollBy(dx, dy)) return true;\n }\n return false;\n }\n hitTest(x: number, y: number): CanvasNode | undefined {\n return this.pick(x, y).node;\n }\n /** One ordered hit pass covers content and post-subtree overlay bars. */\n pick(x: number, y: number): { node?: CanvasNode; bar?: CanvasScrollbar } {\n this.hits++;\n let result: { node?: CanvasNode; bar?: CanvasScrollbar } = {};\n const walk = (node: CanvasNode, clip: UIBounds) => {\n this.hitVisits++;\n if (\n node.disposed ||\n !node.visible ||\n !node.enabled ||\n node.busy ||\n node.presentation.opacity === 0 ||\n node.style.pointerEvents === \"none\" ||\n !containsUI(clip, x, y)\n )\n return;\n const c =\n node.style.clip || node.style.scroll\n ? intersectUI(clip, node.bounds)\n : clip;\n if (!containsUI(c, x, y)) return;\n if (node.style.pointerEvents === \"auto\" && containsUI(node.bounds, x, y))\n result = { node };\n for (const child of node.children) walk(child, c);\n for (const bar of canvasScrollbars(node))\n if (scrollbarContains(bar, x, y, this.factor, c))\n result = { node, bar };\n };\n if (!this.disposed)\n walk(this.root, {\n x: 0,\n y: 0,\n width: Math.max(0, this.width / this.factor),\n height: Math.max(0, this.height / this.factor),\n });\n return result;\n }\n dispose(): void {\n if (this.disposed) return;\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => {\n if (this.focusNode) this.focusNode.focused = false;\n this.focusNode = undefined;\n },\n () => this.stopMotion(),\n () => this.root.dispose(),\n () => this.removeScene?.(),\n () => {\n this.listeners.clear();\n this.removeScene = undefined;\n this.nodes = 0;\n this.errors = () => {};\n this.measure = undefined;\n },\n ],\n \"Canvas UI cleanup failed\",\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["integer","finite","finite","inputPhase","updatePhase","integratePhase","latePhase","finite","finite","finite","finite","finite","finite","integer","clamp"],"sources":["../src/foundation/diagnostics.ts","../src/foundation/easing.ts","../src/foundation/tween.ts","../src/foundation/lifetime.ts","../src/foundation/events.ts","../src/scene/component.ts","../src/graphics/sprite-sheet.ts","../src/graphics/components.ts","../src/animation/actor-tween.ts","../src/animation/sprite-animation.ts","../src/game/motion.ts","../src/foundation/cancellation.ts","../src/foundation/grid.ts","../src/foundation/random.ts","../src/foundation/version.ts","../src/scene/actor.ts","../src/game/character.ts","../src/game/collision-policy.ts","../src/game/tilemap-collision.ts","../src/graphics/coordinates.ts","../src/game/tilemap.ts","../src/foundation/timers.ts","../src/scene/scene.ts","../src/game/collider.ts","../src/game/collision-body.ts","../src/game/collision-contact.ts","../src/game/collision-geometry.ts","../src/game/collision-response.ts","../src/game/tile-collision-geometry.ts","../src/game/tile-collision-index.ts","../src/game/tile-contact.ts","../src/game/collision.ts","../src/game/geometry-tilemap.ts","../src/graphics/camera-follow.ts","../src/graphics/tile-geometry.ts","../src/interaction/key-code.ts","../src/interaction/action-bindings.ts","../src/interaction/action-frame.ts","../src/interaction/action-types.ts","../src/interaction/input-source.ts","../src/interaction/actions.ts","../src/interaction/input.ts","../src/ui/canvas-layout.ts","../src/ui/scrollbar.ts","../src/interaction/pointer-routing.ts","../src/runtime/engine.ts","../src/runtime/fixed-step.ts","../src/runtime/replay-data.ts","../src/runtime/replay.ts","../src/ui/canvas-control.ts","../src/ui/canvas-node.ts","../src/ui/canvas-input.ts","../src/ui/native-edit.ts","../src/ui/canvas-editor.ts","../src/ui/canvas-number-input.ts","../src/ui/canvas-select.ts","../src/ui/canvas-text.ts","../src/ui/canvas-text-input.ts","../src/ui/canvas-tween.ts","../src/ui/canvas-ui.ts"],"sourcesContent":["export class EngineError extends Error {\n constructor(\n public readonly code: string,\n message: string,\n public readonly details: Readonly<Record<string, unknown>> = {},\n ) {\n super(message);\n this.name = \"EngineError\";\n }\n toJSON() {\n return { code: this.code, message: this.message, ...this.details };\n }\n}\nexport function positive(value: number, name: string): number {\n if (!Number.isFinite(value) || value <= 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n `${name} must be finite and positive`,\n { field: name },\n );\n return value;\n}\n","/** Pure normalized easing functions. Custom easing must return a finite value in [0,1]. */\nexport type EasingFunction = (progress: number) => number;\nexport const Easing = Object.freeze({\n Linear: (t: number) => t,\n InQuad: (t: number) => t * t,\n OutQuad: (t: number) => t * (2 - t),\n InOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2),\n InCubic: (t: number) => t ** 3,\n OutCubic: (t: number) => 1 - (1 - t) ** 3,\n InOutCubic: (t: number) => (t < 0.5 ? 4 * t ** 3 : 1 - (-2 * t + 2) ** 3 / 2),\n});\n","import { EngineError } from \"./diagnostics\";\nimport { Easing, type EasingFunction } from \"./easing\";\nimport type { LifetimeOwner } from \"./lifetime\";\n\nexport type TweenCancelReason =\n | \"cancelled\"\n | \"stopped\"\n | \"replaced\"\n | \"external-write\"\n | \"target-unavailable\"\n | \"owner-disposed\"\n | \"scheduler-disposed\"\n | \"error\";\nexport interface TweenBindingOptions {\n readonly target: object;\n readonly key: PropertyKey;\n readonly read: () => number;\n readonly write: ((value: number) => void) | ((value: number) => boolean);\n readonly owner?: LifetimeOwner;\n readonly scope?: () => object | undefined;\n readonly valid?: () => boolean;\n readonly validate?: (value: number) => void;\n readonly stamp?: () => unknown;\n readonly watch?: (\n invalidate: (reason?: TweenCancelReason) => void,\n ) => () => void;\n}\n/** Explicit numeric write capability. target/key identifies a channel, not a reflected object path. */\nexport class TweenBinding {\n readonly key: string | symbol;\n constructor(readonly options: TweenBindingOptions) {\n if (\n !options?.target ||\n ![\"object\", \"function\"].includes(typeof options.target) ||\n ![\"string\", \"number\", \"symbol\"].includes(typeof options.key) ||\n typeof options.read !== \"function\" ||\n typeof options.write !== \"function\"\n )\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Binding needs a target, property identity, read and write\",\n );\n for (const fn of [\n options.scope,\n options.valid,\n options.validate,\n options.stamp,\n options.watch,\n ])\n if (fn !== undefined && typeof fn !== \"function\")\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Binding hooks must be functions\",\n );\n this.key =\n typeof options.key === \"symbol\" ? options.key : String(options.key);\n this.options = Object.freeze({ ...options });\n Object.freeze(this);\n }\n}\nexport interface TweenOptions {\n readonly duration: number;\n readonly from?: number;\n readonly easing?: EasingFunction;\n readonly delay?: number;\n /** Additional iterations, or Infinity. */\n readonly repeat?: number;\n readonly yoyo?: boolean;\n}\ntype NumberRecipe = Readonly<{\n kind: \"number\";\n binding: TweenBinding;\n to: number;\n duration: number;\n delay: number;\n repeat: number;\n yoyo: boolean;\n easing: EasingFunction;\n from: number | undefined;\n}>;\nexport type TweenRecipe =\n | NumberRecipe\n | Readonly<{ kind: \"delay\"; duration: number }>\n | Readonly<{\n kind: \"sequence\" | \"parallel\";\n children: readonly TweenRecipe[];\n }>;\nconst recipes = new WeakSet<object>();\nexport function tweenFinite(value: number, label: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_TWEEN\", `${label} must be finite`);\n return value;\n}\nfunction seconds(value: number, label: string): number {\n tweenFinite(value, label);\n if (value < 0)\n throw new EngineError(\n \"INVALID_TWEEN\",\n `${label} must be nonnegative seconds`,\n );\n return value;\n}\nfunction recipe<T extends TweenRecipe>(value: T): T {\n recipes.add(value);\n return Object.freeze(value);\n}\ntype Equal<X, Y, A, B> =\n (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;\nexport type TweenNumericKey<T> = {\n [K in keyof T]-?: T[K] extends number\n ? Equal<Pick<T, K>, { -readonly [P in K]: T[P] }, K, never>\n : never;\n}[keyof T];\nexport const Tween = Object.freeze({\n bind: (options: TweenBindingOptions): TweenBinding =>\n new TweenBinding(options),\n /** Only writable own numeric data properties on plain records. Classes need explicit adapters. */\n property<T extends object>(target: T, key: TweenNumericKey<T>): TweenBinding {\n const prototype = Object.getPrototypeOf(target),\n descriptor = Object.getOwnPropertyDescriptor(target, key);\n if (\n (prototype !== Object.prototype && prototype !== null) ||\n !descriptor?.writable ||\n !(\"value\" in descriptor) ||\n typeof descriptor.value !== \"number\"\n )\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Property binding requires a writable own numeric data property on a plain object\",\n );\n tweenFinite(descriptor.value, \"property\");\n return new TweenBinding({\n target,\n key,\n read: () => (target as Record<PropertyKey, number>)[key] as number,\n write: (value) => {\n (target as Record<PropertyKey, number>)[key] = value;\n },\n valid: () => {\n const d = Object.getOwnPropertyDescriptor(target, key);\n return !!d?.writable && \"value\" in d && typeof d.value === \"number\";\n },\n });\n },\n to(binding: TweenBinding, to: number, options: TweenOptions): TweenRecipe {\n if (!(binding instanceof TweenBinding) || !options)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Tween.to requires a numeric binding and options\",\n );\n tweenFinite(to, \"to\");\n if (options.from !== undefined) tweenFinite(options.from, \"from\");\n const duration = seconds(options.duration, \"duration\"),\n delay = seconds(options.delay ?? 0, \"delay\"),\n repeat = options.repeat ?? 0,\n yoyo = options.yoyo ?? false,\n easing = options.easing ?? Easing.Linear;\n if (\n (repeat !== Infinity && (!Number.isSafeInteger(repeat) || repeat < 0)) ||\n typeof yoyo !== \"boolean\" ||\n typeof easing !== \"function\" ||\n (repeat === Infinity && duration === 0)\n )\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Invalid repeat, yoyo or easing; infinite zero-duration loops are not allowed\",\n );\n if (\n repeat !== Infinity &&\n !Number.isFinite(delay + duration * (repeat + 1))\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Tween duration overflows\");\n synchronous(binding.options.validate?.(to));\n if (options.from !== undefined)\n synchronous(binding.options.validate?.(options.from));\n return recipe({\n kind: \"number\",\n binding,\n to,\n duration,\n delay,\n repeat,\n yoyo,\n easing,\n from: options.from,\n });\n },\n delay: (duration: number): TweenRecipe =>\n recipe({ kind: \"delay\", duration: seconds(duration, \"delay\") }),\n sequence: (...children: TweenRecipe[]): TweenRecipe =>\n recipe({ kind: \"sequence\", children: Object.freeze([...children]) }),\n parallel: (...children: TweenRecipe[]): TweenRecipe =>\n recipe({ kind: \"parallel\", children: Object.freeze([...children]) }),\n});\ninterface Track {\n definition: NumberRecipe;\n start: number;\n end: number;\n from: number | undefined;\n done: boolean;\n channel?: Channel | undefined;\n}\ninterface Channel {\n binding: TweenBinding;\n expected: number;\n stamp: unknown;\n}\nfunction same(a: TweenBinding, b: TweenBinding): boolean {\n return a.options.target === b.options.target && a.key === b.key;\n}\nfunction compile(root: TweenRecipe) {\n let count = 0;\n const tracks: Track[] = [];\n const visit = (\n item: TweenRecipe,\n start: number,\n depth: number,\n ): { duration: number; bindings: TweenBinding[] } => {\n if (!item || !recipes.has(item) || ++count > 4096 || depth > 64)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Expected engine recipes within 4096 nodes / 64 nesting levels\",\n );\n if (item.kind === \"number\") {\n const duration =\n item.repeat === Infinity ? Infinity : item.duration * (item.repeat + 1);\n tracks.push({\n definition: item,\n start: start + item.delay,\n end: duration === Infinity ? Infinity : start + item.delay + duration,\n from: undefined,\n done: false,\n });\n return { duration: item.delay + duration, bindings: [item.binding] };\n }\n if (item.kind === \"delay\") return { duration: item.duration, bindings: [] };\n let duration = 0;\n const bindings: TweenBinding[] = [];\n for (const child of item.children) {\n if (item.kind === \"sequence\" && duration === Infinity)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"An unbounded sequence child must be last\",\n );\n const part = visit(\n child,\n start + (item.kind === \"sequence\" ? duration : 0),\n depth + 1,\n );\n if (\n item.kind === \"parallel\" &&\n part.bindings.some((b) => bindings.some((a) => same(a, b)))\n )\n throw new EngineError(\n \"TWEEN_CONFLICT\",\n \"Parallel children cannot share a property channel\",\n );\n for (const b of part.bindings)\n if (!bindings.some((a) => same(a, b))) bindings.push(b);\n const next =\n item.kind === \"sequence\"\n ? duration + part.duration\n : Math.max(duration, part.duration);\n if (\n next === Infinity &&\n duration !== Infinity &&\n part.duration !== Infinity\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Composite duration overflows\");\n duration = next;\n }\n return { duration, bindings };\n };\n const plan = visit(root, 0, 0);\n if (\n tracks.some(\n (t) =>\n t.start === Infinity ||\n (t.end === Infinity && t.definition.repeat !== Infinity),\n )\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Track timing overflows\");\n return { ...plan, tracks };\n}\nexport interface TweenPlayOptions {\n readonly owner?: LifetimeOwner;\n readonly conflict?: \"replace\" | \"error\";\n readonly onComplete?: (playback: TweenPlayback) => void;\n readonly onCancel?: (\n reason: TweenCancelReason,\n playback: TweenPlayback,\n ) => void;\n}\nexport type TweenState = \"playing\" | \"paused\" | \"completed\" | \"cancelled\";\nconst claims = new WeakMap<object, Map<string | symbol, TweenPlayback>>();\nfunction synchronous<T>(result: T): T {\n if (\n result &&\n (typeof result === \"object\" || typeof result === \"function\") &&\n \"then\" in result &&\n typeof result.then === \"function\"\n ) {\n void Promise.resolve(result).catch(() => {});\n throw new EngineError(\n \"TWEEN_ASYNC_CALLBACK\",\n \"Tween hooks and callbacks must be synchronous\",\n );\n }\n return result;\n}\nfunction notify(callback: (() => unknown) | undefined): void {\n synchronous(callback?.());\n}\n/** One playback, terminal once. A finished handle drops channels, targets and scheduler references. */\nexport class TweenPlayback {\n private status: TweenState = \"playing\";\n private time = 0;\n private updating = false;\n private cause: TweenCancelReason | undefined;\n private removers: Array<() => void> = [];\n private channels: Channel[];\n private tracks: Track[];\n private scheduler: TweenScheduler | undefined;\n private complete: TweenPlayOptions[\"onComplete\"];\n private cancelled: TweenPlayOptions[\"onCancel\"];\n readonly duration: number;\n /** @internal Created by Scheduler.play after recipe validation. */\n constructor(\n scheduler: TweenScheduler,\n plan: ReturnType<typeof compile>,\n options: TweenPlayOptions,\n ) {\n this.scheduler = scheduler;\n this.tracks = plan.tracks;\n this.duration = plan.duration;\n this.complete = options.onComplete;\n this.cancelled = options.onCancel;\n this.channels = plan.bindings.map((binding) => {\n const expected = tweenFinite(\n synchronous(binding.options.read()),\n \"start value\",\n );\n synchronous(binding.options.validate?.(expected));\n return {\n binding,\n expected,\n stamp: synchronous(binding.options.stamp?.()),\n };\n });\n for (const track of this.tracks)\n track.channel = this.channels.find((c) =>\n same(c.binding, track.definition.binding),\n );\n }\n get state(): TweenState {\n return this.status;\n }\n get elapsed(): number {\n return this.time;\n }\n get reason(): TweenCancelReason | undefined {\n return this.cause;\n }\n pause(): void {\n if (this.status === \"playing\") this.status = \"paused\";\n }\n resume(): void {\n if (this.status === \"paused\") this.status = \"playing\";\n }\n cancel(): void {\n this.interrupt(\"cancelled\");\n }\n stop(): void {\n this.interrupt(\"stopped\");\n }\n /** Skip finite delays/iterations and apply terminal values. Infinite playback cannot finish. */\n finish(): void {\n if (this.terminal) return;\n if (this.updating)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Playback finish is not reentrant\",\n );\n if (this.duration === Infinity)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Cannot finish unbounded playback\",\n );\n const previous = this.status;\n this.status = \"playing\";\n try {\n this.updateTo(this.duration);\n } catch (error) {\n if (!this.terminal) this.interrupt(\"error\");\n throw error;\n }\n if (!this.terminal && this.status === \"playing\") this.status = previous;\n }\n private get terminal(): boolean {\n return this.status === \"completed\" || this.status === \"cancelled\";\n }\n /** @internal */ valid(scope: object | undefined): boolean {\n for (const { binding: b } of this.channels)\n if (\n b.options.owner?.disposed ||\n !(synchronous(b.options.valid?.()) ?? true) ||\n (scope !== undefined &&\n b.options.scope &&\n synchronous(b.options.scope()) !== scope)\n )\n return false;\n return true;\n }\n /** @internal */ own(owners: Iterable<LifetimeOwner>): void {\n for (const owner of owners) {\n if (this.terminal) break;\n const remove = owner.onDispose(() => this.interrupt(\"owner-disposed\"));\n if (this.terminal) remove();\n else this.removers.push(remove);\n }\n }\n /** @internal Claims are reserved before replaced-owner callbacks run. */\n claim(): Set<TweenPlayback> {\n const replaced = new Set<TweenPlayback>();\n for (const { binding: b } of this.channels) {\n let slots = claims.get(b.options.target);\n if (!slots) {\n slots = new Map();\n claims.set(b.options.target, slots);\n }\n const old = slots.get(b.key);\n if (old) replaced.add(old);\n slots.set(b.key, this);\n }\n return replaced;\n }\n /** @internal */ conflicts(): boolean {\n return this.channels.some(({ binding: b }) =>\n claims.get(b.options.target)?.has(b.key),\n );\n }\n /** @internal */ watch(): void {\n for (const { binding: b } of this.channels) {\n if (this.terminal) break;\n const remove = synchronous(\n b.options.watch?.((reason) =>\n this.interrupt(reason ?? \"external-write\"),\n ),\n );\n if (remove) {\n if (this.terminal) remove();\n else this.removers.push(remove);\n }\n }\n }\n private release(): void {\n const errors: unknown[] = [];\n for (const { binding: b } of this.channels) {\n const slots = claims.get(b.options.target);\n if (slots?.get(b.key) === this) {\n slots.delete(b.key);\n if (!slots.size) claims.delete(b.options.target);\n }\n }\n this.channels = [];\n this.tracks = [];\n const scheduler = this.scheduler;\n this.scheduler = undefined;\n scheduler?.remove(this);\n const removers = this.removers;\n this.removers = [];\n for (const remove of removers)\n try {\n synchronous(remove());\n } catch (error) {\n errors.push(error);\n }\n if (errors.length)\n throw new AggregateError(errors, \"Tween resource release failed\");\n }\n private end(\n state: \"completed\" | \"cancelled\",\n reason?: TweenCancelReason,\n ): void {\n if (this.terminal) return;\n this.status = state;\n this.cause = reason;\n const callback = state === \"completed\" ? this.complete : this.cancelled;\n this.complete = undefined;\n this.cancelled = undefined;\n const errors: unknown[] = [];\n try {\n this.release();\n } catch (error) {\n errors.push(error);\n }\n try {\n if (state === \"completed\")\n notify(() => (callback as TweenPlayOptions[\"onComplete\"])?.(this));\n else\n notify(() =>\n (callback as TweenPlayOptions[\"onCancel\"])?.(\n reason as TweenCancelReason,\n this,\n ),\n );\n } catch (error) {\n errors.push(error);\n }\n if (errors.length)\n throw new AggregateError(errors, \"Tween termination callbacks failed\");\n }\n /** @internal */ interrupt(reason: TweenCancelReason): void {\n this.end(\"cancelled\", reason);\n }\n /** @internal */ advance(delta: number): void {\n if (this.status !== \"playing\") return;\n const time =\n this.duration !== Infinity && delta >= this.duration - this.time\n ? this.duration\n : this.time + delta;\n tweenFinite(time, \"elapsed time\");\n this.updateTo(time);\n }\n private updateTo(time: number): void {\n if (this.updating)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Playback update is not reentrant\",\n );\n this.updating = true;\n try {\n this.advanceTo(time);\n } finally {\n this.updating = false;\n }\n }\n private advanceTo(time: number): void {\n if (!this.scheduler?.available || !this.valid(this.scheduler.scope)) {\n this.interrupt(\"target-unavailable\");\n return;\n }\n for (const c of this.channels)\n if (\n !Object.is(synchronous(c.binding.options.read()), c.expected) ||\n !Object.is(synchronous(c.binding.options.stamp?.()), c.stamp)\n ) {\n this.interrupt(\"external-write\");\n return;\n }\n this.time = time;\n for (const track of this.tracks) {\n if (this.status !== \"playing\") return;\n if (track.done || time < track.start) continue;\n const d = track.definition,\n b = d.binding;\n if (track.from === undefined)\n track.from =\n d.from ?? tweenFinite(synchronous(b.options.read()), \"start value\");\n const finished = time >= track.end,\n relative = Math.max(0, time - track.start);\n let progress: number;\n if (finished || d.duration === 0)\n progress = d.yoyo && d.repeat % 2 === 1 ? 0 : 1;\n else if (d.yoyo) {\n const period = d.duration * 2,\n phase = Number.isFinite(period) ? relative % period : relative;\n progress =\n phase <= d.duration\n ? phase / d.duration\n : 1 - (phase - d.duration) / d.duration;\n } else progress = (relative % d.duration) / d.duration;\n const eased =\n progress === 0\n ? 0\n : progress === 1\n ? 1\n : synchronous(d.easing(progress));\n if (!Number.isFinite(eased) || eased < 0 || eased > 1)\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Easing must return a finite normalized value\",\n );\n const value =\n eased === 0\n ? track.from\n : eased === 1\n ? d.to\n : track.from * (1 - eased) + d.to * eased;\n tweenFinite(value, \"interpolated value\");\n synchronous(b.options.validate?.(value));\n if (\n !this.scheduler?.available ||\n b.options.owner?.disposed ||\n !(synchronous(b.options.valid?.()) ?? true) ||\n (this.scheduler.scope !== undefined &&\n b.options.scope &&\n synchronous(b.options.scope()) !== this.scheduler.scope)\n ) {\n this.interrupt(\"target-unavailable\");\n return;\n }\n const current = track.channel;\n if (\n current &&\n (!Object.is(synchronous(b.options.read()), current.expected) ||\n !Object.is(synchronous(b.options.stamp?.()), current.stamp))\n ) {\n this.interrupt(\"external-write\");\n return;\n }\n const written: unknown = Object.is(value, synchronous(b.options.read()))\n ? undefined\n : b.options.write(value);\n synchronous(written);\n if (this.terminal) return;\n if (written === false) {\n this.interrupt(\"external-write\");\n return;\n }\n const c = track.channel;\n if (c) {\n c.expected = tweenFinite(\n synchronous(b.options.read()),\n \"written value\",\n );\n c.stamp = synchronous(b.options.stamp?.());\n }\n track.done = finished;\n }\n if (this.status === \"playing\" && time >= this.duration)\n this.end(\"completed\");\n }\n}\n/** Explicit clock. Scene owns automatic clocks; standalone schedulers are advanced by their caller. */\nexport class TweenScheduler {\n private readonly entries = new Set<TweenPlayback>();\n private roster: readonly TweenPlayback[] = [];\n private dirty = true;\n private plan: readonly TweenPlayback[] = [];\n private advancing = false;\n private dead = false;\n private rate = 1;\n private owner: LifetimeOwner | undefined;\n private removeOwner: (() => void) | undefined;\n readonly scope: object | undefined;\n constructor(options: { owner?: LifetimeOwner; scope?: object } = {}) {\n this.owner = options.owner;\n this.scope = options.scope;\n this.removeOwner = this.owner?.onDispose(() => this.dispose());\n }\n get disposed(): boolean {\n return this.dead;\n }\n /** @internal */ get available(): boolean {\n return !this.dead && !this.owner?.disposed;\n }\n get diagnostics() {\n return { active: this.entries.size };\n }\n get speed(): number {\n return this.rate;\n }\n set speed(value: number) {\n tweenFinite(value, \"speed\");\n if (value < 0)\n throw new EngineError(\"INVALID_TWEEN\", \"speed must be nonnegative\");\n this.rate = value;\n }\n play(definition: TweenRecipe, options: TweenPlayOptions = {}): TweenPlayback {\n if (this.dead || this.owner?.disposed || options.owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Tween owner has been disposed\");\n if (\n options.conflict !== undefined &&\n options.conflict !== \"replace\" &&\n options.conflict !== \"error\"\n )\n throw new EngineError(\"INVALID_TWEEN\", \"Unknown conflict policy\");\n for (const callback of [options.onComplete, options.onCancel])\n if (callback !== undefined && typeof callback !== \"function\")\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Tween callbacks must be functions\",\n );\n const plan = compile(definition),\n p = new TweenPlayback(this, plan, options);\n if (!p.valid(this.scope))\n throw new EngineError(\n \"INVALID_TWEEN\",\n \"Binding is unavailable or belongs to another scope\",\n );\n if (options.conflict === \"error\" && p.conflicts())\n throw new EngineError(\n \"TWEEN_CONFLICT\",\n \"A property channel is already owned\",\n );\n const owners = new Set<LifetimeOwner>();\n if (this.owner) owners.add(this.owner);\n if (options.owner) owners.add(options.owner);\n for (const b of plan.bindings)\n if (b.options.owner) owners.add(b.options.owner);\n try {\n p.own(owners);\n } catch (error) {\n p.interrupt(\"error\");\n throw error;\n }\n if (p.state === \"cancelled\") return p;\n this.entries.add(p);\n this.dirty = true;\n this.roster = [];\n const replaced = p.claim(),\n errors: unknown[] = [];\n for (const old of replaced)\n try {\n old.interrupt(\"replaced\");\n } catch (error) {\n errors.push(error);\n }\n try {\n p.watch();\n } catch (error) {\n errors.push(error);\n }\n if (errors.length) {\n try {\n p.interrupt(\"error\");\n } catch (error) {\n errors.push(error);\n }\n throw new AggregateError(errors, \"Tween replacement failed\");\n }\n return p;\n }\n /** @internal Eligibility snapshot before the Scene input/update phases. */\n beginStep(): void {\n if (this.dirty) {\n this.roster = [...this.entries];\n this.dirty = false;\n }\n this.plan = this.roster;\n }\n advance(seconds: number): void {\n if (this.advancing)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Scheduler advance is not reentrant\",\n );\n this.beginStep();\n this.advanceCaptured(seconds);\n }\n /** @internal */ advanceCaptured(seconds: number): void {\n if (this.dead)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Tween scheduler has been disposed\",\n );\n tweenFinite(seconds, \"delta\");\n if (seconds < 0)\n throw new EngineError(\"INVALID_TWEEN\", \"delta must be nonnegative\");\n const delta = tweenFinite(seconds * this.rate, \"scaled delta\");\n if (this.advancing)\n throw new EngineError(\n \"TWEEN_REENTRANT\",\n \"Scheduler advance is not reentrant\",\n );\n this.advancing = true;\n const plan = this.plan;\n this.plan = [];\n const errors: unknown[] = [];\n try {\n for (const p of plan) {\n if (this.dead) break;\n try {\n p.advance(delta);\n } catch (error) {\n errors.push(error);\n try {\n p.interrupt(\"error\");\n } catch (error) {\n errors.push(error);\n }\n }\n }\n } finally {\n this.advancing = false;\n }\n if (errors.length) throw new AggregateError(errors, \"Tween updates failed\");\n }\n /** @internal */ remove(p: TweenPlayback): void {\n this.entries.delete(p);\n this.dirty = true;\n this.roster = [];\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const plan = [...this.entries],\n errors: unknown[] = [];\n this.entries.clear();\n this.roster = [];\n this.plan = [];\n this.removeOwner?.();\n this.removeOwner = undefined;\n this.owner = undefined;\n for (const p of plan)\n try {\n p.interrupt(\"scheduler-disposed\");\n } catch (error) {\n errors.push(error);\n }\n if (errors.length)\n throw new AggregateError(errors, \"Tween scheduler disposal failed\");\n }\n}\n","import { EngineError } from \"./diagnostics\";\nexport interface LifetimeOwner {\n readonly disposed: boolean;\n onDispose(callback: () => void): () => void;\n}\n/** Lazy, removable LIFO cleanup. Disposed owners cannot acquire new resources. */\nexport class Lifetime implements LifetimeOwner {\n private callbacks: Set<() => void> | undefined;\n private dead = false;\n get disposed(): boolean {\n return this.dead;\n }\n onDispose(callback: () => void): () => void {\n if (this.dead)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Cannot register cleanup on a disposed owner\",\n );\n this.callbacks ??= new Set();\n this.callbacks.add(callback);\n return () => {\n this.callbacks?.delete(callback);\n };\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const callbacks = this.callbacks;\n this.callbacks = undefined;\n const errors: unknown[] = [];\n if (callbacks)\n for (const callback of [...callbacks].reverse()) {\n try {\n callback();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Owned resource cleanup failed\");\n }\n}\n/** Execute every cleanup even when one throws. */\nexport function cleanupAll(\n actions: Iterable<() => void>,\n message: string,\n): void {\n const errors: unknown[] = [];\n for (const action of actions) {\n try {\n action();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length) throw new AggregateError(errors, message);\n}\n","import { EngineError } from \"./diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"./lifetime\";\nexport interface EventType<T> {\n readonly id: symbol;\n readonly name: string;\n readonly payload?: (value: T) => T;\n}\nexport function defineEvent<T>(name: string): EventType<T> {\n return Object.freeze({ id: Symbol(name), name });\n}\ninterface Subscription {\n active: boolean;\n deliver(payload: unknown): void;\n off(): void;\n}\n/** Synchronous registration-order delivery. Recursive delivery of the same token is rejected. */\nexport class EventBus {\n private readonly listeners = new Map<symbol, Set<Subscription>>();\n private readonly dispatching = new Set<symbol>();\n private dead = false;\n private assertAlive(): void {\n if (this.dead)\n throw new EngineError(\n \"EVENT_BUS_DISPOSED\",\n \"Event bus has been disposed\",\n );\n }\n on<T>(\n type: EventType<T>,\n handler: (payload: T) => void,\n owner?: LifetimeOwner,\n ): () => void {\n this.assertAlive();\n if (owner?.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Cannot subscribe using a disposed owner\",\n { event: type.name },\n );\n let removeOwnership: (() => void) | undefined;\n const group = this.listeners.get(type.id) ?? new Set<Subscription>();\n this.listeners.set(type.id, group);\n const subscription: Subscription = {\n active: true,\n deliver: (value) => {\n const result: unknown = handler(value as T);\n if (\n result &&\n (typeof result === \"object\" || typeof result === \"function\") &&\n \"then\" in result &&\n typeof result.then === \"function\"\n ) {\n void Promise.resolve(result).catch(() => {});\n throw new EngineError(\n \"EVENT_ASYNC_HANDLER\",\n \"Event handlers must be synchronous; own asynchronous tasks explicitly\",\n { event: type.name },\n );\n }\n },\n off: () => {\n if (!subscription.active) return;\n subscription.active = false;\n group.delete(subscription);\n if (group.size === 0) this.listeners.delete(type.id);\n const remove = removeOwnership;\n removeOwnership = undefined;\n remove?.();\n },\n };\n group.add(subscription);\n if (owner) {\n try {\n removeOwnership = owner.onDispose(subscription.off);\n } catch (error) {\n subscription.off();\n throw error;\n }\n }\n return subscription.off;\n }\n emit<T>(type: EventType<T>, payload: NoInfer<T>): void {\n this.assertAlive();\n if (this.dispatching.has(type.id))\n throw new EngineError(\n \"EVENT_REENTRANT\",\n \"Recursive delivery of the same event is not allowed\",\n { event: type.name },\n );\n const group = this.listeners.get(type.id);\n if (!group?.size) return;\n const errors: unknown[] = [];\n this.dispatching.add(type.id);\n try {\n for (const subscription of [...group])\n if (subscription.active) {\n try {\n subscription.deliver(payload);\n } catch (error) {\n errors.push(error);\n }\n }\n } finally {\n this.dispatching.delete(type.id);\n }\n if (errors.length)\n throw new AggregateError(errors, `Event handlers failed: ${type.name}`);\n }\n listenerCount<T>(type?: EventType<T>): number {\n if (type) return this.listeners.get(type.id)?.size ?? 0;\n let count = 0;\n for (const group of this.listeners.values()) count += group.size;\n return count;\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const subscriptions = [...this.listeners.values()].flatMap((group) => [\n ...group,\n ]);\n try {\n cleanupAll(\n subscriptions.map((subscription) => subscription.off),\n \"Event bus cleanup failed\",\n );\n } finally {\n this.listeners.clear();\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus, type EventType } from \"../foundation/events\";\nimport { cleanupAll, Lifetime } from \"../foundation/lifetime\";\nimport type { Actor } from \"./actor\";\nimport type { Scene } from \"./scene\";\nexport const ComponentPhase = {\n Input: \"input\",\n Update: \"update\",\n Integrate: \"integrate\",\n LateUpdate: \"late-update\",\n} as const;\nexport type ComponentPhase =\n (typeof ComponentPhase)[keyof typeof ComponentPhase];\nexport interface UpdateContext {\n readonly delta: number;\n readonly scene: Scene;\n}\nexport interface ComponentType<T extends Component = Component> {\n readonly id: symbol;\n readonly name: string;\n readonly requires: readonly ComponentType[];\n readonly instance?: T;\n}\nexport function defineComponent<T extends Component>(\n name: string,\n requires: readonly ComponentType[] = [],\n): ComponentType<T> {\n return Object.freeze({\n id: Symbol(name),\n name,\n requires: Object.freeze([...requires]),\n });\n}\nexport abstract class Component {\n abstract readonly type: ComponentType;\n readonly phase: ComponentPhase = ComponentPhase.Update;\n private owner: Actor | undefined;\n private readonly lifetime = new Lifetime();\n private bus: EventBus | undefined;\n private on = true;\n get actor(): Actor {\n if (!this.owner)\n throw new EngineError(\"COMPONENT_DETACHED\", \"Component is not attached\", {\n component: this.type.name,\n });\n return this.owner;\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get enabled(): boolean {\n return this.on;\n }\n set enabled(value: boolean) {\n if (this.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"Component has been disposed\",\n );\n if (this.on === value) return;\n this.on = value;\n if (!value) this.onDisable();\n }\n get events(): EventBus {\n if (this.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"Component has been disposed\",\n );\n this.bus ??= new EventBus();\n return this.bus;\n }\n protected emit<T>(type: EventType<T>, payload: NoInfer<T>): void {\n this.bus?.emit(type, payload);\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n protected onAttach(): void {}\n protected onDisable(): void {}\n protected onDestroy(): void {}\n update(_context: UpdateContext): void {}\n /** @internal */ attachTo(actor: Actor): void {\n if (this.disposed || this.owner)\n throw new EngineError(\n \"COMPONENT_OWNERSHIP\",\n \"Component must be new and unowned\",\n { component: this.type.name },\n );\n this.owner = actor;\n try {\n this.onAttach();\n } catch (error) {\n try {\n this.destroyOwned();\n } catch {\n /* Preserve the attach error. */\n }\n throw error;\n }\n }\n /** @internal */ destroyOwned(): void {\n if (this.disposed) return;\n try {\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.bus?.dispose(),\n () => this.onDestroy(),\n ],\n \"Component cleanup failed\",\n );\n } finally {\n this.owner = undefined;\n this.bus = undefined;\n }\n }\n dispose(): void {\n if (this.disposed) return;\n if (this.owner) this.owner.remove(this.type);\n else this.destroyOwned();\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\n\nexport interface SpriteRect {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\n/** Image pixels, origin at top left, x right and y down. */\nexport type SpriteFrame =\n | Readonly<{ kind: \"rect\" } & SpriteRect>\n | Readonly<{\n kind: \"grid\";\n index: number;\n frameWidth: number;\n frameHeight: number;\n }>;\nexport interface SpriteImage {\n readonly kind: \"image\";\n readonly url: string;\n readonly frame: SpriteFrame;\n}\nfunction integer(value: number, minimum: number, field: string): number {\n if (!Number.isSafeInteger(value) || value < minimum)\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n `${field} must be a safe integer >= ${minimum}`,\n );\n return value;\n}\n/** @internal Copies and validates public frame descriptions. */\nexport function spriteFrame(value: SpriteFrame): SpriteFrame {\n if (!value || typeof value !== \"object\")\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"Expected a frame description\",\n );\n if (value.kind === \"rect\")\n return Object.freeze({\n kind: \"rect\",\n x: integer(value.x, 0, \"x\"),\n y: integer(value.y, 0, \"y\"),\n width: integer(value.width, 1, \"width\"),\n height: integer(value.height, 1, \"height\"),\n });\n if (value.kind === \"grid\")\n return Object.freeze({\n kind: \"grid\",\n index: integer(value.index, 0, \"index\"),\n frameWidth: integer(value.frameWidth, 1, \"frameWidth\"),\n frameHeight: integer(value.frameHeight, 1, \"frameHeight\"),\n });\n throw new EngineError(\"SPRITE_FRAME_INVALID\", \"Unknown frame kind\");\n}\n/** Resolves a frame against decoded image dimensions; rejects partial grid cells. */\nexport function spriteFrameBounds(\n frame: SpriteFrame,\n width: number,\n height: number,\n): SpriteRect {\n integer(width, 1, \"image width\");\n integer(height, 1, \"image height\");\n const f = spriteFrame(frame);\n let rect: SpriteRect;\n if (f.kind === \"grid\") {\n const columns = width / f.frameWidth,\n rows = height / f.frameHeight;\n if (\n !Number.isInteger(columns) ||\n !Number.isInteger(rows) ||\n f.index >= columns * rows\n )\n throw new EngineError(\n \"SPRITE_FRAME_BOUNDS\",\n \"Grid must divide the image exactly and contain the frame\",\n );\n rect = {\n x: (f.index % columns) * f.frameWidth,\n y: Math.floor(f.index / columns) * f.frameHeight,\n width: f.frameWidth,\n height: f.frameHeight,\n };\n } else rect = f;\n if (rect.width > width - rect.x || rect.height > height - rect.y)\n throw new EngineError(\n \"SPRITE_FRAME_BOUNDS\",\n \"Frame extends outside the image\",\n );\n return rect;\n}\n\n/** Immutable metadata only: no load, GPU ownership or manual dispose required. */\nexport class SpriteSheet<Name extends string = never> {\n private readonly cache = new Map<number, SpriteImage>();\n private constructor(\n readonly url: string,\n private readonly makeFrame: (index: number) => SpriteFrame,\n private readonly names: ReadonlyMap<string, number>,\n readonly count: number | undefined,\n ) {\n if (typeof url !== \"string\" || !url.trim())\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"SpriteSheet requires a nonempty URL\",\n );\n Object.freeze(this);\n }\n static grid<\n const Names extends Record<string, number> = Record<never, never>,\n >(\n url: string,\n options: { frameWidth: number; frameHeight: number; names?: Names },\n ): SpriteSheet<Extract<keyof Names, string>> {\n const width = integer(options.frameWidth, 1, \"frameWidth\"),\n height = integer(options.frameHeight, 1, \"frameHeight\");\n const names = new Map(Object.entries(options.names ?? {}));\n for (const [name, index] of names) {\n if (!name)\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"Frame name cannot be empty\",\n );\n integer(index, 0, \"named frame index\");\n }\n return new SpriteSheet(\n url,\n (index) =>\n Object.freeze({\n kind: \"grid\",\n index,\n frameWidth: width,\n frameHeight: height,\n }),\n names,\n undefined,\n );\n }\n static rects<const Frames extends Record<string, SpriteRect>>(\n url: string,\n frames: Frames,\n ): SpriteSheet<Extract<keyof Frames, string>>;\n static rects(url: string, frames: readonly SpriteRect[]): SpriteSheet;\n static rects(\n url: string,\n frames: Readonly<Record<string, SpriteRect>> | readonly SpriteRect[],\n ): SpriteSheet<string> {\n const entries = Array.isArray(frames)\n ? Array.from(\n frames,\n (rect: SpriteRect, index) => [String(index), rect] as const,\n )\n : Object.entries(frames);\n if (!entries.length || entries.some(([name]) => !name))\n throw new EngineError(\n \"SPRITE_FRAME_INVALID\",\n \"SpriteSheet requires nonempty frame definitions\",\n );\n const rects = entries.map(([, rect]) =>\n spriteFrame({ ...rect, kind: \"rect\" }),\n );\n const names = new Map(entries.map(([name], index) => [name, index]));\n return new SpriteSheet(\n url,\n (index) => {\n const rect = rects[index];\n if (!rect)\n throw new EngineError(\"SPRITE_FRAME_BOUNDS\", \"Unknown frame index\");\n return rect;\n },\n names,\n rects.length,\n );\n }\n get(key: number | Name): SpriteImage {\n const index = typeof key === \"number\" ? key : this.names.get(key);\n if (index === undefined)\n throw new EngineError(\"SPRITE_FRAME_BOUNDS\", \"Unknown frame name\", {\n frame: key,\n });\n integer(index, 0, \"index\");\n let image = this.cache.get(index);\n if (!image) {\n image = Object.freeze({\n kind: \"image\",\n url: this.url,\n frame: this.makeFrame(index),\n });\n this.cache.set(index, image);\n }\n return image;\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nimport { type SpriteFrame, spriteFrame } from \"./sprite-sheet\";\n\nfunction finite(value: number, field: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${field} must be finite`, {\n field,\n });\n return value;\n}\nexport class Transform extends Component {\n static readonly type: ComponentType<Transform> =\n defineComponent<Transform>(\"Transform\");\n readonly type: ComponentType<Transform> = Transform.type;\n x: number;\n y: number;\n rotation: number;\n scaleX: number;\n scaleY: number;\n constructor(\n options: {\n x?: number;\n y?: number;\n rotation?: number;\n scaleX?: number;\n scaleY?: number;\n } = {},\n ) {\n super();\n this.x = finite(options.x ?? 0, \"x\");\n this.y = finite(options.y ?? 0, \"y\");\n this.rotation = finite(options.rotation ?? 0, \"rotation\");\n this.scaleX = finite(options.scaleX ?? 1, \"scaleX\");\n this.scaleY = finite(options.scaleY ?? 1, \"scaleY\");\n }\n}\nexport const Shape = {\n Box: \"box\",\n Character: \"character\",\n Circle: \"circle\",\n Triangle: \"triangle\",\n Hexagon: \"hexagon\",\n} as const;\nexport const SpriteFit = { Contain: \"contain\", Stretch: \"stretch\" } as const;\nexport type SpriteFit = (typeof SpriteFit)[keyof typeof SpriteFit];\nexport function imageSize(\n sourceWidth: number,\n sourceHeight: number,\n width: number,\n height: number,\n fit: SpriteFit = SpriteFit.Contain,\n) {\n positive(sourceWidth, \"sourceWidth\");\n positive(sourceHeight, \"sourceHeight\");\n positive(width, \"width\");\n positive(height, \"height\");\n if (fit === SpriteFit.Stretch) return { width, height };\n if (fit !== SpriteFit.Contain)\n throw new EngineError(\"INVALID_VALUE\", \"Unknown sprite fit\");\n const scale = Math.min(width / sourceWidth, height / sourceHeight);\n return { width: sourceWidth * scale, height: sourceHeight * scale };\n}\nexport type Shape = (typeof Shape)[keyof typeof Shape];\n/** Immutable, backend-independent description. Image fit defaults to Contain. */\nexport type VisualSource =\n | Readonly<{ kind: \"shape\"; shape: Shape }>\n | Readonly<{\n kind: \"image\";\n url: string;\n fit?: SpriteFit;\n frame?: SpriteFrame;\n }>;\n\nfunction visualSource(value: VisualSource): VisualSource {\n if (!value || typeof value !== \"object\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"source must be a visual description\",\n );\n if (value.kind === \"shape\") {\n if (\n !Object.values(Shape).includes(value.shape) ||\n \"url\" in value ||\n \"fit\" in value ||\n \"frame\" in value\n )\n throw new EngineError(\"INVALID_VALUE\", \"Invalid shape source\");\n return Object.freeze({ kind: \"shape\", shape: value.shape });\n }\n if (value.kind === \"image\") {\n if (typeof value.url !== \"string\" || !value.url.trim() || \"shape\" in value)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Image source requires a nonempty URL\",\n );\n const fit = value.fit === undefined ? SpriteFit.Contain : value.fit;\n if (!Object.values(SpriteFit).includes(fit))\n throw new EngineError(\"INVALID_VALUE\", \"Unknown sprite fit\");\n return Object.freeze({\n kind: \"image\",\n url: value.url,\n fit,\n ...(value.frame === undefined ? {} : { frame: spriteFrame(value.frame) }),\n });\n }\n throw new EngineError(\"INVALID_VALUE\", \"Unknown visual source kind\");\n}\nfunction equalFrame(\n a: SpriteFrame | undefined,\n b: SpriteFrame | undefined,\n): boolean {\n if (a === b) return true;\n if (!a || !b) return false;\n return a.kind === \"rect\"\n ? b.kind === \"rect\" &&\n a.x === b.x &&\n a.y === b.y &&\n a.width === b.width &&\n a.height === b.height\n : b.kind === \"grid\" &&\n a.index === b.index &&\n a.frameWidth === b.frameWidth &&\n a.frameHeight === b.frameHeight;\n}\nfunction equalSource(a: VisualSource, b: VisualSource): boolean {\n return a.kind === \"shape\"\n ? b.kind === \"shape\" && a.shape === b.shape\n : b.kind === \"image\" &&\n a.url === b.url &&\n a.fit === b.fit &&\n equalFrame(a.frame, b.frame);\n}\nconst defaultVisualSource: VisualSource = Object.freeze({\n kind: \"shape\",\n shape: Shape.Box,\n});\nexport interface RenderableOptions {\n /** Draw-only world-axis offset; does not move Transform or colliders. */\n offsetX?: number;\n offsetY?: number;\n /** Draw-only rotation in radians, added to Transform.rotation. */\n rotation?: number;\n scaleX?: number;\n scaleY?: number;\n width?: number;\n height?: number;\n color?: number;\n source?: VisualSource;\n opacity?: number;\n visible?: boolean;\n zIndex?: number;\n}\nexport class Renderable extends Component {\n static readonly type: ComponentType<Renderable> = defineComponent<Renderable>(\n \"Renderable\",\n [Transform.type],\n );\n readonly type: ComponentType<Renderable> = Renderable.type;\n private version = 0;\n private horizontal = 32;\n private vertical = 32;\n private rgb = 0x73e3c0;\n private visual: VisualSource = defaultVisualSource;\n private shown = true;\n private alpha = 1;\n private depth = 0;\n private drawX = 0;\n private drawY = 0;\n private drawRotation = 0;\n private drawScaleX = 1;\n private drawScaleY = 1;\n get offsetX(): number {\n return this.drawX;\n }\n set offsetX(value: number) {\n finite(value, \"Renderable.offsetX\");\n if (value !== this.drawX) {\n this.drawX = value;\n this.version++;\n }\n }\n get offsetY(): number {\n return this.drawY;\n }\n set offsetY(value: number) {\n finite(value, \"Renderable.offsetY\");\n if (value !== this.drawY) {\n this.drawY = value;\n this.version++;\n }\n }\n get rotation(): number {\n return this.drawRotation;\n }\n set rotation(value: number) {\n finite(value, \"Renderable.rotation\");\n if (value !== this.drawRotation) {\n this.drawRotation = value;\n this.version++;\n }\n }\n get scaleX(): number {\n return this.drawScaleX;\n }\n set scaleX(value: number) {\n finite(value, \"Renderable.scaleX\");\n if (value !== this.drawScaleX) {\n this.drawScaleX = value;\n this.version++;\n }\n }\n get scaleY(): number {\n return this.drawScaleY;\n }\n set scaleY(value: number) {\n finite(value, \"Renderable.scaleY\");\n if (value !== this.drawScaleY) {\n this.drawScaleY = value;\n this.version++;\n }\n }\n /** Changes only when a validated display value changes; independent of Scene revision. */\n get revision(): number {\n return this.version;\n }\n get width(): number {\n return this.horizontal;\n }\n set width(value: number) {\n positive(value, \"width\");\n if (this.horizontal !== value) {\n this.horizontal = value;\n this.version++;\n }\n }\n get height(): number {\n return this.vertical;\n }\n set height(value: number) {\n positive(value, \"height\");\n if (this.vertical !== value) {\n this.vertical = value;\n this.version++;\n }\n }\n get color(): number {\n return this.rgb;\n }\n set color(value: number) {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffff)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"color must be a 24-bit RGB integer\",\n );\n if (this.rgb !== value) {\n this.rgb = value;\n this.version++;\n }\n }\n get source(): VisualSource {\n return this.visual;\n }\n set source(value: VisualSource) {\n if (value === this.visual) return;\n const next = visualSource(value);\n if (!equalSource(this.visual, next)) {\n this.visual = next;\n this.version++;\n }\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"visible must be boolean\");\n if (this.shown !== value) {\n this.shown = value;\n this.version++;\n }\n }\n get opacity(): number {\n return this.alpha;\n }\n set opacity(value: number) {\n if (!Number.isFinite(value) || value < 0 || value > 1)\n throw new EngineError(\"INVALID_VALUE\", \"opacity must be between 0 and 1\");\n if (this.alpha !== value) {\n this.alpha = value;\n this.version++;\n }\n }\n get zIndex(): number {\n return this.depth;\n }\n set zIndex(value: number) {\n finite(value, \"zIndex\");\n if (this.depth !== value) {\n this.depth = value;\n this.version++;\n }\n }\n constructor(options: RenderableOptions = {}) {\n super();\n this.offsetX = options.offsetX ?? 0;\n this.offsetY = options.offsetY ?? 0;\n this.rotation = options.rotation ?? 0;\n this.scaleX = options.scaleX ?? 1;\n this.scaleY = options.scaleY ?? 1;\n if (options.source !== undefined) this.source = options.source;\n this.width = options.width === undefined ? 32 : options.width;\n this.height = options.height === undefined ? 32 : options.height;\n // Source chooses the initial default only. Later source changes retain color.\n this.color =\n options.color === undefined\n ? this.source.kind === \"image\"\n ? 0xffffff\n : 0x73e3c0\n : options.color;\n this.opacity = options.opacity === undefined ? 1 : options.opacity;\n this.zIndex = options.zIndex === undefined ? 0 : options.zIndex;\n this.visible = options.visible === undefined ? true : options.visible;\n this.version = 0;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Tween, tweenFinite } from \"../foundation/tween\";\nimport { Renderable } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\n/** Explicit draw-only channels. World Transform/Motion/CollisionBody are never tweened. */\nexport function actorTween(actor: Actor) {\n const view = actor.require(Renderable.type);\n const bind = (\n key: \"offsetX\" | \"offsetY\" | \"rotation\" | \"scaleX\" | \"scaleY\" | \"opacity\",\n ) =>\n Tween.bind({\n target: view,\n key,\n owner: view,\n scope: () => actor.scene,\n read: () => view[key],\n write: (value) => {\n view[key] = value;\n return Object.is(view[key], value);\n },\n valid: () => !actor.disposed && actor.get(Renderable.type) === view,\n validate: (value) => {\n tweenFinite(value, key);\n if (key === \"opacity\" && (value < 0 || value > 1))\n throw new EngineError(\"INVALID_TWEEN\", \"Opacity must be 0..1\");\n },\n });\n return Object.freeze({\n offsetX: bind(\"offsetX\"),\n offsetY: bind(\"offsetY\"),\n rotation: bind(\"rotation\"),\n scaleX: bind(\"scaleX\"),\n scaleY: bind(\"scaleY\"),\n opacity: bind(\"opacity\"),\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Renderable, type VisualSource } from \"../graphics/components\";\nimport type { SpriteImage, SpriteSheet } from \"../graphics/sprite-sheet\";\nimport {\n Component,\n ComponentPhase,\n type ComponentType,\n defineComponent,\n type UpdateContext,\n} from \"../scene/component\";\n\n/** Uniform frame timing in simulation seconds; default 8fps and loop=true. */\nexport type SpriteClip<FrameName extends string = never> = Readonly<\n {\n frames: readonly (number | FrameName)[];\n loop?: boolean;\n } & (\n | { fps?: number; frameSeconds?: never }\n | { fps?: never; frameSeconds: number }\n )\n>;\nexport const SpriteAnimationState = {\n Playing: \"playing\",\n Paused: \"paused\",\n Stopped: \"stopped\",\n Completed: \"completed\",\n} as const;\nexport type SpriteAnimationState =\n (typeof SpriteAnimationState)[keyof typeof SpriteAnimationState];\nexport interface SpriteAnimationOptions<\n Name extends string,\n FrameName extends string,\n> {\n sheet: SpriteSheet<FrameName>;\n clips: Readonly<Record<Name, SpriteClip<NoInfer<FrameName>>>>;\n initial?: NoInfer<Name>;\n onComplete?: (name: NoInfer<Name>) => void;\n}\ninterface CompiledClip {\n readonly images: readonly SpriteImage[];\n readonly frameSeconds: number;\n readonly duration: number;\n readonly loop: boolean;\n}\n/** One independent playback cursor per Actor. Requires an existing Renderable. */\nexport class SpriteAnimation<\n Name extends string = string,\n FrameName extends string = never,\n> extends Component {\n static readonly type: ComponentType<SpriteAnimation> =\n defineComponent<SpriteAnimation>(\"SpriteAnimation\", [Renderable.type]);\n readonly type = SpriteAnimation.type;\n readonly phase = ComponentPhase.LateUpdate;\n private readonly clips = new Map<Name, CompiledClip>();\n private readonly complete: ((name: Name) => void) | undefined;\n private selected: Name;\n private clip: CompiledClip;\n private status: SpriteAnimationState = SpriteAnimationState.Playing;\n private cursor = 0;\n private time = 0;\n private view: Renderable | undefined;\n private written: VisualSource | undefined;\n private image: SpriteImage | undefined;\n constructor(options: SpriteAnimationOptions<Name, FrameName>) {\n super();\n for (const [name, definition] of Object.entries(options.clips) as [\n Name,\n SpriteClip<FrameName>,\n ][]) {\n if (\n !name ||\n !definition ||\n !Array.isArray(definition.frames) ||\n !definition.frames.length\n )\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Clips need a name and at least one frame\",\n );\n if (definition.fps !== undefined && definition.frameSeconds !== undefined)\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Specify fps or frameSeconds, not both\",\n );\n const seconds = definition.frameSeconds ?? 1 / (definition.fps ?? 8);\n const duration = seconds * definition.frames.length;\n if (\n !Number.isFinite(seconds) ||\n seconds <= 0 ||\n !Number.isFinite(duration) ||\n duration <= 0 ||\n (definition.fps !== undefined &&\n (!Number.isFinite(definition.fps) || definition.fps <= 0)) ||\n (definition.loop !== undefined && typeof definition.loop !== \"boolean\")\n )\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Timing must be finite and positive; loop must be boolean\",\n );\n this.clips.set(\n name,\n Object.freeze({\n images: Object.freeze(\n Array.from(definition.frames, (key) => options.sheet.get(key)),\n ),\n frameSeconds: seconds,\n duration,\n loop: definition.loop ?? true,\n }),\n );\n }\n const initial = options.initial ?? this.clips.keys().next().value;\n const clip = initial === undefined ? undefined : this.clips.get(initial);\n if (initial === undefined || !clip)\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"Expected a valid initial clip\",\n );\n if (\n options.onComplete !== undefined &&\n typeof options.onComplete !== \"function\"\n )\n throw new EngineError(\n \"SPRITE_CLIP_INVALID\",\n \"onComplete must be a function\",\n );\n this.selected = initial;\n this.clip = clip;\n this.complete = options.onComplete;\n }\n get current(): Name {\n return this.selected;\n }\n get state(): SpriteAnimationState {\n return this.status;\n }\n /** Zero-based position within the selected clip, not a sheet index. */\n get frameIndex(): number {\n return this.cursor;\n }\n /** Elapsed simulation seconds within the selected clip; wraps when looping. */\n get elapsed(): number {\n return this.time;\n }\n private assertAlive(): void {\n if (this.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"SpriteAnimation has been disposed\",\n );\n }\n private show(): void {\n const source = this.clip.images[this.cursor];\n if (\n this.view &&\n source &&\n (source !== this.image || this.view.source !== this.written)\n ) {\n this.view.source = source;\n this.written = this.view.source;\n this.image = source;\n }\n }\n protected onAttach(): void {\n this.view = this.actor.require(Renderable.type);\n this.show();\n }\n /** Same playing/paused clip is a no-op. restart=true or stopped/completed restarts. */\n play(name: Name, options: { restart?: boolean } = {}): void {\n this.assertAlive();\n const clip = this.clips.get(name);\n if (!clip)\n throw new EngineError(\"SPRITE_CLIP_INVALID\", \"Unknown animation clip\", {\n clip: name,\n });\n if (options.restart !== undefined && typeof options.restart !== \"boolean\")\n throw new EngineError(\"SPRITE_CLIP_INVALID\", \"restart must be boolean\");\n if (\n name === this.selected &&\n !options.restart &&\n (this.status === SpriteAnimationState.Playing ||\n this.status === SpriteAnimationState.Paused)\n )\n return;\n this.selected = name;\n this.clip = clip;\n this.time = 0;\n this.cursor = 0;\n this.status = SpriteAnimationState.Playing;\n this.show();\n }\n pause(): void {\n this.assertAlive();\n if (this.status === SpriteAnimationState.Playing)\n this.status = SpriteAnimationState.Paused;\n }\n resume(): void {\n this.assertAlive();\n if (this.status === SpriteAnimationState.Paused)\n this.status = SpriteAnimationState.Playing;\n }\n /** Reset to the first frame; does not emit completion. */\n stop(): void {\n this.assertAlive();\n this.status = SpriteAnimationState.Stopped;\n this.time = 0;\n this.cursor = 0;\n this.show();\n }\n update({ delta }: UpdateContext): void {\n if (this.disposed || this.status !== SpriteAnimationState.Playing) return;\n if (!Number.isFinite(delta) || delta < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Animation delta must be finite and nonnegative\",\n );\n const clip = this.clip;\n // Reduce before addition: bounded work and no overflow even for very large delta.\n const remaining = clip.duration - this.time;\n const finished =\n !clip.loop &&\n (delta >= remaining ||\n remaining - delta <= clip.duration * Number.EPSILON * 4);\n if (clip.loop) {\n const remainder = delta % clip.duration;\n this.time =\n this.time >= clip.duration - remainder\n ? this.time - (clip.duration - remainder)\n : this.time + remainder;\n if (clip.duration - this.time <= clip.duration * Number.EPSILON * 4)\n this.time = 0;\n } else this.time = finished ? clip.duration : this.time + delta;\n const position = this.time / clip.frameSeconds;\n this.cursor = finished\n ? clip.images.length - 1\n : Math.min(\n clip.images.length - 1,\n Math.floor(position + Math.max(1, position) * Number.EPSILON * 4),\n );\n if (finished) this.status = SpriteAnimationState.Completed;\n this.show();\n if (finished) this.complete?.(this.selected);\n }\n protected onDestroy(): void {\n this.status = SpriteAnimationState.Stopped;\n this.view = undefined;\n this.written = undefined;\n this.image = undefined;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Transform } from \"../graphics/components\";\nimport type { ActionReader } from \"../interaction/actions\";\nimport {\n Component,\n ComponentPhase,\n type ComponentType,\n defineComponent,\n type UpdateContext,\n} from \"../scene/component\";\n\nfunction finite(value: number, field: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${field} must be finite`, {\n field,\n });\n return value;\n}\n/** Integrates an input-independent direction × speed after command-producing Components. */\nexport class Motion extends Component {\n static readonly type: ComponentType<Motion> = defineComponent<Motion>(\n \"Motion\",\n [Transform.type],\n );\n readonly type: ComponentType<Motion> = Motion.type;\n readonly phase: ComponentPhase = ComponentPhase.Integrate;\n private readonly vector = { x: 0, y: 0 };\n get direction(): { x: number; y: number } {\n return this.vector;\n }\n private rate = 180;\n private transform: Transform | undefined;\n get speed(): number {\n return this.rate;\n }\n set speed(value: number) {\n if (!Number.isFinite(value) || value < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Motion.speed must be finite and nonnegative\",\n );\n this.rate = value;\n }\n constructor(options: { speed?: number; x?: number; y?: number } = {}) {\n super();\n this.speed = options.speed ?? 180;\n this.vector.x = finite(options.x ?? 0, \"Motion.direction.x\");\n this.vector.y = finite(options.y ?? 0, \"Motion.direction.y\");\n }\n protected onAttach(): void {\n this.transform = this.actor.require(Transform.type);\n }\n update(context: UpdateContext): void {\n if (!this.transform) return;\n const dx = finite(this.vector.x, \"Motion.direction.x\"),\n dy = finite(this.vector.y, \"Motion.direction.y\");\n const x = finite(\n this.transform.x + dx * this.rate * context.delta,\n \"Motion result x\",\n ),\n y = finite(\n this.transform.y + dy * this.rate * context.delta,\n \"Motion result y\",\n );\n this.transform.x = x;\n this.transform.y = y;\n }\n protected onDestroy(): void {\n this.transform = undefined;\n }\n}\n/** Optional Action-to-Motion adapter. Custom Update Components can replace it entirely. */\nexport class ActionMovement extends Component {\n static readonly type: ComponentType<ActionMovement> =\n defineComponent<ActionMovement>(\"ActionMovement\", [Motion.type]);\n readonly type = ActionMovement.type;\n readonly phase: ComponentPhase = ComponentPhase.Update;\n private motion: Motion | undefined;\n private factor = 1;\n get scale(): number {\n return this.factor;\n }\n set scale(value: number) {\n if (!Number.isFinite(value) || value < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"ActionMovement.scale must be finite and nonnegative\",\n );\n this.factor = value;\n }\n constructor(\n readonly input: ActionReader<\"axis2d\">,\n options: { scale?: number } = {},\n ) {\n super();\n this.scale = options.scale ?? 1;\n }\n protected onAttach(): void {\n this.motion = this.actor.require(Motion.type);\n }\n protected onDisable(): void {\n if (this.motion) {\n this.motion.direction.x = 0;\n this.motion.direction.y = 0;\n }\n }\n update(context: UpdateContext): void {\n if (this.input.scene !== context.scene)\n throw new EngineError(\n \"INPUT_SCENE\",\n \"Movement Action belongs to another Scene\",\n );\n if (this.input.disposed) {\n this.onDisable();\n return;\n }\n const value = this.input.value();\n if (this.motion) {\n this.motion.direction.x = value.x * this.factor;\n this.motion.direction.y = value.y * this.factor;\n }\n }\n protected onDestroy(): void {\n this.onDisable();\n this.motion = undefined;\n }\n}\n","import { cleanupAll } from \"./lifetime\";\n\n/** Owner cancellation, independent of browser AbortSignal and host event types. */\nexport interface CancellationSignal {\n readonly aborted: boolean;\n onCancel(callback: () => void): () => void;\n throwIfCancelled(): void;\n}\nexport class Cancellation {\n private dead = false;\n private readonly listeners = new Set<() => void>();\n readonly signal: CancellationSignal;\n constructor() {\n const owner = this;\n this.signal = Object.freeze({\n get aborted() {\n return owner.dead;\n },\n onCancel(callback: () => void): () => void {\n if (owner.dead) {\n callback();\n return () => {};\n }\n owner.listeners.add(callback);\n return () => {\n owner.listeners.delete(callback);\n };\n },\n throwIfCancelled(): void {\n if (owner.dead) throw new Error(\"Operation cancelled\");\n },\n });\n }\n cancel(): void {\n if (this.dead) return;\n this.dead = true;\n const callbacks = [...this.listeners];\n this.listeners.clear();\n cleanupAll(callbacks, \"Cancellation callbacks failed\");\n }\n}\n","import { EngineError } from \"./diagnostics\";\n\n// A deliberate dense-allocation limit, independent of the host's Array maximum.\nconst maxCells = 16_777_216;\nexport type GridVisitor<T> = (value: T, x: number, y: number) => void;\n\n/** Fixed-size, row-major data. Cells retain values/references without owning them. */\nexport class Grid<T> {\n readonly #width: number;\n readonly #height: number;\n readonly #cells: T[];\n\n static get maxCells(): number {\n return maxCells;\n }\n /** The same initial value/reference is stored in every cell, including functions. */\n constructor(width: number, height: number, initial: T) {\n if (\n !Number.isSafeInteger(width) ||\n !Number.isSafeInteger(height) ||\n width <= 0 ||\n height <= 0 ||\n !Number.isSafeInteger(width * height) ||\n width * height > maxCells\n )\n throw new EngineError(\n \"GRID_SIZE\",\n \"Grid dimensions must be positive safe integers within the dense cell limit\",\n { width, height, maxCells },\n );\n this.#width = width;\n this.#height = height;\n this.#cells = new Array<T>(width * height).fill(initial);\n }\n /** Calls initialize(x,y) once per cell, left-to-right then top-to-bottom. */\n static generate<T>(\n width: number,\n height: number,\n initialize: (x: number, y: number) => T,\n ): Grid<T> {\n if (typeof initialize !== \"function\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Grid initializer must be a function\",\n );\n // The partially initialized Grid is private until every callback succeeds.\n const grid = new Grid<T>(width, height, undefined as T);\n let index = 0;\n for (let y = 0; y < height; y++)\n for (let x = 0; x < width; x++) grid.#cells[index++] = initialize(x, y);\n return grid;\n }\n get width(): number {\n return this.#width;\n }\n get height(): number {\n return this.#height;\n }\n /** False for noninteger/nonfinite/out-of-range coordinates; never clips. */\n inBounds(x: number, y: number): boolean {\n return this.#contains(x, y);\n }\n #contains(x: number, y: number): boolean {\n return (\n Number.isInteger(x) &&\n Number.isInteger(y) &&\n x >= 0 &&\n y >= 0 &&\n x < this.#width &&\n y < this.#height\n );\n }\n #index(x: number, y: number, operation: string): number {\n if (!this.#contains(x, y))\n throw new EngineError(\n \"GRID_BOUNDS\",\n \"Grid coordinate is outside its bounds\",\n {\n x,\n y,\n width: this.#width,\n height: this.#height,\n operation,\n },\n );\n return y * this.#width + x;\n }\n get(x: number, y: number): T {\n // Every index exists, including cells whose legitimate value is undefined.\n return this.#cells[this.#index(x, y, \"get\")] as T;\n }\n set(x: number, y: number, value: T): void {\n this.#cells[this.#index(x, y, \"set\")] = value;\n }\n /** Replaces every cell with the same value/reference; does not dispose old values. */\n fill(value: T): void {\n this.#cells.fill(value);\n }\n /** Live row-major traversal; later cells observe writes made by earlier visits. */\n forEach(visit: GridVisitor<T>): void {\n this.forEachRect(0, 0, this.#width, this.#height, visit);\n }\n /** Fully contained rectangle, with nonnegative integer extents; empty is valid. */\n forEachRect(\n x: number,\n y: number,\n width: number,\n height: number,\n visit: GridVisitor<T>,\n ): void {\n if (\n !Number.isSafeInteger(x) ||\n !Number.isSafeInteger(y) ||\n !Number.isSafeInteger(width) ||\n !Number.isSafeInteger(height) ||\n x < 0 ||\n y < 0 ||\n width < 0 ||\n height < 0 ||\n x > this.#width ||\n y > this.#height ||\n width > this.#width - x ||\n height > this.#height - y\n )\n throw new EngineError(\n \"GRID_BOUNDS\",\n \"Grid rectangle is outside its bounds\",\n {\n x,\n y,\n rectWidth: width,\n rectHeight: height,\n width: this.#width,\n height: this.#height,\n operation: \"forEachRect\",\n },\n );\n if (typeof visit !== \"function\")\n throw new EngineError(\"INVALID_VALUE\", \"Grid visitor must be a function\");\n if (width === 0 || height === 0) return;\n const endX = x + width,\n endY = y + height;\n for (let cy = y; cy < endY; cy++) {\n let index = cy * this.#width + x;\n for (let cx = x; cx < endX; cx++)\n visit(this.#cells[index++] as T, cx, cy);\n }\n }\n}\n","import { EngineError } from \"./diagnostics\";\nexport const RANDOM_ALGORITHM = \"lcg32-fnv1a-utf16le-v1\";\nexport const DEFAULT_RANDOM_STREAM = \"$default\";\nexport interface RandomState {\n readonly name: string;\n readonly seed: number;\n readonly state: number;\n readonly calls: number;\n}\nexport interface RandomSnapshot {\n readonly algorithm: typeof RANDOM_ALGORITHM;\n readonly seed: number;\n readonly streams: readonly RandomState[];\n}\nfunction uint32(value: number): number {\n if (!Number.isInteger(value) || value < 0 || value > 0xffffffff)\n throw new EngineError(\n \"INVALID_SEED\",\n \"Seed must be an unsigned 32-bit integer\",\n );\n return value;\n}\n/** Uses the cross-host Crypto capability when present; ES Math.random is the fallback. */\nfunction automaticSeed(): number {\n const capability = (\n globalThis as unknown as {\n crypto?: { getRandomValues(array: Uint32Array): Uint32Array };\n }\n ).crypto;\n if (capability?.getRandomValues) {\n try {\n const buffer = new Uint32Array(1);\n capability.getRandomValues(buffer);\n return buffer[0] ?? 0;\n } catch {\n /* Hosts may expose an unavailable capability; use the portable fallback. */\n }\n }\n return Math.floor(Math.random() * 4294967296);\n}\n/** FNV-1a over master seed (four LE bytes), then exact UTF-16 code units (two LE bytes each). */\nexport function deriveStreamSeed(seed: number, name: string): number {\n uint32(seed);\n let hash = 2166136261;\n const byte = (value: number) => {\n hash = Math.imul(hash ^ (value & 255), 16777619) >>> 0;\n };\n for (let shift = 0; shift < 32; shift += 8) byte(seed >>> shift);\n for (let index = 0; index < name.length; index++) {\n const code = name.charCodeAt(index);\n byte(code);\n byte(code >>> 8);\n }\n return hash;\n}\nexport class RandomStream {\n private current: number;\n private count = 0;\n private dead = false;\n /** @internal Streams are acquired from RandomManager.stream(). */\n constructor(private readonly initial: number) {\n this.current = uint32(initial);\n }\n get seed(): number {\n return this.initial;\n }\n get state(): number {\n return this.current;\n }\n get calls(): number {\n return this.count;\n }\n get disposed(): boolean {\n return this.dead;\n }\n next(): number {\n if (this.dead)\n throw new EngineError(\n \"RANDOM_DISPOSED\",\n \"Random stream has been disposed\",\n );\n this.current = (Math.imul(1664525, this.current) + 1013904223) >>> 0;\n this.count++;\n return this.current / 4294967296;\n }\n /** @internal */ dispose(): void {\n this.dead = true;\n }\n}\n/** Independent deterministic streams. State survives Scene replacement and ends with its owner. */\nexport class RandomManager {\n private readonly initial: number;\n private readonly streams = new Map<string, RandomStream>();\n private readonly defaultStream: RandomStream;\n private dead = false;\n constructor(seed?: number) {\n this.initial = uint32(seed ?? automaticSeed());\n this.defaultStream = new RandomStream(this.initial);\n this.streams.set(DEFAULT_RANDOM_STREAM, this.defaultStream);\n }\n get seed(): number {\n return this.initial;\n }\n get disposed(): boolean {\n return this.dead;\n }\n private alive(): void {\n if (this.dead)\n throw new EngineError(\n \"RANDOM_DISPOSED\",\n \"Random manager has been disposed\",\n );\n }\n next(): number {\n this.alive();\n return this.defaultStream.next();\n }\n stream(name: string): RandomStream {\n this.alive();\n if (typeof name !== \"string\" || !name.length || name.length > 256)\n throw new EngineError(\n \"INVALID_STREAM\",\n \"Stream name must contain 1 to 256 UTF-16 code units\",\n );\n let stream = this.streams.get(name);\n if (!stream) {\n stream = new RandomStream(deriveStreamSeed(this.seed, name));\n this.streams.set(name, stream);\n }\n return stream;\n }\n snapshot(): RandomSnapshot {\n return {\n algorithm: RANDOM_ALGORITHM,\n seed: this.seed,\n streams: [...this.streams]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, s]) => ({\n name,\n seed: s.seed,\n state: s.state,\n calls: s.calls,\n })),\n };\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n for (const stream of this.streams.values()) stream.dispose();\n }\n}\n","/** Source workspace version; checked against package.json by the build validator. */\nexport const ENGINE_VERSION = \"0.1.4\";\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus } from \"../foundation/events\";\nimport { cleanupAll, Lifetime } from \"../foundation/lifetime\";\nimport {\n Component,\n ComponentPhase,\n type ComponentType,\n type UpdateContext,\n} from \"./component\";\nimport type { Scene } from \"./scene\";\n\n// Fixed identifiers are resolved once, outside per-Actor dispatch loops.\nconst inputPhase = ComponentPhase.Input,\n updatePhase = ComponentPhase.Update,\n integratePhase = ComponentPhase.Integrate,\n latePhase = ComponentPhase.LateUpdate;\nexport const ActorState = {\n Detached: \"detached\",\n Attached: \"attached\",\n Disposed: \"disposed\",\n} as const;\nexport type ActorState = (typeof ActorState)[keyof typeof ActorState];\nexport interface ActorOptions {\n id?: string;\n enabled?: boolean;\n}\nconst emptyPlan: readonly Component[] = Object.freeze([]);\nconst phases = Object.values(ComponentPhase);\nexport class Actor {\n private identifier: string | undefined;\n private owner: Scene | undefined;\n private readonly components = new Map<symbol, Component>();\n private inputPlan = emptyPlan;\n private updatePlan = emptyPlan;\n private integratePlan = emptyPlan;\n private latePlan = emptyPlan;\n private frameInput = emptyPlan;\n private frameUpdates = emptyPlan;\n private frameIntegrate = emptyPlan;\n private frameLate = emptyPlan;\n private attaching = false;\n private frameEligible = false;\n private readonly lifetime = new Lifetime();\n private bus: EventBus | undefined;\n private on: boolean;\n private destroying = false;\n constructor(options: ActorOptions = {}) {\n if (options.id !== undefined && !options.id.trim())\n throw new EngineError(\"INVALID_ID\", \"Actor id cannot be empty\");\n this.identifier = options.id;\n this.on = options.enabled ?? true;\n }\n get id(): string | undefined {\n return this.identifier;\n }\n get scene(): Scene | undefined {\n return this.owner;\n }\n get state(): ActorState {\n return this.disposed\n ? ActorState.Disposed\n : this.owner\n ? ActorState.Attached\n : ActorState.Detached;\n }\n get disposed(): boolean {\n return this.destroying || this.lifetime.disposed;\n }\n get enabled(): boolean {\n return this.on;\n }\n set enabled(value: boolean) {\n this.assertAlive();\n this.on = value;\n }\n get events(): EventBus {\n this.assertAlive();\n this.bus ??= new EventBus();\n return this.bus;\n }\n onDispose(callback: () => void): () => void {\n this.assertAlive();\n return this.lifetime.onDispose(callback);\n }\n private assertAlive(): void {\n if (this.disposed)\n throw new EngineError(\"ACTOR_DISPOSED\", \"Actor has been disposed\", {\n actorId: this.id,\n });\n }\n get<T extends Component>(type: ComponentType<T>): T | undefined {\n return this.components.get(type.id) as T | undefined;\n }\n require<T extends Component>(type: ComponentType<T>): T {\n const value = this.get(type);\n if (!value)\n throw new EngineError(\n \"COMPONENT_MISSING\",\n \"Required component is missing\",\n { actorId: this.id, component: type.name },\n );\n return value;\n }\n private validate(\n type: ComponentType,\n visiting = new Set<symbol>(),\n visited = new Set<symbol>(),\n ): void {\n if (visiting.has(type.id))\n throw new EngineError(\n \"COMPONENT_CYCLE\",\n \"Cyclic component requirements\",\n { component: type.name, actorId: this.id },\n );\n if (visited.has(type.id)) return;\n visiting.add(type.id);\n for (const dependency of type.requires)\n this.validate(dependency, visiting, visited);\n visiting.delete(type.id);\n visited.add(type.id);\n }\n add<T extends Component>(component: T): T {\n this.assertAlive();\n if (this.attaching)\n throw new EngineError(\n \"COMPONENT_MUTATION_REENTRANT\",\n \"Do not change component structure from onAttach\",\n );\n this.validate(component.type);\n if (!phases.includes(component.phase))\n throw new EngineError(\"COMPONENT_PHASE\", \"Unknown Component phase\", {\n component: component.type.name,\n });\n if (this.components.has(component.type.id))\n throw new EngineError(\n \"COMPONENT_DUPLICATE\",\n \"Component type already exists\",\n { actorId: this.id, component: component.type.name },\n );\n for (const dependency of component.type.requires)\n if (!this.components.has(dependency.id))\n throw new EngineError(\n \"COMPONENT_MISSING\",\n \"Add required components before dependents\",\n {\n actorId: this.id,\n component: component.type.name,\n dependency: dependency.name,\n },\n );\n if (component.disposed)\n throw new EngineError(\n \"COMPONENT_OWNERSHIP\",\n \"Cannot add a disposed component\",\n );\n this.components.set(component.type.id, component);\n this.attaching = true;\n try {\n component.attachTo(this);\n this.assertAlive();\n if (component.disposed)\n throw new EngineError(\n \"COMPONENT_DISPOSED\",\n \"Component was disposed during attachment\",\n );\n } catch (error) {\n this.components.delete(component.type.id);\n throw error;\n } finally {\n this.attaching = false;\n }\n this.rebuild();\n return component;\n }\n remove<T extends Component>(type: ComponentType<T>): boolean {\n this.assertAlive();\n if (this.attaching)\n throw new EngineError(\n \"COMPONENT_MUTATION_REENTRANT\",\n \"Do not change component structure from onAttach\",\n );\n const component = this.components.get(type.id);\n if (!component) return false;\n for (const other of this.components.values())\n if (other.type.requires.some((required) => required.id === type.id))\n throw new EngineError(\n \"COMPONENT_REQUIRED\",\n \"Remove dependents before their dependency\",\n {\n actorId: this.id,\n component: type.name,\n dependent: other.type.name,\n },\n );\n this.components.delete(type.id);\n this.rebuild();\n component.destroyOwned();\n return true;\n }\n private rebuild(): void {\n let input: Component[] | undefined,\n update: Component[] | undefined,\n integrate: Component[] | undefined,\n late: Component[] | undefined;\n for (const component of this.components.values())\n if (component.update !== Component.prototype.update) {\n switch (component.phase) {\n case inputPhase:\n input ??= [];\n input.push(component);\n break;\n case updatePhase:\n update ??= [];\n update.push(component);\n break;\n case integratePhase:\n integrate ??= [];\n integrate.push(component);\n break;\n case latePhase:\n late ??= [];\n late.push(component);\n break;\n }\n }\n this.inputPlan = input ?? emptyPlan;\n this.updatePlan = update ?? emptyPlan;\n this.integratePlan = integrate ?? emptyPlan;\n this.latePlan = late ?? emptyPlan;\n this.owner?.touch();\n }\n /** @internal */ attachTo(scene: Scene, id: string): void {\n this.assertAlive();\n if (this.owner)\n throw new EngineError(\n \"ACTOR_OWNERSHIP\",\n \"Actor already belongs to a scene\",\n { actorId: this.id },\n );\n this.identifier = id;\n this.owner = scene;\n }\n /** @internal */ get hasUpdates(): boolean {\n return (\n this.inputPlan.length > 0 ||\n this.updatePlan.length > 0 ||\n this.integratePlan.length > 0 ||\n this.latePlan.length > 0\n );\n }\n /** @internal */ beginStep(): void {\n this.frameInput = this.inputPlan;\n this.frameUpdates = this.updatePlan;\n this.frameIntegrate = this.integratePlan;\n this.frameLate = this.latePlan;\n this.frameEligible = this.enabled && !this.disposed;\n }\n /** @internal */ updatePhase(\n phase: ComponentPhase,\n context: UpdateContext,\n ): void {\n const plan =\n phase === inputPhase\n ? this.frameInput\n : phase === updatePhase\n ? this.frameUpdates\n : phase === integratePhase\n ? this.frameIntegrate\n : this.frameLate;\n if (!plan.length) return;\n if (\n !this.frameEligible ||\n !this.enabled ||\n this.disposed ||\n this.owner !== context.scene\n )\n return;\n for (const component of plan) {\n if (!this.enabled || this.disposed || this.owner !== context.scene) break;\n if (component.enabled && !component.disposed) component.update(context);\n }\n }\n /** @internal */ destroyOwned(): void {\n if (this.disposed) return;\n this.destroying = true;\n this.owner = undefined;\n const components = [...this.components.values()].reverse();\n this.inputPlan = emptyPlan;\n this.updatePlan = emptyPlan;\n this.integratePlan = emptyPlan;\n this.latePlan = emptyPlan;\n this.frameInput = emptyPlan;\n this.frameUpdates = emptyPlan;\n this.frameIntegrate = emptyPlan;\n this.frameLate = emptyPlan;\n try {\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.bus?.dispose(),\n ...components.map((component) => () => {\n try {\n component.destroyOwned();\n } finally {\n this.components.delete(component.type.id);\n }\n }),\n ],\n \"Actor cleanup failed\",\n );\n } finally {\n this.components.clear();\n this.bus = undefined;\n }\n }\n dispose(): void {\n if (this.disposed) return;\n if (this.owner) this.owner.remove(this);\n else this.destroyOwned();\n }\n}\n","import {\n Renderable,\n Shape,\n Transform,\n type VisualSource,\n} from \"../graphics/components\";\nimport type { ActionReader } from \"../interaction/actions\";\nimport { Actor } from \"../scene/actor\";\nimport { ActionMovement, Motion } from \"./motion\";\nexport interface CharacterOptions {\n id?: string;\n x?: number;\n y?: number;\n speed?: number;\n size?: number;\n color?: number;\n movement?: ActionReader<\"axis2d\">;\n source?: VisualSource;\n}\nexport class CharacterActor extends Actor {\n get x(): number {\n return this.require(Transform.type).x;\n }\n set x(value: number) {\n this.require(Transform.type).x = value;\n }\n get y(): number {\n return this.require(Transform.type).y;\n }\n set y(value: number) {\n this.require(Transform.type).y = value;\n }\n}\n/** Composition preset; the simulation has no knowledge of characters. */\nexport function Character(options: CharacterOptions = {}): CharacterActor {\n const actor = new CharacterActor(\n options.id === undefined ? {} : { id: options.id },\n );\n try {\n actor.add(new Transform({ x: options.x ?? 400, y: options.y ?? 225 }));\n actor.add(\n new Renderable({\n width: options.size ?? 32,\n height: options.size ?? 32,\n ...(options.color === undefined ? {} : { color: options.color }),\n source: options.source ?? { kind: \"shape\", shape: Shape.Character },\n }),\n );\n actor.add(new Motion({ speed: options.speed ?? 180 }));\n if (options.movement) actor.add(new ActionMovement(options.movement));\n return actor;\n } catch (error) {\n actor.dispose();\n throw error;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nexport const CollisionResponse = {\n Trigger: \"trigger\",\n Solid: \"solid\",\n} as const;\nexport type CollisionResponse =\n (typeof CollisionResponse)[keyof typeof CollisionResponse];\nexport interface CollisionPolicy {\n readonly response: CollisionResponse;\n readonly layer: number;\n readonly mask: number;\n}\nexport function collisionResponse(value: CollisionResponse): CollisionResponse {\n if (!Object.values(CollisionResponse).includes(value))\n throw new EngineError(\"INVALID_VALUE\", \"Unknown collision response\");\n return value;\n}\nexport function collisionBits(\n value: number,\n name: string,\n allowZero: boolean,\n): number {\n if (\n !Number.isInteger(value) ||\n value < (allowZero ? 0 : 1) ||\n value > 0xffffffff\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n `${name} must be an unsigned 32-bit ${allowZero ? \"mask\" : \"nonzero layer\"}`,\n );\n return value;\n}\nexport function allowsPair(a: CollisionPolicy, b: CollisionPolicy): boolean {\n return !!(a.mask & b.layer) && !!(b.mask & a.layer);\n}\nexport function pairResponse(\n a: CollisionPolicy,\n b: CollisionPolicy,\n): CollisionResponse {\n return a.response === CollisionResponse.Solid &&\n b.response === CollisionResponse.Solid\n ? CollisionResponse.Solid\n : CollisionResponse.Trigger;\n}\nexport function samePolicy(\n a: CollisionPolicy | null,\n b: CollisionPolicy | null,\n): boolean {\n return (\n a === b ||\n (a !== null &&\n b !== null &&\n a.response === b.response &&\n a.layer === b.layer &&\n a.mask === b.mask)\n );\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport {\n type CollisionPolicy,\n type CollisionResponse,\n collisionBits,\n collisionResponse,\n samePolicy,\n} from \"./collision-policy\";\n\nexport interface TileCollisionPolicy {\n readonly response: CollisionResponse;\n readonly layer?: number;\n readonly mask?: number;\n}\nexport type ResolvedTileCollision = Readonly<CollisionPolicy>;\nexport interface TileCollisionOptions<Name extends string> {\n readonly tiles: readonly (TileCollisionPolicy & {\n readonly tile: number | NoInfer<Name>;\n })[];\n}\n/** @internal Notifications invalidate collision state only, never presentation. */\nexport type TileCollisionChange<Name extends string> =\n | { readonly kind: \"cell\"; readonly index: number }\n | { readonly kind: \"tile\"; readonly tile: number | Name }\n | { readonly kind: \"all\" };\nfunction normalized(\n value: TileCollisionPolicy | null,\n): ResolvedTileCollision | null {\n if (value === null) return null;\n if (!value || typeof value !== \"object\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile collision requires a policy or null\",\n );\n return Object.freeze({\n response: collisionResponse(value.response),\n layer: collisionBits(\n value.layer === undefined ? 1 : value.layer,\n \"layer\",\n false,\n ),\n mask: collisionBits(\n value.mask === undefined ? 0xffffffff : value.mask,\n \"mask\",\n true,\n ),\n });\n}\n/** @internal Sparse overrides and copied ID policies; no geometry/Scene/renderer ownership. */\nexport class TileCollisionData<Name extends string> {\n private readonly defaults = new Map<number | Name, ResolvedTileCollision>();\n private readonly overrides = new Map<number, ResolvedTileCollision | null>();\n private positiveOverrides = 0;\n constructor(\n options?: TileCollisionOptions<Name>,\n validate?: (tile: number | Name) => void,\n ) {\n if (options !== undefined) {\n if (!options || !Array.isArray(options.tiles))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"collision.tiles must be an array\",\n );\n for (const rule of options.tiles) {\n if (!rule || typeof rule !== \"object\")\n throw new EngineError(\"INVALID_VALUE\", \"Invalid tile collision rule\");\n validate?.(rule.tile);\n if (this.defaults.has(rule.tile))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Duplicate tile collision rule\",\n );\n const policy = normalized(rule);\n if (policy) this.defaults.set(rule.tile, policy);\n }\n }\n }\n get configured(): boolean {\n return this.defaults.size > 0 || this.positiveOverrides > 0;\n }\n get(index: number, tile: number | Name | null): ResolvedTileCollision | null {\n if (this.overrides.has(index)) return this.overrides.get(index) ?? null;\n return tile === null ? null : (this.defaults.get(tile) ?? null);\n }\n set(index: number, value: TileCollisionPolicy | null): boolean {\n const policy = normalized(value),\n old = this.overrides.get(index);\n if (this.overrides.has(index) && samePolicy(old ?? null, policy))\n return false;\n if (old) this.positiveOverrides--;\n if (policy) this.positiveOverrides++;\n this.overrides.set(index, policy);\n return true;\n }\n reset(index: number): boolean {\n if (this.overrides.get(index)) this.positiveOverrides--;\n return this.overrides.delete(index);\n }\n setDefault(tile: number | Name, value: TileCollisionPolicy | null): boolean {\n const policy = normalized(value),\n old = this.defaults.get(tile) ?? null;\n if (samePolicy(old, policy)) return false;\n if (policy) this.defaults.set(tile, policy);\n else this.defaults.delete(tile);\n return true;\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nexport const Aspect = {\n Fit: \"fit\",\n Fill: \"fill\",\n Adaptive: \"adaptive\",\n} as const;\nexport type Aspect = (typeof Aspect)[keyof typeof Aspect];\nexport interface Point {\n readonly x: number;\n readonly y: number;\n}\nexport interface TilePoint extends Point {\n readonly space: \"tile\";\n}\nexport interface WorldPoint extends Point {\n readonly space: \"world\";\n}\nexport interface ScreenPoint extends Point {\n readonly space: \"screen\";\n}\nexport interface PhysicalPoint extends Point {\n readonly space: \"physical\";\n}\nexport interface LogicalResolution {\n readonly width: number;\n readonly height: number;\n}\nexport interface Viewport extends LogicalResolution {\n readonly x: number;\n readonly y: number;\n}\nfunction finite(value: number, field: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${field} must be finite`, {\n field,\n });\n return value;\n}\nexport function worldPoint(x: number, y: number): WorldPoint {\n return { space: \"world\", x: finite(x, \"x\"), y: finite(y, \"y\") };\n}\nexport function screenPoint(x: number, y: number): ScreenPoint {\n return { space: \"screen\", x: finite(x, \"x\"), y: finite(y, \"y\") };\n}\n/** Position is the nominal visible world's top-left; zoom is centered on that extent. */\nexport class Camera {\n private left: number;\n private top: number;\n private magnification: number;\n constructor(options: { x?: number; y?: number; zoom?: number } = {}) {\n this.left = finite(options.x ?? 0, \"camera.x\");\n this.top = finite(options.y ?? 0, \"camera.y\");\n this.magnification = positive(options.zoom ?? 1, \"camera.zoom\");\n }\n get x(): number {\n return this.left;\n }\n set x(value: number) {\n this.left = finite(value, \"camera.x\");\n }\n get y(): number {\n return this.top;\n }\n set y(value: number) {\n this.top = finite(value, \"camera.y\");\n }\n get zoom(): number {\n return this.magnification;\n }\n set zoom(value: number) {\n this.magnification = positive(value, \"camera.zoom\");\n }\n}\nexport interface ViewTransform {\n readonly scale: number;\n readonly x: number;\n readonly y: number;\n readonly logicalWidth: number;\n readonly logicalHeight: number;\n readonly viewport: Viewport;\n readonly clip: Viewport;\n}\nexport function createViewTransform(options: {\n viewport: Viewport;\n resolution?: LogicalResolution;\n camera?: Readonly<Pick<Camera, \"x\" | \"y\" | \"zoom\">>;\n aspect?: Aspect;\n}): ViewTransform {\n const { viewport } = options,\n aspect = options.aspect ?? Aspect.Fit,\n resolution = options.resolution ?? { width: 800, height: 450 };\n positive(viewport.width, \"viewport.width\");\n positive(viewport.height, \"viewport.height\");\n finite(viewport.x, \"viewport.x\");\n finite(viewport.y, \"viewport.y\");\n positive(resolution.width, \"resolution.width\");\n positive(resolution.height, \"resolution.height\");\n if (!Object.values(Aspect).includes(aspect))\n throw new EngineError(\"INVALID_ASPECT\", \"Unknown aspect policy\");\n const logicalWidth =\n aspect === Aspect.Adaptive ? viewport.width : resolution.width,\n logicalHeight =\n aspect === Aspect.Adaptive ? viewport.height : resolution.height;\n const base =\n aspect === Aspect.Adaptive\n ? 1\n : (aspect === Aspect.Fit ? Math.min : Math.max)(\n viewport.width / logicalWidth,\n viewport.height / logicalHeight,\n );\n const camera = options.camera ?? { x: 0, y: 0, zoom: 1 };\n finite(camera.x, \"camera.x\");\n finite(camera.y, \"camera.y\");\n const scale = base * positive(camera.zoom, \"camera.zoom\");\n const clip =\n aspect === Aspect.Fit\n ? {\n x: viewport.x + (viewport.width - logicalWidth * base) / 2,\n y: viewport.y + (viewport.height - logicalHeight * base) / 2,\n width: logicalWidth * base,\n height: logicalHeight * base,\n }\n : { ...viewport };\n return {\n scale,\n x: viewport.x + viewport.width / 2 - (camera.x + logicalWidth / 2) * scale,\n y:\n viewport.y + viewport.height / 2 - (camera.y + logicalHeight / 2) * scale,\n logicalWidth,\n logicalHeight,\n viewport: { ...viewport },\n clip,\n };\n}\nexport function worldToScreen(\n view: ViewTransform,\n point: WorldPoint,\n): ScreenPoint {\n return screenPoint(\n point.x * view.scale + view.x,\n point.y * view.scale + view.y,\n );\n}\nexport function screenToWorld(\n view: ViewTransform,\n point: ScreenPoint,\n): WorldPoint {\n return worldPoint(\n (point.x - view.x) / view.scale,\n (point.y - view.y) / view.scale,\n );\n}\nexport function screenToPhysical(\n point: ScreenPoint,\n devicePixelRatio: number,\n): PhysicalPoint {\n const ratio = positive(devicePixelRatio, \"devicePixelRatio\");\n return { space: \"physical\", x: point.x * ratio, y: point.y * ratio };\n}\nexport function containsScreenPoint(\n view: ViewTransform,\n point: ScreenPoint,\n): boolean {\n const c = view.clip;\n return (\n point.x >= c.x &&\n point.y >= c.y &&\n point.x < c.x + c.width &&\n point.y < c.y + c.height\n );\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport { Grid } from \"../foundation/grid\";\nimport { samePolicy } from \"../game/collision-policy\";\nimport {\n type ResolvedTileCollision,\n type TileCollisionChange,\n TileCollisionData,\n type TileCollisionOptions,\n type TileCollisionPolicy,\n} from \"../game/tilemap-collision\";\nimport {\n type TilePoint,\n type WorldPoint,\n worldPoint,\n} from \"../graphics/coordinates\";\nimport type { SpriteSheet } from \"../graphics/sprite-sheet\";\nimport { Actor, type ActorOptions } from \"../scene/actor\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nimport type { Scene } from \"../scene/scene\";\n\nexport type {\n ResolvedTileCollision,\n TileCollisionOptions,\n TileCollisionPolicy,\n} from \"../game/tilemap-collision\";\n\nexport type TileId<Name extends string = never> = number | Name | null;\nexport type { TilePoint } from \"../graphics/coordinates\";\nexport interface TilemapOptions<Name extends string> extends ActorOptions {\n sheet: SpriteSheet<Name>;\n tiles:\n | Grid<TileId<NoInfer<Name>>>\n | readonly (readonly TileId<NoInfer<Name>>[])[];\n tileWidth: number;\n tileHeight: number;\n x?: number;\n y?: number;\n zIndex?: number;\n visible?: boolean;\n collision?: TileCollisionOptions<NoInfer<Name>>;\n}\nfunction finite(value: number): number {\n if (!Number.isFinite(value))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tilemap position/depth must be finite\",\n );\n return value;\n}\n/** One Scene-owned placement, not one Actor per cell. Input grids/rows are copied. */\nexport class Tilemap<Name extends string = never> {\n private readonly owner: Actor;\n readonly sheet: SpriteSheet<Name>;\n readonly tileWidth: number;\n readonly tileHeight: number;\n private cells: Grid<TileId<Name>>;\n private readonly counts = new Map<number | Name, number>();\n private readonly listeners = new Set<(index: number | null) => void>();\n private version = 0;\n private collisionData: TileCollisionData<Name> | undefined;\n private collisionVersion = 0;\n private collidable = true;\n private readonly collisionListeners = new Set<\n (change: TileCollisionChange<string>) => void\n >();\n private left = 0;\n private top = 0;\n private depth = 0;\n private shown = true;\n constructor(options: TilemapOptions<Name>) {\n this.owner = new Actor(options);\n this.sheet = options.sheet;\n this.tileWidth = positive(options.tileWidth, \"tileWidth\");\n this.tileHeight = positive(options.tileHeight, \"tileHeight\");\n const input = options.tiles;\n if (input instanceof Grid) {\n this.cells = Grid.generate(input.width, input.height, (x, y) =>\n this.validateTile(input.get(x, y)),\n );\n } else {\n if (\n !Array.isArray(input) ||\n !input.length ||\n !Array.isArray(input[0]) ||\n !input[0].length ||\n input.some(\n (row) => !Array.isArray(row) || row.length !== input[0]?.length,\n )\n )\n throw new EngineError(\n \"GRID_SIZE\",\n \"Tilemap rows must form a nonempty rectangle\",\n );\n this.cells = Grid.generate(input[0].length, input.length, (x, y) =>\n this.validateTile(input[y]?.[x] as TileId<Name>),\n );\n }\n this.cells.forEach((tile) => {\n this.count(tile, 1);\n });\n positive(this.width * this.tileWidth, \"map world width\");\n positive(this.height * this.tileHeight, \"map world height\");\n this.x = options.x ?? 0;\n this.y = options.y ?? 0;\n this.zIndex = options.zIndex ?? 0;\n this.visible = options.visible ?? true;\n if (options.collision !== undefined)\n this.collisionData = new TileCollisionData(options.collision, (tile) => {\n this.sheet.get(tile);\n });\n this.owner.add(new TilemapLayer(this));\n }\n /** Uses existing Actor ownership without adding a second Scene collection. */\n place(scene: Scene): this {\n scene.add(this.owner);\n return this;\n }\n get scene(): Scene | undefined {\n return this.owner.scene;\n }\n get disposed(): boolean {\n return this.owner.disposed;\n }\n get enabled(): boolean {\n return this.owner.enabled;\n }\n set enabled(value: boolean) {\n this.owner.enabled = value;\n }\n dispose(): void {\n this.owner.dispose();\n }\n onDispose(callback: () => void): () => void {\n return this.owner.onDispose(callback);\n }\n private alive(): void {\n if (this.disposed)\n throw new EngineError(\"ACTOR_DISPOSED\", \"Tilemap has been disposed\");\n }\n private validateTile(tile: TileId<Name>): TileId<Name> {\n if (tile !== null) this.sheet.get(tile);\n return tile;\n }\n private count(tile: TileId<Name>, change: number): void {\n if (tile === null) return;\n const n = (this.counts.get(tile) ?? 0) + change;\n if (n) this.counts.set(tile, n);\n else this.counts.delete(tile);\n }\n get width(): number {\n return this.cells.width;\n }\n get height(): number {\n return this.cells.height;\n }\n get revision(): number {\n return this.version;\n }\n get x(): number {\n return this.left;\n }\n set x(value: number) {\n this.alive();\n finite(value);\n finite(value + this.width * this.tileWidth);\n this.left = value;\n }\n get y(): number {\n return this.top;\n }\n set y(value: number) {\n this.alive();\n finite(value);\n finite(value + this.height * this.tileHeight);\n this.top = value;\n }\n get zIndex(): number {\n return this.depth;\n }\n set zIndex(value: number) {\n this.alive();\n this.depth = finite(value);\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n this.alive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"visible must be boolean\");\n this.shown = value;\n }\n inBounds(x: number, y: number): boolean {\n return this.cells.inBounds(x, y);\n }\n get(x: number, y: number): TileId<Name> {\n return this.cells.get(x, y);\n }\n set(x: number, y: number, tile: TileId<Name>): void {\n this.alive();\n const previous = this.cells.get(x, y);\n this.validateTile(tile);\n if (previous === tile) return;\n const previousPolicy = this.getCollision(x, y);\n this.cells.set(x, y, tile);\n this.count(previous, -1);\n this.count(tile, 1);\n this.version++;\n if (!samePolicy(previousPolicy, this.getCollision(x, y)))\n this.collisionChanged({ kind: \"cell\", index: y * this.width + x });\n for (const notify of this.listeners) notify(y * this.width + x);\n }\n fill(tile: TileId<Name>): void {\n this.alive();\n this.validateTile(tile);\n let changed = false,\n collisionChanged = false;\n this.cells.forEach((old, x, y) => {\n if (old !== tile) changed = true;\n if (\n this.collisionData &&\n !samePolicy(\n this.collisionData.get(y * this.width + x, old),\n this.collisionData.get(y * this.width + x, tile),\n )\n )\n collisionChanged = true;\n });\n if (!changed) return;\n this.cells.fill(tile);\n this.counts.clear();\n this.count(tile, this.width * this.height);\n this.version++;\n if (collisionChanged) this.collisionChanged({ kind: \"all\" });\n for (const notify of this.listeners) notify(null);\n }\n get collisionRevision(): number {\n return this.collisionVersion;\n }\n get collisionEnabled(): boolean {\n return this.collidable;\n }\n set collisionEnabled(value: boolean) {\n this.alive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"collisionEnabled must be boolean\",\n );\n if (this.collidable !== value) {\n this.collidable = value;\n this.collisionChanged({ kind: \"all\" });\n }\n }\n getCollision(x: number, y: number): ResolvedTileCollision | null {\n const tile = this.cells.get(x, y);\n return this.collisionData?.get(y * this.width + x, tile) ?? null;\n }\n setCollision(x: number, y: number, policy: TileCollisionPolicy | null): void {\n this.alive();\n this.cells.get(x, y);\n this.collisionData ??= new TileCollisionData();\n if (this.collisionData.set(y * this.width + x, policy))\n this.collisionChanged({ kind: \"cell\", index: y * this.width + x });\n }\n resetCollision(x: number, y: number): void {\n this.alive();\n this.cells.get(x, y);\n if (this.collisionData?.reset(y * this.width + x))\n this.collisionChanged({ kind: \"cell\", index: y * this.width + x });\n }\n setTileCollision(\n tile: number | NoInfer<Name>,\n policy: TileCollisionPolicy | null,\n ): void {\n this.alive();\n this.sheet.get(tile);\n this.collisionData ??= new TileCollisionData();\n if (this.collisionData.setDefault(tile, policy))\n this.collisionChanged({ kind: \"tile\", tile });\n }\n /** @internal Constant-time gate; never scans rules/overrides/cells. */\n get hasCollision(): boolean {\n return this.collisionData?.configured ?? false;\n }\n private collisionChanged(change: TileCollisionChange<string>): void {\n this.collisionVersion++;\n for (const notify of this.collisionListeners) notify(change);\n }\n /** @internal Optional observers use the placement lifetime, not rendering readiness. */\n onCollisionChanged(\n notify: (change: TileCollisionChange<string>) => void,\n ): () => void {\n this.alive();\n this.collisionListeners.add(notify);\n const unregister = this.onDispose(() =>\n this.collisionListeners.delete(notify),\n );\n return () => {\n unregister();\n this.collisionListeners.delete(notify);\n };\n }\n /** Independent data snapshot, reusable after this placement/Scene is disposed. */\n copyTiles(): Grid<TileId<Name>> {\n return Grid.generate(this.width, this.height, (x, y) => this.get(x, y));\n }\n tileToWorld(\n x: number,\n y: number,\n options: { center?: boolean } = {},\n ): WorldPoint {\n this.cells.get(x, y);\n const offset = options.center ? 0.5 : 0;\n return worldPoint(\n this.x + (x + offset) * this.tileWidth,\n this.y + (y + offset) * this.tileHeight,\n );\n }\n /** World-space cell rectangle. Grid integer/bounds validation matches tileToWorld. */\n tileBounds(\n x: number,\n y: number,\n ): { x: number; y: number; width: number; height: number } {\n const origin = this.tileToWorld(x, y);\n return {\n x: origin.x,\n y: origin.y,\n width: this.tileWidth,\n height: this.tileHeight,\n };\n }\n /** Half-open bounds: left/top included, right/bottom excluded; outside returns undefined. */\n worldToTile(x: number, y: number): TilePoint | undefined {\n finite(x);\n finite(y);\n const tx = Math.floor((x - this.x) / this.tileWidth),\n ty = Math.floor((y - this.y) / this.tileHeight);\n return this.inBounds(tx, ty) ? { space: \"tile\", x: tx, y: ty } : undefined;\n }\n /** @internal Unique currently used IDs; no writable Grid/cache is exposed. */\n tileIds(): IterableIterator<number | Name> {\n return this.counts.keys();\n }\n /** @internal Presentation subscriptions are removed with their presentation or Actor. */\n onTilesChanged(notify: (index: number | null) => void): () => void {\n this.alive();\n this.listeners.add(notify);\n const unregister = this.onDispose(() => this.listeners.delete(notify));\n return () => {\n unregister();\n this.listeners.delete(notify);\n };\n }\n}\n\n/** @internal One passive placement Component, not one Component per tile. */\nexport class TilemapLayer extends Component {\n static readonly type: ComponentType<TilemapLayer> =\n defineComponent<TilemapLayer>(\"TilemapLayer\");\n readonly type = TilemapLayer.type;\n constructor(readonly map: Tilemap<string>) {\n super();\n }\n}\n","import { EngineError, positive } from \"./diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"./lifetime\";\n\ninterface Timer {\n remaining: number;\n interval: number;\n callback(): void;\n cancel(): void;\n removeOwner?: () => void;\n active: boolean;\n}\nexport class SimulationTimers {\n private readonly timers = new Set<Timer>();\n private dead = false;\n private plan: readonly Timer[] = [];\n schedule(\n seconds: number,\n callback: () => void,\n repeat: boolean,\n owner?: LifetimeOwner,\n ): () => void {\n if (this.dead || owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Timer owner has been disposed\");\n if (repeat) positive(seconds, \"interval\");\n else if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Timer delay must be finite and nonnegative\",\n );\n const timer: Timer = {\n remaining: seconds,\n interval: repeat ? seconds : 0,\n callback,\n active: true,\n cancel: () => {\n if (!timer.active) return;\n timer.active = false;\n this.timers.delete(timer);\n const remove = timer.removeOwner;\n delete timer.removeOwner;\n remove?.();\n },\n };\n this.timers.add(timer);\n if (owner) {\n try {\n timer.removeOwner = owner.onDispose(timer.cancel);\n } catch (error) {\n timer.cancel();\n throw error;\n }\n }\n return timer.cancel;\n }\n /** Capture eligibility before any Scene update phase. */\n beginStep(): void {\n this.plan = [...this.timers];\n }\n step(seconds: number): void {\n const plan = this.plan;\n this.plan = [];\n if (!plan.length) return;\n const errors: unknown[] = [];\n for (const timer of plan) {\n if (!timer.active) continue;\n timer.remaining -= seconds;\n if (timer.remaining > 1e-12) continue;\n if (timer.interval === 0) {\n try {\n timer.cancel();\n } catch (error) {\n errors.push(error);\n }\n } else {\n // Preserve phase, but deliver at most once after a long step.\n const remainder = Math.max(0, -timer.remaining) % timer.interval;\n timer.remaining = timer.interval - remainder;\n if (timer.remaining <= 1e-12) timer.remaining = timer.interval;\n }\n try {\n timer.callback();\n } catch (error) {\n errors.push(error);\n }\n if (this.dead) break;\n }\n if (errors.length)\n throw new AggregateError(errors, \"Timer callbacks failed\");\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const timers = [...this.timers];\n try {\n cleanupAll(\n timers.map((timer) => timer.cancel),\n \"Timer cleanup failed\",\n );\n } finally {\n this.timers.clear();\n this.plan = [];\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport { SimulationTimers } from \"../foundation/timers\";\nimport { TweenScheduler } from \"../foundation/tween\";\nimport type { InputSystem } from \"../interaction/input\";\nimport type { Actor } from \"./actor\";\nimport { ComponentPhase, type UpdateContext } from \"./component\";\n\n/** Identity and input ownership only; Scene does not depend on the Engine implementation. */\ninterface SceneEngineOwner {\n readonly input: InputSystem;\n}\n\n// Fixed identifiers are resolved once, outside per-Actor dispatch loops.\nconst inputPhase = ComponentPhase.Input,\n updatePhase = ComponentPhase.Update,\n integratePhase = ComponentPhase.Integrate,\n latePhase = ComponentPhase.LateUpdate;\nexport const SceneState = {\n Preparing: \"preparing\",\n Ready: \"ready\",\n Active: \"active\",\n Inactive: \"inactive\",\n Disposed: \"disposed\",\n} as const;\nexport type SceneState = (typeof SceneState)[keyof typeof SceneState];\nexport class Scene {\n private phase: SceneState = SceneState.Preparing;\n private engineOwner: SceneEngineOwner | undefined;\n private inputScope: InputSystem | undefined;\n private readonly members = new Map<string, Actor>();\n private roster: readonly Actor[] = [];\n private rosterDirty = false;\n private nextId = 0;\n private updateRevision = -1;\n private updateActors: readonly Actor[] = [];\n private frameActors: readonly Actor[] = [];\n private readonly postUpdates = new Set<(seconds: number) => void>();\n private postPlan: readonly ((seconds: number) => void)[] = [];\n private version = 0;\n private readonly lifetime = new Lifetime();\n private bus: EventBus | undefined;\n private timers: SimulationTimers | undefined;\n private simulationAnimation: TweenScheduler | undefined;\n private displayAnimation: TweenScheduler | undefined;\n private readonly updates = new Set<(seconds: number) => void>();\n private updatePlan: readonly ((seconds: number) => void)[] = [];\n private readonly activations = new Set<() => void>();\n private readonly deactivations = new Set<() => void>();\n constructor(readonly id: string) {\n if (!id.trim())\n throw new EngineError(\"INVALID_ID\", \"Scene id cannot be empty\");\n }\n get state(): SceneState {\n return this.phase;\n }\n get disposed(): boolean {\n return this.phase === SceneState.Disposed;\n }\n get revision(): number {\n return this.version;\n }\n get actors(): readonly Actor[] {\n if (this.rosterDirty) {\n this.roster = [...this.members.values()];\n this.rosterDirty = false;\n }\n return this.roster;\n }\n get events(): EventBus {\n this.assertAlive();\n this.bus ??= new EventBus();\n return this.bus;\n }\n /** Simulation clock, advanced after contacts and before timers. */\n get tweens(): TweenScheduler {\n this.assertAlive();\n this.simulationAnimation ??= new TweenScheduler({\n owner: this,\n scope: this,\n });\n return this.simulationAnimation;\n }\n /** Display clock: the Host supplies visible frame time, including during Engine pause. */\n get presentationTweens(): TweenScheduler {\n this.assertAlive();\n this.displayAnimation ??= new TweenScheduler({ owner: this, scope: this });\n return this.displayAnimation;\n }\n advancePresentation(seconds: number): void {\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Presentation delta must be finite and nonnegative\",\n );\n if (this.phase !== SceneState.Active)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Only active scenes advance presentation\",\n );\n this.displayAnimation?.advance(seconds);\n }\n private assertAlive(): void {\n if (this.disposed || this.phase === SceneState.Inactive)\n throw new EngineError(\n \"SCENE_DISPOSED\",\n \"Scene can no longer acquire resources\",\n { sceneId: this.id },\n );\n }\n add<T extends Actor>(actor: T): T {\n this.assertAlive();\n if (actor.disposed || actor.scene)\n throw new EngineError(\n \"ACTOR_OWNERSHIP\",\n \"Actor must be new and unowned\",\n { sceneId: this.id, actorId: actor.id },\n );\n let id = actor.id;\n if (id === undefined)\n do {\n id = `actor-${++this.nextId}`;\n } while (this.members.has(id));\n if (this.members.has(id))\n throw new EngineError(\"DUPLICATE_ACTOR\", \"Actor id already exists\", {\n sceneId: this.id,\n actorId: id,\n });\n actor.attachTo(this, id);\n this.members.set(id, actor);\n this.rosterDirty = true;\n this.touch();\n return actor;\n }\n find(id: string): Actor | undefined {\n return this.members.get(id);\n }\n remove(actorOrId: Actor | string): boolean {\n const actor =\n typeof actorOrId === \"string\" ? this.members.get(actorOrId) : actorOrId;\n if (\n !actor ||\n actor.scene !== this ||\n actor.id === undefined ||\n this.members.get(actor.id) !== actor\n )\n return false;\n this.members.delete(actor.id);\n this.rosterDirty = true;\n this.touch();\n actor.destroyOwned();\n return true;\n }\n /** @internal */ touch(): void {\n this.version++;\n }\n onUpdate(callback: (seconds: number) => void): () => void {\n this.assertAlive();\n this.updates.add(callback);\n this.updatePlan = [...this.updates];\n return () => {\n this.updates.delete(callback);\n this.updatePlan = [...this.updates];\n };\n }\n /** Runs after every captured Actor component update and before timers/onUpdate. */\n onPostUpdate(callback: (seconds: number) => void): () => void {\n this.assertAlive();\n this.postUpdates.add(callback);\n this.postPlan = [...this.postUpdates];\n return () => {\n this.postUpdates.delete(callback);\n this.postPlan = [...this.postUpdates];\n };\n }\n onActivate(callback: () => void): () => void {\n this.assertAlive();\n if (this.phase !== SceneState.Preparing && this.phase !== SceneState.Ready)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Register activation callbacks before activation\",\n { sceneId: this.id },\n );\n this.activations.add(callback);\n return () => {\n this.activations.delete(callback);\n };\n }\n onDeactivate(callback: () => void): () => void {\n this.assertAlive();\n this.deactivations.add(callback);\n return () => {\n this.deactivations.delete(callback);\n };\n }\n onDispose(callback: () => void): () => void {\n this.assertAlive();\n return this.lifetime.onDispose(callback);\n }\n after(\n seconds: number,\n callback: () => void,\n owner?: LifetimeOwner,\n ): () => void {\n this.assertAlive();\n this.timers ??= new SimulationTimers();\n return this.timers.schedule(seconds, callback, false, owner);\n }\n every(\n seconds: number,\n callback: () => void,\n owner?: LifetimeOwner,\n ): () => void {\n this.assertAlive();\n this.timers ??= new SimulationTimers();\n return this.timers.schedule(seconds, callback, true, owner);\n }\n markReady(): void {\n this.assertAlive();\n if (this.phase !== SceneState.Preparing)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Only a preparing scene can become ready\",\n { sceneId: this.id },\n );\n this.phase = SceneState.Ready;\n }\n /** @internal */ get inputOwner(): InputSystem | undefined {\n return this.engineOwner?.input;\n }\n /** @internal */ claimInput(input: InputSystem): void {\n this.assertAlive();\n if (\n (this.inputScope && this.inputScope !== input) ||\n (this.engineOwner && this.engineOwner.input !== input)\n )\n throw new EngineError(\n \"SCENE_OWNERSHIP\",\n \"Action input must belong to the Scene's Engine\",\n { sceneId: this.id },\n );\n this.inputScope = input;\n }\n /** @internal */ validateOwner(engine: SceneEngineOwner): void {\n this.assertAlive();\n if (\n (this.engineOwner && this.engineOwner !== engine) ||\n (this.inputScope && this.inputScope !== engine.input)\n )\n throw new EngineError(\n \"SCENE_OWNERSHIP\",\n \"Scene belongs to another engine\",\n { sceneId: this.id },\n );\n }\n /** @internal */ claim(engine: SceneEngineOwner): void {\n this.validateOwner(engine);\n this.engineOwner = engine;\n }\n /** @internal */ activateOwned(): void {\n this.phase = SceneState.Active;\n }\n /** @internal */ notifyActivated(): void {\n if (!this.disposed)\n cleanupAll(this.activations, \"Scene activation callbacks failed\");\n }\n /** @internal */ deactivateOwned(): void {\n if (this.phase !== SceneState.Active) return;\n this.phase = SceneState.Inactive;\n cleanupAll(this.deactivations, \"Scene deactivation callbacks failed\");\n }\n /** @internal */ beginStep(): void {\n if (this.phase !== SceneState.Active)\n throw new EngineError(\"SCENE_STATE\", \"Only active scenes can update\", {\n sceneId: this.id,\n });\n this.timers?.beginStep();\n this.simulationAnimation?.beginStep();\n if (this.updateRevision !== this.revision) {\n this.updateActors = this.actors.filter((actor) => actor.hasUpdates);\n this.updateRevision = this.revision;\n }\n this.frameActors = this.updateActors;\n for (const actor of this.frameActors) actor.beginStep();\n }\n /** @internal */ step(context: UpdateContext): void {\n const actors = this.frameActors;\n for (const actor of actors) actor.updatePhase(inputPhase, context);\n for (const actor of actors) actor.updatePhase(updatePhase, context);\n for (const actor of actors) actor.updatePhase(integratePhase, context);\n for (const actor of actors) actor.updatePhase(latePhase, context);\n if (this.disposed) return;\n for (const callback of this.postPlan) {\n if (this.disposed) return;\n if (this.postUpdates.has(callback)) callback(context.delta);\n }\n if (this.disposed) return;\n this.simulationAnimation?.advanceCaptured(context.delta);\n if (this.disposed) return;\n this.timers?.step(context.delta);\n // Callback plans change only on subscription changes; iteration stays stable.\n if (this.updates.size)\n for (const callback of this.updatePlan) {\n if (this.disposed) break;\n if (this.updates.has(callback)) callback(context.delta);\n }\n }\n dispose(): void {\n if (this.disposed) return;\n const wasActive = this.phase === SceneState.Active;\n this.phase = SceneState.Disposed;\n const actors = this.actors;\n this.engineOwner = undefined;\n this.inputScope = undefined;\n this.members.clear();\n this.roster = [];\n this.rosterDirty = false;\n this.touch();\n try {\n cleanupAll(\n [\n ...(wasActive\n ? [\n () =>\n cleanupAll(\n this.deactivations,\n \"Scene deactivation callbacks failed\",\n ),\n ]\n : []),\n () => this.simulationAnimation?.dispose(),\n () => this.displayAnimation?.dispose(),\n () => this.timers?.dispose(),\n () => this.bus?.dispose(),\n ...[...actors].reverse().map((actor) => () => actor.destroyOwned()),\n () => this.lifetime.dispose(),\n ],\n \"Scene cleanup failed\",\n );\n } finally {\n this.updateActors = [];\n this.frameActors = [];\n this.postUpdates.clear();\n this.postPlan = [];\n this.updates.clear();\n this.updatePlan = [];\n this.activations.clear();\n this.deactivations.clear();\n this.bus = undefined;\n this.timers = undefined;\n this.simulationAnimation = undefined;\n this.displayAnimation = undefined;\n }\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport { defineEvent, type EventType } from \"../foundation/events\";\nimport { Transform } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nexport const CollisionShape = { Box: \"box\", Circle: \"circle\" } as const;\nexport type CollisionShape =\n (typeof CollisionShape)[keyof typeof CollisionShape];\n\nimport {\n CollisionResponse,\n collisionBits,\n collisionResponse,\n} from \"./collision-policy\";\n\nexport { CollisionResponse } from \"./collision-policy\";\n\ntype ShapeOptions =\n | { shape?: typeof CollisionShape.Box; width?: number; height?: number }\n | { shape: typeof CollisionShape.Circle; radius?: number };\nexport type ColliderOptions = ShapeOptions & {\n response?: CollisionResponse;\n offsetX?: number;\n offsetY?: number;\n layer?: number;\n mask?: number;\n};\nexport interface ContactGeometry {\n /** Unit normal from self toward other at detection, before position correction. */\n readonly normalX: number;\n readonly normalY: number;\n readonly depth: number;\n readonly response: CollisionResponse;\n readonly resolved: boolean;\n}\nexport interface Contact extends ContactGeometry {\n readonly self: Collider;\n readonly other: Collider;\n readonly selfActor: Actor;\n readonly otherActor: Actor;\n}\nexport const ContactEnter = defineEvent<Contact>(\"ContactEnter\");\nexport const ContactStay = defineEvent<Contact>(\"ContactStay\");\nexport const ContactExit = defineEvent<Contact>(\"ContactExit\");\nfunction finite(value: number, name: string): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${name} must be finite`, {\n field: name,\n });\n return value;\n}\n/** Geometry and contact policy. CollisionBody separately controls position correction. */\nexport class Collider extends Component {\n static readonly type: ComponentType<Collider> = defineComponent<Collider>(\n \"Collider\",\n [Transform.type],\n );\n readonly type = Collider.type;\n readonly response: CollisionResponse;\n readonly shape: CollisionShape;\n readonly width: number;\n readonly height: number;\n readonly radius: number;\n readonly offsetX: number;\n readonly offsetY: number;\n readonly layer: number;\n readonly mask: number;\n constructor(options: ColliderOptions = {}) {\n super();\n this.response = collisionResponse(\n options.response ?? CollisionResponse.Trigger,\n );\n this.shape = options.shape ?? CollisionShape.Box;\n if (\n this.shape !== CollisionShape.Box &&\n this.shape !== CollisionShape.Circle\n )\n throw new EngineError(\"INVALID_VALUE\", \"Unknown collider shape\");\n this.width =\n options.shape === CollisionShape.Circle\n ? 0\n : positive(options.width ?? 32, \"width\");\n this.height =\n options.shape === CollisionShape.Circle\n ? 0\n : positive(options.height ?? 32, \"height\");\n this.radius =\n options.shape === CollisionShape.Circle\n ? positive(options.radius ?? 16, \"radius\")\n : 0;\n this.offsetX = finite(options.offsetX ?? 0, \"offsetX\");\n this.offsetY = finite(options.offsetY ?? 0, \"offsetY\");\n this.layer = collisionBits(options.layer ?? 1, \"layer\", false);\n this.mask = collisionBits(options.mask ?? 0xffffffff, \"mask\", true);\n }\n /** @internal */ notify<T>(type: EventType<T>, contact: T): void {\n this.emit(type, contact);\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport { Transform } from \"../graphics/components\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nexport const BodyType = { Static: \"static\", Dynamic: \"dynamic\" } as const;\nexport type BodyType = (typeof BodyType)[keyof typeof BodyType];\n/** Position-correction participation, not velocity integration or a rigid body. */\nexport class CollisionBody extends Component {\n static readonly type: ComponentType<CollisionBody> =\n defineComponent<CollisionBody>(\"CollisionBody\", [Transform.type]);\n readonly type = CollisionBody.type;\n readonly motion: BodyType;\n readonly mass: number;\n constructor(options: { motion?: BodyType; mass?: number } = {}) {\n super();\n this.motion = options.motion ?? BodyType.Dynamic;\n this.mass = positive(options.mass ?? 1, \"mass\");\n if (\n !Object.values(BodyType).includes(this.motion) ||\n !Number.isFinite(1 / this.mass)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Invalid collision body motion or mass\",\n );\n }\n get inverseMass(): number {\n return this.motion === BodyType.Dynamic ? 1 / this.mass : 0;\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { ContactGeometry } from \"./collider\";\nimport type { Manifold } from \"./collision-geometry\";\nimport type { CollisionResponse } from \"./collision-policy\";\nexport type Mutable<T> = { -readonly [K in keyof T]: T[K] };\nexport interface ContactObservation {\n seen: number;\n readonly aContact: Mutable<ContactGeometry>;\n readonly bContact?: Mutable<ContactGeometry>;\n}\n/** One observation path for both public payload families. */\nexport function observeContact(\n pair: ContactObservation,\n pass: number,\n manifold: Manifold,\n response: CollisionResponse,\n sign = 1,\n): void {\n if (\n !Number.isFinite(manifold.depth) ||\n !Number.isFinite(manifold.normalX) ||\n !Number.isFinite(manifold.normalY)\n )\n throw new EngineError(\"INVALID_VALUE\", \"Contact geometry overflowed\");\n const a = pair.aContact,\n b = pair.bContact;\n if (pair.seen !== pass) {\n a.depth = -1;\n a.resolved = false;\n if (b) b.resolved = false;\n }\n if (manifold.depth >= a.depth) {\n a.normalX = sign * manifold.normalX;\n a.normalY = sign * manifold.normalY;\n a.depth = manifold.depth;\n if (b) {\n b.normalX = -a.normalX;\n b.normalY = -a.normalY;\n b.depth = manifold.depth;\n }\n }\n a.response = response;\n if (b) b.response = response;\n pair.seen = pass;\n}\nexport type ContactPhase = \"enter\" | \"stay\" | \"exit\";\nexport function contactPhase(entered: boolean, active: boolean): ContactPhase {\n return active ? (entered ? \"stay\" : \"enter\") : \"exit\";\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { Transform } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\nimport { type Collider, CollisionShape } from \"./collider\";\n\nfunction finite(value: number, name: string): void {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", `${name} must be finite`);\n}\nexport interface GeometryEntry {\n readonly actor: Actor;\n readonly collider: Collider;\n readonly transform: Transform;\n readonly geometry: Geometry;\n}\n/** Narrow phase needs shape data only, not Actor ownership or a Transform. */\nexport interface ManifoldEntry {\n readonly collider: Pick<Collider, \"shape\">;\n readonly geometry: Geometry;\n}\nexport interface Manifold {\n normalX: number;\n normalY: number;\n depth: number;\n}\nexport function createGeometry(): Geometry {\n return {\n x: 0,\n y: 0,\n hx: 0,\n hy: 0,\n radius: 0,\n cos: 1,\n sin: 0,\n minX: 0,\n maxX: 0,\n minY: 0,\n maxY: 0,\n };\n}\nexport interface Geometry {\n x: number;\n y: number;\n hx: number;\n hy: number;\n radius: number;\n cos: number;\n sin: number;\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\nexport function updateGeometry(entry: GeometryEntry): boolean {\n const t = entry.transform,\n c = entry.collider,\n g = entry.geometry;\n finite(t.x, \"transform.x\");\n finite(t.y, \"transform.y\");\n finite(t.rotation, \"transform.rotation\");\n finite(t.scaleX, \"transform.scaleX\");\n finite(t.scaleY, \"transform.scaleY\");\n const sx = Math.abs(t.scaleX),\n sy = Math.abs(t.scaleY);\n if (sx === 0 || sy === 0) return false;\n if (\n c.shape === CollisionShape.Circle &&\n Math.abs(sx - sy) > 1e-9 * Math.max(sx, sy)\n )\n throw new EngineError(\n \"COLLIDER_SCALE_UNSUPPORTED\",\n \"Circle colliders require uniform absolute scale\",\n { actorId: entry.actor.id },\n );\n g.cos = Math.cos(t.rotation);\n g.sin = Math.sin(t.rotation);\n g.x = t.x + g.cos * c.offsetX * t.scaleX - g.sin * c.offsetY * t.scaleY;\n g.y = t.y + g.sin * c.offsetX * t.scaleX + g.cos * c.offsetY * t.scaleY;\n g.hx = (c.width * sx) / 2;\n g.hy = (c.height * sy) / 2;\n g.radius = c.radius * sx;\n const ex =\n c.shape === CollisionShape.Circle\n ? g.radius\n : Math.abs(g.cos) * g.hx + Math.abs(g.sin) * g.hy;\n const ey =\n c.shape === CollisionShape.Circle\n ? g.radius\n : Math.abs(g.sin) * g.hx + Math.abs(g.cos) * g.hy;\n g.minX = g.x - ex;\n g.maxX = g.x + ex;\n g.minY = g.y - ey;\n g.maxY = g.y + ey;\n if (\n !Number.isFinite(g.x) ||\n !Number.isFinite(g.y) ||\n !Number.isFinite(g.hx) ||\n !Number.isFinite(g.hy) ||\n !Number.isFinite(g.radius) ||\n !Number.isFinite(g.minX) ||\n !Number.isFinite(g.maxX) ||\n !Number.isFinite(g.minY) ||\n !Number.isFinite(g.maxY)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Collider world geometry must be finite\",\n );\n return true;\n}\n\nfunction boxCircle(\n box: Geometry,\n circle: Geometry,\n out: Manifold,\n tolerance: number,\n): boolean {\n const dx = circle.x - box.x,\n dy = circle.y - box.y;\n const x = dx * box.cos + dy * box.sin,\n y = -dx * box.sin + dy * box.cos;\n const cx = Math.max(-box.hx, Math.min(box.hx, x)),\n cy = Math.max(-box.hy, Math.min(box.hy, y));\n const ox = x - cx,\n oy = y - cy,\n distance = Math.hypot(ox, oy);\n let nx: number, ny: number;\n if (distance > 0) {\n if (distance > circle.radius + tolerance) return false;\n nx = ox / distance;\n ny = oy / distance;\n out.depth = Math.max(0, circle.radius - distance);\n } else if (box.hx - Math.abs(x) <= box.hy - Math.abs(y)) {\n nx = x >= 0 ? 1 : -1;\n ny = 0;\n out.depth = circle.radius + box.hx - Math.abs(x);\n } else {\n nx = 0;\n ny = y >= 0 ? 1 : -1;\n out.depth = circle.radius + box.hy - Math.abs(y);\n }\n out.normalX = nx * box.cos - ny * box.sin;\n out.normalY = nx * box.sin + ny * box.cos;\n return true;\n}\nfunction axis(\n a: Geometry,\n b: Geometry,\n x: number,\n y: number,\n out: Manifold,\n tolerance: number,\n): boolean {\n const distance = (b.x - a.x) * x + (b.y - a.y) * y;\n const ar =\n a.hx * Math.abs(a.cos * x + a.sin * y) +\n a.hy * Math.abs(-a.sin * x + a.cos * y);\n const br =\n b.hx * Math.abs(b.cos * x + b.sin * y) +\n b.hy * Math.abs(-b.sin * x + b.cos * y);\n const depth = ar + br - Math.abs(distance);\n if (depth < -tolerance) return false;\n if (depth < out.depth) {\n out.depth = Math.max(0, depth);\n const sign = distance >= 0 ? 1 : -1;\n out.normalX = x * sign;\n out.normalY = y * sign;\n }\n return true;\n}\n/** Exact existing circle/OBB tests, extended to return a minimum translation normal. */\nexport function contactManifold(\n a: ManifoldEntry,\n b: ManifoldEntry,\n out: Manifold,\n tolerance = 0,\n): boolean {\n const ag = a.geometry,\n bg = b.geometry;\n if (a.collider.shape === CollisionShape.Circle) {\n if (b.collider.shape === CollisionShape.Circle) {\n const dx = bg.x - ag.x,\n dy = bg.y - ag.y,\n distance = Math.hypot(dx, dy),\n r = ag.radius + bg.radius;\n if (distance > r + tolerance) return false;\n out.normalX = distance ? dx / distance : 1;\n out.normalY = distance ? dy / distance : 0;\n out.depth = Math.max(0, r - distance);\n return true;\n }\n const hit = boxCircle(bg, ag, out, tolerance);\n out.normalX = -out.normalX;\n out.normalY = -out.normalY;\n return hit;\n }\n if (b.collider.shape === CollisionShape.Circle)\n return boxCircle(ag, bg, out, tolerance);\n out.depth = Infinity;\n return (\n axis(ag, bg, ag.cos, ag.sin, out, tolerance) &&\n axis(ag, bg, -ag.sin, ag.cos, out, tolerance) &&\n axis(ag, bg, bg.cos, bg.sin, out, tolerance) &&\n axis(ag, bg, -bg.sin, bg.cos, out, tolerance)\n );\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { Transform } from \"../graphics/components\";\nimport type { Manifold } from \"./collision-geometry\";\n/** Translate along the minimum separation axis, preserving tangential movement intent. */\nexport function correctPositions(\n a: Pick<Transform, \"x\" | \"y\">,\n b: Pick<Transform, \"x\" | \"y\">,\n contact: Manifold,\n ia: number,\n ib: number,\n): boolean {\n const scale = Math.max(ia, ib);\n if (scale === 0 || contact.depth === 0) return false;\n const total = ia / scale + ib / scale,\n wa = ia / scale / total,\n wb = ib / scale / total;\n const dx = contact.normalX * contact.depth,\n dy = contact.normalY * contact.depth;\n const ax = a.x - dx * wa,\n ay = a.y - dy * wa,\n bx = b.x + dx * wb,\n by = b.y + dy * wb;\n if (\n !Number.isFinite(ax) ||\n !Number.isFinite(ay) ||\n !Number.isFinite(bx) ||\n !Number.isFinite(by)\n )\n throw new EngineError(\"INVALID_VALUE\", \"Position correction overflowed\");\n a.x = ax;\n a.y = ay;\n b.x = bx;\n b.y = by;\n return true;\n}\n","import type { Tilemap } from \"../game/tilemap\";\nimport { CollisionShape } from \"./collider\";\nimport {\n contactManifold,\n type Geometry,\n type Manifold,\n type ManifoldEntry,\n} from \"./collision-geometry\";\nimport { samePolicy } from \"./collision-policy\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n\nexport interface TileRange {\n x0: number;\n y0: number;\n x1: number;\n y1: number;\n}\n/** Closed, tolerance-expanded contact bounds; intentionally not worldToTile's point contract. */\nexport function tileRange(\n map: Tilemap<string>,\n g: Geometry,\n tolerance: number,\n out: TileRange,\n): boolean {\n out.x0 = Math.max(\n 0,\n Math.ceil((g.minX - map.x - tolerance) / map.tileWidth) - 1,\n );\n out.y0 = Math.max(\n 0,\n Math.ceil((g.minY - map.y - tolerance) / map.tileHeight) - 1,\n );\n out.x1 = Math.min(\n map.width - 1,\n Math.floor((g.maxX - map.x + tolerance) / map.tileWidth),\n );\n out.y1 = Math.min(\n map.height - 1,\n Math.floor((g.maxY - map.y + tolerance) / map.tileHeight),\n );\n return out.x0 <= out.x1 && out.y0 <= out.y1;\n}\nexport function tileGeometry(\n map: Tilemap<string>,\n x: number,\n y: number,\n g: Geometry,\n): void {\n g.minX = map.x + x * map.tileWidth;\n g.maxX = map.x + (x + 1) * map.tileWidth;\n g.minY = map.y + y * map.tileHeight;\n g.maxY = map.y + (y + 1) * map.tileHeight;\n g.x = g.minX + map.tileWidth / 2;\n g.y = g.minY + map.tileHeight / 2;\n g.hx = map.tileWidth / 2;\n g.hy = map.tileHeight / 2;\n g.radius = 0;\n g.cos = 1;\n g.sin = 0;\n}\n/** @internal Box enclosing an exact rectangular union of cells. */\nexport function tileRegionGeometry(\n map: Tilemap<string>,\n region: TileRange,\n g: Geometry,\n): void {\n tileGeometry(map, region.x0, region.y0, g);\n g.maxX = map.x + (region.x1 + 1) * map.tileWidth;\n g.maxY = map.y + (region.y1 + 1) * map.tileHeight;\n g.hx = (g.maxX - g.minX) / 2;\n g.hy = (g.maxY - g.minY) / 2;\n g.x = g.minX + g.hx;\n g.y = g.minY + g.hy;\n}\nexport const TileFace = {\n Left: 1,\n Right: 2,\n Top: 4,\n Bottom: 8,\n All: 15,\n} as const;\n/** Only equal full policies share topology. No merge/index/cache or renderer dependency. */\nexport function exposedFaces(\n map: Tilemap<string>,\n x: number,\n y: number,\n policy: ResolvedTileCollision,\n): number {\n const equal = (nx: number, ny: number) =>\n map.inBounds(nx, ny) && samePolicy(policy, map.getCollision(nx, ny));\n return (\n (equal(x - 1, y) ? 0 : TileFace.Left) |\n (equal(x + 1, y) ? 0 : TileFace.Right) |\n (equal(x, y - 1) ? 0 : TileFace.Top) |\n (equal(x, y + 1) ? 0 : TileFace.Bottom)\n );\n}\n/** Does a finite boundary segment intersect the OBB? Slabs in Actor-local coordinates. */\nfunction segmentBox(\n g: Geometry,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n tolerance: number,\n): boolean {\n const ax = (x0 - g.x) * g.cos + (y0 - g.y) * g.sin;\n const ay = -(x0 - g.x) * g.sin + (y0 - g.y) * g.cos;\n const bx = (x1 - g.x) * g.cos + (y1 - g.y) * g.sin;\n const by = -(x1 - g.x) * g.sin + (y1 - g.y) * g.cos;\n let low = 0,\n high = 1;\n for (const [p, d, half] of [\n [ax, bx - ax, g.hx],\n [ay, by - ay, g.hy],\n ]) {\n if (p === undefined || d === undefined || half === undefined) return false;\n if (Math.abs(d) < 1e-15) {\n if (Math.abs(p) > half + tolerance) return false;\n } else {\n const a = (-half - tolerance - p) / d,\n b = (half + tolerance - p) / d;\n low = Math.max(low, Math.min(a, b));\n high = Math.min(high, Math.max(a, b));\n if (low > high) return false;\n }\n }\n return true;\n}\n/**\n * Keep the exact circle/OBB manifold at exposed faces and convex corners.\n * A manifold using an internal face/vertex is replaced only by a real exposed\n * face intersection. Its axis is geometric, not a rounded arbitrary normal.\n */\nexport function tileResponseManifold(\n a: ManifoldEntry,\n b: ManifoldEntry,\n faces: number,\n out: Manifold,\n tolerance: number,\n): boolean {\n if (!contactManifold(a, b, out, tolerance)) return false;\n if (faces === TileFace.All) return true;\n const nx = out.normalX,\n ny = out.normalY;\n const xFace =\n Math.abs(nx) <= 1e-10 ? 0 : nx > 0 ? TileFace.Left : TileFace.Right;\n const yFace =\n Math.abs(ny) <= 1e-10 ? 0 : ny > 0 ? TileFace.Top : TileFace.Bottom;\n if ((!xFace || faces & xFace) && (!yFace || faces & yFace)) return true;\n const g = a.geometry,\n tile = b.geometry;\n const inside =\n g.x >= tile.minX &&\n g.x <= tile.maxX &&\n g.y >= tile.minY &&\n g.y <= tile.maxY;\n let best = Infinity,\n bestX = 0,\n bestY = 0;\n const face = (\n flag: number,\n depth: number,\n x: number,\n y: number,\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n ) => {\n if (!(faces & flag) || depth < -tolerance || depth >= best) return;\n const intersects =\n a.collider.shape === CollisionShape.Circle\n ? x !== 0\n ? g.y >= y0 - tolerance && g.y <= y1 + tolerance\n : g.x >= x0 - tolerance && g.x <= x1 + tolerance\n : segmentBox(g, x0, y0, x1, y1, tolerance);\n if (!inside && !intersects) return;\n best = Math.max(0, depth);\n bestX = x;\n bestY = y;\n };\n face(\n TileFace.Left,\n g.maxX - tile.minX,\n 1,\n 0,\n tile.minX,\n tile.minY,\n tile.minX,\n tile.maxY,\n );\n face(\n TileFace.Right,\n tile.maxX - g.minX,\n -1,\n 0,\n tile.maxX,\n tile.minY,\n tile.maxX,\n tile.maxY,\n );\n face(\n TileFace.Top,\n g.maxY - tile.minY,\n 0,\n 1,\n tile.minX,\n tile.minY,\n tile.maxX,\n tile.minY,\n );\n face(\n TileFace.Bottom,\n tile.maxY - g.minY,\n 0,\n -1,\n tile.minX,\n tile.maxY,\n tile.maxX,\n tile.maxY,\n );\n if (!Number.isFinite(best)) return false;\n out.normalX = bestX;\n out.normalY = bestY;\n out.depth = best;\n return true;\n}\n","import { samePolicy } from \"./collision-policy\";\nimport type { TileRange } from \"./tile-collision-geometry\";\nimport type { Tilemap } from \"./tilemap\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n\nconst chunkSize = 16;\n/** @internal Inclusive tile bounds, independent of placement translation and image frames. */\nexport interface TileCollisionRegion extends TileRange {\n readonly policy: ResolvedTileCollision;\n}\ninterface Chunk {\n readonly regions: TileCollisionRegion[];\n readonly ids: Set<number | string>;\n readonly cells: number;\n}\n/**\n * Optional candidate index. Equal-policy horizontal runs extend vertically only\n * when their extents match. Cell manifolds/events remain the World's authority.\n */\nexport class TileCollisionIndex {\n private readonly chunks = new Map<number, Chunk>();\n private readonly columns: number;\n private readonly off: (() => void)[];\n private builds = 0;\n private builtCells = 0;\n private disposed = false;\n constructor(private readonly map: Tilemap<string>) {\n this.columns = Math.ceil(map.width / chunkSize);\n this.off = [\n map.onCollisionChanged((change) => {\n if (change.kind === \"cell\") this.invalidate(change.index);\n else if (change.kind === \"all\") this.chunks.clear();\n else\n for (const [key, chunk] of this.chunks)\n if (chunk.ids.has(change.tile)) this.chunks.delete(key);\n }),\n // Equal-policy image edits still change which future ID-default edits matter.\n map.onTilesChanged((index) => {\n if (index === null) this.chunks.clear();\n else this.invalidate(index);\n }),\n map.onDispose(() => this.dispose()),\n ];\n }\n private key(x: number, y: number): number {\n return Math.floor(y / chunkSize) * this.columns + Math.floor(x / chunkSize);\n }\n private invalidate(index: number): void {\n this.chunks.delete(\n this.key(index % this.map.width, Math.floor(index / this.map.width)),\n );\n }\n private build(cx: number, cy: number): Chunk {\n const map = this.map;\n const x0 = cx * chunkSize,\n y0 = cy * chunkSize;\n const x1 = Math.min(map.width, x0 + chunkSize),\n y1 = Math.min(map.height, y0 + chunkSize);\n const regions: TileCollisionRegion[] = [],\n ids = new Set<number | string>();\n let previous = new Map<string, TileCollisionRegion>();\n let cells = 0;\n for (let y = y0; y < y1; y++) {\n const current = new Map<string, TileCollisionRegion>();\n for (let x = x0; x < x1; ) {\n const start = x,\n policy = map.getCollision(x, y);\n const remember = (tx: number) => {\n const id = map.get(tx, y);\n if (id !== null) ids.add(id);\n };\n remember(x++);\n if (!policy) continue;\n while (x < x1 && samePolicy(policy, map.getCollision(x, y)))\n remember(x++);\n cells += x - start;\n const key = `${start}:${x}:${policy.response}:${policy.layer}:${policy.mask}`;\n let region = previous.get(key);\n if (region) region.y1 = y;\n else {\n region = { x0: start, x1: x - 1, y0: y, y1: y, policy };\n regions.push(region);\n }\n current.set(key, region);\n }\n previous = current;\n }\n this.builds++;\n this.builtCells += (x1 - x0) * (y1 - y0);\n return { regions, ids, cells };\n }\n /** @internal Produces each eligible cell once, in the same row-major order as direct search. */\n query(\n range: TileRange,\n accept: (region: TileCollisionRegion) => boolean,\n out: number[],\n ): void {\n out.length = 0;\n if (this.disposed) return;\n for (\n let cy = Math.floor(range.y0 / chunkSize);\n cy <= Math.floor(range.y1 / chunkSize);\n cy++\n )\n for (\n let cx = Math.floor(range.x0 / chunkSize);\n cx <= Math.floor(range.x1 / chunkSize);\n cx++\n ) {\n const key = cy * this.columns + cx;\n let chunk = this.chunks.get(key);\n if (!chunk) {\n chunk = this.build(cx, cy);\n this.chunks.set(key, chunk);\n }\n for (const region of chunk.regions) {\n const x0 = Math.max(range.x0, region.x0),\n x1 = Math.min(range.x1, region.x1);\n const y0 = Math.max(range.y0, region.y0),\n y1 = Math.min(range.y1, region.y1);\n if (x0 > x1 || y0 > y1 || !accept(region)) continue;\n for (let y = y0; y <= y1; y++)\n for (let x = x0; x <= x1; x++) out.push(y * this.map.width + x);\n }\n }\n out.sort((a, b) => a - b);\n }\n get diagnostics() {\n let regions = 0,\n cells = 0;\n for (const chunk of this.chunks.values()) {\n regions += chunk.regions.length;\n cells += chunk.cells;\n }\n return {\n chunks: this.chunks.size,\n regions,\n cells,\n builds: this.builds,\n builtCells: this.builtCells,\n };\n }\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const off of this.off) off();\n this.chunks.clear();\n }\n}\n","import { defineEvent } from \"../foundation/events\";\nimport type { Tilemap } from \"../game/tilemap\";\nimport type { Actor } from \"../scene/actor\";\nimport type { Collider, ContactGeometry } from \"./collider\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n/** Cell observation at detection; delivered after all position correction. */\nexport interface TileContact extends ContactGeometry {\n readonly self: Collider;\n readonly selfActor: Actor;\n readonly map: Tilemap<string>;\n readonly tileX: number;\n readonly tileY: number;\n readonly tileId: number | string | null;\n /** Frozen normalized cell policy at observation, distinct from the pair response. */\n readonly policy: ResolvedTileCollision;\n}\nexport const TileContactEnter = defineEvent<TileContact>(\"TileContactEnter\");\nexport const TileContactStay = defineEvent<TileContact>(\"TileContactStay\");\nexport const TileContactExit = defineEvent<TileContact>(\"TileContactExit\");\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { EventType } from \"../foundation/events\";\nimport { Lifetime } from \"../foundation/lifetime\";\nimport { type Tilemap, TilemapLayer } from \"../game/tilemap\";\nimport { Transform } from \"../graphics/components\";\nimport type { Actor } from \"../scene/actor\";\nimport { type Scene, SceneState } from \"../scene/scene\";\nimport {\n Collider,\n CollisionResponse,\n CollisionShape,\n type Contact,\n ContactEnter,\n ContactExit,\n ContactStay,\n} from \"./collider\";\nimport { CollisionBody } from \"./collision-body\";\nimport {\n contactPhase,\n type Mutable,\n observeContact,\n} from \"./collision-contact\";\nimport {\n contactManifold,\n createGeometry,\n type Geometry,\n type Manifold,\n updateGeometry,\n} from \"./collision-geometry\";\nimport { allowsPair, pairResponse } from \"./collision-policy\";\nimport { correctPositions } from \"./collision-response\";\nimport {\n exposedFaces,\n tileGeometry,\n tileRange,\n tileRegionGeometry,\n tileResponseManifold,\n} from \"./tile-collision-geometry\";\nimport { TileCollisionIndex } from \"./tile-collision-index\";\nimport {\n type TileContact,\n TileContactEnter,\n TileContactExit,\n TileContactStay,\n} from \"./tile-contact\";\nimport type { ResolvedTileCollision } from \"./tilemap-collision\";\n\nexport * from \"./collider\";\nexport * from \"./collision-body\";\nexport * from \"./tile-contact\";\n\ninterface Entry {\n readonly id: number;\n readonly collider: Collider;\n readonly actor: Actor;\n readonly transform: Transform;\n readonly geometry: Geometry;\n}\ninterface MapEntry {\n readonly id: number;\n readonly map: Tilemap<string>;\n /** Geometry records exist only for observed cells, shared by their contact pairs. */\n readonly targets: Map<number, TileTarget>;\n readonly index?: TileCollisionIndex;\n}\ninterface TileTarget {\n readonly owner: MapEntry;\n readonly index: number;\n readonly x: number;\n readonly y: number;\n readonly collider: { readonly shape: typeof CollisionShape.Box };\n readonly geometry: Geometry;\n policy: ResolvedTileCollision;\n users: number;\n}\ninterface PairState {\n seen: number;\n aEntered: boolean;\n bEntered: boolean;\n}\ninterface ActorPair extends PairState {\n readonly kind: \"actor\";\n readonly a: Entry;\n readonly b: Entry;\n readonly aContact: Mutable<Contact>;\n readonly bContact: Mutable<Contact>;\n}\ninterface TilePair extends PairState {\n readonly kind: \"tile\";\n readonly a: Entry;\n readonly b: TileTarget;\n readonly aContact: Mutable<TileContact>;\n previous: TileContact | undefined;\n}\ntype Pair = ActorPair | TilePair;\nexport interface CollisionWorldOptions {\n /** Direct cells suit small Actors; rectangles cache equal-policy 16x16 chunks. */\n tileSearch?: \"cells\" | \"rectangles\";\n iterations?: number;\n tolerance?: number;\n}\nconst sceneWorlds = new WeakMap<Scene, CollisionWorld>();\nconst actorEvents = {\n enter: ContactEnter,\n stay: ContactStay,\n exit: ContactExit,\n};\nconst tileEvents = {\n enter: TileContactEnter,\n stay: TileContactStay,\n exit: TileContactExit,\n};\nconst tileShape = { shape: CollisionShape.Box } as const;\n/** One Scene-owned candidate/response/contact pipeline, with typed delivery at its boundary. */\nexport class CollisionWorld {\n private readonly lifetime = new Lifetime();\n private readonly entries = new Map<Collider, Entry>();\n private readonly maps = new Map<Tilemap<string>, MapEntry>();\n private readonly pairs = new Map<Entry, Map<Entry | TileTarget, Pair>>();\n private readonly sorted: Entry[] = [];\n private readonly activeMaps: MapEntry[] = [];\n private readonly delivery: Pair[] = [];\n private readonly solving: Pair[] = [];\n private readonly manifold: Manifold = { normalX: 0, normalY: 0, depth: 0 };\n private readonly scratchTile = {\n collider: tileShape,\n geometry: createGeometry(),\n };\n private readonly range = { x0: 0, y0: 0, x1: 0, y1: 0 };\n private readonly tileSearch: \"cells\" | \"rectangles\";\n private readonly tileCells: number[] = [];\n private regionTests = 0;\n private regionNarrowTests = 0;\n private readonly iterations: number;\n private readonly tolerance: number;\n private corrections = 0;\n private solverPasses = 0;\n private unresolved = 0;\n private revision = -1;\n private serial = 0;\n private mapSerial = 0;\n private pass = 0;\n private stepping = false;\n private contactCount = 0;\n private candidates = 0;\n private tests = 0;\n private tileCount = 0;\n private tileCandidates = 0;\n private policyRejected = 0;\n private tileTests = 0;\n private tileCorrections = 0;\n private tileResponseTests = 0;\n private tileUnresolved = 0;\n private neighborProbes = 0;\n constructor(\n readonly scene: Scene,\n options: CollisionWorldOptions = {},\n ) {\n this.tileSearch = options.tileSearch ?? \"cells\";\n if (this.tileSearch !== \"cells\" && this.tileSearch !== \"rectangles\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"tileSearch must be cells or rectangles\",\n );\n this.iterations = options.iterations ?? 6;\n this.tolerance = options.tolerance ?? 1e-7;\n if (\n !Number.isInteger(this.iterations) ||\n this.iterations < 1 ||\n this.iterations > 32 ||\n !Number.isFinite(this.tolerance) ||\n this.tolerance < 0\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Collision iterations must be 1..32 and tolerance must be finite and nonnegative\",\n );\n if (sceneWorlds.has(scene))\n throw new EngineError(\n \"COLLISION_WORLD_DUPLICATE\",\n \"Only one automatic collision world may own a scene\",\n );\n this.lifetime.onDispose(scene.onPostUpdate(() => this.step()));\n this.lifetime.onDispose(scene.onDispose(() => this.dispose()));\n sceneWorlds.set(scene, this);\n this.lifetime.onDispose(() => {\n sceneWorlds.delete(scene);\n });\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n /** Actor broad-phase counters retain their existing meaning; terrain is separate below. */\n get diagnostics() {\n return {\n colliders: this.entries.size,\n contacts: this.contactCount,\n candidates: this.candidates,\n narrowTests: this.tests,\n };\n }\n get responseDiagnostics() {\n return {\n passes: this.solverPasses,\n corrections: this.corrections,\n unresolved: this.unresolved,\n };\n }\n get tileDiagnostics() {\n let retainedCells = 0;\n for (const entry of this.maps.values()) retainedCells += entry.targets.size;\n return {\n maps: this.maps.size,\n candidateCells: this.tileCandidates,\n policyRejected: this.policyRejected,\n narrowTests: this.tileTests,\n contacts: this.tileCount,\n corrections: this.tileCorrections,\n responseTests: this.tileResponseTests,\n unresolved: this.tileUnresolved,\n neighborProbes: this.neighborProbes,\n retainedCells,\n };\n }\n /** Cached candidate geometry only; not public contact/response shape counts. */\n get tileIndexDiagnostics() {\n let chunks = 0,\n regions = 0,\n cells = 0,\n builds = 0,\n builtCells = 0;\n for (const entry of this.maps.values()) {\n const d = entry.index?.diagnostics;\n if (!d) continue;\n chunks += d.chunks;\n regions += d.regions;\n cells += d.cells;\n builds += d.builds;\n builtCells += d.builtCells;\n }\n return {\n mode: this.tileSearch,\n chunks,\n regions,\n cells,\n builds,\n builtCells,\n regionTests: this.regionTests,\n regionNarrowTests: this.regionNarrowTests,\n };\n }\n contactsFor(collider: Collider): readonly Contact[] {\n const contacts: Contact[] = [];\n for (const group of this.pairs.values())\n for (const pair of group.values())\n if (\n pair.kind === \"actor\" &&\n pair.seen === this.pass &&\n this.valid(pair)\n ) {\n if (pair.a.collider === collider) contacts.push({ ...pair.aContact });\n else if (pair.b.collider === collider)\n contacts.push({ ...pair.bContact });\n }\n return contacts;\n }\n tileContactsFor(collider: Collider): readonly TileContact[] {\n const entry = this.entries.get(collider),\n contacts: TileContact[] = [];\n if (entry)\n for (const pair of this.pairs.get(entry)?.values() ?? [])\n if (pair.kind === \"tile\" && pair.seen === this.pass && this.valid(pair))\n contacts.push({ ...pair.aContact });\n return contacts;\n }\n private inverseMass(entry: Entry): number {\n const body = entry.actor.get(CollisionBody.type);\n return body?.enabled ? body.inverseMass : 0;\n }\n private eligible(entry: Entry): boolean {\n return (\n !entry.collider.disposed &&\n entry.collider.enabled &&\n !entry.actor.disposed &&\n entry.actor.enabled &&\n entry.actor.scene === this.scene &&\n entry.actor.get(Collider.type) === entry.collider\n );\n }\n private mapEligible(map: Tilemap<string>): boolean {\n return (\n !map.disposed &&\n map.enabled &&\n map.collisionEnabled &&\n map.scene === this.scene\n );\n }\n private valid(pair: Pair): boolean {\n return (\n this.eligible(pair.a) &&\n (pair.kind === \"actor\"\n ? this.eligible(pair.b)\n : this.mapEligible(pair.b.owner.map))\n );\n }\n private reconcile(): void {\n if (this.revision === this.scene.revision) return;\n this.revision = this.scene.revision;\n for (const [collider, entry] of this.entries)\n if (\n collider.disposed ||\n entry.actor.scene !== this.scene ||\n entry.actor.get(Collider.type) !== collider\n )\n this.entries.delete(collider);\n for (const [map] of this.maps)\n if (map.disposed || map.scene !== this.scene) {\n this.maps.get(map)?.index?.dispose();\n this.maps.delete(map);\n }\n for (const actor of this.scene.actors) {\n const collider = actor.get(Collider.type);\n if (collider && !this.entries.has(collider))\n this.entries.set(collider, {\n id: ++this.serial,\n collider,\n actor,\n transform: actor.require(Transform.type),\n geometry: createGeometry(),\n });\n const map = actor.get(TilemapLayer.type)?.map;\n if (map && !this.maps.has(map))\n this.maps.set(map, {\n id: ++this.mapSerial,\n map,\n targets: new Map(),\n ...(this.tileSearch === \"rectangles\"\n ? { index: new TileCollisionIndex(map) }\n : {}),\n });\n }\n }\n private group(a: Entry): Map<Entry | TileTarget, Pair> {\n let group = this.pairs.get(a);\n if (!group) {\n group = new Map();\n this.pairs.set(a, group);\n }\n return group;\n }\n private actorPair(a: Entry, b: Entry): ActorPair {\n let sign = 1;\n if (a.id > b.id) {\n const swap = a;\n a = b;\n b = swap;\n sign = -1;\n }\n const group = this.group(a);\n let pair = group.get(b) as ActorPair | undefined;\n if (!pair) {\n pair = {\n kind: \"actor\",\n a,\n b,\n seen: this.pass,\n aEntered: false,\n bEntered: false,\n aContact: {\n normalX: 0,\n normalY: 0,\n depth: 0,\n response: CollisionResponse.Trigger,\n resolved: false,\n self: a.collider,\n other: b.collider,\n selfActor: a.actor,\n otherActor: b.actor,\n },\n bContact: {\n normalX: 0,\n normalY: 0,\n depth: 0,\n response: CollisionResponse.Trigger,\n resolved: false,\n self: b.collider,\n other: a.collider,\n selfActor: b.actor,\n otherActor: a.actor,\n },\n };\n group.set(b, pair);\n this.contactCount++;\n }\n observeContact(\n pair,\n this.pass,\n this.manifold,\n pairResponse(a.collider, b.collider),\n sign,\n );\n return pair;\n }\n private tilePair(\n a: Entry,\n owner: MapEntry,\n x: number,\n y: number,\n policy: ResolvedTileCollision,\n ): TilePair {\n const index = y * owner.map.width + x;\n let target = owner.targets.get(index);\n if (!target) {\n target = {\n owner,\n index,\n x,\n y,\n collider: tileShape,\n geometry: createGeometry(),\n policy,\n users: 0,\n };\n owner.targets.set(index, target);\n }\n target.policy = policy;\n tileGeometry(owner.map, x, y, target.geometry);\n const group = this.group(a);\n let pair = group.get(target) as TilePair | undefined;\n const response = pairResponse(a.collider, policy);\n if (!pair) {\n pair = {\n kind: \"tile\",\n a,\n b: target,\n seen: this.pass,\n aEntered: false,\n bEntered: false,\n previous: undefined,\n aContact: {\n normalX: 0,\n normalY: 0,\n depth: 0,\n response,\n resolved: false,\n self: a.collider,\n selfActor: a.actor,\n map: owner.map,\n tileX: x,\n tileY: y,\n tileId: owner.map.get(x, y),\n policy,\n },\n };\n group.set(target, pair);\n target.users++;\n this.tileCount++;\n }\n if (pair.seen !== this.pass && pair.aContact.response !== response) {\n if (pair.aEntered) pair.previous = { ...pair.aContact };\n pair.aEntered = false;\n }\n observeContact(pair, this.pass, this.manifold, response);\n pair.aContact.tileId = owner.map.get(x, y);\n pair.aContact.policy = policy;\n return pair;\n }\n private remove(pair: Pair): void {\n const group = this.pairs.get(pair.a);\n if (group?.delete(pair.b)) {\n if (pair.kind === \"actor\") this.contactCount--;\n else {\n this.tileCount--;\n if (--pair.b.users === 0) pair.b.owner.targets.delete(pair.b.index);\n }\n }\n if (!group?.size) this.pairs.delete(pair.a);\n }\n private capture(): void {\n this.sorted.length = 0;\n for (const entry of this.entries.values())\n if (this.eligible(entry) && updateGeometry(entry))\n this.sorted.push(entry);\n this.sorted.sort(\n (a, b) => a.geometry.minX - b.geometry.minX || a.id - b.id,\n );\n this.activeMaps.length = 0;\n for (const entry of this.maps.values())\n if (this.mapEligible(entry.map) && entry.map.hasCollision)\n this.activeMaps.push(entry);\n }\n private scanActors(solidOnly: boolean): void {\n for (let i = 0; i < this.sorted.length; i++) {\n const a = this.sorted[i];\n if (!a) continue;\n for (let j = i + 1; j < this.sorted.length; j++) {\n const b = this.sorted[j];\n if (!b || b.geometry.minX > a.geometry.maxX + this.tolerance) break;\n this.candidates++;\n const solid =\n pairResponse(a.collider, b.collider) === CollisionResponse.Solid;\n if (\n (solidOnly && !solid) ||\n a.geometry.maxY + this.tolerance < b.geometry.minY ||\n b.geometry.maxY + this.tolerance < a.geometry.minY ||\n !allowsPair(a.collider, b.collider)\n )\n continue;\n this.tests++;\n if (contactManifold(a, b, this.manifold, this.tolerance)) {\n const pair = this.actorPair(a, b);\n if (solidOnly) this.solving.push(pair);\n else if (\n solid &&\n this.manifold.depth > this.tolerance &&\n (this.inverseMass(a) > 0 || this.inverseMass(b) > 0)\n )\n this.unresolved++;\n }\n }\n }\n }\n private scanTiles(solidOnly: boolean): void {\n for (const a of this.sorted)\n for (const owner of this.activeMaps) {\n const map = owner.map;\n if (!tileRange(map, a.geometry, this.tolerance, this.range)) continue;\n if (owner.index) {\n owner.index.query(\n this.range,\n (region) => {\n this.regionTests++;\n if (\n (solidOnly &&\n pairResponse(a.collider, region.policy) !==\n CollisionResponse.Solid) ||\n !allowsPair(a.collider, region.policy)\n )\n return false;\n this.regionNarrowTests++;\n tileRegionGeometry(map, region, this.scratchTile.geometry);\n return contactManifold(\n a,\n this.scratchTile,\n this.manifold,\n this.tolerance,\n );\n },\n this.tileCells,\n );\n for (const index of this.tileCells)\n this.scanTile(\n a,\n owner,\n index % map.width,\n Math.floor(index / map.width),\n solidOnly,\n );\n } else {\n for (let y = this.range.y0; y <= this.range.y1; y++)\n for (let x = this.range.x0; x <= this.range.x1; x++)\n this.scanTile(a, owner, x, y, solidOnly);\n }\n }\n }\n private scanTile(\n a: Entry,\n owner: MapEntry,\n x: number,\n y: number,\n solidOnly: boolean,\n ): void {\n this.tileCandidates++;\n const policy = owner.map.getCollision(x, y);\n const solid =\n policy && pairResponse(a.collider, policy) === CollisionResponse.Solid;\n if (!policy || (solidOnly && !solid) || !allowsPair(a.collider, policy)) {\n this.policyRejected++;\n return;\n }\n this.tileTests++;\n tileGeometry(owner.map, x, y, this.scratchTile.geometry);\n if (!contactManifold(a, this.scratchTile, this.manifold, this.tolerance))\n return;\n const pair = this.tilePair(a, owner, x, y, policy);\n if (solidOnly) this.solving.push(pair);\n else if (\n solid &&\n this.manifold.depth > this.tolerance &&\n this.inverseMass(a) > 0\n ) {\n this.unresolved++;\n this.tileUnresolved++;\n }\n }\n private compare(a: Pair, b: Pair): number {\n if (a.kind !== b.kind) return a.kind === \"actor\" ? -1 : 1;\n if (a.kind === \"actor\" && b.kind === \"actor\")\n return a.a.id - b.a.id || a.b.id - b.b.id;\n if (a.kind === \"tile\" && b.kind === \"tile\")\n return (\n a.a.id - b.a.id || a.b.owner.id - b.b.owner.id || a.b.index - b.b.index\n );\n return 0;\n }\n private correct(pair: Pair): boolean {\n updateGeometry(pair.a);\n let hit: boolean;\n if (pair.kind === \"actor\") {\n updateGeometry(pair.b);\n hit = contactManifold(pair.a, pair.b, this.manifold, this.tolerance);\n } else {\n tileGeometry(pair.b.owner.map, pair.b.x, pair.b.y, pair.b.geometry);\n this.tileResponseTests++;\n this.neighborProbes += 4;\n hit = tileResponseManifold(\n pair.a,\n pair.b,\n exposedFaces(pair.b.owner.map, pair.b.x, pair.b.y, pair.b.policy),\n this.manifold,\n this.tolerance,\n );\n }\n if (!hit || this.manifold.depth <= this.tolerance) return false;\n const moved = correctPositions(\n pair.a.transform,\n pair.kind === \"actor\" ? pair.b.transform : pair.b.geometry,\n this.manifold,\n this.inverseMass(pair.a),\n pair.kind === \"actor\" ? this.inverseMass(pair.b) : 0,\n );\n if (moved) {\n this.corrections++;\n pair.aContact.resolved = true;\n if (pair.kind === \"actor\") pair.bContact.resolved = true;\n else this.tileCorrections++;\n }\n return moved;\n }\n private notify<T>(\n collider: Collider,\n type: EventType<T>,\n contact: T,\n errors: unknown[],\n ): void {\n try {\n collider.notify(type, contact);\n } catch (error) {\n errors.push(error);\n }\n }\n private deliver(errors: unknown[]): void {\n this.delivery.length = 0;\n for (const group of this.pairs.values())\n for (const pair of group.values()) this.delivery.push(pair);\n this.delivery.sort((a, b) => this.compare(a, b));\n for (const pair of this.delivery) {\n if (this.disposed) break;\n if (pair.kind === \"tile\" && pair.previous) {\n const previous = pair.previous;\n pair.previous = undefined;\n if (!pair.a.collider.disposed)\n this.notify(pair.a.collider, TileContactExit, previous, errors);\n if (this.disposed) break;\n }\n const active = pair.seen === this.pass && this.valid(pair);\n const phase = contactPhase(pair.aEntered, active);\n if (!active) {\n this.remove(pair);\n if (pair.aEntered && !pair.a.collider.disposed) {\n if (pair.kind === \"actor\")\n this.notify(\n pair.a.collider,\n actorEvents[phase],\n pair.aContact,\n errors,\n );\n else\n this.notify(\n pair.a.collider,\n tileEvents[phase],\n pair.aContact,\n errors,\n );\n }\n if (\n !this.disposed &&\n pair.kind === \"actor\" &&\n pair.bEntered &&\n !pair.b.collider.disposed\n )\n this.notify(pair.b.collider, ContactExit, pair.bContact, errors);\n continue;\n }\n pair.aEntered = true;\n if (pair.kind === \"actor\")\n this.notify(pair.a.collider, actorEvents[phase], pair.aContact, errors);\n else\n this.notify(pair.a.collider, tileEvents[phase], pair.aContact, errors);\n if (this.disposed || !this.valid(pair)) continue;\n if (pair.kind === \"actor\") {\n const bPhase = contactPhase(pair.bEntered, true);\n pair.bEntered = true;\n this.notify(\n pair.b.collider,\n actorEvents[bPhase],\n pair.bContact,\n errors,\n );\n }\n }\n }\n step(): void {\n if (this.disposed)\n throw new EngineError(\n \"COLLISION_WORLD_DISPOSED\",\n \"Collision world has been disposed\",\n );\n if (this.stepping)\n throw new EngineError(\n \"COLLISION_REENTRANT\",\n \"Contact delivery cannot recursively step the same world\",\n );\n if (this.scene.state !== SceneState.Active)\n throw new EngineError(\n \"SCENE_STATE\",\n \"Contact detection requires an active scene\",\n );\n this.stepping = true;\n this.pass++;\n this.regionTests = this.regionNarrowTests = 0;\n this.candidates =\n this.tests =\n this.tileCandidates =\n this.policyRejected =\n this.tileTests =\n this.tileResponseTests =\n this.neighborProbes =\n 0;\n this.corrections =\n this.solverPasses =\n this.unresolved =\n this.tileCorrections =\n this.tileUnresolved =\n 0;\n const errors: unknown[] = [];\n try {\n this.reconcile();\n this.capture(); // Validate all Actor geometry before any translation.\n if (\n this.sorted.some(\n (entry) =>\n entry.collider.response === CollisionResponse.Solid &&\n this.inverseMass(entry) > 0,\n )\n ) {\n for (let iteration = 0; iteration < this.iterations; iteration++) {\n this.solving.length = 0;\n this.scanActors(true);\n this.scanTiles(true);\n this.solving.sort((a, b) => this.compare(a, b));\n let changed = false;\n this.solverPasses++;\n for (const pair of this.solving)\n changed = this.correct(pair) || changed;\n if (!changed) break;\n this.capture();\n }\n }\n // Triggers sample final positions; encountered Solid pairs remain observed for this pass.\n this.scanActors(false);\n this.scanTiles(false);\n this.deliver(errors);\n if (errors.length)\n throw new AggregateError(errors, \"Contact handlers failed\");\n } finally {\n this.stepping = false;\n this.sorted.length =\n this.activeMaps.length =\n this.solving.length =\n this.delivery.length =\n 0;\n }\n }\n dispose(): void {\n if (this.disposed) return;\n try {\n this.lifetime.dispose();\n } finally {\n this.entries.clear();\n for (const entry of this.maps.values()) entry.index?.dispose();\n this.maps.clear();\n this.pairs.clear();\n this.sorted.length =\n this.activeMaps.length =\n this.solving.length =\n this.delivery.length =\n 0;\n this.tileCells.length = 0;\n this.contactCount = this.tileCount = 0;\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Grid } from \"../foundation/grid\";\nimport {\n containsScreenPoint,\n type ScreenPoint,\n screenToWorld,\n type ViewTransform,\n type WorldPoint,\n worldPoint,\n} from \"../graphics/coordinates\";\nimport type { TileBounds, TileGeometry } from \"../graphics/tile-geometry\";\nimport { Actor, type ActorOptions } from \"../scene/actor\";\nimport {\n Component,\n type ComponentType,\n defineComponent,\n} from \"../scene/component\";\nimport type { Scene } from \"../scene/scene\";\nimport type { TilePoint } from \"./tilemap\";\n\nexport type TileColor = number | null;\nexport interface GeometryTilemapOptions extends ActorOptions {\n geometry: TileGeometry;\n tiles: Grid<TileColor> | readonly (readonly TileColor[])[];\n x?: number;\n y?: number;\n zIndex?: number;\n visible?: boolean;\n}\nfunction color(value: TileColor): TileColor {\n if (\n value !== null &&\n (!Number.isInteger(value) || value < 0 || value > 0xffffff)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile color must be a 24-bit RGB integer or null\",\n );\n return value;\n}\nfunction finite(value: number): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_VALUE\", \"Map placement must be finite\");\n return value;\n}\n/** One Scene-owned color layer. Geometry is independent of copied finite Grid data.\n * Hex x/y indices mean axial q/r; the finite map is a q/r parallelogram.\n * No sheet/image ownership or automatic terrain collision is attached.\n */\nexport class GeometryTilemap {\n private readonly owner: Actor;\n readonly geometry: TileGeometry;\n private readonly cells: Grid<TileColor>;\n private readonly extent: TileBounds;\n private readonly listeners = new Set<(index: number | null) => void>();\n private version = 0;\n private left = 0;\n private top = 0;\n private depth = 0;\n private shown = true;\n constructor(options: GeometryTilemapOptions) {\n this.owner = new Actor(options);\n this.geometry = options.geometry;\n const input = options.tiles;\n if (input instanceof Grid) {\n this.cells = Grid.generate(input.width, input.height, (x, y) =>\n color(input.get(x, y)),\n );\n } else {\n if (\n !Array.isArray(input) ||\n !input.length ||\n !Array.isArray(input[0]) ||\n !input[0].length ||\n input.some(\n (row) => !Array.isArray(row) || row.length !== input[0]?.length,\n )\n )\n throw new EngineError(\n \"GRID_SIZE\",\n \"GeometryTilemap rows must form a nonempty rectangle\",\n );\n this.cells = Grid.generate(input[0].length, input.length, (x, y) =>\n color(input[y]?.[x] as TileColor),\n );\n }\n const first = this.geometry.bounds(0, 0),\n last = this.geometry.bounds(this.width - 1, this.height - 1);\n this.extent = {\n x: first.x,\n y: first.y,\n width: finite(last.x + last.width - first.x),\n height: finite(last.y + last.height - first.y),\n };\n this.x = options.x ?? 0;\n this.y = options.y ?? 0;\n this.zIndex = options.zIndex ?? 0;\n this.visible = options.visible ?? true;\n this.owner.add(new GeometryTilemapLayer(this));\n }\n place(scene: Scene): this {\n scene.add(this.owner);\n return this;\n }\n get scene(): Scene | undefined {\n return this.owner.scene;\n }\n get disposed(): boolean {\n return this.owner.disposed;\n }\n get enabled(): boolean {\n return this.owner.enabled;\n }\n set enabled(value: boolean) {\n this.owner.enabled = value;\n }\n dispose(): void {\n this.owner.dispose();\n }\n onDispose(callback: () => void): () => void {\n return this.owner.onDispose(callback);\n }\n private alive(): void {\n if (this.disposed)\n throw new EngineError(\n \"ACTOR_DISPOSED\",\n \"GeometryTilemap has been disposed\",\n );\n }\n get width(): number {\n return this.cells.width;\n }\n get height(): number {\n return this.cells.height;\n }\n get revision(): number {\n return this.version;\n }\n get x(): number {\n return this.left;\n }\n set x(value: number) {\n this.alive();\n finite(value);\n const b = this.extent;\n finite(value + b.x);\n finite(value + b.x + b.width);\n this.left = value;\n }\n get y(): number {\n return this.top;\n }\n set y(value: number) {\n this.alive();\n finite(value);\n const b = this.extent;\n finite(value + b.y);\n finite(value + b.y + b.height);\n this.top = value;\n }\n get zIndex(): number {\n return this.depth;\n }\n set zIndex(value: number) {\n this.alive();\n this.depth = finite(value);\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n this.alive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"visible must be boolean\");\n this.shown = value;\n }\n inBounds(x: number, y: number): boolean {\n return this.cells.inBounds(x, y);\n }\n get(x: number, y: number): TileColor {\n return this.cells.get(x, y);\n }\n set(x: number, y: number, value: TileColor): void {\n this.alive();\n const previous = this.cells.get(x, y);\n color(value);\n if (previous === value) return;\n this.cells.set(x, y, value);\n this.version++;\n for (const notify of this.listeners) notify(y * this.width + x);\n }\n fill(value: TileColor): void {\n this.alive();\n color(value);\n let changed = false;\n this.cells.forEach((old) => {\n if (old !== value) changed = true;\n });\n if (!changed) return;\n this.cells.fill(value);\n this.version++;\n for (const notify of this.listeners) notify(null);\n }\n copyTiles(): Grid<TileColor> {\n return Grid.generate(this.width, this.height, (x, y) => this.get(x, y));\n }\n /** Bounding-box origin by default; center is the polygon centroid. */\n tileToWorld(\n x: number,\n y: number,\n options: { center?: boolean } = {},\n ): WorldPoint {\n this.cells.get(x, y);\n const p = options.center\n ? this.geometry.center(x, y)\n : this.geometry.bounds(x, y);\n return worldPoint(p.x + this.x, p.y + this.y);\n }\n tileBounds(x: number, y: number): TileBounds {\n this.cells.get(x, y);\n const b = this.geometry.bounds(x, y);\n return { ...b, x: b.x + this.x, y: b.y + this.y };\n }\n tileVertices(x: number, y: number): readonly WorldPoint[] {\n this.cells.get(x, y);\n return this.geometry\n .vertices(x, y)\n .map((p) => worldPoint(p.x + this.x, p.y + this.y));\n }\n /** Hidden/null cells are still selectable. Infinite-tiling ties resolve before map clipping. */\n worldToTile(x: number, y: number): TilePoint | undefined {\n finite(x);\n finite(y);\n const b = this.extent,\n lx = x - this.x,\n ly = y - this.y;\n if (lx < b.x || ly < b.y || lx > b.x + b.width || ly > b.y + b.height)\n return undefined;\n const t = this.geometry.worldToTile(finite(x) - this.x, finite(y) - this.y);\n return this.inBounds(t.x, t.y) ? t : undefined;\n }\n screenToTile(view: ViewTransform, point: ScreenPoint): TilePoint | undefined {\n if (!containsScreenPoint(view, point)) return undefined;\n const p = screenToWorld(view, point);\n return this.worldToTile(p.x, p.y);\n }\n neighbors(x: number, y: number): readonly TilePoint[] {\n this.cells.get(x, y);\n return this.geometry.neighbors(x, y).filter((t) => this.inBounds(t.x, t.y));\n }\n /** World-space bounding candidates clipped to finite storage. */\n tilesInBounds(bounds: TileBounds): IterableIterator<TilePoint> {\n return this.geometry.tilesInBounds(\n { ...bounds, x: bounds.x - this.x, y: bounds.y - this.y },\n { x: 0, y: 0, width: this.width, height: this.height },\n );\n }\n /** @internal Same changed-cell/lifetime contract as textured Tilemap. */\n onTilesChanged(notify: (index: number | null) => void): () => void {\n this.alive();\n this.listeners.add(notify);\n const unregister = this.onDispose(() => this.listeners.delete(notify));\n return () => {\n unregister();\n this.listeners.delete(notify);\n };\n }\n}\n/** @internal Passive placement component; not a collider. */\nexport class GeometryTilemapLayer extends Component {\n static readonly type: ComponentType<GeometryTilemapLayer> =\n defineComponent<GeometryTilemapLayer>(\"GeometryTilemapLayer\");\n readonly type = GeometryTilemapLayer.type;\n constructor(readonly map: GeometryTilemap) {\n super();\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport type { Camera, LogicalResolution, Point } from \"./coordinates\";\n\nfunction clampCenter(\n value: number,\n origin: number,\n size: number,\n half: number,\n): number {\n return size <= 2 * half\n ? origin + size / 2\n : Math.max(origin + half, Math.min(origin + size - half, value));\n}\nexport interface WorldBounds extends Point, LogicalResolution {}\nexport interface CameraFollowOptions {\n resolution?: LogicalResolution;\n bounds?: WorldBounds;\n /** Exponential response per simulation second. Zero snaps immediately. */\n responsiveness?: number;\n}\n/** World-space tracking, called after movement/response; independent of host pixels and DOM. */\nexport class CameraFollow {\n private readonly width: number;\n private readonly height: number;\n private readonly bounds: WorldBounds | undefined;\n private readonly responsiveness: number;\n constructor(\n readonly camera: Camera,\n options: CameraFollowOptions = {},\n ) {\n this.width = positive(options.resolution?.width ?? 800, \"resolution.width\");\n this.height = positive(\n options.resolution?.height ?? 450,\n \"resolution.height\",\n );\n this.responsiveness = options.responsiveness ?? 0;\n if (!Number.isFinite(this.responsiveness) || this.responsiveness < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Camera responsiveness must be finite and nonnegative\",\n );\n if (options.bounds) {\n const b = options.bounds;\n positive(b.width, \"bounds.width\");\n positive(b.height, \"bounds.height\");\n if (\n !Number.isFinite(b.x) ||\n !Number.isFinite(b.y) ||\n !Number.isFinite(b.x + b.width) ||\n !Number.isFinite(b.y + b.height)\n )\n throw new EngineError(\"INVALID_VALUE\", \"Camera bounds must be finite\");\n this.bounds = { ...b };\n }\n }\n update(target: Point, seconds: number): void {\n if (\n !Number.isFinite(target.x) ||\n !Number.isFinite(target.y) ||\n !Number.isFinite(seconds) ||\n seconds < 0\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Camera target/time must be finite; time must be nonnegative\",\n );\n const b = this.bounds,\n hx = this.width / this.camera.zoom / 2,\n hy = this.height / this.camera.zoom / 2;\n const x = b ? clampCenter(target.x, b.x, b.width, hx) : target.x,\n y = b ? clampCenter(target.y, b.y, b.height, hy) : target.y;\n const alpha =\n this.responsiveness === 0\n ? 1\n : -Math.expm1(-this.responsiveness * seconds);\n let cx = this.camera.x + this.width / 2,\n cy = this.camera.y + this.height / 2;\n cx += (x - cx) * alpha;\n cy += (y - cy) * alpha;\n if (b) {\n cx = clampCenter(cx, b.x, b.width, hx);\n cy = clampCenter(cy, b.y, b.height, hy);\n }\n const left = cx - this.width / 2,\n top = cy - this.height / 2;\n if (!Number.isFinite(left) || !Number.isFinite(top))\n throw new EngineError(\"INVALID_VALUE\", \"Camera tracking overflowed\");\n this.camera.x = left;\n this.camera.y = top;\n }\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport type { Point, TilePoint } from \"./coordinates\";\n\nexport interface TileBounds extends Point {\n readonly width: number;\n readonly height: number;\n}\nexport const HexOrientation = { Pointy: \"pointy\", Flat: \"flat\" } as const;\nexport type HexOrientation =\n (typeof HexOrientation)[keyof typeof HexOrientation];\nexport type TileGeometryKind = \"square\" | \"triangle\" | \"hex\";\nfunction finite(...values: number[]): void {\n if (values.some((v) => !Number.isFinite(v)))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile geometry coordinates must be finite\",\n );\n}\nfunction integer(x: number, y: number): void {\n if (!Number.isSafeInteger(x) || !Number.isSafeInteger(y))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile coordinates must be safe integers\",\n );\n}\nfunction rect(b: TileBounds): void {\n finite(b.x, b.y, b.width, b.height, b.x + b.width, b.y + b.height);\n if (b.width < 0 || b.height < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Tile query extents must be nonnegative\",\n );\n}\nconst tile = (x: number, y: number): TilePoint => {\n integer(x, y);\n return { space: \"tile\", x: x || 0, y: y || 0 };\n};\nconst directions = [\n [1, 0],\n [1, -1],\n [0, -1],\n [-1, 0],\n [-1, 1],\n [0, 1],\n] as const;\n\n/** Immutable local-space tiling; x/y are axial q/r for hexagons. No cell storage. */\nexport class TileGeometry {\n private constructor(\n readonly kind: TileGeometryKind,\n readonly width: number,\n readonly height: number,\n readonly orientation: HexOrientation = HexOrientation.Pointy,\n ) {\n positive(width, \"tile width\");\n positive(height, \"tile height\");\n Object.freeze(this);\n }\n static square(options: { width: number; height?: number }): TileGeometry {\n return new TileGeometry(\n \"square\",\n options.width,\n options.height ?? options.width,\n );\n }\n static triangle(options: { width: number; height?: number }): TileGeometry {\n return new TileGeometry(\n \"triangle\",\n options.width,\n options.height ?? (options.width * Math.sqrt(3)) / 2,\n );\n }\n static hex(options: {\n radius: number;\n orientation?: HexOrientation;\n }): TileGeometry {\n const radius = positive(options.radius, \"hex radius\");\n const orientation = options.orientation ?? HexOrientation.Pointy;\n if (!Object.values(HexOrientation).includes(orientation))\n throw new EngineError(\"INVALID_VALUE\", \"Unknown hex orientation\");\n return new TileGeometry(\n \"hex\",\n radius * (orientation === HexOrientation.Pointy ? Math.sqrt(3) : 2),\n radius * (orientation === HexOrientation.Pointy ? 2 : Math.sqrt(3)),\n orientation,\n );\n }\n /** Triangle orientation is invariant under negative coordinates too. */\n pointsUp(x: number, y: number): boolean {\n integer(x, y);\n if (this.kind !== \"triangle\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"pointsUp requires triangle geometry\",\n );\n return (x + y) % 2 === 0;\n }\n center(x: number, y: number): Point {\n integer(x, y);\n let cx: number, cy: number;\n if (this.kind === \"hex\") {\n cx =\n this.width *\n (this.orientation === HexOrientation.Pointy ? x + y / 2 : 0.75 * x);\n cy =\n this.height *\n (this.orientation === HexOrientation.Pointy ? 0.75 * y : y + x / 2);\n } else {\n cx = (x * (this.kind === \"triangle\" ? 0.5 : 1) + 0.5) * this.width;\n cy =\n (y +\n (this.kind === \"triangle\"\n ? this.pointsUp(x, y)\n ? 2 / 3\n : 1 / 3\n : 0.5)) *\n this.height;\n }\n finite(cx, cy);\n return { x: cx, y: cy };\n }\n bounds(x: number, y: number): TileBounds {\n const c = this.center(x, y);\n const top =\n this.kind === \"triangle\" ? y * this.height : c.y - this.height / 2;\n return {\n x: c.x - this.width / 2,\n y: top,\n width: this.width,\n height: this.height,\n };\n }\n vertices(x: number, y: number): readonly Point[] {\n const b = this.bounds(x, y),\n w = this.width,\n h = this.height;\n const coords =\n this.kind === \"square\"\n ? [\n [0, 0],\n [w, 0],\n [w, h],\n [0, h],\n ]\n : this.kind === \"triangle\"\n ? this.pointsUp(x, y)\n ? [\n [w / 2, 0],\n [w, h],\n [0, h],\n ]\n : [\n [0, 0],\n [w, 0],\n [w / 2, h],\n ]\n : this.orientation === HexOrientation.Pointy\n ? [\n [w / 2, 0],\n [w, h / 4],\n [w, (3 * h) / 4],\n [w / 2, h],\n [0, (3 * h) / 4],\n [0, h / 4],\n ]\n : [\n [w / 4, 0],\n [(3 * w) / 4, 0],\n [w, h / 2],\n [(3 * w) / 4, h],\n [w / 4, h],\n [0, h / 2],\n ];\n return coords.map(([dx, dy]) => ({\n x: b.x + (dx ?? 0),\n y: b.y + (dy ?? 0),\n }));\n }\n neighbors(x: number, y: number): readonly TilePoint[] {\n integer(x, y);\n if (this.kind === \"hex\")\n return directions.map(([dx, dy]) => tile(x + dx, y + dy));\n if (this.kind === \"triangle\")\n return [\n tile(x - 1, y),\n tile(x + 1, y),\n tile(x, y + (this.pointsUp(x, y) ? 1 : -1)),\n ];\n return [tile(x + 1, y), tile(x, y + 1), tile(x - 1, y), tile(x, y - 1)];\n }\n /** Hex graph distance; square/triangle do not silently use a different metric. */\n distance(a: Point, b: Point): number {\n integer(a.x, a.y);\n integer(b.x, b.y);\n if (this.kind !== \"hex\")\n throw new EngineError(\"INVALID_VALUE\", \"distance requires hex geometry\");\n const x = a.x - b.x,\n y = a.y - b.y;\n return (Math.abs(x) + Math.abs(y) + Math.abs(x + y)) / 2;\n }\n /** Infinite tiling ownership. Square is half-open; polygon ties use lowest y then x. */\n worldToTile(x: number, y: number): TilePoint {\n finite(x, y);\n if (this.kind === \"square\")\n return tile(Math.floor(x / this.width), Math.floor(y / this.height));\n let q = (x * 2) / this.width,\n r = y / this.height;\n if (this.kind === \"hex\") {\n if (this.orientation === HexOrientation.Pointy) {\n r = y / (this.height * 0.75);\n q = x / this.width - r / 2;\n } else {\n q = x / (this.width * 0.75);\n r = y / this.height - q / 2;\n }\n }\n const col = Math.floor(q),\n row = Math.floor(r);\n integer(col, row);\n // A small closed-polygon search handles shared edges/vertices deterministically.\n for (let ty = row - 1; ty <= row + 1; ty++)\n for (let tx = col - 2; tx <= col + 1; tx++) {\n const v = this.vertices(tx, ty);\n let inside = true;\n for (let i = 0; i < v.length; i++) {\n const a = v[i],\n b = v[(i + 1) % v.length];\n if (!a || !b) continue;\n const cross = (b.x - a.x) * (y - a.y) - (b.y - a.y) * (x - a.x);\n if (cross < -1e-10 * this.width * this.height) {\n inside = false;\n break;\n }\n }\n if (inside) return tile(tx, ty);\n }\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Point exceeds reliable tile geometry precision\",\n );\n }\n /** Bounding-box candidates, row-major, optionally clipped to a finite coordinate rectangle.\n * Touching bounds are included. No full-map scan; exact polygon picking uses worldToTile.\n */\n *tilesInBounds(\n bounds: TileBounds,\n limit?: TileBounds,\n ): IterableIterator<TilePoint> {\n rect(bounds);\n if (limit) {\n rect(limit);\n integer(limit.x, limit.y);\n integer(limit.width, limit.height);\n }\n if (\n !bounds.width ||\n !bounds.height ||\n (limit && (!limit.width || !limit.height))\n )\n return;\n const w = this.width,\n h = this.height;\n let top: number, bottom: number;\n if (this.kind !== \"hex\") {\n top = Math.ceil(bounds.y / h) - 1;\n bottom = Math.floor((bounds.y + bounds.height) / h);\n } else if (this.orientation === HexOrientation.Pointy) {\n top = Math.ceil((bounds.y - h / 2) / (h * 0.75));\n bottom = Math.floor((bounds.y + bounds.height + h / 2) / (h * 0.75));\n } else {\n top = Math.ceil(\n (bounds.y - h / 2) / h - (bounds.x + bounds.width + w / 2) / (w * 1.5),\n );\n bottom = Math.floor(\n (bounds.y + bounds.height + h / 2) / h - (bounds.x - w / 2) / (w * 1.5),\n );\n }\n if (limit) {\n top = Math.max(top, limit.y);\n bottom = Math.min(bottom, limit.y + limit.height - 1);\n }\n integer(top, bottom);\n for (let y = top; y <= bottom; y++) {\n let left: number, right: number;\n if (this.kind !== \"hex\") {\n const step = w * (this.kind === \"triangle\" ? 0.5 : 1);\n left = Math.ceil((bounds.x - w) / step);\n right = Math.floor((bounds.x + bounds.width) / step);\n } else if (this.orientation === HexOrientation.Pointy) {\n left = Math.ceil((bounds.x - w / 2) / w - y / 2);\n right = Math.floor((bounds.x + bounds.width + w / 2) / w - y / 2);\n } else {\n left = Math.max(\n Math.ceil((bounds.x - w / 2) / (w * 0.75)),\n Math.ceil(2 * ((bounds.y - h / 2) / h - y)),\n );\n right = Math.min(\n Math.floor((bounds.x + bounds.width + w / 2) / (w * 0.75)),\n Math.floor(2 * ((bounds.y + bounds.height + h / 2) / h - y)),\n );\n }\n if (limit) {\n left = Math.max(left, limit.x);\n right = Math.min(right, limit.x + limit.width - 1);\n }\n integer(left, right);\n for (let x = left; x <= right; x++) yield tile(x, y);\n }\n }\n /** Inclusive axial disk, row-major, including its center. */\n *withinRadius(\n x: number,\n y: number,\n radius: number,\n ): IterableIterator<TilePoint> {\n integer(x, y);\n integer(radius, 0);\n if (this.kind !== \"hex\" || radius < 0)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"withinRadius requires hex geometry and a nonnegative integer radius\",\n );\n for (let dy = -radius; dy <= radius; dy++)\n for (\n let dx = Math.max(-radius, -dy - radius);\n dx <= Math.min(radius, -dy + radius);\n dx++\n )\n yield tile(x + dx, y + dy);\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\n\n/** Physical UI Events code values plus F13–F24; Unidentified is not bindable. */\nexport const KeyCode = {\n A: \"KeyA\",\n B: \"KeyB\",\n C: \"KeyC\",\n D: \"KeyD\",\n E: \"KeyE\",\n F: \"KeyF\",\n G: \"KeyG\",\n H: \"KeyH\",\n I: \"KeyI\",\n J: \"KeyJ\",\n K: \"KeyK\",\n L: \"KeyL\",\n M: \"KeyM\",\n N: \"KeyN\",\n O: \"KeyO\",\n P: \"KeyP\",\n Q: \"KeyQ\",\n R: \"KeyR\",\n S: \"KeyS\",\n T: \"KeyT\",\n U: \"KeyU\",\n V: \"KeyV\",\n W: \"KeyW\",\n X: \"KeyX\",\n Y: \"KeyY\",\n Z: \"KeyZ\",\n Digit0: \"Digit0\",\n Digit1: \"Digit1\",\n Digit2: \"Digit2\",\n Digit3: \"Digit3\",\n Digit4: \"Digit4\",\n Digit5: \"Digit5\",\n Digit6: \"Digit6\",\n Digit7: \"Digit7\",\n Digit8: \"Digit8\",\n Digit9: \"Digit9\",\n Space: \"Space\",\n Enter: \"Enter\",\n Escape: \"Escape\",\n Tab: \"Tab\",\n Backspace: \"Backspace\",\n ArrowLeft: \"ArrowLeft\",\n ArrowRight: \"ArrowRight\",\n ArrowUp: \"ArrowUp\",\n ArrowDown: \"ArrowDown\",\n ShiftLeft: \"ShiftLeft\",\n ShiftRight: \"ShiftRight\",\n ControlLeft: \"ControlLeft\",\n ControlRight: \"ControlRight\",\n AltLeft: \"AltLeft\",\n AltRight: \"AltRight\",\n MetaLeft: \"MetaLeft\",\n MetaRight: \"MetaRight\",\n CapsLock: \"CapsLock\",\n NumLock: \"NumLock\",\n ScrollLock: \"ScrollLock\",\n ContextMenu: \"ContextMenu\",\n Insert: \"Insert\",\n Delete: \"Delete\",\n Home: \"Home\",\n End: \"End\",\n PageUp: \"PageUp\",\n PageDown: \"PageDown\",\n Backquote: \"Backquote\",\n Minus: \"Minus\",\n Equal: \"Equal\",\n BracketLeft: \"BracketLeft\",\n BracketRight: \"BracketRight\",\n Backslash: \"Backslash\",\n Semicolon: \"Semicolon\",\n Quote: \"Quote\",\n Comma: \"Comma\",\n Period: \"Period\",\n Slash: \"Slash\",\n IntlBackslash: \"IntlBackslash\",\n IntlRo: \"IntlRo\",\n IntlYen: \"IntlYen\",\n Convert: \"Convert\",\n NonConvert: \"NonConvert\",\n KanaMode: \"KanaMode\",\n Lang1: \"Lang1\",\n Lang2: \"Lang2\",\n Lang3: \"Lang3\",\n Lang4: \"Lang4\",\n Lang5: \"Lang5\",\n F1: \"F1\",\n F2: \"F2\",\n F3: \"F3\",\n F4: \"F4\",\n F5: \"F5\",\n F6: \"F6\",\n F7: \"F7\",\n F8: \"F8\",\n F9: \"F9\",\n F10: \"F10\",\n F11: \"F11\",\n F12: \"F12\",\n F13: \"F13\",\n F14: \"F14\",\n F15: \"F15\",\n F16: \"F16\",\n F17: \"F17\",\n F18: \"F18\",\n F19: \"F19\",\n F20: \"F20\",\n F21: \"F21\",\n F22: \"F22\",\n F23: \"F23\",\n F24: \"F24\",\n Numpad0: \"Numpad0\",\n Numpad1: \"Numpad1\",\n Numpad2: \"Numpad2\",\n Numpad3: \"Numpad3\",\n Numpad4: \"Numpad4\",\n Numpad5: \"Numpad5\",\n Numpad6: \"Numpad6\",\n Numpad7: \"Numpad7\",\n Numpad8: \"Numpad8\",\n Numpad9: \"Numpad9\",\n NumpadAdd: \"NumpadAdd\",\n NumpadSubtract: \"NumpadSubtract\",\n NumpadMultiply: \"NumpadMultiply\",\n NumpadDivide: \"NumpadDivide\",\n NumpadDecimal: \"NumpadDecimal\",\n NumpadEnter: \"NumpadEnter\",\n NumpadEqual: \"NumpadEqual\",\n NumpadComma: \"NumpadComma\",\n PrintScreen: \"PrintScreen\",\n Pause: \"Pause\",\n Help: \"Help\",\n AudioVolumeMute: \"AudioVolumeMute\",\n AudioVolumeDown: \"AudioVolumeDown\",\n AudioVolumeUp: \"AudioVolumeUp\",\n MediaPlayPause: \"MediaPlayPause\",\n MediaStop: \"MediaStop\",\n MediaTrackNext: \"MediaTrackNext\",\n MediaTrackPrevious: \"MediaTrackPrevious\",\n BrowserBack: \"BrowserBack\",\n BrowserForward: \"BrowserForward\",\n BrowserRefresh: \"BrowserRefresh\",\n BrowserStop: \"BrowserStop\",\n BrowserSearch: \"BrowserSearch\",\n BrowserFavorites: \"BrowserFavorites\",\n BrowserHome: \"BrowserHome\",\n NumpadBackspace: \"NumpadBackspace\",\n NumpadClear: \"NumpadClear\",\n NumpadClearEntry: \"NumpadClearEntry\",\n NumpadHash: \"NumpadHash\",\n NumpadMemoryAdd: \"NumpadMemoryAdd\",\n NumpadMemoryClear: \"NumpadMemoryClear\",\n NumpadMemoryRecall: \"NumpadMemoryRecall\",\n NumpadMemoryStore: \"NumpadMemoryStore\",\n NumpadMemorySubtract: \"NumpadMemorySubtract\",\n NumpadParenLeft: \"NumpadParenLeft\",\n NumpadParenRight: \"NumpadParenRight\",\n NumpadStar: \"NumpadStar\",\n Fn: \"Fn\",\n FnLock: \"FnLock\",\n Eject: \"Eject\",\n LaunchApp1: \"LaunchApp1\",\n LaunchApp2: \"LaunchApp2\",\n LaunchMail: \"LaunchMail\",\n MediaSelect: \"MediaSelect\",\n Power: \"Power\",\n Sleep: \"Sleep\",\n WakeUp: \"WakeUp\",\n Again: \"Again\",\n Copy: \"Copy\",\n Cut: \"Cut\",\n Find: \"Find\",\n Open: \"Open\",\n Paste: \"Paste\",\n Props: \"Props\",\n Select: \"Select\",\n Undo: \"Undo\",\n Abort: \"Abort\",\n Resume: \"Resume\",\n Suspend: \"Suspend\",\n Hiragana: \"Hiragana\",\n Katakana: \"Katakana\",\n Hyper: \"Hyper\",\n Super: \"Super\",\n Turbo: \"Turbo\",\n} as const;\nexport type KeyCode = (typeof KeyCode)[keyof typeof KeyCode];\nconst knownCodes = new Set<string>(Object.values(KeyCode));\nexport function isKeyCode(value: unknown): value is KeyCode {\n return typeof value === \"string\" && knownCodes.has(value);\n}\nexport function parseKeyCode(value: unknown): KeyCode {\n if (!isKeyCode(value))\n throw new EngineError(\n \"INVALID_KEY_CODE\",\n \"Unknown physical keyboard code\",\n { value },\n );\n return value;\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { ActionKind, ActionSet, ActionToken } from \"./action-types\";\nimport { KeyCode, parseKeyCode } from \"./key-code\";\nexport interface ButtonBinding {\n readonly keys?: readonly KeyCode[];\n}\nexport interface Axis1DBinding {\n readonly negative?: readonly KeyCode[];\n readonly positive?: readonly KeyCode[];\n}\nexport interface Axis2DBinding {\n readonly x?: Axis1DBinding;\n readonly y?: Axis1DBinding;\n}\nexport interface Axis3DBinding extends Axis2DBinding {\n readonly z?: Axis1DBinding;\n}\nexport type ActionBinding<K extends ActionKind> = K extends \"button\"\n ? ButtonBinding\n : K extends \"axis1d\"\n ? Axis1DBinding\n : K extends \"axis2d\"\n ? Axis2DBinding\n : Axis3DBinding;\nexport type ActionBindings<A extends ActionSet> = {\n readonly [N in keyof A]?: ActionBinding<A[N][\"kind\"]>;\n};\ntype Binding = ButtonBinding | Axis1DBinding | Axis2DBinding | Axis3DBinding;\nexport function checkedBinding(action: ActionToken, value: unknown): Binding {\n const record = (v: unknown, allowed: readonly string[]) => {\n if (!v || typeof v !== \"object\" || Array.isArray(v))\n throw new EngineError(\"INVALID_BINDING\", \"Binding must be an object\");\n const r = v as Record<string, unknown>;\n if (Object.keys(r).some((k) => !allowed.includes(k)))\n throw new EngineError(\"INVALID_BINDING\", \"Unknown binding field\", {\n action: action.name,\n });\n return r;\n };\n const codes = (v: unknown): readonly KeyCode[] => {\n if (v === undefined) return Object.freeze([]);\n if (!Array.isArray(v))\n throw new EngineError(\"INVALID_BINDING\", \"Key list must be an array\");\n return Object.freeze([...new Set(v.map(parseKeyCode))]);\n };\n const axis = (v: unknown): Axis1DBinding => {\n const r = record(v ?? {}, [\"negative\", \"positive\"]);\n return Object.freeze({\n negative: codes(r.negative),\n positive: codes(r.positive),\n });\n };\n if (action.kind === \"button\")\n return Object.freeze({ keys: codes(record(value, [\"keys\"]).keys) });\n if (action.kind === \"axis1d\") return axis(value);\n const r = record(\n value,\n action.kind === \"axis2d\" ? [\"x\", \"y\"] : [\"x\", \"y\", \"z\"],\n );\n return Object.freeze(\n action.kind === \"axis2d\"\n ? { x: axis(r.x), y: axis(r.y) }\n : { x: axis(r.x), y: axis(r.y), z: axis(r.z) },\n );\n}\nexport function keyLists(\n binding: Binding,\n path = \"\",\n): Array<{ path: string; keys: readonly KeyCode[] }> {\n const lists: Array<{ path: string; keys: readonly KeyCode[] }> = [];\n for (const [key, value] of Object.entries(binding)) {\n if (Array.isArray(value)) lists.push({ path: path + key, keys: value });\n else lists.push(...keyLists(value, `${path}${key}.`));\n }\n return lists;\n}\nexport function editBinding(\n current: Binding,\n patch: Binding,\n remove: boolean,\n): Binding {\n const result: Record<string, unknown> = { ...current };\n for (const [name, value] of Object.entries(patch)) {\n const old = (current as Record<string, unknown>)[name];\n if (Array.isArray(value))\n result[name] = remove\n ? (old as KeyCode[]).filter((k) => !value.includes(k))\n : [...new Set([...(old as KeyCode[]), ...value])];\n else result[name] = editBinding(old as Binding, value as Binding, remove);\n }\n return result as Binding;\n}\n\n/** Physical keyboard presets for any user-defined Axis2D Action. */\nexport const KeyboardBindings = Object.freeze({\n WASD: Object.freeze({\n x: Object.freeze({\n negative: Object.freeze([KeyCode.A]),\n positive: Object.freeze([KeyCode.D]),\n }),\n y: Object.freeze({\n negative: Object.freeze([KeyCode.W]),\n positive: Object.freeze([KeyCode.S]),\n }),\n }),\n Arrows: Object.freeze({\n x: Object.freeze({\n negative: Object.freeze([KeyCode.ArrowLeft]),\n positive: Object.freeze([KeyCode.ArrowRight]),\n }),\n y: Object.freeze({\n negative: Object.freeze([KeyCode.ArrowUp]),\n positive: Object.freeze([KeyCode.ArrowDown]),\n }),\n }),\n});\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { ActionKind, ActionValue } from \"./action-types\";\nexport interface ActionSchema {\n readonly name: string;\n readonly kind: ActionKind;\n readonly normalize: boolean;\n}\nexport interface ActionFrame {\n readonly values: Readonly<Record<string, ActionValue<ActionKind>>>;\n readonly events: readonly { readonly name: string; readonly down: boolean }[];\n}\n/** Shared validation for device-independent Action values, including JSON imports. */\nexport function checkedActionValue(\n action: { readonly kind: ActionKind; readonly normalize?: boolean },\n value: unknown,\n): ActionValue<ActionKind> {\n if (action.kind === \"button\") {\n if (typeof value !== \"boolean\")\n throw new EngineError(\n \"INVALID_ACTION_VALUE\",\n \"Button requires a boolean\",\n );\n return value;\n }\n const number = (v: unknown) => {\n if (typeof v !== \"number\" || !Number.isFinite(v) || Math.abs(v) > 1)\n throw new EngineError(\n \"INVALID_ACTION_VALUE\",\n \"Axis components must be finite and between -1 and 1\",\n );\n return v;\n };\n if (action.kind === \"axis1d\") return number(value);\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n throw new EngineError(\"INVALID_ACTION_VALUE\", \"Axis requires a vector\");\n const v = value as Record<string, unknown>,\n expected = action.kind === \"axis2d\" ? [\"x\", \"y\"] : [\"x\", \"y\", \"z\"];\n if (\n Object.keys(v).length !== expected.length ||\n Object.keys(v).some((k) => !expected.includes(k))\n )\n throw new EngineError(\n \"INVALID_ACTION_VALUE\",\n \"Unexpected vector component\",\n );\n return Object.freeze(\n action.kind === \"axis2d\"\n ? { x: number(v.x), y: number(v.y) }\n : { x: number(v.x), y: number(v.y), z: number(v.z) },\n );\n}\nexport function parseActionFrame(\n value: unknown,\n schema: readonly ActionSchema[],\n): ActionFrame {\n const invalid = () => {\n throw new EngineError(\"REPLAY_DATA\", \"Malformed Action frame\");\n };\n if (!value || typeof value !== \"object\" || Array.isArray(value))\n return invalid();\n const f = value as Record<string, unknown>;\n if (\n Object.keys(f).length !== 2 ||\n !f.values ||\n typeof f.values !== \"object\" ||\n Array.isArray(f.values) ||\n !Array.isArray(f.events) ||\n f.events.length > 10000\n )\n return invalid();\n const raw = f.values as Record<string, unknown>,\n values: Record<string, ActionValue<ActionKind>> = Object.create(null),\n definitions = new Map(schema.map((s) => [s.name, s]));\n if (\n Object.keys(raw).length !== schema.length ||\n Object.keys(raw).some((n) => !definitions.has(n))\n )\n return invalid();\n for (const s of schema) {\n const v = checkedActionValue(s, raw[s.name]);\n if (\n typeof v === \"object\" &&\n s.normalize &&\n Math.hypot(v.x, v.y, \"z\" in v ? v.z : 0) > 1 + 1e-12\n )\n return invalid();\n values[s.name] = v;\n }\n const held = new Map<string, boolean>();\n const events = f.events.map((event: unknown) => {\n if (!event || typeof event !== \"object\" || Array.isArray(event))\n return invalid();\n const e = event as Record<string, unknown>;\n if (\n Object.keys(e).length !== 2 ||\n typeof e.name !== \"string\" ||\n typeof e.down !== \"boolean\" ||\n definitions.get(e.name)?.kind !== \"button\"\n )\n return invalid();\n if (held.has(e.name) && held.get(e.name) === e.down) return invalid();\n held.set(e.name, e.down);\n return Object.freeze({ name: e.name, down: e.down });\n });\n for (const [name, down] of held) if (values[name] !== down) return invalid();\n return Object.freeze({\n values: Object.freeze(values),\n events: Object.freeze(events),\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nexport type ActionKind = \"button\" | \"axis1d\" | \"axis2d\" | \"axis3d\";\nexport interface Axis2DValue {\n readonly x: number;\n readonly y: number;\n}\nexport interface Axis3DValue extends Axis2DValue {\n readonly z: number;\n}\nexport type ActionValue<K extends ActionKind> = K extends \"button\"\n ? boolean\n : K extends \"axis1d\"\n ? number\n : K extends \"axis2d\"\n ? Axis2DValue\n : Axis3DValue;\n/** Axis2D writes reject a third component even when supplied through a typed variable. */\nexport type ActionInputValue<K extends ActionKind> = K extends \"axis2d\"\n ? Axis2DValue & { readonly z?: never }\n : ActionValue<K>;\nexport interface ActionDefinition<K extends ActionKind = ActionKind> {\n readonly kind: K;\n readonly normalize: boolean;\n}\nexport interface ActionToken<\n K extends ActionKind = ActionKind,\n N extends string = string,\n> extends ActionDefinition<K> {\n readonly id: symbol;\n readonly name: N;\n}\nexport const Action = {\n button: (): ActionDefinition<\"button\"> =>\n Object.freeze({ kind: \"button\", normalize: false }),\n axis1D: (): ActionDefinition<\"axis1d\"> =>\n Object.freeze({ kind: \"axis1d\", normalize: false }),\n axis2D: (options: { normalize?: boolean } = {}): ActionDefinition<\"axis2d\"> =>\n Object.freeze({ kind: \"axis2d\", normalize: options.normalize ?? true }),\n axis3D: (options: { normalize?: boolean } = {}): ActionDefinition<\"axis3d\"> =>\n Object.freeze({ kind: \"axis3d\", normalize: options.normalize ?? true }),\n};\nexport type ActionSet = Readonly<Record<string, ActionToken>>;\nexport function defineActions<const D extends Record<string, ActionDefinition>>(\n definitions: D,\n): { readonly [N in keyof D]: ActionToken<D[N][\"kind\"], N & string> } {\n const result: Record<string, ActionToken> = Object.create(null);\n for (const [name, definition] of Object.entries(definitions)) {\n if (\n !name.trim() ||\n ![\"button\", \"axis1d\", \"axis2d\", \"axis3d\"].includes(definition.kind) ||\n typeof definition.normalize !== \"boolean\"\n )\n throw new EngineError(\"INVALID_ACTION\", \"Invalid action definition\", {\n name,\n });\n result[name] = Object.freeze({ ...definition, id: Symbol(name), name });\n }\n return Object.freeze(result) as {\n readonly [N in keyof D]: ActionToken<D[N][\"kind\"], N & string>;\n };\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"../foundation/lifetime\";\n/** @internal Shared lifetime for logical and device contributions. */\nexport abstract class OwnedInputSource {\n private dead = false;\n private accepting = true;\n private removeOwner: (() => void) | undefined;\n get disposed(): boolean {\n return this.dead;\n }\n get enabled(): boolean {\n return this.accepting;\n }\n set enabled(value: boolean) {\n if (this.dead)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input source has been disposed\");\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"Source enabled must be boolean\");\n if (value === this.accepting) return;\n this.accepting = value;\n if (!value) this.release(false);\n }\n /** @internal */ own(owner: LifetimeOwner): void {\n if (owner.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input owner has been disposed\");\n this.removeOwner = owner.onDispose(() => this.dispose());\n }\n protected writable(neutral: boolean): boolean {\n if (!this.dead) return this.accepting;\n if (neutral) return false;\n throw new EngineError(\"OWNER_DISPOSED\", \"Input source has been disposed\");\n }\n protected abstract release(remove: boolean): void;\n clear(): void {\n if (!this.dead) this.release(false);\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const remove = this.removeOwner;\n this.removeOwner = undefined;\n cleanupAll(\n [() => this.release(true), () => remove?.()],\n \"Input source cleanup failed\",\n );\n }\n}\n","import {\n type ActionBinding,\n type ActionBindings,\n type Axis1DBinding,\n type Axis2DBinding,\n type Axis3DBinding,\n type ButtonBinding,\n checkedBinding,\n editBinding,\n keyLists,\n} from \"./action-bindings\";\nimport {\n type ActionFrame,\n type ActionSchema,\n checkedActionValue,\n} from \"./action-frame\";\nimport type {\n ActionInputValue,\n ActionKind,\n ActionSet,\n ActionToken,\n ActionValue,\n Axis2DValue,\n Axis3DValue,\n} from \"./action-types\";\n\nexport type {\n ActionBinding,\n ActionBindings,\n Axis1DBinding,\n Axis2DBinding,\n Axis3DBinding,\n ButtonBinding,\n} from \"./action-bindings\";\nexport { KeyboardBindings } from \"./action-bindings\";\nexport type {\n ActionDefinition,\n ActionInputValue,\n ActionKind,\n ActionSet,\n ActionToken,\n ActionValue,\n Axis2DValue,\n Axis3DValue,\n} from \"./action-types\";\nexport { Action, defineActions } from \"./action-types\";\n\nimport { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent, EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport { type Scene, SceneState } from \"../scene/scene\";\nimport type { ActionInputPort, InputSystem } from \"./input\";\nimport { OwnedInputSource } from \"./input-source\";\nimport type { KeyCode } from \"./key-code\";\n\ntype Token<A extends ActionSet> = A[keyof A];\ntype ButtonToken<A extends ActionSet> = Extract<Token<A>, { kind: \"button\" }>;\ntype Value = boolean | number | Axis2DValue | Axis3DValue;\ntype Binding = ButtonBinding | Axis1DBinding | Axis2DBinding | Axis3DBinding;\nexport interface ButtonState {\n readonly held: boolean;\n readonly pressed: boolean;\n readonly released: boolean;\n readonly pressCount: number;\n readonly releaseCount: number;\n}\nexport type ActionSnapshot<A extends ActionSet> = {\n readonly [N in keyof A]: {\n readonly kind: A[N][\"kind\"];\n readonly value: ActionValue<A[N][\"kind\"]>;\n } & (A[N][\"kind\"] extends \"button\"\n ? { readonly button: ButtonState }\n : unknown);\n};\nexport interface ButtonTransition<\n T extends ActionToken = ActionToken<\"button\">,\n> {\n readonly action: T;\n readonly down: boolean;\n}\ninterface Entry {\n value: Value;\n frame: Value;\n button: ButtonState;\n binding: Binding;\n defaults: Binding;\n}\nconst noButton: ButtonState = Object.freeze({\n held: false,\n pressed: false,\n released: false,\n pressCount: 0,\n releaseCount: 0,\n});\nconst pressedEvent = defineEvent<ActionToken>(\"ActionPressed\");\nconst clamp = (n: number) => Math.max(-1, Math.min(1, n));\nfunction neutral(action: ActionToken): Value {\n if (action.kind === \"button\") return false;\n if (action.kind === \"axis1d\") return 0;\n return Object.freeze(\n action.kind === \"axis2d\" ? { x: 0, y: 0 } : { x: 0, y: 0, z: 0 },\n );\n}\nfunction isNeutral(value: Value): boolean {\n return typeof value === \"boolean\"\n ? !value\n : typeof value === \"number\"\n ? value === 0\n : value.x === 0 && value.y === 0 && (!(\"z\" in value) || value.z === 0);\n}\n/** Scene-owned logical input, sampled automatically at each Engine.step boundary. */\nexport class ActionController<A extends ActionSet>\n implements LifetimeOwner, ActionInputPort\n{\n private readonly lifetime = new Lifetime();\n private readonly entries = new Map<ActionToken, Entry>();\n private readonly sources = new Map<\n ActionSource<A>,\n Map<ActionToken, Value>\n >();\n private readonly bus = new EventBus();\n private keyboardAllowed = true;\n private readonly blockedKeys = new Set<KeyCode>();\n private pending: ButtonTransition[] = [];\n private transitions: readonly ButtonTransition[] = [];\n constructor(\n readonly actions: A,\n private readonly options: {\n scene: Scene;\n input: InputSystem;\n bindings?: ActionBindings<A>;\n keyboard?: boolean;\n },\n ) {\n if (options.keyboard !== undefined && typeof options.keyboard !== \"boolean\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Keyboard enabled must be boolean\",\n );\n this.keyboardAllowed = options.keyboard ?? true;\n for (const action of Object.values(actions)) {\n const binding = checkedBinding(\n action,\n options.bindings && Object.hasOwn(options.bindings, action.name)\n ? (options.bindings[action.name] ?? {})\n : {},\n );\n const value = neutral(action);\n this.entries.set(action, {\n value,\n frame: value,\n button: noButton,\n binding,\n defaults: binding,\n });\n }\n if (\n Object.keys(options.bindings ?? {}).some(\n (name) => !Object.hasOwn(actions, name),\n )\n )\n throw new EngineError(\"INVALID_ACTION\", \"Unknown action in bindings\");\n const off = options.input.registerActions(this);\n try {\n options.scene.claimInput(options.input);\n this.lifetime.onDispose(options.scene.onDispose(() => this.dispose()));\n } catch (error) {\n off();\n throw error;\n }\n this.lifetime.onDispose(off);\n this.keyChanged();\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get active(): boolean {\n return (\n !this.disposed &&\n this.options.scene.state === SceneState.Active &&\n this.options.scene.inputOwner === this.options.input\n );\n }\n get keyboardEnabled(): boolean {\n return this.keyboardAllowed;\n }\n set keyboardEnabled(value: boolean) {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Action controller has been disposed\",\n );\n if (typeof value !== \"boolean\")\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Keyboard enabled must be boolean\",\n );\n if (value === this.keyboardAllowed) return;\n this.keyboardAllowed = value;\n this.blockedKeys.clear();\n if (value) {\n for (const entry of this.entries.values())\n for (const list of keyLists(entry.binding))\n for (const key of list.keys)\n if (this.options.input.keyDown(key)) this.blockedKeys.add(key);\n }\n for (const action of this.entries.keys()) this.recompute(action);\n }\n get sourceCount(): number {\n return this.sources.size;\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n private entry(action: ActionToken): Entry {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Action controller has been disposed\",\n );\n const entry = this.entries.get(action);\n if (!entry)\n throw new EngineError(\n \"INVALID_ACTION\",\n \"Action belongs to another definition\",\n { action: action.name },\n );\n return entry;\n }\n value<T extends Token<A>>(action: T): ActionValue<T[\"kind\"]> {\n return this.entry(action).frame as ActionValue<T[\"kind\"]>;\n }\n schema(): readonly ActionSchema[] {\n return Object.freeze(\n [...this.entries.keys()]\n .map(({ name, kind, normalize }) =>\n Object.freeze({ name, kind, normalize }),\n )\n .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)),\n );\n }\n frame(): ActionFrame {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Action controller has been disposed\",\n );\n return Object.freeze({\n values: Object.freeze(\n Object.fromEntries(\n [...this.entries].map(([a, e]) => [a.name, e.frame]),\n ),\n ),\n events: Object.freeze(\n this.transitions.map((e) =>\n Object.freeze({ name: e.action.name, down: e.down }),\n ),\n ),\n });\n }\n reader<T extends Token<A>>(action: T): ActionReader<T[\"kind\"]> {\n this.entry(action);\n const controller = this;\n return Object.freeze({\n scene: this.options.scene,\n kind: action.kind,\n get disposed() {\n return controller.disposed;\n },\n value: () => controller.value(action),\n });\n }\n button(action: ButtonToken<A>): ButtonState {\n return this.entry(action).button;\n }\n pressed(action: ButtonToken<A>): boolean {\n return this.button(action).pressed;\n }\n released(action: ButtonToken<A>): boolean {\n return this.button(action).released;\n }\n get events(): readonly ButtonTransition<ButtonToken<A>>[] {\n return this.transitions as readonly ButtonTransition<ButtonToken<A>>[];\n }\n snapshot(): ActionSnapshot<A> {\n return Object.fromEntries(\n [...this.entries].map(([action, entry]) => [\n action.name,\n {\n kind: action.kind,\n value:\n typeof entry.frame === \"object\" ? { ...entry.frame } : entry.frame,\n ...(action.kind === \"button\" ? { button: { ...entry.button } } : {}),\n },\n ]),\n ) as ActionSnapshot<A>;\n }\n onPressed(action: ButtonToken<A>, handler: () => void): () => void {\n this.entry(action);\n return this.bus.on(pressedEvent, (token) => {\n if (token === action) return handler();\n });\n }\n createSource(owner?: LifetimeOwner): ActionSource<A> {\n if (this.disposed || owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input owner has been disposed\");\n const source = new ActionSource(this);\n this.sources.set(source, new Map());\n try {\n if (owner) source.own(owner);\n } catch (error) {\n source.dispose();\n throw error;\n }\n return source;\n }\n /** @internal */ write(\n source: ActionSource<A>,\n action: ActionToken,\n value: Value,\n ): void {\n this.options.input.assertWrite(isNeutral(value));\n this.entry(action);\n const values = this.sources.get(source);\n if (!values)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Action source has been disposed\",\n );\n values.set(action, value);\n this.recompute(action);\n }\n /** @internal */ clearSource(source: ActionSource<A>, remove: boolean): void {\n const values = this.sources.get(source);\n if (!values) return;\n const actions = [...values.keys()];\n values.clear();\n if (remove) this.sources.delete(source);\n if (!this.disposed) for (const action of actions) this.recompute(action);\n }\n private keyboard(action: ActionToken): Value {\n if (!this.keyboardAllowed) return neutral(action);\n const binding = this.entry(action).binding;\n const held = (keys: readonly KeyCode[] | undefined) =>\n keys?.some(\n (k) => !this.blockedKeys.has(k) && this.options.input.keyDown(k),\n ) ?? false;\n const axis = (b: Axis1DBinding | undefined) =>\n Number(held(b?.positive)) - Number(held(b?.negative));\n if (action.kind === \"button\") return held((binding as ButtonBinding).keys);\n if (action.kind === \"axis1d\") return axis(binding as Axis1DBinding);\n const b = binding as Axis3DBinding;\n return action.kind === \"axis2d\"\n ? { x: axis(b.x), y: axis(b.y) }\n : { x: axis(b.x), y: axis(b.y), z: axis(b.z) };\n }\n private recompute(action: ActionToken, edges = true): void {\n const entry = this.entry(action);\n let value = this.keyboard(action);\n for (const values of this.sources.values()) {\n const contribution = values.get(action);\n if (contribution === undefined) continue;\n if (typeof value === \"boolean\") value ||= contribution as boolean;\n else if (typeof value === \"number\") value += contribution as number;\n else {\n const v = contribution as Axis3DValue;\n value =\n \"z\" in value\n ? { x: value.x + v.x, y: value.y + v.y, z: value.z + v.z }\n : { x: value.x + v.x, y: value.y + v.y };\n }\n }\n if (typeof value === \"number\") value = clamp(value);\n else if (typeof value === \"object\") {\n const x = clamp(value.x),\n y = clamp(value.y),\n z = \"z\" in value ? clamp(value.z) : 0;\n const length = action.normalize ? Math.max(1, Math.hypot(x, y, z)) : 1;\n value = Object.freeze(\n \"z\" in value\n ? { x: x / length, y: y / length, z: z / length }\n : { x: x / length, y: y / length },\n );\n }\n if (edges && action.kind === \"button\" && value !== entry.value)\n this.pending.push(\n Object.freeze({\n action: action as ActionToken<\"button\">,\n down: value as boolean,\n }),\n );\n entry.value = value;\n }\n /** @internal */ keyChanged(): void {\n for (const key of this.blockedKeys)\n if (!this.options.input.keyDown(key)) this.blockedKeys.delete(key);\n // Only the Engine-owned default Scene can retain pre-activation physical taps.\n // Staged Scenes do not accumulate another Scene's keyboard history.\n if (\n this.active ||\n (!this.disposed &&\n this.options.scene.inputOwner === this.options.input &&\n (this.options.scene.state === SceneState.Preparing ||\n this.options.scene.state === SceneState.Ready))\n )\n for (const action of this.entries.keys()) this.recompute(action);\n }\n /** @internal */ accepts(code: KeyCode): boolean {\n return (\n this.active &&\n this.keyboardAllowed &&\n [...this.entries.values()].some((e) =>\n keyLists(e.binding).some((list) => list.keys.includes(code)),\n )\n );\n }\n /** @internal */ capture(override?: ActionFrame): void {\n if (!this.active) return;\n const tokens = override\n ? new Map([...this.entries.keys()].map((a) => [a.name, a]))\n : undefined;\n this.transitions = override\n ? Object.freeze(\n override.events.map((e) =>\n Object.freeze({\n action: tokens?.get(e.name) as ActionToken<\"button\">,\n down: e.down,\n }),\n ),\n )\n : Object.freeze(this.pending);\n this.pending = [];\n for (const [action, entry] of this.entries) {\n entry.frame = override\n ? (override.values[action.name] as Value)\n : entry.value;\n if (action.kind === \"button\") {\n let pressCount = 0,\n releaseCount = 0;\n for (const event of this.transitions)\n if (event.action === action) {\n if (event.down) pressCount++;\n else releaseCount++;\n }\n entry.button = Object.freeze({\n held: entry.frame as boolean,\n pressed: pressCount > 0,\n released: releaseCount > 0,\n pressCount,\n releaseCount,\n });\n }\n }\n }\n /** @internal */ dispatch(): void {\n const errors: unknown[] = [];\n for (const event of this.transitions) {\n if (!this.active) break;\n if (event.down)\n try {\n this.bus.emit(pressedEvent, event.action);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Action input handlers failed\");\n }\n /** Clears held contributions and unconsumed edges; no synthetic button release. */\n reset(): void {\n this.blockedKeys.clear();\n for (const values of this.sources.values()) values.clear();\n this.pending = [];\n for (const [action, entry] of this.entries) entry.value = neutral(action);\n }\n getBinding<T extends Token<A>>(action: T): ActionBinding<T[\"kind\"]> {\n return this.entry(action).binding as ActionBinding<T[\"kind\"]>;\n }\n rebind<T extends Token<A>>(\n action: T,\n binding: NoInfer<ActionBinding<T[\"kind\"]>>,\n ): void {\n const checked = checkedBinding(action, binding),\n entry = this.entry(action);\n entry.binding = checked;\n this.pending = this.pending.filter((event) => event.action !== action);\n this.recompute(action, false);\n }\n addBindings<T extends Token<A>>(\n action: T,\n binding: NoInfer<ActionBinding<T[\"kind\"]>>,\n ): void {\n this.rebind(\n action,\n editBinding(\n this.entry(action).binding,\n checkedBinding(action, binding),\n false,\n ) as ActionBinding<T[\"kind\"]>,\n );\n }\n removeBindings<T extends Token<A>>(\n action: T,\n binding: NoInfer<ActionBinding<T[\"kind\"]>>,\n ): void {\n this.rebind(\n action,\n editBinding(\n this.entry(action).binding,\n checkedBinding(action, binding),\n true,\n ) as ActionBinding<T[\"kind\"]>,\n );\n }\n resetBindings(action?: Token<A>): void {\n for (const token of action ? [action] : this.entries.keys())\n this.rebind(\n token as Token<A>,\n this.entry(token).defaults as ActionBinding<Token<A>[\"kind\"]>,\n );\n }\n conflicts(): ReadonlyArray<{\n readonly key: KeyCode;\n readonly bindings: ReadonlyArray<{\n readonly action: Token<A>;\n readonly path: string;\n }>;\n }> {\n const keys = new Map<KeyCode, Array<{ action: Token<A>; path: string }>>();\n for (const [action, entry] of this.entries)\n for (const list of keyLists(entry.binding))\n for (const key of list.keys) {\n const group = keys.get(key) ?? [];\n group.push({ action: action as Token<A>, path: list.path });\n keys.set(key, group);\n }\n return [...keys]\n .filter(([, bindings]) => bindings.length > 1)\n .map(([key, bindings]) => ({ key, bindings }));\n }\n exportBindings(): { version: 1; bindings: ActionBindings<A> } {\n return {\n version: 1,\n bindings: Object.fromEntries(\n [...this.entries].map(([action, entry]) => [\n action.name,\n entry.binding,\n ]),\n ) as ActionBindings<A>,\n };\n }\n importBindings(value: unknown): void {\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"version\" in value) ||\n value.version !== 1 ||\n !(\"bindings\" in value) ||\n !value.bindings ||\n typeof value.bindings !== \"object\" ||\n Array.isArray(value.bindings) ||\n Object.keys(value).some((key) => key !== \"version\" && key !== \"bindings\")\n )\n throw new EngineError(\n \"INVALID_BINDING\",\n \"Expected version 1 binding configuration\",\n );\n const data = value.bindings as Record<string, unknown>;\n if (\n Object.keys(data).length !== this.entries.size ||\n Object.keys(data).some((name) => !Object.hasOwn(this.actions, name))\n )\n throw new EngineError(\n \"INVALID_ACTION\",\n \"Binding configuration must contain exactly the defined actions\",\n );\n const checked = [...this.entries.keys()].map(\n (action) => [action, checkedBinding(action, data[action.name])] as const,\n );\n for (const [action, binding] of checked)\n this.rebind(\n action as Token<A>,\n binding as ActionBinding<Token<A>[\"kind\"]>,\n );\n }\n dispose(): void {\n if (this.disposed) return;\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.bus.dispose(),\n ...[...this.sources.keys()].map((source) => () => source.dispose()),\n () => {\n this.entries.clear();\n this.pending = [];\n this.transitions = [];\n },\n ],\n \"Action input cleanup failed\",\n );\n }\n}\n\n/** Read-only, typed dependency injected into Components; no hidden global lookup. */\nexport interface ActionReader<K extends ActionKind> {\n readonly kind: K;\n readonly scene: Scene;\n readonly disposed: boolean;\n value(): ActionValue<K>;\n}\nexport class ActionSource<A extends ActionSet> extends OwnedInputSource {\n /** @internal */ constructor(\n private readonly controller: ActionController<A>,\n ) {\n super();\n }\n set<T extends Token<A>>(\n action: T,\n value: NoInfer<ActionInputValue<T[\"kind\"]>>,\n ): void {\n const checked = checkedActionValue(action, value);\n if (this.writable(isNeutral(checked)))\n this.controller.write(this, action, checked);\n }\n protected release(remove: boolean): void {\n this.controller.clearSource(this, remove);\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { cleanupAll, type LifetimeOwner } from \"../foundation/lifetime\";\nimport type { ActionFrame } from \"./action-frame\";\nimport { OwnedInputSource } from \"./input-source\";\nimport { type KeyCode, parseKeyCode } from \"./key-code\";\n/** Host device adapter. Sampled before all Action frames; reset flushes held device state. */\nexport interface InputAdapter {\n sample(): void;\n reset(): void;\n dispose(): void;\n}\n/** @internal Engine boundary participant, implemented by ActionController. */\nexport interface ActionInputPort {\n readonly active: boolean;\n readonly sourceCount: number;\n accepts(code: KeyCode): boolean;\n keyChanged(): void;\n capture(frame?: ActionFrame): void;\n dispatch(): void;\n reset(): void;\n dispose(): void;\n}\n/** A keyboard device contribution, not a game-facing state reader.\n * Use ActionSource for touch, automation and game logic. */\nexport class KeyboardSource extends OwnedInputSource {\n /** @internal */ constructor(private readonly input: InputSystem) {\n super();\n }\n set(code: KeyCode, pressed: boolean): void {\n parseKeyCode(code);\n if (typeof pressed !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"Keyboard state must be boolean\");\n if (this.writable(!pressed)) this.input.writeKey(this, code, pressed);\n }\n protected release(remove: boolean): void {\n this.input.releaseKeyboard(this, remove);\n }\n}\n/** Engine-owned routing and update boundary. No raw game-state/alternate movement API. */\nexport class InputSystem {\n private readonly actions = new Set<ActionInputPort>();\n private readonly adapters = new Set<InputAdapter>();\n private readonly keyboards = new Map<KeyboardSource, Set<KeyCode>>();\n private dead = false;\n private playback = false;\n private frames: ReadonlyMap<object, ActionFrame> | undefined;\n get sourceCount(): number {\n let count = this.keyboards.size;\n for (const actions of this.actions) count += actions.sourceCount;\n return count;\n }\n /** @internal */ registerActions(actions: ActionInputPort): () => void {\n if (this.dead)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input has been disposed\");\n this.actions.add(actions);\n return () => {\n this.actions.delete(actions);\n };\n }\n /** Host integration boundary; ordinary game input uses ActionSource instead. */\n addAdapter(adapter: InputAdapter): () => void {\n if (this.dead)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input has been disposed\");\n this.adapters.add(adapter);\n return () => {\n this.adapters.delete(adapter);\n };\n }\n acceptsKey(code: KeyCode): boolean {\n if (this.playback) return false;\n for (const actions of this.actions) if (actions.accepts(code)) return true;\n return false;\n }\n private notify(): void {\n for (const actions of this.actions) actions.keyChanged();\n }\n /** @internal Device state is resolved only through Action bindings. */\n keyDown(code: KeyCode): boolean {\n for (const keys of this.keyboards.values()) if (keys.has(code)) return true;\n return false;\n }\n /** @internal Freeze every controller before invoking any callbacks. */\n beginStep(captured?: () => void): void {\n if (!this.playback && this.adapters.size) {\n for (const adapter of [...this.adapters])\n if (this.adapters.has(adapter)) adapter.sample();\n }\n if (!this.actions.size) {\n captured?.();\n return;\n }\n const plan = [...this.actions].filter((actions) => actions.active);\n for (const actions of plan) actions.capture(this.frames?.get(actions));\n captured?.();\n const errors: unknown[] = [];\n for (const actions of plan) {\n if (!this.actions.has(actions) || !actions.active) continue;\n try {\n actions.dispatch();\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Input callbacks failed\");\n }\n createKeyboardSource(owner?: LifetimeOwner): KeyboardSource {\n if (this.dead || owner?.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input owner has been disposed\");\n const source = new KeyboardSource(this);\n this.keyboards.set(source, new Set());\n try {\n if (owner) source.own(owner);\n } catch (error) {\n source.dispose();\n throw error;\n }\n return source;\n }\n /** @internal */ writeKey(\n source: KeyboardSource,\n code: KeyCode,\n pressed: boolean,\n ): void {\n this.assertWrite(!pressed);\n const keys = this.keyboards.get(source);\n if (!keys || this.dead)\n throw new EngineError(\"OWNER_DISPOSED\", \"Input has been disposed\");\n if (keys.has(code) === pressed) return;\n const before = this.keyDown(code);\n if (pressed) keys.add(code);\n else keys.delete(code);\n if (before !== this.keyDown(code)) this.notify();\n }\n /** @internal */ releaseKeyboard(\n source: KeyboardSource,\n remove: boolean,\n ): void {\n const keys = this.keyboards.get(source);\n if (!keys) return;\n const changed = keys.size > 0;\n keys.clear();\n if (remove) this.keyboards.delete(source);\n if (changed && !this.dead) this.notify();\n }\n /** @internal */ hasController(controller: object): boolean {\n return this.actions.has(controller as ActionInputPort);\n }\n /** @internal */ verifyControllers(controllers: readonly object[]): void {\n const active = [...this.actions].filter((a) => a.active);\n if (\n active.length !== controllers.length ||\n active.some((a) => !controllers.includes(a))\n )\n throw new EngineError(\n \"REPLAY_CONTROLLERS\",\n \"Replay must bind exactly the active Scene controllers\",\n );\n }\n /** @internal */ assertWrite(neutral: boolean): void {\n if (this.playback && !neutral)\n throw new EngineError(\n \"REPLAY_INPUT_LOCKED\",\n \"Live Action/device writes are disabled during Replay playback\",\n );\n }\n /** @internal */ lockPlayback(): void {\n if (this.playback)\n throw new EngineError(\n \"REPLAY_STATE\",\n \"Input already has a playback driver\",\n );\n this.clear();\n this.playback = true;\n }\n /** @internal */ playbackFrames(\n frames: ReadonlyMap<object, ActionFrame>,\n ): void {\n if (!this.playback)\n throw new EngineError(\"REPLAY_STATE\", \"Playback is not active\");\n this.frames = frames;\n }\n /** @internal */ unlockPlayback(): void {\n this.frames = undefined;\n this.playback = false;\n this.clear();\n }\n clear(): void {\n for (const keys of this.keyboards.values()) keys.clear();\n cleanupAll(\n [\n ...[...this.actions].map((actions) => () => actions.reset()),\n ...[...this.adapters].map((adapter) => () => {\n if (this.adapters.has(adapter)) adapter.reset();\n }),\n ],\n \"Input reset failed\",\n );\n }\n /** Device diagnostics only; game state is ActionController.snapshot(). */\n snapshot(): readonly KeyCode[] {\n const keys = new Set<KeyCode>();\n for (const contribution of this.keyboards.values())\n for (const key of contribution) keys.add(key);\n return [...keys].sort();\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n try {\n cleanupAll(\n [\n ...[...this.adapters].map((a) => () => a.dispose()),\n ...[...this.actions].map((a) => () => a.dispose()),\n ...[...this.keyboards.keys()].map((s) => () => s.dispose()),\n ],\n \"Input cleanup failed\",\n );\n } finally {\n this.adapters.clear();\n this.actions.clear();\n this.keyboards.clear();\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { CanvasNode, UIBounds, UISize } from \"./canvas-node\";\nexport interface UISizeValue {\n width: number;\n height: number;\n}\nexport type MeasureText = (\n node: CanvasNode,\n contentWidth?: number,\n) => UISizeValue;\nconst finite = (v: number) => {\n if (!Number.isFinite(v) || v < 0)\n throw new EngineError(\"INVALID_UI\", \"UI layout overflow\");\n return v;\n};\nconst size = (v: UISize | undefined, parent: number): number | undefined =>\n v === undefined\n ? undefined\n : finite(\n typeof v === \"number\" ? v : (Number(v.slice(0, -1)) / 100) * parent,\n );\n// A conflicting minimum wins, including percentage constraints after parent resolution.\nconst unbounded = Object.freeze({ min: 0, max: Infinity });\nconst limits = (node: CanvasNode, axis: \"Width\" | \"Height\", parent: number) => {\n const s = node.style;\n const minimum = axis === \"Width\" ? s.minWidth : s.minHeight;\n const maximum = axis === \"Width\" ? s.maxWidth : s.maxHeight;\n if (minimum === undefined && maximum === undefined) return unbounded;\n const min = size(minimum, parent) ?? 0;\n return { min, max: Math.max(min, size(maximum, parent) ?? Infinity) };\n};\nconst clamp = (value: number, range: { min: number; max: number }) =>\n finite(Math.max(range.min, Math.min(range.max, value)));\ninterface Item {\n min: number;\n max: number;\n node: CanvasNode;\n main: number;\n cross: number;\n explicitCross: boolean;\n}\ninterface Line {\n items: Item[];\n main: number;\n cross: number;\n}\n/** Bounded Flex with iterative constraint freezing and width-aware leaf measurement. */\nexport function layoutCanvas(\n root: CanvasNode,\n width: number,\n height: number,\n measure: MeasureText,\n): { nodes: number; intrinsicVisits: number; constrainVisits: number } {\n finite(width);\n finite(height);\n let visited = 0,\n intrinsicVisits = 0,\n constrainVisits = 0;\n const naturalCache = new Map<CanvasNode, UISizeValue>();\n const natural = (node: CanvasNode, depth: number): UISizeValue => {\n intrinsicVisits++;\n if (depth > 64)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI trees support at most 64 nested levels\",\n );\n const previous = naturalCache.get(node);\n if (previous) return previous;\n const s = node.style,\n pad = s.padding * 2;\n let w = 0,\n h = 0;\n if (node.kind !== \"panel\") {\n if (typeof s.width !== \"number\" || typeof s.height !== \"number\")\n ({ width: w, height: h } = measure(node));\n } else {\n const children = node.children.filter((n) => n.visible && !n.disposed),\n row = s.direction === \"row\";\n for (const c of children) {\n const n = natural(c, depth + 1),\n cw = n.width,\n ch = n.height;\n w = row ? w + cw : Math.max(w, cw);\n h = row ? Math.max(h, ch) : h + ch;\n }\n if (row) w += Math.max(0, children.length - 1) * s.gap;\n else h += Math.max(0, children.length - 1) * s.gap;\n }\n const result = {\n width: finite(typeof s.width === \"number\" ? s.width : w + pad),\n height: finite(typeof s.height === \"number\" ? s.height : h + pad),\n };\n for (const axis of [\"Width\", \"Height\"] as const) {\n const key = axis === \"Width\" ? \"width\" : \"height\";\n const min = s[`min${axis}`],\n max = s[`max${axis}`];\n if (min === undefined && max === undefined) continue;\n result[key] = clamp(result[key], {\n min: typeof min === \"number\" ? min : 0,\n max: Math.max(\n typeof min === \"number\" ? min : 0,\n typeof max === \"number\" ? max : Infinity,\n ),\n });\n }\n naturalCache.set(node, result);\n return result;\n };\n const constrainedCache = new Map<CanvasNode, Map<string, UISizeValue>>();\n // Auto cross size of a wrapped container depends on its constrained main size.\n const constrained = (\n node: CanvasNode,\n aw: number,\n ah: number,\n stretchWidth: boolean,\n stretchHeight: boolean,\n depth: number,\n forcedWidth?: number,\n forcedHeight?: number,\n ): UISizeValue => {\n constrainVisits++;\n if (depth > 64)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI trees support at most 64 nested levels\",\n );\n const s = node.style,\n n = natural(node, depth),\n row = s.direction === \"row\";\n let w = forcedWidth ?? size(s.width, aw) ?? (stretchWidth ? aw : n.width),\n h = forcedHeight ?? size(s.height, ah) ?? (stretchHeight ? ah : n.height);\n if (\n node.kind !== \"panel\" &&\n s.textWrap &&\n s.width === undefined &&\n forcedWidth === undefined\n )\n w = Math.min(w, aw);\n w = clamp(w, limits(node, \"Width\", aw));\n h = clamp(h, limits(node, \"Height\", ah));\n if (node.kind !== \"panel\") {\n if (\n s.height === undefined &&\n !stretchHeight &&\n forcedHeight === undefined\n )\n h = clamp(\n measure(node, Math.max(0, w - s.padding * 2)).height + s.padding * 2,\n limits(node, \"Height\", ah),\n );\n return { width: w, height: h };\n }\n const key = `${aw},${ah},${stretchWidth},${stretchHeight},${forcedWidth},${forcedHeight}`;\n let cache = constrainedCache.get(node);\n const cached = cache?.get(key);\n if (cached) return cached;\n if (!cache) {\n cache = new Map();\n constrainedCache.set(node, cache);\n }\n const saved = (value: UISizeValue) => {\n cache?.set(key, value);\n return value;\n };\n const lines = linesFor(\n node,\n Math.max(0, w - s.padding * 2),\n Math.max(0, h - s.padding * 2),\n depth,\n );\n const totalCross =\n lines.reduce((sum, line) => sum + line.cross, 0) +\n s.gap * Math.max(0, lines.length - 1);\n const totalMain = Math.max(\n 0,\n ...lines.map(\n (line) =>\n line.items.reduce((sum, i) => sum + i.main, 0) +\n s.gap * Math.max(0, line.items.length - 1),\n ),\n );\n if (\n row &&\n s.height === undefined &&\n !stretchHeight &&\n forcedHeight === undefined\n )\n h = totalCross + s.padding * 2;\n if (\n !row &&\n s.width === undefined &&\n !stretchWidth &&\n forcedWidth === undefined\n )\n w = totalCross + s.padding * 2;\n if (\n !row &&\n !s.wrap &&\n s.height === undefined &&\n !stretchHeight &&\n forcedHeight === undefined\n )\n h = totalMain + s.padding * 2;\n return saved({\n width: clamp(w, limits(node, \"Width\", aw)),\n height: clamp(h, limits(node, \"Height\", ah)),\n });\n };\n const linesFor = (\n node: CanvasNode,\n cw: number,\n ch: number,\n depth: number,\n ): Line[] => {\n const s = node.style,\n row = s.direction === \"row\",\n main = row ? cw : ch;\n const lines: Line[] = [{ items: [], main: 0, cross: 0 }];\n for (const child of node.children) {\n if (!child.visible || child.disposed) continue;\n const align = child.style.alignSelf ?? s.align;\n const n = constrained(\n child,\n cw,\n ch,\n !row && align === \"stretch\" && child.style.width === undefined,\n row &&\n !s.wrap &&\n align === \"stretch\" &&\n child.style.height === undefined,\n depth + 1,\n ),\n a = n.width,\n b = n.height;\n const range = limits(child, row ? \"Width\" : \"Height\", main);\n const item: Item = {\n ...range,\n node: child,\n main: row ? a : b,\n cross: row ? b : a,\n explicitCross:\n (row ? child.style.height : child.style.width) !== undefined,\n };\n let line = lines[lines.length - 1] as Line;\n if (s.wrap && line.items.length && line.main + s.gap + item.main > main) {\n line = { items: [], main: 0, cross: 0 };\n lines.push(line);\n }\n if (line.items.length) line.main += s.gap;\n line.items.push(item);\n line.main += item.main;\n line.cross = Math.max(line.cross, item.cross);\n }\n\n for (const line of lines) {\n // Freeze min/max-limited items and redistribute remaining free space.\n const growing = main >= line.main;\n const scrolling =\n s.scroll === \"both\" || s.scroll === (row ? \"horizontal\" : \"vertical\");\n let remaining = line.items.filter((i) =>\n growing\n ? i.node.style.grow > 0 && i.main < i.max\n : !scrolling && i.node.style.shrink > 0 && i.main > i.min,\n );\n const bases =\n !growing && remaining.length\n ? new Map(line.items.map((i) => [i, i.main]))\n : undefined;\n while (remaining.length) {\n const free =\n main -\n line.items.reduce((sum, i) => sum + i.main, 0) -\n s.gap * Math.max(0, line.items.length - 1);\n if (Math.abs(free) < 1e-9 || (growing ? free < 0 : free > 0)) break;\n const weightOf = (i: Item) =>\n growing\n ? i.node.style.grow\n : i.node.style.shrink * (bases?.get(i) ?? 0);\n const weight = remaining.reduce((sum, i) => sum + weightOf(i), 0);\n if (weight === 0) break;\n let changed = 0;\n for (const i of remaining) {\n const previous = i.main;\n i.main = clamp(previous + (free * weightOf(i)) / weight, i);\n changed += Math.abs(i.main - previous);\n }\n remaining = remaining.filter((i) =>\n growing ? i.main < i.max - 1e-9 : i.main > i.min + 1e-9,\n );\n if (changed < 1e-9) break;\n }\n // Wrapped descendants remeasure their auto cross extent after flex main allocation.\n for (const i of line.items)\n if (!i.explicitCross) {\n const measured = constrained(\n i.node,\n cw,\n ch,\n false,\n false,\n depth + 1,\n row ? i.main : undefined,\n row ? undefined : i.main,\n );\n i.cross = row ? measured.height : measured.width;\n }\n line.cross = line.items.reduce((v, i) => Math.max(v, i.cross), 0);\n }\n return lines;\n };\n const arrange = (\n node: CanvasNode,\n x: number,\n y: number,\n w: number,\n h: number,\n depth: number,\n ) => {\n if (depth > 64)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI trees support at most 64 nested levels\",\n );\n visited++;\n const s = node.style;\n node.boundsValue = Object.freeze({\n x: finite(x),\n y: finite(y),\n width: finite(w),\n height: finite(h),\n });\n if (node.kind !== \"panel\") return;\n const row = s.direction === \"row\",\n cw = Math.max(0, w - 2 * s.padding),\n ch = Math.max(0, h - 2 * s.padding),\n main = row ? cw : ch,\n cross = row ? ch : cw;\n const lines = linesFor(node, cw, ch, depth);\n if (!s.wrap) (lines[0] as Line).cross = cross;\n let lineOffset = 0;\n for (const line of lines) {\n const left = Math.max(\n 0,\n main -\n line.items.reduce((sum, i) => sum + i.main, 0) -\n s.gap * Math.max(0, line.items.length - 1),\n );\n let gap = s.gap,\n offset = 0;\n if (s.justify === \"end\") offset = left;\n if (s.justify === \"center\") offset = left / 2;\n if (s.justify === \"space-between\" && line.items.length > 1)\n gap += left / (line.items.length - 1);\n if (s.justify === \"space-around\" && line.items.length) {\n gap += left / line.items.length;\n offset = left / line.items.length / 2;\n }\n for (const i of line.items) {\n const align = i.node.style.alignSelf ?? s.align;\n if (!i.explicitCross && align === \"stretch\")\n i.cross = clamp(\n line.cross,\n limits(i.node, row ? \"Height\" : \"Width\", cross),\n );\n let c =\n align === \"end\"\n ? line.cross - i.cross\n : align === \"center\"\n ? (line.cross - i.cross) / 2\n : 0;\n c = Math.max(0, c);\n arrange(\n i.node,\n x + s.padding + (row ? offset : lineOffset + c),\n y + s.padding + (row ? lineOffset + c : offset),\n row ? i.main : i.cross,\n row ? i.cross : i.main,\n depth + 1,\n );\n offset += i.main + gap;\n }\n lineOffset += line.cross + s.gap;\n }\n };\n natural(root, 0);\n arrange(\n root,\n 0,\n 0,\n clamp(size(root.style.width, width) ?? width, limits(root, \"Width\", width)),\n clamp(\n size(root.style.height, height) ?? height,\n limits(root, \"Height\", height),\n ),\n 0,\n );\n return { nodes: visited, intrinsicVisits, constrainVisits };\n}\nexport function containsUI(box: UIBounds, x: number, y: number): boolean {\n return (\n x >= box.x && y >= box.y && x < box.x + box.width && y < box.y + box.height\n );\n}\nexport function intersectUI(a: UIBounds, b: UIBounds): UIBounds {\n const x = Math.max(a.x, b.x),\n y = Math.max(a.y, b.y);\n return {\n x,\n y,\n width: Math.max(0, Math.min(a.x + a.width, b.x + b.width) - x),\n height: Math.max(0, Math.min(a.y + a.height, b.y + b.height) - y),\n };\n}\n","import { containsUI, intersectUI } from \"./canvas-layout\";\nimport type { CanvasNode, UIBounds } from \"./canvas-node\";\nexport type ScrollbarAxis = \"vertical\" | \"horizontal\";\nexport interface CanvasScrollbar {\n readonly node: CanvasNode;\n readonly axis: ScrollbarAxis;\n readonly track: UIBounds;\n readonly thumb: UIBounds;\n readonly enabled: boolean;\n}\nconst empty: readonly CanvasScrollbar[] = Object.freeze([]);\n/** Overlay geometry, independent of layout metrics and Renderer objects. */\nexport function canvasScrollbars(node: CanvasNode): readonly CanvasScrollbar[] {\n const s = node.style,\n b = node.bounds;\n if (!s.scroll || s.scrollbar === \"hidden\") return empty;\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n if (p.disposed || !p.visible) return empty;\n const axes: ScrollbarAxis[] =\n s.scroll === \"both\" ? [\"vertical\", \"horizontal\"] : [s.scroll];\n const result: CanvasScrollbar[] = [];\n for (const axis of axes) {\n const vertical = axis === \"vertical\",\n maximum = vertical ? node.maxScrollY : node.maxScrollX;\n if (maximum === 0 && s.scrollbar !== \"always\") continue;\n const corner = s.scroll === \"both\" ? 10 : 0;\n const track = vertical\n ? {\n x: b.x + Math.max(0, b.width - 10),\n y: b.y + 2,\n width: Math.min(8, b.width),\n height: Math.max(0, b.height - 4 - corner),\n }\n : {\n x: b.x + 2,\n y: b.y + Math.max(0, b.height - 10),\n width: Math.max(0, b.width - 4 - corner),\n height: Math.min(8, b.height),\n };\n const length = vertical ? track.height : track.width,\n viewport = vertical ? b.height : b.width;\n const thumbLength =\n maximum > 0\n ? Math.min(\n length,\n Math.max(24, (length * viewport) / (viewport + maximum)),\n )\n : length;\n const offset =\n (maximum > 0 ? (vertical ? node.scrollY : node.scrollX) / maximum : 0) *\n (length - thumbLength);\n const thumb = vertical\n ? { ...track, y: track.y + offset, height: thumbLength }\n : { ...track, x: track.x + offset, width: thumbLength };\n result.push({\n node,\n axis,\n track,\n thumb,\n enabled: node.available && maximum > 0 && length > thumbLength,\n });\n }\n return result;\n}\n/** Minimum 24 Host-unit cross-axis hit region, intersected with the node/ancestor clip. */\nexport function scrollbarContains(\n bar: CanvasScrollbar,\n x: number,\n y: number,\n scale: number,\n clip: UIBounds,\n thumb = false,\n): boolean {\n const b = thumb ? bar.thumb : bar.track;\n const pad =\n bar.axis === \"vertical\"\n ? Math.max(0, (24 / scale - b.width) / 2)\n : Math.max(0, (24 / scale - b.height) / 2);\n const hit =\n bar.axis === \"vertical\"\n ? { x: b.x - pad, y: b.y, width: b.width + 2 * pad, height: b.height }\n : { x: b.x, y: b.y - pad, width: b.width, height: b.height + 2 * pad };\n return containsUI(intersectUI(hit, clip), x, y);\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent, EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport type { ScreenPoint, WorldPoint } from \"../graphics/coordinates\";\nimport type { Scene } from \"../scene/scene\";\nimport type { CanvasNode } from \"../ui/canvas-node\";\nimport type { CanvasUI } from \"../ui/canvas-ui\";\nimport {\n type CanvasScrollbar,\n canvasScrollbars,\n scrollbarContains,\n} from \"../ui/scrollbar\";\n/** Snapshot coordinates at DOM delivery. Screen is host CSS units; world includes the current Camera. */\nexport interface PointerInfo {\n readonly pointerId: number;\n readonly pointerType: string;\n readonly button: number;\n readonly buttons: number;\n readonly screen: ScreenPoint;\n readonly world: WorldPoint;\n /** Inside the original UI target's current clipped hit area, or the world viewport clip. */\n readonly inside: boolean;\n /** Monotonic Host seconds; omit when unavailable (momentum then stays off). */\n readonly time?: number;\n}\nexport const PointerDown = defineEvent<PointerInfo>(\"PointerDown\");\nexport const PointerMove = defineEvent<PointerInfo>(\"PointerMove\");\nexport const PointerUp = defineEvent<PointerInfo>(\"PointerUp\");\nexport const PointerCancel = defineEvent<PointerInfo>(\"PointerCancel\");\nexport const PointerEnter = defineEvent<PointerInfo>(\"PointerEnter\");\nexport const PointerLeave = defineEvent<PointerInfo>(\"PointerLeave\");\nexport const PointerClick = defineEvent<PointerInfo>(\"PointerClick\");\n/** Scene-scoped world input. UI gestures are never delivered here. */\nexport class ScenePointer implements LifetimeOwner {\n private readonly lifetime = new Lifetime();\n readonly events = new EventBus();\n private readonly removeScene: () => void;\n constructor(readonly scene: Scene) {\n this.removeScene = scene.onDispose(() => this.dispose());\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n dispose(): void {\n if (this.disposed) return;\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.events.dispose(),\n this.removeScene,\n ],\n \"Scene pointer cleanup failed\",\n );\n }\n}\ninterface Gesture {\n channel: ScenePointer;\n node?: CanvasNode;\n ui?: CanvasUI;\n last: PointerInfo;\n primary: boolean;\n off?: () => void;\n start: PointerInfo;\n scale: number;\n candidates: readonly CanvasNode[];\n candidateRevisions: readonly number[];\n scroll?: CanvasNode;\n axis?: \"vertical\" | \"horizontal\" | \"both\";\n revision?: number;\n bar?: { axis: CanvasScrollbar[\"axis\"]; grab: number; thumb: boolean };\n control?: CanvasNode;\n controlRevision?: number;\n controlLocked?: boolean;\n vx: number;\n vy: number;\n}\n/** @internal Device-independent routing state; DOM is only an adapter. */\nexport class PointerRouting {\n private readonly controlOwners = new Map<CanvasNode, number>();\n private readonly scrollOwners = new Map<CanvasNode, number>();\n private readonly suppressed = new Set<number>();\n private readonly gestures = new Map<number, Gesture>();\n private readonly hovering = new Map<\n number,\n { node: CanvasNode; info: PointerInfo }\n >();\n private readonly holds = new Map<CanvasNode, Set<number | string>>();\n private readonly keyRevisions = new Map<CanvasNode, number>();\n private readonly keys = new Map<CanvasNode, Set<string>>();\n private channel: ScenePointer | undefined;\n private ui: CanvasUI | undefined;\n private subscriptions: Array<() => void> = [];\n private deliveries = 0;\n constructor(private readonly released: (id: number) => void = () => {}) {}\n get diagnostics() {\n return {\n captures: this.gestures.size,\n suppressedPointers: this.suppressed.size,\n hoverPointers: this.hovering.size,\n heldNodes: this.holds.size,\n keyboardNodes: this.keys.size,\n deliveries: this.deliveries,\n scrollDrags: this.scrollOwners.size,\n controlDrags: this.controlOwners.size,\n };\n }\n setScene(channel: ScenePointer, ui?: CanvasUI): void {\n this.reset();\n this.channel = channel;\n this.ui = ui;\n this.subscriptions.push(channel.onDispose(() => this.reset()));\n if (ui) {\n this.subscriptions.push(ui.onDispose(() => this.reset()));\n this.subscriptions.push(ui.subscribe(() => this.prune()));\n }\n }\n private hold(node: CanvasNode, key: number | string, down: boolean): void {\n const set = this.holds.get(node) ?? new Set<number | string>();\n if (down) set.add(key);\n else set.delete(key);\n if (set.size) this.holds.set(node, set);\n else this.holds.delete(node);\n if (node.kind === \"hold-button\") node.setHeld(set.size > 0);\n else if (node.held !== set.size > 0) {\n node.held = set.size > 0;\n node.changed();\n }\n }\n private emit(\n gesture: Gesture,\n type: typeof PointerDown,\n info: PointerInfo,\n ): void {\n if (gesture.channel.disposed || gesture.node?.disposed) return;\n this.deliveries++;\n (gesture.node?.events ?? gesture.channel.events).emit(type, info);\n }\n private inside(g: Gesture, data: PointerInfo): PointerInfo {\n return Object.freeze({\n ...data,\n inside:\n g.scroll && g.ui\n ? g.ui.containsNode(\n g.scroll,\n data.screen.x / g.ui.scale,\n data.screen.y / g.ui.scale,\n )\n : g.node\n ? g.ui?.hitTest(\n data.screen.x / g.ui.scale,\n data.screen.y / g.ui.scale,\n ) === g.node\n : data.inside,\n });\n }\n down(data: PointerInfo): CanvasNode | undefined {\n this.validate(data);\n if (!this.channel || this.channel.disposed) return;\n if (this.gestures.has(data.pointerId)) this.cancel(data.pointerId);\n this.suppressed.delete(data.pointerId);\n const pick = this.ui?.pick(\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n );\n const node = pick?.node,\n bar = pick?.bar;\n if (\n bar &&\n data.button === 0 &&\n (!bar.enabled || this.scrollOwners.has(bar.node))\n ) {\n this.suppressed.add(data.pointerId);\n return node;\n }\n if (node && data.button === 0 && this.controlOwners.has(node)) {\n this.suppressed.add(data.pointerId);\n return node;\n }\n if (!node && !data.inside) return;\n const g: Gesture = {\n channel: this.channel,\n last: data,\n primary: data.button === 0,\n start: data,\n scale: this.ui?.scale ?? 1,\n candidates:\n this.ui?.scrollTargets(\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n ) ?? [],\n candidateRevisions: [],\n vx: 0,\n vy: 0,\n ...(node ? { node, ui: this.ui as CanvasUI } : {}),\n };\n g.candidateRevisions = g.candidates.map((n) => n.scrollRevision);\n for (const candidate of g.candidates) candidate.stopScroll();\n if (bar && this.ui && g.primary) {\n const pos =\n (bar.axis === \"vertical\" ? data.screen.y : data.screen.x) /\n this.ui.scale;\n const thumb = scrollbarContains(\n bar,\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n this.ui.scale,\n bar.node.bounds,\n true,\n );\n const length =\n bar.axis === \"vertical\" ? bar.thumb.height : bar.thumb.width,\n start = bar.axis === \"vertical\" ? bar.thumb.y : bar.thumb.x;\n g.scroll = bar.node;\n g.axis = bar.node.style.scroll ?? bar.axis;\n g.revision = bar.node.scrollRevision;\n g.bar = {\n axis: bar.axis,\n grab: length > 0 ? (pos - start) / length : 0,\n thumb,\n };\n this.scrollOwners.set(bar.node, data.pointerId);\n }\n if (node?.control) g.controlRevision = node.control.revision;\n this.gestures.set(data.pointerId, g);\n if (node) g.off = node.onDispose(() => this.cancel(data.pointerId));\n cleanupAll(\n [\n () => {\n const port = node?.control;\n if (!node || !port?.pointerAxis || !g.primary) return;\n g.control = node;\n g.controlRevision = port.revision;\n this.controlOwners.set(node, data.pointerId);\n if (\n !port.beginPointer(\n data.screen.x / g.scale,\n data.screen.y / g.scale,\n ) &&\n this.gestures.get(data.pointerId) === g\n ) {\n this.controlOwners.delete(node);\n delete g.control;\n }\n },\n () => {\n if (\n this.gestures.get(data.pointerId) === g &&\n node?.interactive &&\n g.primary\n )\n this.hold(node, data.pointerId, true);\n },\n () => {\n if (\n this.gestures.get(data.pointerId) === g &&\n (!node || node.available)\n )\n this.emit(g, PointerDown, this.inside(g, data));\n },\n () => {\n if (\n bar &&\n g.bar &&\n !g.bar.thumb &&\n this.gestures.get(data.pointerId) === g\n ) {\n const vertical = bar.axis === \"vertical\",\n pos =\n (vertical ? data.screen.y : data.screen.x) / (g.ui?.scale ?? 1),\n start = vertical ? bar.thumb.y : bar.thumb.x;\n const direction = pos < start ? -1 : 1;\n bar.node.setScrollPosition(\n bar.node.scrollX +\n (!vertical ? direction * bar.node.bounds.width * 0.9 : 0),\n bar.node.scrollY +\n (vertical ? direction * bar.node.bounds.height * 0.9 : 0),\n );\n }\n },\n ],\n \"Pointer down handlers failed\",\n );\n return node;\n }\n private validate(data: PointerInfo): void {\n if (\n !Number.isInteger(data.pointerId) ||\n !Number.isFinite(data.screen.x) ||\n !Number.isFinite(data.screen.y)\n ) {\n this.cancel(data.pointerId, false);\n throw new EngineError(\n \"INVALID_UI\",\n \"Pointer identity and coordinates must be finite\",\n );\n }\n }\n /** Host-local screen units, normalized by the UI scale. */\n scroll(x: number, y: number, dx: number, dy: number): boolean {\n const ui = this.ui;\n return (\n ui?.scrollAt(x / ui.scale, y / ui.scale, dx / ui.scale, dy / ui.scale) ??\n false\n );\n }\n hasHover(id: number): boolean {\n return this.hovering.has(id);\n }\n has(id: number): boolean {\n return this.gestures.has(id);\n }\n owns(id: number): boolean {\n return this.gestures.has(id) || this.suppressed.has(id);\n }\n move(data: PointerInfo): void {\n this.validate(data);\n if (this.suppressed.has(data.pointerId)) return;\n const g = this.gestures.get(data.pointerId);\n if (g) {\n if (g.control && !g.controlLocked) {\n const dx = Math.abs(data.screen.x - g.start.screen.x),\n dy = Math.abs(data.screen.y - g.start.screen.y);\n if (dx >= g.control.style.dragThreshold && dx > dy)\n g.controlLocked = true;\n }\n if (!g.scroll && g.primary && !g.controlLocked) this.claimScroll(g, data);\n if (this.gestures.get(data.pointerId) !== g) return;\n if (g.bar && g.scroll && g.ui) {\n const bar = canvasScrollbars(g.scroll).find(\n (b) => b.axis === g.bar?.axis,\n );\n if (!bar) {\n this.cancel(data.pointerId);\n return;\n }\n if (g.bar.thumb && bar.enabled) {\n const vertical = bar.axis === \"vertical\",\n position = (vertical ? data.screen.y : data.screen.x) / g.ui.scale;\n const start = vertical ? bar.track.y : bar.track.x,\n thumb = vertical ? bar.thumb.height : bar.thumb.width,\n travel = (vertical ? bar.track.height : bar.track.width) - thumb;\n const offset =\n ((position - start - g.bar.grab * thumb) / travel) *\n (vertical ? g.scroll.maxScrollY : g.scroll.maxScrollX);\n g.scroll.setScrollPosition(\n vertical ? g.scroll.scrollX : offset,\n vertical ? offset : g.scroll.scrollY,\n );\n }\n g.last = data;\n } else if (g.scroll && g.ui) {\n const dx = (g.last.screen.x - data.screen.x) / g.ui.scale,\n dy = (g.last.screen.y - data.screen.y) / g.ui.scale;\n this.sampleVelocity(g, data, dx, dy);\n g.last = data;\n g.scroll.setScrollPosition(\n g.scroll.scrollX + dx,\n g.scroll.scrollY + dy,\n );\n } else {\n g.last = data;\n g.control?.control?.movePointer(\n data.screen.x / g.scale,\n data.screen.y / g.scale,\n );\n }\n if (this.gestures.get(data.pointerId) === g)\n this.emit(g, PointerMove, this.inside(g, data));\n return;\n }\n if (!this.channel || this.channel.disposed) return;\n const node = this.ui?.hitTest(\n data.screen.x / this.ui.scale,\n data.screen.y / this.ui.scale,\n );\n this.hover(data.pointerId, node, data);\n if (node?.available) {\n this.deliveries++;\n node.events.emit(PointerMove, Object.freeze({ ...data, inside: true }));\n } else if (!node && data.inside) {\n this.deliveries++;\n this.channel.events.emit(PointerMove, data);\n }\n }\n private sampleVelocity(\n g: Gesture,\n data: PointerInfo,\n dx: number,\n dy: number,\n ): void {\n const dt =\n data.time !== undefined && g.last.time !== undefined\n ? data.time - g.last.time\n : 0;\n if (!Number.isFinite(dt) || dt <= 0 || dt > 0.15) {\n g.vx = 0;\n g.vy = 0;\n return;\n }\n const a = 1 - Math.exp(-dt / 0.045);\n g.vx += (Math.max(-3000, Math.min(3000, dx / dt)) - g.vx) * a;\n g.vy += (Math.max(-3000, Math.min(3000, dy / dt)) - g.vy) * a;\n }\n private claimScroll(g: Gesture, data: PointerInfo): void {\n const ui = this.ui;\n if (!ui) return;\n const dx = (g.start.screen.x - data.screen.x) / ui.scale,\n dy = (g.start.screen.y - data.screen.y) / ui.scale;\n const candidate = g.candidates.find((n) => {\n if (n.ui !== ui || !n.available || !n.style.dragScroll) return false;\n const x =\n n.style.scroll !== \"vertical\" &&\n n.maxScrollX > 0 &&\n Math.abs(dx) * ui.scale >= n.style.dragThreshold;\n const y =\n n.style.scroll !== \"horizontal\" &&\n n.maxScrollY > 0 &&\n Math.abs(dy) * ui.scale >= n.style.dragThreshold;\n return (\n (x &&\n ((dx < 0 && n.scrollX > 0) ||\n (dx > 0 && n.scrollX < n.maxScrollX))) ||\n (y &&\n ((dy < 0 && n.scrollY > 0) || (dy > 0 && n.scrollY < n.maxScrollY)))\n );\n });\n const axis = candidate?.style.scroll;\n if (!candidate || !axis) return;\n if (this.scrollOwners.has(candidate)) {\n this.cancel(data.pointerId);\n return;\n }\n const previous = { ...g };\n if (g.control) this.controlOwners.delete(g.control);\n delete g.control;\n delete g.controlRevision;\n delete g.controlLocked;\n g.off?.();\n g.scroll = candidate;\n g.node = candidate;\n g.ui = ui;\n g.axis = axis;\n g.revision = candidate.scrollRevision;\n this.scrollOwners.set(candidate, data.pointerId);\n g.off = candidate.onDispose(() => this.cancel(data.pointerId));\n cleanupAll(\n [\n () => previous.control?.control?.endPointer(true),\n () => {\n if (previous.node?.interactive)\n this.hold(previous.node, data.pointerId, false);\n },\n () =>\n this.emit(\n previous,\n PointerCancel,\n Object.freeze({ ...data, inside: false }),\n ),\n () => {\n if (this.gestures.get(data.pointerId) === g)\n this.emit(g, PointerDown, this.inside(g, data));\n },\n ],\n \"Scroll ownership transfer failed\",\n );\n }\n leave(data: PointerInfo): void {\n if (!this.gestures.has(data.pointerId))\n this.hover(data.pointerId, undefined, data);\n }\n private hover(\n id: number,\n node: CanvasNode | undefined,\n info: PointerInfo,\n ): void {\n const previous = this.hovering.get(id);\n if (previous?.node === node) {\n if (node) this.hovering.set(id, { node, info });\n return;\n }\n this.hovering.delete(id);\n if (node) this.hovering.set(id, { node, info });\n cleanupAll(\n [\n () => {\n if (previous) {\n previous.node.hovered = [...this.hovering.values()].some(\n (h) => h.node === previous.node,\n );\n previous.node.changed();\n if (!previous.node.disposed)\n previous.node.events.emit(\n PointerLeave,\n Object.freeze({ ...info, inside: false }),\n );\n }\n },\n () => {\n if (node?.available) {\n node.hovered = true;\n node.changed();\n node.events.emit(\n PointerEnter,\n Object.freeze({ ...info, inside: true }),\n );\n }\n },\n ],\n \"Pointer hover handlers failed\",\n );\n }\n up(data: PointerInfo): void {\n this.validate(data);\n if (this.suppressed.delete(data.pointerId)) return;\n let g = this.gestures.get(data.pointerId);\n if (!g) return;\n if (data.screen.x !== g.last.screen.x || data.screen.y !== g.last.screen.y)\n this.move(data);\n g = this.gestures.get(data.pointerId);\n if (!g) return;\n this.gestures.delete(data.pointerId);\n if (g.control) this.controlOwners.delete(g.control);\n if (g.scroll) {\n this.scrollOwners.delete(g.scroll);\n const fresh =\n data.time !== undefined &&\n g.last.time !== undefined &&\n Number.isFinite(data.time) &&\n data.time >= g.last.time &&\n data.time - g.last.time <= 0.08;\n if (fresh && !g.bar) g.scroll.startScroll(g.vx, g.vy);\n }\n const info = this.inside(g, data);\n cleanupAll(\n [\n () => g.off?.(),\n () => this.released(data.pointerId),\n () => g.control?.control?.endPointer(false),\n () => {\n if (g.node?.interactive) this.hold(g.node, data.pointerId, false);\n },\n () => {\n if (!g.node || g.node.available) this.emit(g, PointerUp, info);\n },\n () => {\n if (\n !g.scroll &&\n g.primary &&\n info.inside &&\n (!g.node || g.node.available)\n )\n this.emit(g, PointerClick, info);\n },\n () => {\n if (!g.scroll && g.primary && info.inside && g.node?.available)\n g.node.activate(\"pointer\");\n },\n ],\n \"Pointer up handlers failed\",\n );\n }\n cancel(id: number, retainOwnership = true): void {\n if (!retainOwnership) this.suppressed.delete(id);\n const g = this.gestures.get(id);\n if (!g) return;\n this.gestures.delete(id);\n if (g.control) this.controlOwners.delete(g.control);\n if (g.scroll) {\n this.scrollOwners.delete(g.scroll);\n g.scroll.stopScroll();\n }\n if (retainOwnership) this.suppressed.add(id);\n cleanupAll(\n [\n () => g.off?.(),\n () => this.released(id),\n () => g.control?.control?.endPointer(true),\n () => {\n if (g.node?.interactive) this.hold(g.node, id, false);\n },\n () =>\n this.emit(\n g,\n PointerCancel,\n Object.freeze({ ...g.last, inside: false }),\n ),\n ],\n \"Pointer cancel handlers failed\",\n );\n }\n /** Control-specific keys take priority over ancestor scrolling. Hosts preserve Tab and native editor input. */\n controlKey(node: CanvasNode, code: string): boolean {\n const port = node.control;\n if (!port?.keys.includes(code) || node.ui !== this.ui || !node.available)\n return false;\n port.key(code);\n return true;\n }\n hasKey(node: CanvasNode, code: string): boolean {\n return this.keys.get(node)?.has(code) ?? false;\n }\n key(node: CanvasNode, code: string, down: boolean): void {\n if (code !== \"Space\" && code !== \"Enter\") return;\n if (down && !node.available) return;\n const set = this.keys.get(node) ?? new Set<string>();\n const activate = !down && set.has(code);\n if (down) {\n if (node.control && !this.keys.has(node))\n this.keyRevisions.set(node, node.control.revision);\n set.add(code);\n this.keys.set(node, set);\n } else {\n set.delete(code);\n if (!set.size) {\n this.keys.delete(node);\n this.keyRevisions.delete(node);\n }\n }\n cleanupAll(\n [\n () => this.hold(node, `key:${code}`, down),\n () => {\n if (activate && node.kind !== \"hold-button\" && node.available)\n node.activate(\"keyboard\");\n },\n ],\n \"UI keyboard handlers failed\",\n );\n }\n releaseKeys(node: CanvasNode): void {\n const keys = [...(this.keys.get(node) ?? [])];\n this.keys.delete(node);\n this.keyRevisions.delete(node);\n cleanupAll(\n keys.map((code) => () => this.hold(node, `key:${code}`, false)),\n \"Keyboard hold cleanup failed\",\n );\n }\n private prune(): void {\n cleanupAll(\n [\n ...[...this.gestures]\n .filter(\n ([, g]) =>\n (g.node && !g.node.available) ||\n (g.node?.control &&\n g.controlRevision !== undefined &&\n g.node.control.revision !== g.controlRevision) ||\n (!g.scroll &&\n g.candidates.some(\n (n, i) => n.scrollRevision !== g.candidateRevisions[i],\n )) ||\n (g.ui && g.scale !== g.ui.scale) ||\n (g.scroll &&\n ((!g.bar && !g.scroll.style.dragScroll) ||\n (g.bar &&\n !canvasScrollbars(g.scroll).some(\n (b) => b.axis === g.bar?.axis && b.enabled,\n )) ||\n g.axis !== g.scroll.style.scroll ||\n g.revision !== g.scroll.scrollRevision)),\n )\n .map(\n ([id]) =>\n () =>\n this.cancel(id),\n ),\n ...[...this.hovering]\n .filter(([, h]) => !h.node.available)\n .map(\n ([id, h]) =>\n () =>\n this.hover(id, undefined, h.info),\n ),\n ...[...this.keys.keys()]\n .filter(\n (n) =>\n !n.available ||\n (n.control && this.keyRevisions.get(n) !== n.control.revision),\n )\n .map((n) => () => this.releaseKeys(n)),\n ],\n \"Invalid pointer cleanup failed\",\n );\n }\n release(): void {\n this.ui?.stopMotion();\n cleanupAll(\n [\n ...[...this.gestures.keys()].map((id) => () => this.cancel(id)),\n ...[...this.hovering].map(\n ([id, h]) =>\n () =>\n this.hover(id, undefined, h.info),\n ),\n ...[...this.keys.keys()].map((n) => () => this.releaseKeys(n)),\n ],\n \"Pointer release failed\",\n );\n }\n dispose(): void {\n try {\n this.reset();\n } finally {\n this.suppressed.clear();\n }\n }\n reset(): void {\n const off = this.subscriptions.splice(0);\n this.ui?.stopMotion();\n this.channel = undefined;\n this.ui = undefined;\n cleanupAll(\n [...off, () => this.release()],\n \"Pointer routing cleanup failed\",\n );\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { cleanupAll } from \"../foundation/lifetime\";\nimport { RandomManager } from \"../foundation/random\";\nimport { Transform } from \"../graphics/components\";\nimport { InputSystem } from \"../interaction/input\";\nimport type { ExecutionPort } from \"../scene/execution\";\nimport { Scene, SceneState } from \"../scene/scene\";\nexport class Engine {\n readonly input = new InputSystem();\n private active = new Scene(\"default\");\n private dead = false;\n private stepping = false;\n private transitioning = false;\n private suspended = false;\n private elapsed = 0;\n private count = 0;\n private execution: ExecutionPort | undefined;\n get stepCount(): number {\n return this.count;\n }\n /** @internal Replay owns this single optional execution boundary. */\n attachExecution(port: ExecutionPort): () => void {\n this.assertAlive();\n if (this.execution || this.stepping || this.transitioning)\n throw new EngineError(\n \"REPLAY_STATE\",\n \"An execution driver is already attached or Engine is stepping\",\n );\n this.execution = port;\n return () => {\n if (this.execution === port) this.execution = undefined;\n };\n }\n readonly random: RandomManager;\n private readonly context: {\n delta: number;\n scene: Scene;\n };\n constructor(options: { seed?: number } = {}) {\n this.random = new RandomManager(options.seed);\n this.active.claim(this);\n this.context = {\n delta: 0,\n scene: this.active,\n };\n }\n get scene(): Scene {\n return this.active;\n }\n get disposed(): boolean {\n return this.dead;\n }\n private assertAlive(): void {\n if (this.dead)\n throw new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\");\n }\n get paused(): boolean {\n return this.suspended;\n }\n pause(): void {\n this.assertAlive();\n if (!this.suspended) {\n this.suspended = true;\n this.input.clear();\n }\n }\n resume(): void {\n this.assertAlive();\n if (this.suspended) {\n this.suspended = false;\n this.input.clear();\n }\n }\n activate(scene: Scene): void {\n this.assertAlive();\n if (this.stepping || this.transitioning)\n throw new EngineError(\n \"TRANSITION_REENTRANT\",\n \"Cannot activate during a synchronous update or transition\",\n );\n scene.validateOwner(this);\n this.execution?.validateScene(scene);\n if (scene === this.active && scene.state === SceneState.Active) return;\n if (scene.state === SceneState.Preparing) scene.markReady();\n if (scene.state !== SceneState.Ready)\n throw new EngineError(\"SCENE_STATE\", \"Only ready scenes can activate\", {\n sceneId: scene.id,\n });\n scene.claim(this);\n const previous = this.active;\n this.transitioning = true;\n this.active = scene;\n this.context.scene = scene;\n scene.activateOwned();\n if (previous !== scene) this.input.clear();\n try {\n cleanupAll(\n [\n ...(previous !== scene\n ? [() => previous.deactivateOwned(), () => previous.dispose()]\n : []),\n () => scene.notifyActivated(),\n ],\n \"Scene transition callbacks failed\",\n );\n } finally {\n this.transitioning = false;\n }\n }\n step(seconds: number): void {\n this.assertAlive();\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Delta seconds must be finite and nonnegative\",\n );\n if (this.stepping || this.transitioning)\n throw new EngineError(\n \"STEP_REENTRANT\",\n \"Cannot step during an update or transition\",\n );\n if (\n !this.suspended &&\n (this.active.state === SceneState.Preparing ||\n this.active.state === SceneState.Ready)\n ) {\n try {\n this.activate(this.active);\n } catch (error) {\n this.execution?.failed(error);\n throw error;\n }\n // Activation hooks may synchronously terminate this first step.\n if (this.dead || this.active.disposed) return;\n }\n this.stepping = true;\n const execution = this.execution;\n try {\n execution?.beforeStep(seconds);\n this.count++;\n if (!this.suspended || this.active.state === SceneState.Active)\n this.active.beginStep();\n this.context.delta = seconds;\n this.input.beginStep(execution?.captured);\n this.context.scene = this.active;\n // Logical input callbacks remain available for pause/resume controls.\n if (!this.dead && !this.suspended && !this.active.disposed) {\n this.elapsed += seconds;\n this.active.step(this.context);\n }\n execution?.afterStep();\n } catch (error) {\n execution?.failed(error);\n throw error;\n } finally {\n this.stepping = false;\n }\n }\n snapshot() {\n return {\n stepCount: this.count,\n sceneId: this.active.id,\n sceneState: this.active.state,\n elapsed: this.elapsed,\n paused: this.suspended,\n random: this.random.snapshot(),\n input: this.input.snapshot(),\n actors: this.active.actors.map((actor) => {\n const transform = actor.get(Transform.type);\n return {\n id: actor.id,\n enabled: actor.enabled,\n ...(transform\n ? {\n transform: {\n x: transform.x,\n y: transform.y,\n rotation: transform.rotation,\n scaleX: transform.scaleX,\n scaleY: transform.scaleY,\n },\n }\n : {}),\n };\n }),\n };\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n cleanupAll(\n [\n () => this.execution?.dispose(),\n () => this.input.dispose(),\n () => this.active.dispose(),\n () => this.random.dispose(),\n ],\n \"Engine cleanup failed\",\n );\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { Engine } from \"./engine\";\nexport interface FixedStepOptions {\n readonly step?: number;\n readonly maxSteps?: number;\n readonly maxFrameDelta?: number;\n}\nexport interface FixedStepResult {\n readonly steps: number;\n readonly alpha: number;\n readonly droppedSeconds: number;\n readonly inputPumps: number;\n}\n/** Bounded host-time accumulator. Rendering and interpolation remain host responsibilities. */\nexport class FixedStepRunner {\n readonly step: number;\n readonly maxSteps: number;\n readonly maxFrameDelta: number;\n private accumulator = 0;\n private scene: Engine[\"scene\"];\n private advancing = false;\n constructor(\n private readonly engine: Engine,\n options: FixedStepOptions = {},\n ) {\n this.step = options.step ?? 1 / 60;\n this.maxSteps = options.maxSteps ?? 8;\n this.maxFrameDelta = options.maxFrameDelta ?? 0.25;\n this.scene = engine.scene;\n if (\n !Number.isFinite(this.step) ||\n this.step < 1e-6 ||\n this.step > 1 ||\n !Number.isInteger(this.maxSteps) ||\n this.maxSteps < 1 ||\n this.maxSteps > 1000 ||\n !Number.isFinite(this.maxFrameDelta) ||\n this.maxFrameDelta < this.step ||\n this.maxFrameDelta > 60\n )\n throw new EngineError(\n \"INVALID_FIXED_STEP\",\n \"step must be 1e-6..1 seconds, maxSteps 1..1000, and maxFrameDelta step..60 seconds\",\n );\n }\n reset(): void {\n this.accumulator = 0;\n this.scene = this.engine.scene;\n }\n advance(seconds: number): FixedStepResult {\n if (this.engine.disposed)\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Cannot advance a disposed Engine\",\n );\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Frame delta must be finite and nonnegative\",\n );\n if (this.advancing)\n throw new EngineError(\n \"STEP_REENTRANT\",\n \"FixedStepRunner.advance is not reentrant\",\n );\n this.advancing = true;\n try {\n if (this.scene !== this.engine.scene) this.reset();\n if (this.engine.paused) {\n this.reset();\n this.engine.step(0);\n return { steps: 0, alpha: 0, droppedSeconds: 0, inputPumps: 1 };\n }\n const accepted = Math.min(seconds, this.maxFrameDelta);\n let dropped = seconds - accepted,\n steps = 0;\n this.accumulator += accepted;\n const epsilon = this.step * 1e-9;\n while (this.accumulator + epsilon >= this.step && steps < this.maxSteps) {\n this.accumulator = Math.max(0, this.accumulator - this.step);\n this.engine.step(this.step);\n steps++;\n if (\n this.engine.disposed ||\n this.engine.paused ||\n this.scene !== this.engine.scene\n ) {\n this.reset();\n break;\n }\n }\n if (this.accumulator + epsilon >= this.step) {\n const discarded =\n Math.floor((this.accumulator + epsilon) / this.step) * this.step;\n dropped += discarded;\n this.accumulator = Math.max(0, this.accumulator - discarded);\n }\n return {\n steps,\n alpha: this.accumulator / this.step,\n droppedSeconds: dropped,\n inputPumps: 0,\n };\n } finally {\n this.advancing = false;\n }\n }\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport {\n DEFAULT_RANDOM_STREAM,\n deriveStreamSeed,\n RANDOM_ALGORITHM,\n type RandomSnapshot,\n} from \"../foundation/random\";\nimport {\n type ActionFrame,\n type ActionSchema,\n parseActionFrame,\n} from \"../interaction/action-frame\";\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | readonly JsonValue[]\n | { readonly [key: string]: JsonValue };\nexport interface ReplayControllerSchema {\n readonly id: string;\n readonly actions: readonly ActionSchema[];\n}\nexport interface ReplayStep {\n readonly index: number;\n readonly dt: number;\n readonly pausedBefore: boolean;\n readonly pausedAfter: boolean;\n readonly inputs: Readonly<Record<string, ActionFrame>>;\n}\nexport interface ReplayEvent {\n readonly step: number;\n readonly phase: \"between\" | \"step\";\n readonly order: number;\n readonly type: string;\n readonly payload: JsonValue;\n}\nexport interface ReplayData {\n readonly formatVersion: 1;\n readonly engineVersion: string;\n readonly random: RandomSnapshot;\n readonly sceneId: string;\n readonly controllers: readonly ReplayControllerSchema[];\n readonly metadata: Readonly<Record<string, JsonValue>>;\n readonly steps: readonly ReplayStep[];\n readonly events: readonly ReplayEvent[];\n}\nfunction bad(message: string): never {\n throw new EngineError(\"REPLAY_DATA\", message);\n}\nfunction object(v: unknown): Record<string, unknown> {\n if (\n !v ||\n typeof v !== \"object\" ||\n Array.isArray(v) ||\n (Object.getPrototypeOf(v) !== Object.prototype &&\n Object.getPrototypeOf(v) !== null)\n )\n return bad(\"Expected a plain JSON object\");\n return v as Record<string, unknown>;\n}\nfunction keys(v: Record<string, unknown>, names: readonly string[]): void {\n if (\n Object.keys(v).length !== names.length ||\n Object.keys(v).some((k) => !names.includes(k))\n )\n bad(\"Unexpected or missing Replay fields\");\n}\nfunction text(v: unknown): string {\n if (typeof v !== \"string\" || !v.length || v.length > 256)\n return bad(\"Identifier must contain 1 to 256 code units\");\n return v;\n}\nfunction integer(v: unknown, max = Number.MAX_SAFE_INTEGER): number {\n if (typeof v !== \"number\" || !Number.isSafeInteger(v) || v < 0 || v > max)\n return bad(\"Expected a bounded nonnegative integer\");\n return v;\n}\nfunction array(v: unknown, max: number): unknown[] {\n if (!Array.isArray(v) || v.length > max)\n return bad(\"Expected a bounded array\");\n return v;\n}\n/** Clones JSON-only payloads; rejects nonfinite numbers, cycles, class instances and undefined. */\nexport function copyJson(value: unknown): JsonValue {\n const ancestors = new Set<object>();\n let nodes = 0;\n const copy = (v: unknown, depth: number): JsonValue => {\n if (++nodes > 100000 || depth > 32)\n return bad(\"JSON payload exceeds size/depth limit\");\n if (v === null || typeof v === \"string\" || typeof v === \"boolean\") return v;\n if (typeof v === \"number\") {\n if (!Number.isFinite(v)) return bad(\"JSON numbers must be finite\");\n return v;\n }\n if (typeof v !== \"object\" || !v)\n return bad(\"Expected JSON data, not executable/host values\");\n if (Object.getOwnPropertySymbols(v).length)\n return bad(\"Symbol keys are not JSON payloads\");\n if (ancestors.has(v)) return bad(\"Cyclic JSON payload\");\n ancestors.add(v);\n let result: JsonValue;\n if (Array.isArray(v)) {\n if (Object.keys(v).length !== v.length)\n return bad(\"Sparse or extended arrays are not JSON payloads\");\n result = Object.freeze(v.map((x) => copy(x, depth + 1)));\n } else\n result = Object.freeze(\n Object.fromEntries(\n Object.entries(object(v))\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, x]) => [k, copy(x, depth + 1)]),\n ),\n );\n ancestors.delete(v);\n return result;\n };\n return copy(value, 0);\n}\n/** @internal Shared one-time validation for recording headers and imported Replay data. */\nexport type ReplayHeader = Omit<ReplayData, \"steps\" | \"events\">;\nexport function parseReplayHeader(value: unknown): ReplayHeader {\n const d = object(value);\n if (d.formatVersion !== 1) return bad(\"Unsupported Replay formatVersion\");\n const engineVersion = text(d.engineVersion),\n sceneId = text(d.sceneId),\n r = object(d.random);\n keys(r, [\"algorithm\", \"seed\", \"streams\"]);\n if (r.algorithm !== RANDOM_ALGORITHM)\n return bad(\"Unsupported random algorithm\");\n const seed = integer(r.seed, 0xffffffff),\n streamNames = new Set<string>();\n const streams = array(r.streams, 4096).map((v) => {\n const s = object(v);\n keys(s, [\"name\", \"seed\", \"state\", \"calls\"]);\n const name = text(s.name);\n if (streamNames.has(name)) return bad(\"Duplicate random stream\");\n streamNames.add(name);\n const initial = integer(s.seed, 0xffffffff);\n if (\n initial !==\n (name === DEFAULT_RANDOM_STREAM ? seed : deriveStreamSeed(seed, name))\n )\n return bad(\"Incompatible random stream seed\");\n return Object.freeze({\n name,\n seed: initial,\n state: integer(s.state, 0xffffffff),\n calls: integer(s.calls),\n });\n });\n streams.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n if (!streamNames.has(DEFAULT_RANDOM_STREAM))\n return bad(\"Missing default random stream\");\n const ids = new Set<string>();\n const controllers = array(d.controllers, 64).map((v) => {\n const c = object(v);\n keys(c, [\"id\", \"actions\"]);\n const id = text(c.id);\n if (ids.has(id)) return bad(\"Duplicate controller ID\");\n ids.add(id);\n const names = new Set<string>();\n const actions = array(c.actions, 256).map((v) => {\n const a = object(v);\n keys(a, [\"name\", \"kind\", \"normalize\"]);\n const name = text(a.name);\n if (\n names.has(name) ||\n typeof a.kind !== \"string\" ||\n ![\"button\", \"axis1d\", \"axis2d\", \"axis3d\"].includes(a.kind) ||\n typeof a.normalize !== \"boolean\"\n )\n return bad(\"Invalid or duplicate Action schema\");\n names.add(name);\n if ((a.kind === \"button\" || a.kind === \"axis1d\") && a.normalize)\n return bad(\"Unexpected normalization policy\");\n return Object.freeze({\n name,\n kind: a.kind as ActionSchema[\"kind\"],\n normalize: a.normalize,\n });\n });\n actions.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n return Object.freeze({ id, actions: Object.freeze(actions) });\n });\n controllers.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));\n const metadata = copyJson(object(d.metadata)) as Readonly<\n Record<string, JsonValue>\n >;\n return Object.freeze({\n formatVersion: 1,\n engineVersion,\n random: Object.freeze({\n algorithm: RANDOM_ALGORITHM,\n seed,\n streams: Object.freeze(streams),\n }),\n sceneId,\n controllers: Object.freeze(controllers),\n metadata,\n });\n}\nexport function parseReplayData(value: unknown): ReplayData {\n const d = object(value);\n keys(d, [\n \"formatVersion\",\n \"engineVersion\",\n \"random\",\n \"sceneId\",\n \"controllers\",\n \"metadata\",\n \"steps\",\n \"events\",\n ]);\n const header = parseReplayHeader(d),\n controllers = header.controllers,\n ids = controllers.map((c) => c.id);\n const steps = array(d.steps, 1000000).map((value, index) => {\n const s = object(value);\n keys(s, [\"index\", \"dt\", \"pausedBefore\", \"pausedAfter\", \"inputs\"]);\n if (\n s.index !== index ||\n typeof s.dt !== \"number\" ||\n !Number.isFinite(s.dt) ||\n s.dt < 0 ||\n typeof s.pausedBefore !== \"boolean\" ||\n typeof s.pausedAfter !== \"boolean\"\n )\n return bad(\"Invalid step number, delta or pause state\");\n const raw = object(s.inputs);\n keys(raw, [...ids]);\n const inputs = Object.fromEntries(\n controllers.map((c) => [c.id, parseActionFrame(raw[c.id], c.actions)]),\n );\n return Object.freeze({\n index,\n dt: s.dt,\n pausedBefore: s.pausedBefore,\n pausedAfter: s.pausedAfter,\n inputs: Object.freeze(inputs),\n });\n });\n if (!steps.length)\n return bad(\"Replay requires at least one completed input boundary\");\n let lastStep = -1,\n lastPhase = -1;\n const events = array(d.events, 1000000).map((value, index) => {\n const e = object(value);\n keys(e, [\"step\", \"phase\", \"order\", \"type\", \"payload\"]);\n const step = integer(e.step, steps.length);\n if (\n e.order !== index ||\n (e.phase !== \"between\" && e.phase !== \"step\") ||\n (e.phase === \"step\" && step === steps.length)\n )\n return bad(\"Invalid auxiliary event position\");\n const phase = e.phase === \"between\" ? 0 : 1;\n if (step < lastStep || (step === lastStep && phase < lastPhase))\n return bad(\"Auxiliary event order is not monotonic\");\n lastStep = step;\n lastPhase = phase;\n return Object.freeze({\n step,\n phase: e.phase,\n order: index,\n type: text(e.type),\n payload: copyJson(e.payload),\n });\n });\n return Object.freeze({\n ...header,\n steps: Object.freeze(steps),\n events: Object.freeze(events),\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { ENGINE_VERSION } from \"../foundation/version\";\nimport type { ActionFrame, ActionSchema } from \"../interaction/action-frame\";\nimport type { ExecutionPort } from \"../scene/execution\";\nimport type { Engine } from \"./engine\";\nimport {\n copyJson,\n type JsonValue,\n parseReplayData,\n parseReplayHeader,\n type ReplayControllerSchema,\n type ReplayData,\n type ReplayEvent,\n type ReplayHeader,\n type ReplayStep,\n} from \"./replay-data\";\n\nexport type {\n JsonValue,\n ReplayData,\n ReplayEvent,\n ReplayStep,\n} from \"./replay-data\";\nexport { parseReplayData } from \"./replay-data\";\nexport interface ReplayController {\n readonly disposed: boolean;\n readonly active: boolean;\n schema(): readonly ActionSchema[];\n frame(): ActionFrame;\n}\nexport type ReplayControllers = Readonly<Record<string, ReplayController>>;\nfunction state(message: string): never {\n throw new EngineError(\"REPLAY_STATE\", message);\n}\nfunction bindings(\n engine: Engine,\n controllers: ReplayControllers,\n): [string, ReplayController][] {\n if (engine.disposed || engine.stepCount !== 0)\n state(\n \"Replay requires a new Engine before its first step; rebuild game state with the recorded seed\",\n );\n const result = Object.entries(controllers).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0,\n ),\n seen = new Set<ReplayController>();\n if (result.length > 64) state(\"Too many Replay controllers\");\n for (const [id, c] of result) {\n if (\n !id.length ||\n id.length > 256 ||\n c.disposed ||\n seen.has(c) ||\n !engine.input.hasController(c)\n )\n state(\"Replay IDs must uniquely bind controllers owned by this Engine\");\n seen.add(c);\n }\n return result;\n}\nfunction compatible(a: unknown, b: unknown): boolean {\n return JSON.stringify(a) === JSON.stringify(b);\n}\n/** Opt-in capture of one fresh Engine/Scene run, not a save-state serializer. */\nexport class ReplayRecorder implements ExecutionPort {\n private readonly bound: readonly [string, ReplayController][];\n private readonly schemas: readonly ReplayControllerSchema[];\n private readonly metadata: Readonly<Record<string, JsonValue>>;\n private readonly maxSteps: number;\n private steps: ReplayStep[] = [];\n private events: ReplayEvent[] = [];\n private header: ReplayHeader | undefined;\n private scene: Engine[\"scene\"] | undefined;\n private completed = 0;\n private current:\n | {\n dt: number;\n pausedBefore: boolean;\n inputs?: Readonly<Record<string, ActionFrame>>;\n }\n | undefined;\n private failure: unknown;\n private closed = false;\n private readonly detach: () => void = () => {};\n constructor(\n private readonly engine: Engine,\n options: {\n controllers: ReplayControllers;\n metadata?: Readonly<Record<string, JsonValue>>;\n maxSteps?: number;\n },\n ) {\n this.bound = bindings(engine, options.controllers);\n this.schemas = this.bound.map(([id, c]) => ({ id, actions: c.schema() }));\n if (\n options.metadata !== undefined &&\n (!options.metadata ||\n typeof options.metadata !== \"object\" ||\n Array.isArray(options.metadata))\n )\n state(\"Replay metadata must be a JSON object\");\n this.metadata = copyJson(options.metadata ?? {}) as Readonly<\n Record<string, JsonValue>\n >;\n this.maxSteps = options.maxSteps ?? 100000;\n if (\n !Number.isSafeInteger(this.maxSteps) ||\n this.maxSteps < 1 ||\n this.maxSteps > 1000000\n )\n state(\"maxSteps must be an integer from 1 to 1000000\");\n this.detach = engine.attachExecution(this);\n }\n get disposed(): boolean {\n return this.closed;\n }\n get length(): number {\n return this.completed;\n }\n validateScene(scene: Engine[\"scene\"]): void {\n if (this.scene && this.scene !== scene)\n state(\n \"Replay supports one Scene; finish/dispose it before Scene replacement\",\n );\n }\n beforeStep(seconds: number): void {\n if (this.closed) return;\n if (this.failure)\n state(\"Recording failed; dispose it and rebuild the game\");\n if (this.steps.length >= this.maxSteps)\n state(\"Replay recording reached maxSteps; finish before advancing again\");\n this.engine.input.verifyControllers(this.bound.map(([, c]) => c));\n if (!this.header) {\n this.header = parseReplayHeader({\n formatVersion: 1,\n engineVersion: ENGINE_VERSION,\n random: this.engine.random.snapshot(),\n sceneId: this.engine.scene.id,\n controllers: this.schemas,\n metadata: this.metadata,\n });\n this.scene = this.engine.scene;\n }\n if (this.scene !== this.engine.scene)\n state(\n \"Replay records one Scene; start a fresh Engine to record a different Scene\",\n );\n this.current = { dt: seconds, pausedBefore: this.engine.paused };\n }\n readonly captured = (): void => {\n if (this.closed || !this.current) return;\n this.current.inputs = Object.freeze(\n Object.fromEntries(\n this.bound.map(([id, c]) => {\n const frame = c.frame();\n if (frame.events.length > 10000)\n state(\"Too many Button transitions in one Replay boundary\");\n return [id, frame];\n }),\n ),\n );\n };\n afterStep(): void {\n if (this.closed) return;\n const c = this.current;\n if (!c?.inputs) state(\"Input capture did not complete\");\n this.steps.push(\n Object.freeze({\n index: this.steps.length,\n dt: c.dt,\n pausedBefore: c.pausedBefore,\n pausedAfter: this.engine.paused,\n inputs: c.inputs,\n }),\n );\n this.completed = this.steps.length;\n this.current = undefined;\n }\n failed(error: unknown): void {\n this.failure = error;\n this.current = undefined;\n }\n record(type: string, payload: JsonValue): void {\n if (this.closed || this.failure)\n state(\"Cannot append to a closed or failed recording\");\n if (typeof type !== \"string\" || !type.length || type.length > 256)\n state(\"Event type must contain 1 to 256 code units\");\n if (this.events.length >= 1000000) state(\"Too many auxiliary events\");\n this.events.push(\n Object.freeze({\n step: this.steps.length,\n phase: this.current ? \"step\" : \"between\",\n order: this.events.length,\n type,\n payload: copyJson(payload),\n }),\n );\n }\n finish(): ReplayData {\n if (\n this.closed ||\n this.current ||\n this.failure ||\n this.engine.scene.disposed ||\n !this.header ||\n !this.steps.length\n )\n state(\n \"Finish requires a healthy recording with completed steps, outside Engine.step\",\n );\n // Headers/payloads were validated once and captured Action frames are immutable.\n // Transfer the frozen buffers rather than cloning the full recording on export.\n const result: ReplayData = Object.freeze({\n ...this.header,\n steps: Object.freeze(this.steps),\n events: Object.freeze(this.events),\n });\n this.steps = [];\n this.events = [];\n this.dispose();\n return result;\n }\n dispose(): void {\n if (this.closed) return;\n this.closed = true;\n this.detach();\n this.current = undefined;\n this.steps.length = 0;\n this.events.length = 0;\n }\n}\n/** Exclusive logical-frame playback. Auxiliary events are data and are never executed. */\nexport class ReplayPlayer implements ExecutionPort {\n readonly data: ReplayData;\n private readonly bound: readonly [string, ReplayController][];\n private readonly detach: () => void = () => {};\n private position = 0;\n private clock = 0;\n private advancing = false;\n private scene: Engine[\"scene\"] | undefined;\n private closed = false;\n private failure: unknown;\n constructor(\n private readonly engine: Engine,\n data: unknown,\n options: {\n controllers: ReplayControllers;\n expectedMetadata?: Readonly<Record<string, JsonValue>>;\n },\n ) {\n this.data = parseReplayData(data);\n this.bound = bindings(engine, options.controllers);\n if (\n this.data.engineVersion !== ENGINE_VERSION ||\n engine.random.seed !== this.data.random.seed\n )\n throw new EngineError(\n \"REPLAY_INCOMPATIBLE\",\n \"Engine version or initial seed does not match Replay\",\n );\n const schemas = this.bound.map(([id, c]) => ({ id, actions: c.schema() }));\n if (!compatible(schemas, this.data.controllers))\n throw new EngineError(\n \"REPLAY_INCOMPATIBLE\",\n \"Controller IDs or Action names/kinds/normalization do not match Replay\",\n );\n for (const [key, value] of Object.entries(options.expectedMetadata ?? {}))\n if (\n !Object.hasOwn(this.data.metadata, key) ||\n !compatible(copyJson(value), this.data.metadata[key])\n )\n throw new EngineError(\n \"REPLAY_INCOMPATIBLE\",\n `Metadata mismatch: ${key}`,\n );\n this.detach = engine.attachExecution(this);\n try {\n engine.input.lockPlayback();\n } catch (error) {\n this.detach();\n throw error;\n }\n }\n get disposed(): boolean {\n return this.closed;\n }\n get done(): boolean {\n return this.position === this.data.steps.length;\n }\n get index(): number {\n return this.position;\n }\n step(): boolean {\n if (this.closed || this.failure) state(\"Playback is closed or failed\");\n if (this.done) return false;\n const frame = this.data.steps[this.position];\n if (!frame) return false;\n this.engine.step(frame.dt);\n return true;\n }\n /** Host-time pacing; bounded catch-up slows playback rather than skipping recorded steps. */\n advance(seconds: number, maxSteps = 8): number {\n if (\n !Number.isFinite(seconds) ||\n seconds < 0 ||\n !Number.isInteger(maxSteps) ||\n maxSteps < 1 ||\n maxSteps > 1000\n )\n throw new EngineError(\n \"INVALID_DELTA\",\n \"Playback advance requires nonnegative finite seconds and maxSteps 1..1000\",\n );\n if (this.closed || this.failure) state(\"Playback is closed or failed\");\n if (this.advancing)\n throw new EngineError(\n \"STEP_REENTRANT\",\n \"Replay advance is not reentrant\",\n );\n this.advancing = true;\n try {\n const next = this.data.steps[this.position]?.dt ?? 0;\n this.clock = Math.min(\n Math.max(0.25, next),\n this.clock + Math.min(seconds, 0.25),\n );\n let count = 0;\n while (!this.done && count < maxSteps) {\n const dt = this.data.steps[this.position]?.dt ?? 0;\n if (this.clock + 1e-12 < dt) break;\n this.clock = Math.max(0, this.clock - dt);\n this.step();\n count++;\n }\n return count;\n } finally {\n this.advancing = false;\n }\n }\n validateScene(scene: Engine[\"scene\"]): void {\n if (\n (this.scene && this.scene !== scene) ||\n (!this.scene && scene.id !== this.data.sceneId)\n )\n state(\n \"Replay supports one matching Scene; dispose playback before Scene replacement\",\n );\n }\n beforeStep(seconds: number): void {\n if (this.closed || this.failure) state(\"Playback is closed or failed\");\n const frame = this.data.steps[this.position];\n if (!frame)\n throw new EngineError(\n \"REPLAY_COMPLETE\",\n \"Replay has reached its end; dispose playback before live stepping\",\n );\n if (seconds !== frame.dt)\n throw new EngineError(\n \"REPLAY_DELTA\",\n \"Step delta differs from the recorded boundary\",\n { step: this.position, expected: frame.dt, actual: seconds },\n );\n this.engine.input.verifyControllers(this.bound.map(([, c]) => c));\n if (\n (this.scene && this.scene !== this.engine.scene) ||\n this.engine.scene.id !== this.data.sceneId ||\n (!this.position &&\n !compatible(this.engine.random.snapshot(), this.data.random))\n )\n throw new EngineError(\n \"REPLAY_INITIAL_STATE\",\n \"Rebuild the same Scene and initial random consumption before playback\",\n );\n this.scene = this.engine.scene;\n if (this.engine.paused !== frame.pausedBefore) {\n if (frame.pausedBefore) this.engine.pause();\n else this.engine.resume();\n }\n this.engine.input.playbackFrames(\n new Map(\n this.bound.map(([id, c]) => [c, frame.inputs[id] as ActionFrame]),\n ),\n );\n }\n readonly captured = (): void => {};\n afterStep(): void {\n if (this.closed) return;\n const frame = this.data.steps[this.position];\n if (this.engine.paused !== frame?.pausedAfter)\n throw new EngineError(\n \"REPLAY_DIVERGED\",\n \"Pause behavior differs from Replay\",\n { step: this.position },\n );\n this.position++;\n }\n failed(error: unknown): void {\n this.failure = error;\n }\n dispose(): void {\n if (this.closed) return;\n this.closed = true;\n this.detach();\n this.engine.input.unlockPlayback();\n }\n}\n","import type { CanvasNode, UIBounds } from \"./canvas-node\";\nimport type { CanvasNativeControl } from \"./native-edit\";\n\nexport type CanvasActivation = \"pointer\" | \"keyboard\" | \"accessibility\";\nexport type CanvasControlModel =\n | {\n readonly kind: \"checkbox\";\n readonly checked: boolean;\n readonly readOnly: boolean;\n }\n | {\n readonly kind: \"slider\";\n readonly value: number;\n readonly min: number;\n readonly max: number;\n readonly step: number;\n readonly ratio: number;\n readonly readOnly: boolean;\n }\n | {\n readonly kind: \"select\";\n readonly options: readonly {\n readonly label: string;\n readonly disabled: boolean;\n }[];\n readonly selectedIndex: number;\n readonly readOnly: boolean;\n }\n | {\n readonly kind: \"text\";\n readonly text: string;\n readonly placeholder: string;\n readonly maxLength: number | undefined;\n readonly inputMode: \"text\" | \"numeric\" | \"decimal\";\n readonly numeric?: Readonly<{\n value: number;\n min: number;\n max: number;\n step: number;\n }>;\n readonly readOnly: boolean;\n };\n/** Core control commands/data consumed by input routing and Host presentations. Coordinates are UI units. */\nexport interface CanvasControlPort {\n readonly model: CanvasControlModel;\n readonly revision: number;\n readonly keys: readonly string[];\n readonly pointerAxis?: \"horizontal\";\n readonly native?: CanvasNativeControl | undefined;\n key(code: string): void;\n beginPointer(x: number, y: number): boolean;\n movePointer(x: number, y: number): void;\n endPointer(cancelled: boolean): void;\n}\n/** Shared paint/input geometry; the whole node remains the clipped pointer hit area. */\nexport function canvasSliderGeometry(\n node: CanvasNode,\n): { track: UIBounds; thumb: UIBounds } | undefined {\n const model = node.control?.model;\n if (model?.kind !== \"slider\") return;\n const b = node.bounds;\n const inset = Math.min(node.style.padding + 8, b.width / 2);\n const width = Math.max(0, b.width - inset * 2);\n const y =\n b.y + Math.max(0, Math.min(b.height, b.height - node.style.padding - 8));\n const radius = Math.min(8, b.height / 2, b.width / 2);\n return {\n track: { x: b.x + inset, y: y - 2, width, height: 4 },\n thumb: {\n x: b.x + inset + width * model.ratio - radius,\n y: y - radius,\n width: radius * 2,\n height: radius * 2,\n },\n };\n}\n/** Hosts measure/paint this exact string. Slider size is fixed by style, so value changes are paint-only. */\nexport function canvasControlText(node: CanvasNode): string {\n const model = node.control?.model;\n return model?.kind === \"slider\"\n ? `${node.text}: ${model.value}`\n : model?.kind === \"select\"\n ? (model.options[model.selectedIndex]?.label ?? \"\")\n : model?.kind === \"text\"\n ? model.text || model.placeholder\n : node.text;\n}\n\n/** Hover events/hit ownership remain independent of this presentation-only policy. */\nexport function canvasHoverHighlight(node: CanvasNode): boolean {\n return (\n node.hovered &&\n (node.style.hoverEffect === \"highlight\" ||\n (node.style.hoverEffect === \"auto\" && node.interactive))\n );\n}\n\n/** Inherited paint opacity; input availability excludes fully transparent ancestors. */\nexport function canvasOpacity(node: CanvasNode): number {\n let opacity = 1;\n for (\n let current: CanvasNode | undefined = node;\n current;\n current = current.parent\n )\n opacity *= current.presentation.opacity;\n return opacity;\n}\n","import {\n Cancellation,\n type CancellationSignal,\n} from \"../foundation/cancellation\";\nimport type { CanvasActivation, CanvasControlPort } from \"./canvas-control\";\nexport interface CanvasNodeOwner {\n readonly disposed: boolean;\n readonly scene?: LifetimeOwner;\n invalidate(layout?: boolean): void;\n report(error: unknown): void;\n scrollChanged(node: CanvasNode): void;\n motionChanged(node: CanvasNode, active: boolean): void;\n}\n\nimport { EngineError } from \"../foundation/diagnostics\";\nimport { EventBus } from \"../foundation/events\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\n\nexport type UISize = number | `${number}%`;\nexport type UIAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type UIJustify =\n | \"start\"\n | \"center\"\n | \"end\"\n | \"space-between\"\n | \"space-around\";\nexport interface CanvasStyle {\n width?: UISize;\n height?: UISize;\n minWidth?: UISize;\n maxWidth?: UISize;\n minHeight?: UISize;\n maxHeight?: UISize;\n /** Wrap text at the allocated content width. Default true. */\n textWrap?: boolean;\n direction?: \"row\" | \"column\";\n gap?: number;\n padding?: number;\n grow?: number;\n shrink?: number;\n align?: UIAlign;\n alignSelf?: UIAlign;\n justify?: UIJustify;\n wrap?: boolean;\n clip?: boolean;\n /** Preserve overflowing content on the selected axes; always clips descendants. */\n scroll?: \"vertical\" | \"horizontal\" | \"both\";\n /** Content dragging. Default true; only scroll containers use it. */\n dragScroll?: boolean;\n /** Coast after a content drag. Default true. */\n inertia?: boolean;\n /** Overlay bars; hiding bars does not disable scrolling. Default auto. */\n scrollbar?: \"auto\" | \"always\" | \"hidden\";\n /** Gesture threshold in Host screen units, independent of UI scale and DPR. Default 8. */\n dragThreshold?: number;\n /** auto blocks world input, children permits empty-space pass-through, none excludes subtree. */\n pointerEvents?: \"auto\" | \"children\" | \"none\";\n /** Hover paint only: auto highlights controls; highlight also opts containers in. */\n hoverEffect?: \"auto\" | \"none\" | \"highlight\";\n background?: number;\n color?: number;\n fontSize?: number;\n fontFamily?: string;\n radius?: number;\n}\n/** Paint-space translation, independent of Flex allocation. Rotation/scaling are not supported here. */\nexport interface CanvasPresentationStyle {\n readonly offsetX: number;\n readonly offsetY: number;\n readonly opacity: number;\n}\n/** Portable text semantics; headings require a document level. */\nexport type CanvasLabelOptions = { readonly text: string } & (\n | { readonly role?: \"status\" | \"alert\"; readonly level?: never }\n | { readonly role: \"heading\"; readonly level: 1 | 2 | 3 | 4 | 5 | 6 }\n);\nexport interface UIBounds {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n}\nexport const defaultCanvasStyle = Object.freeze({\n direction: \"column\",\n gap: 0,\n padding: 0,\n grow: 0,\n shrink: 1,\n align: \"stretch\",\n justify: \"start\",\n wrap: false,\n textWrap: true,\n clip: false,\n dragScroll: true,\n inertia: true,\n scrollbar: \"auto\",\n dragThreshold: 8,\n pointerEvents: \"children\",\n hoverEffect: \"auto\",\n color: 0xeff7f6,\n fontSize: 18,\n fontFamily: \"system-ui, sans-serif\",\n radius: 6,\n} as const);\ntype OptionalStyle =\n | \"width\"\n | \"height\"\n | \"minWidth\"\n | \"maxWidth\"\n | \"minHeight\"\n | \"maxHeight\"\n | \"background\"\n | \"alignSelf\"\n | \"scroll\";\nexport type ResolvedCanvasStyle = Readonly<\n Required<Omit<CanvasStyle, OptionalStyle>> & Pick<CanvasStyle, OptionalStyle>\n>;\nfunction checkedStyle(value: CanvasStyle): ResolvedCanvasStyle {\n const result = { ...defaultCanvasStyle, ...value };\n const fields = new Set([\n ...Object.keys(defaultCanvasStyle),\n \"width\",\n \"height\",\n \"minWidth\",\n \"maxWidth\",\n \"minHeight\",\n \"maxHeight\",\n \"background\",\n \"alignSelf\",\n \"scroll\",\n ]);\n for (const [key, v] of Object.entries(result)) {\n if (!fields.has(key) || v === undefined)\n throw new EngineError(\n \"INVALID_UI\",\n `Unknown or undefined UI style: ${key}`,\n );\n if (\n [\n \"width\",\n \"height\",\n \"minWidth\",\n \"maxWidth\",\n \"minHeight\",\n \"maxHeight\",\n ].includes(key)\n ) {\n if (\n typeof v === \"string\" &&\n /^(?:\\d+(?:\\.\\d+)?|\\.\\d+)%$/.test(v) &&\n Number.isFinite(Number(v.slice(0, -1)))\n )\n continue;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < 0)\n throw new EngineError(\n \"INVALID_UI\",\n `${key} must be nonnegative or a percentage`,\n );\n } else if (\n [\n \"gap\",\n \"padding\",\n \"grow\",\n \"shrink\",\n \"radius\",\n \"fontSize\",\n \"dragThreshold\",\n \"background\",\n \"color\",\n ].includes(key)\n ) {\n if (\n typeof v !== \"number\" ||\n !Number.isFinite(v) ||\n v < 0 ||\n (key === \"fontSize\" && v === 0) ||\n ([\"color\", \"background\"].includes(key) &&\n (!Number.isInteger(v) || v > 0xffffff))\n )\n throw new EngineError(\"INVALID_UI\", `Invalid UI ${key}`);\n } else if (\n [\"wrap\", \"clip\", \"textWrap\", \"dragScroll\", \"inertia\"].includes(key)\n ) {\n if (typeof v !== \"boolean\")\n throw new EngineError(\"INVALID_UI\", `Invalid UI ${key}`);\n } else {\n const choices: Record<string, readonly string[]> = {\n scroll: [\"vertical\", \"horizontal\", \"both\"],\n scrollbar: [\"auto\", \"always\", \"hidden\"],\n direction: [\"row\", \"column\"],\n align: [\"start\", \"center\", \"end\", \"stretch\"],\n alignSelf: [\"start\", \"center\", \"end\", \"stretch\"],\n justify: [\"start\", \"center\", \"end\", \"space-between\", \"space-around\"],\n pointerEvents: [\"auto\", \"children\", \"none\"],\n hoverEffect: [\"auto\", \"none\", \"highlight\"],\n };\n if (\n typeof v !== \"string\" ||\n (Object.hasOwn(choices, key)\n ? !choices[key]?.includes(v)\n : !validFontFamily(v))\n )\n throw new EngineError(\"INVALID_UI\", `Invalid UI ${key}`);\n }\n }\n return Object.freeze(result);\n}\nexport type CanvasNodeKind =\n | \"panel\"\n | \"label\"\n | \"button\"\n | \"hold-button\"\n | \"select\"\n | \"text-input\"\n | \"number-input\"\n | \"checkbox\"\n | \"slider\";\n/** Host-independent UI model. Single-parent ownership; removing a child disposes that subtree. */\nexport class CanvasNode implements LifetimeOwner {\n private readonly lifetime = new Lifetime();\n readonly events = new EventBus();\n readonly signal: CancellationSignal;\n private readonly abort = new Cancellation();\n private list: readonly CanvasNode[] = Object.freeze([]);\n private parentNode: CanvasNode | undefined;\n /** @internal Only a root can be claimed by a Scene UI. */ owner:\n | CanvasNodeOwner\n | undefined;\n private config: ResolvedCanvasStyle;\n private captionValue: string;\n private shown = true;\n private active = true;\n private working = false;\n /** @internal */ hovered = false;\n /** @internal */ focused = false;\n /** @internal */ held = false;\n /** @internal */ paintRevision = 0;\n /** @internal */ boundsValue: UIBounds = Object.freeze({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n });\n private offsetX = 0;\n private offsetY = 0;\n private maximumX = 0;\n private maximumY = 0;\n get scrollX(): number {\n return this.offsetX;\n }\n get scrollY(): number {\n return this.offsetY;\n }\n get maxScrollX(): number {\n return this.maximumX;\n }\n get maxScrollY(): number {\n return this.maximumY;\n }\n private velocityX = 0;\n private velocityY = 0;\n private command = 0;\n /** @internal External commands invalidate an in-flight drag's ownership. */\n get scrollRevision(): number {\n return this.command;\n }\n get coasting(): boolean {\n return this.velocityX !== 0 || this.velocityY !== 0;\n }\n /** UI units; commands stop momentum and invalidate active drag ownership, including no-ops. */\n scrollTo(x: number, y: number): boolean {\n this.assertAlive();\n if (!Number.isFinite(x) || !Number.isFinite(y))\n throw new EngineError(\"INVALID_UI\", \"Scroll coordinates must be finite\");\n this.command++;\n this.stopScroll();\n const changed = this.setScrollPosition(x, y);\n if (!changed) this.ui?.invalidate();\n return changed;\n }\n scrollBy(x: number, y: number): boolean {\n return this.scrollTo(this.offsetX + x, this.offsetY + y);\n }\n /** Stop momentum; explicit position commands also cancel pointer ownership. */\n stopScroll(): void {\n this.velocityX = 0;\n this.velocityY = 0;\n this.ui?.motionChanged(this, false);\n }\n /** @internal Gesture/animation write; does not cancel its own ownership. */\n setScrollPosition(x: number, y: number): boolean {\n if (this.disposed) return false;\n if (!Number.isFinite(x) || !Number.isFinite(y))\n throw new EngineError(\"INVALID_UI\", \"Scroll coordinates must be finite\");\n const nx = Math.max(0, Math.min(this.maximumX, x)),\n ny = Math.max(0, Math.min(this.maximumY, y));\n if (nx === this.offsetX && ny === this.offsetY) return false;\n this.offsetX = nx;\n this.offsetY = ny;\n this.ui?.scrollChanged(this);\n return true;\n }\n /** @internal UI units/second. Exponential decay rate 8/s, cutoff 10, cap 3000. */\n startScroll(vx: number, vy: number): void {\n this.stopScroll();\n if (!this.available || !this.config.scroll || !this.config.inertia) return;\n const speed = (v: number) =>\n Number.isFinite(v) && Math.abs(v) >= 10\n ? Math.max(-3000, Math.min(3000, v))\n : 0;\n this.velocityX =\n this.maximumX > 0 && this.config.scroll !== \"vertical\" ? speed(vx) : 0;\n this.velocityY =\n this.maximumY > 0 && this.config.scroll !== \"horizontal\" ? speed(vy) : 0;\n this.ui?.motionChanged(this, this.coasting);\n }\n /** @internal Exact integration for a bounded elapsed interval supplied by the Host. */\n advanceScroll(seconds: number): void {\n if (!this.available || !this.config.inertia) {\n this.stopScroll();\n return;\n }\n const tx =\n Math.abs(this.velocityX) > 10\n ? Math.min(seconds, Math.log(Math.abs(this.velocityX) / 10) / 8)\n : 0;\n const ty =\n Math.abs(this.velocityY) > 10\n ? Math.min(seconds, Math.log(Math.abs(this.velocityY) / 10) / 8)\n : 0;\n const dx = (this.velocityX * (1 - Math.exp(-8 * tx))) / 8,\n dy = (this.velocityY * (1 - Math.exp(-8 * ty))) / 8;\n this.velocityX = tx < seconds ? 0 : this.velocityX * Math.exp(-8 * seconds);\n this.velocityY = ty < seconds ? 0 : this.velocityY * Math.exp(-8 * seconds);\n const x = this.offsetX + dx,\n y = this.offsetY + dy;\n if (x <= 0 || x >= this.maximumX || Math.abs(this.velocityX) < 10)\n this.velocityX = 0;\n if (y <= 0 || y >= this.maximumY || Math.abs(this.velocityY) < 10)\n this.velocityY = 0;\n this.setScrollPosition(x, y);\n if (!this.coasting) this.ui?.motionChanged(this, false);\n }\n /** @internal Layout updates ranges/clamps after resize or mutation. */\n setScrollRange(x: number, y: number): void {\n this.maximumX = x;\n this.maximumY = y;\n this.offsetX = Math.min(this.offsetX, x);\n this.offsetY = Math.min(this.offsetY, y);\n if (x === 0) this.velocityX = 0;\n if (y === 0) this.velocityY = 0;\n if (!this.coasting) this.ui?.motionChanged(this, false);\n }\n private click:\n | ((signal: CancellationSignal) => void | Promise<void>)\n | undefined;\n private hold: ((held: boolean) => void) | undefined;\n /** @internal Text semantics supplied by CanvasLabel. */\n readonly labelSemantics:\n | Readonly<{ role?: \"heading\" | \"status\" | \"alert\"; level?: number }>\n | undefined;\n /** @internal Prefer CanvasPanel/Label/Button/HoldButton. */\n constructor(\n readonly kind: CanvasNodeKind,\n options: {\n text?: string;\n label?: Omit<CanvasLabelOptions, \"text\">;\n style?: CanvasStyle;\n click?: (signal: CancellationSignal) => void | Promise<void>;\n hold?: (held: boolean) => void;\n } = {},\n ) {\n this.captionValue = options.text ?? \"\";\n if (typeof this.captionValue !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"UI text must be a string\");\n if (options.label) {\n const { role, level } = options.label;\n if (\n kind !== \"label\" ||\n (role !== undefined &&\n ![\"heading\", \"status\", \"alert\"].includes(role)) ||\n (role === \"heading\"\n ? typeof level !== \"number\" ||\n !Number.isInteger(level) ||\n level < 1 ||\n level > 6\n : level !== undefined)\n )\n throw new EngineError(\"INVALID_UI\", \"Invalid label semantics\");\n this.labelSemantics = Object.freeze({ ...options.label });\n }\n this.config = checkedStyle(options.style ?? {});\n this.click = options.click;\n this.hold = options.hold;\n this.signal = this.abort.signal;\n }\n private presentationValue: CanvasPresentationStyle = Object.freeze({\n offsetX: 0,\n offsetY: 0,\n opacity: 1,\n });\n private mutationObservers: Set<() => void> | undefined;\n get presentation(): CanvasPresentationStyle {\n return this.presentationValue;\n }\n setPresentation(patch: Partial<CanvasPresentationStyle>): void {\n this.assertAlive();\n const next = { ...this.presentationValue, ...patch };\n if (\n !Number.isFinite(next.offsetX) ||\n !Number.isFinite(next.offsetY) ||\n !Number.isFinite(next.opacity) ||\n next.opacity < 0 ||\n next.opacity > 1\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Presentation offsets must be finite and opacity 0..1\",\n );\n const moved =\n next.offsetX !== this.presentationValue.offsetX ||\n next.offsetY !== this.presentationValue.offsetY;\n if (!moved && next.opacity === this.presentationValue.opacity) return;\n this.presentationValue = Object.freeze(next);\n this.changed(false, moved);\n }\n /** @internal Scoped adapter observations; not a second input/event system. */\n observeMutation(callback: () => void): () => void {\n this.assertAlive();\n this.mutationObservers ??= new Set();\n this.mutationObservers.add(callback);\n return () => {\n this.mutationObservers?.delete(callback);\n };\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get parent(): CanvasNode | undefined {\n return this.parentNode;\n }\n get children(): readonly CanvasNode[] {\n return this.list;\n }\n get style(): ResolvedCanvasStyle {\n return this.config;\n }\n get text(): string {\n return this.captionValue;\n }\n get bounds(): UIBounds {\n return this.boundsValue;\n }\n get visible(): boolean {\n return this.shown;\n }\n set visible(value: boolean) {\n this.setFlag(\"visible\", value);\n }\n get enabled(): boolean {\n return this.active;\n }\n set enabled(value: boolean) {\n this.setFlag(\"enabled\", value);\n }\n get busy(): boolean {\n return this.working;\n }\n get ui(): CanvasNodeOwner | undefined {\n return this.owner ?? this.parentNode?.ui;\n }\n /** Optional portable control commands and drawing model. */\n get control(): CanvasControlPort | undefined {\n return undefined;\n }\n get interactive(): boolean {\n return (\n this.kind === \"button\" ||\n this.kind === \"hold-button\" ||\n this.control !== undefined\n );\n }\n get available(): boolean {\n for (\n let node: CanvasNode | undefined = this;\n node;\n node = node.parentNode\n ) {\n if (\n node.disposed ||\n !node.shown ||\n !node.active ||\n node.working ||\n node.presentationValue.opacity === 0 ||\n node.config.pointerEvents === \"none\" ||\n node.owner?.disposed\n )\n return false;\n }\n return true;\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n private assertAlive(): void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI node has been disposed\");\n }\n private setFlag(key: \"visible\" | \"enabled\", value: boolean): void {\n this.assertAlive();\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_UI\", `${key} must be boolean`);\n if (this[key] === value) return;\n if (!value) this.stopScroll();\n if (key === \"visible\") this.shown = value;\n else this.active = value;\n this.changed(key === \"visible\");\n }\n setStyle(value: CanvasStyle): void {\n this.assertAlive();\n const next = checkedStyle({ ...this.config, ...value });\n if (\n Object.keys(next).every(\n (k) =>\n next[k as keyof CanvasStyle] === this.config[k as keyof CanvasStyle],\n )\n )\n return;\n const geometry: readonly (keyof CanvasStyle)[] = [\n \"width\",\n \"height\",\n \"minWidth\",\n \"maxWidth\",\n \"minHeight\",\n \"maxHeight\",\n \"textWrap\",\n \"direction\",\n \"gap\",\n \"padding\",\n \"grow\",\n \"shrink\",\n \"align\",\n \"alignSelf\",\n \"justify\",\n \"wrap\",\n \"fontSize\",\n \"fontFamily\",\n \"scroll\",\n ];\n const layout = geometry.some((key) => next[key] !== this.config[key]);\n if (next.scroll !== this.config.scroll || !next.inertia || !next.dragScroll)\n this.stopScroll();\n this.config = next;\n this.changed(layout);\n }\n setText(text: string): void {\n this.assertAlive();\n if (typeof text !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"UI text must be a string\");\n if (text === this.captionValue) return;\n this.captionValue = text;\n this.changed(true);\n }\n /** Appending claims and eventually disposes children; nodes cannot belong to two trees. */\n add(...nodes: CanvasNode[]): this {\n this.assertAlive();\n if (this.kind !== \"panel\")\n throw new EngineError(\"INVALID_UI\", \"Only panels contain children\");\n const unique = new Set(nodes);\n if (unique.size !== nodes.length)\n throw new EngineError(\"UI_OWNERSHIP\", \"Duplicate UI child\");\n for (const node of nodes) {\n if (node.disposed || node.parentNode || node.owner)\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"UI child already owned or disposed\",\n );\n for (let p: CanvasNode | undefined = this; p; p = p.parentNode)\n if (p === node) throw new EngineError(\"UI_OWNERSHIP\", \"UI tree cycle\");\n }\n for (const node of nodes) node.parentNode = this;\n this.list = Object.freeze([...this.list, ...nodes]);\n this.changed(true);\n return this;\n }\n /** Reorder an existing child without disposal, subscriptions or identity changes. */\n move(node: CanvasNode, index: number): this {\n this.assertAlive();\n if (\n node.parentNode !== this ||\n !Number.isInteger(index) ||\n index < 0 ||\n index >= this.list.length\n )\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"Move requires an existing child and valid final index\",\n );\n if (this.list.indexOf(node) === index) return this;\n const next = this.list.filter((n) => n !== node);\n next.splice(index, 0, node);\n this.list = Object.freeze(next);\n this.changed(true);\n return this;\n }\n /** Dispose every child, continuing even when cleanup handlers throw. */\n clear(): void {\n this.assertAlive();\n cleanupAll(\n this.list.map((node) => () => node.dispose()),\n \"UI children cleanup failed\",\n );\n }\n remove(node: CanvasNode): boolean {\n this.assertAlive();\n if (node.parentNode !== this) return false;\n node.dispose();\n return true;\n }\n /** @internal */ changed(layout = false, projection = false): void {\n this.paintRevision++;\n const invalidate = () => {\n if (projection) this.ui?.scrollChanged(this);\n else this.ui?.invalidate(layout);\n };\n if (this.mutationObservers?.size)\n cleanupAll(\n [invalidate, ...this.mutationObservers],\n \"UI mutation observers failed\",\n );\n else invalidate();\n }\n /** @internal */ setHeld(value: boolean): void {\n if (value === this.held) return;\n this.held = value;\n this.changed();\n const result: unknown = this.hold?.(value);\n if (\n result &&\n (typeof result === \"object\" || typeof result === \"function\") &&\n \"then\" in result &&\n typeof result.then === \"function\"\n ) {\n void Promise.resolve(result).catch(() => {});\n throw new EngineError(\n \"UI_ASYNC_HOLD\",\n \"Hold handlers must be synchronous; own asynchronous work separately\",\n );\n }\n }\n /** @internal Async callbacks are cancellable and disable this button until settled. */\n activate(_source: CanvasActivation = \"accessibility\"): void {\n if (!this.available || this.kind !== \"button\" || !this.click) return;\n const result = this.click(this.signal);\n if (result && typeof result.then === \"function\") {\n this.working = true;\n this.changed();\n void result\n .catch((error) => {\n if (!this.signal.aborted) this.ui?.report(error);\n })\n .finally(() => {\n this.working = false;\n if (!this.disposed) this.changed();\n });\n }\n }\n dispose(): void {\n if (this.disposed) return;\n const ui = this.ui;\n this.stopScroll();\n const children = this.list;\n this.list = Object.freeze([]);\n if (this.parentNode) {\n this.parentNode.list = Object.freeze(\n this.parentNode.list.filter((n) => n !== this),\n );\n this.parentNode = undefined;\n }\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => this.abort.cancel(),\n () => ui?.invalidate(true),\n () => this.setHeld(false),\n ...children.map((n) => () => n.dispose()),\n () => this.events.dispose(),\n () => this.mutationObservers?.clear(),\n () => {\n this.owner = undefined;\n this.click = undefined;\n this.hold = undefined;\n },\n ],\n \"Canvas node cleanup failed\",\n );\n }\n}\nexport function CanvasPanel(\n children: readonly CanvasNode[] = [],\n style: CanvasStyle = {},\n): CanvasNode {\n return new CanvasNode(\"panel\", { style }).add(...children);\n}\nexport function CanvasRow(\n children: readonly CanvasNode[],\n style: CanvasStyle = {},\n): CanvasNode {\n return CanvasPanel(children, { ...style, direction: \"row\" });\n}\nexport function CanvasColumn(\n children: readonly CanvasNode[],\n style: CanvasStyle = {},\n): CanvasNode {\n return CanvasPanel(children, { ...style, direction: \"column\" });\n}\nexport function CanvasLabel(\n content: string | CanvasLabelOptions,\n style: CanvasStyle = {},\n): CanvasNode {\n if (typeof content === \"string\")\n return new CanvasNode(\"label\", { text: content, style });\n if (!content || typeof content !== \"object\")\n throw new EngineError(\"INVALID_UI\", \"UI label must be text or options\");\n const { text, ...label } = content;\n if (typeof text !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"UI text must be a string\");\n return new CanvasNode(\"label\", { text, label, style });\n}\nexport function CanvasButton(\n text: string,\n click: (signal: CancellationSignal) => void | Promise<void>,\n style: CanvasStyle = {},\n): CanvasNode {\n return new CanvasNode(\"button\", {\n text,\n click,\n style: {\n padding: 12,\n background: 0x23594e,\n pointerEvents: \"auto\",\n ...style,\n },\n });\n}\nexport function CanvasHoldButton(\n text: string,\n hold: (held: boolean) => void,\n style: CanvasStyle = {},\n): CanvasNode {\n return new CanvasNode(\"hold-button\", {\n text,\n hold,\n style: {\n padding: 12,\n background: 0x23594e,\n pointerEvents: \"auto\",\n ...style,\n },\n });\n}\n\n/** Clipped overflowing panel. Give the viewport a bounded size or grow allocation. */\nexport function CanvasScroll(\n children: readonly CanvasNode[] = [],\n style: CanvasStyle = {},\n): CanvasNode {\n return CanvasPanel(children, {\n scroll: \"vertical\",\n pointerEvents: \"auto\",\n ...style,\n clip: true,\n });\n}\n\nfunction validFontFamily(value: string): boolean {\n const syntax = value\n .replace(/\"(?:\\\\[^\\r\\n]|[^\"\\\\])*\"|'(?:\\\\[^\\r\\n]|[^'\\\\])*'/g, \"family\")\n .replace(/\\\\(?:[0-9a-f]{1,6}[ \\t]?|[^\\r\\n])/gi, \"x\");\n return (\n value.trim().length > 0 &&\n !/[\\r\\n\\0]/.test(value) &&\n !/[;{}<>\\\\\"']|url\\s*\\(/i.test(syntax)\n );\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent } from \"../foundation/events\";\nimport { cleanupAll, type LifetimeOwner } from \"../foundation/lifetime\";\nimport type {\n CanvasActivation,\n CanvasControlModel,\n CanvasControlPort,\n} from \"./canvas-control\";\nimport { canvasSliderGeometry } from \"./canvas-control\";\nimport {\n CanvasNode,\n type CanvasNodeKind,\n type CanvasStyle,\n} from \"./canvas-node\";\nimport type { CanvasNativeControl } from \"./native-edit\";\n\nexport type CanvasValueSource = CanvasActivation | \"program\";\nexport interface CanvasValueChange<T> {\n readonly node: CanvasInputNode<T>;\n readonly previous: T;\n readonly value: T;\n readonly source: CanvasValueSource;\n}\nexport interface CanvasEditEnd<T> {\n readonly node: CanvasInputNode<T>;\n readonly previous: T;\n readonly value: T;\n readonly source: CanvasActivation;\n}\nconst boolean = (value: boolean): boolean => {\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_UI\", \"Control flag must be boolean\");\n return value;\n};\n/** Small value/lifetime foundation. Existing buttons and panels do not inherit it. */\nexport abstract class CanvasInputNode<T> extends CanvasNode {\n private current: T;\n private locked: boolean;\n private inputRevision = 0;\n private edit: { previous: T; source: CanvasActivation } | undefined;\n private readonly changeEvent =\n defineEvent<CanvasValueChange<T>>(\"CanvasValueChange\");\n private readonly commitEvent =\n defineEvent<CanvasEditEnd<T>>(\"CanvasValueCommit\");\n private readonly cancelEvent =\n defineEvent<CanvasEditEnd<T>>(\"CanvasValueCancel\");\n private readonly port: CanvasControlPort;\n protected constructor(\n kind: CanvasNodeKind,\n text: string,\n initial: T,\n private readonly normalize: (value: T) => T,\n readOnly: boolean,\n style: CanvasStyle,\n keys: readonly string[] = [],\n pointerAxis?: \"horizontal\",\n ) {\n const value = normalize(initial),\n locked = boolean(readOnly);\n super(kind, {\n text,\n style: {\n padding: 12,\n minHeight: 44,\n pointerEvents: \"auto\",\n background: 0x23594e,\n ...style,\n },\n });\n this.current = value;\n this.locked = locked;\n const self = this;\n this.port = Object.freeze({\n get model() {\n return self.model();\n },\n get revision() {\n return self.inputRevision;\n },\n get native() {\n return self.nativeControl;\n },\n keys,\n ...(pointerAxis ? { pointerAxis } : {}),\n key: (code: string) => self.controlKey(code),\n beginPointer: (x: number, y: number) => self.beginPointer(x, y),\n movePointer: (x: number, y: number) => self.movePointer(x, y),\n endPointer: (cancelled: boolean) => self.endPointer(cancelled),\n });\n this.onDispose(() => this.endPointer(true));\n }\n override get control(): CanvasControlPort {\n return this.port;\n }\n private intentVersion = 0;\n private intentObservers: Set<() => void> | undefined;\n /** @internal Changes on authoritative commands, including equal writes and edit start. */\n get animationRevision(): number {\n return this.intentVersion;\n }\n /** @internal */ observeValueIntent(callback: () => void): () => void {\n this.assertInputAlive();\n this.intentObservers ??= new Set();\n this.intentObservers.add(callback);\n return () => {\n this.intentObservers?.delete(callback);\n };\n }\n protected valueIntent(): void {\n this.intentVersion++;\n this.animationInterrupted();\n if (this.intentObservers?.size)\n cleanupAll(\n [...this.intentObservers],\n \"Value animation interruption failed\",\n );\n }\n protected animationInterrupted(): void {}\n /** @internal Program semantics without interrupting its own animation capability. */\n writeAnimatedValue(value: T): boolean {\n this.assertInputAlive();\n const next = this.normalize(value),\n version = this.intentVersion;\n if (!Object.is(next, this.current)) this.writeValue(next);\n return this.intentVersion === version;\n }\n protected abstract model(): CanvasControlModel;\n protected get nativeControl(): CanvasNativeControl | undefined {\n return undefined;\n }\n protected valueReplaced(): void {}\n protected controlKey(_code: string): void {}\n protected beginPointer(_x: number, _y: number): boolean {\n return false;\n }\n protected movePointer(_x: number, _y: number): void {}\n protected assertInputAlive(): void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI control has been disposed\");\n }\n get value(): T {\n return this.current;\n }\n set value(value: T) {\n this.setValue(value);\n }\n get readOnly(): boolean {\n return this.locked;\n }\n set readOnly(value: boolean) {\n this.assertInputAlive();\n const next = boolean(value);\n if (next === this.locked) return;\n this.valueIntent();\n this.assertInputAlive();\n this.nativeControl?.end(\"interrupt\");\n this.locked = next;\n this.inputRevision++;\n const edit = this.takeEdit();\n cleanupAll(\n [() => this.changed(), () => this.cancelled(edit)],\n \"Control read-only change failed\",\n );\n }\n get editing(): boolean {\n return this.edit !== undefined;\n }\n onChange(\n handler: (event: CanvasValueChange<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.changeEvent, handler, owner);\n }\n onCommit(\n handler: (event: CanvasEditEnd<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.commitEvent, handler, owner);\n }\n onCancel(\n handler: (event: CanvasEditEnd<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.cancelEvent, handler, owner);\n }\n /** Validated program command, even for disabled/read-only controls; cancels pending pointer editing, including equal writes. */\n setValue(value: T): void {\n this.assertInputAlive();\n const next = this.normalize(value);\n this.valueIntent();\n this.assertInputAlive();\n this.writeValue(next);\n }\n private writeValue(next: T): void {\n const previous = this.current;\n this.nativeControl?.end(\"interrupt\");\n const edit = this.takeEdit();\n this.current = next;\n this.inputRevision++;\n this.valueReplaced();\n cleanupAll(\n [\n () => this.changed(),\n () => this.notify(previous, next, \"program\"),\n () => this.cancelled(edit),\n ],\n \"Program control update failed\",\n );\n }\n protected userValue(value: T, source: CanvasActivation, commit = true): void {\n if (!this.available || this.readOnly) return;\n this.valueIntent();\n if (!this.available || this.readOnly) return;\n const next = this.normalize(value),\n previous = this.current;\n if (Object.is(previous, next)) return;\n this.current = next;\n const revision = this.inputRevision;\n cleanupAll(\n [\n () => this.changed(),\n () => this.notify(previous, next, source),\n () => {\n if (\n commit &&\n !this.disposed &&\n this.inputRevision === revision &&\n Object.is(this.current, next)\n )\n this.events.emit(\n this.commitEvent,\n Object.freeze({ node: this, previous, value: next, source }),\n );\n },\n ],\n \"User control update failed\",\n );\n }\n protected beginEdit(source: CanvasActivation = \"pointer\"): boolean {\n if (!this.available || this.readOnly || this.edit) return false;\n this.valueIntent();\n if (!this.available || this.readOnly || this.edit) return false;\n this.edit = { previous: this.current, source };\n this.changed();\n return true;\n }\n private takeEdit(): { previous: T; source: CanvasActivation } | undefined {\n const edit = this.edit;\n this.edit = undefined;\n return edit;\n }\n private notify(previous: T, value: T, source: CanvasValueSource): void {\n if (!this.disposed && !Object.is(previous, value))\n this.events.emit(\n this.changeEvent,\n Object.freeze({ node: this, previous, value, source }),\n );\n }\n private cancelled(\n edit: { previous: T; source: CanvasActivation } | undefined,\n ): void {\n if (edit)\n this.events.emit(\n this.cancelEvent,\n Object.freeze({\n node: this,\n previous: edit.previous,\n value: this.current,\n source: edit.source,\n }),\n );\n }\n /** Cancellation retains the latest immediate value; it never creates a commit or rolls back application state. */\n protected endPointer(cancelled: boolean): void {\n const edit = this.takeEdit();\n if (!edit) return;\n const value = this.current,\n revision = this.inputRevision;\n cleanupAll(\n [\n () => {\n if (!this.disposed && !this.ui?.disposed) this.changed();\n },\n () => {\n if (cancelled) this.cancelled(edit);\n else if (\n !this.disposed &&\n this.inputRevision === revision &&\n Object.is(this.current, value) &&\n !Object.is(edit.previous, value)\n )\n this.events.emit(\n this.commitEvent,\n Object.freeze({\n node: this,\n previous: edit.previous,\n value,\n source: edit.source,\n }),\n );\n },\n ],\n \"Control edit completion failed\",\n );\n }\n}\nexport interface CanvasCheckboxOptions {\n checked?: boolean;\n readOnly?: boolean;\n}\nexport class CanvasCheckboxNode extends CanvasInputNode<boolean> {\n constructor(\n text: string,\n options: CanvasCheckboxOptions = {},\n style: CanvasStyle = {},\n ) {\n super(\n \"checkbox\",\n text,\n options.checked === undefined ? false : options.checked,\n boolean,\n options.readOnly === undefined ? false : options.readOnly,\n style,\n );\n }\n get checked(): boolean {\n return this.value;\n }\n set checked(value: boolean) {\n this.setValue(value);\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"checkbox\",\n checked: this.value,\n readOnly: this.readOnly,\n });\n }\n override activate(source: CanvasActivation = \"accessibility\"): void {\n this.userValue(!this.value, source);\n }\n}\nexport function CanvasCheckbox(\n text: string,\n options: CanvasCheckboxOptions = {},\n style: CanvasStyle = {},\n): CanvasCheckboxNode {\n return new CanvasCheckboxNode(text, options, style);\n}\n\nexport interface CanvasSliderRange {\n min?: number;\n max?: number;\n step?: number;\n}\nexport interface CanvasSliderOptions extends CanvasSliderRange {\n label?: string;\n value?: number;\n readOnly?: boolean;\n}\ninterface Range {\n min: number;\n max: number;\n step: number;\n}\nexport function canvasNumericRange(options: CanvasSliderRange): Range {\n const { min = 0, max = 100, step = 1 } = options;\n if (\n ![min, max, step].every(Number.isFinite) ||\n max <= min ||\n step <= 0 ||\n !Number.isFinite(max - min) ||\n !Number.isFinite((max - min) / step) ||\n (max - min) / step > Number.MAX_SAFE_INTEGER ||\n (step < max - min && (min + step === min || max - step === max))\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Slider requires finite min < max and a positive, representable step\",\n );\n return { min, max, step };\n}\nexport function canvasNumericValue(value: number, range: Range): number {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n throw new EngineError(\"INVALID_UI\", \"Slider value must be finite\");\n const { min, max, step } = range;\n if (value <= min) return min;\n if (value >= max) return max;\n const raw = min + Math.round((value - min) / step) * step;\n const rounded = Number(raw.toPrecision(15));\n return Math.max(\n min,\n Math.min(\n max,\n Math.abs(raw - rounded) <= Math.max(1, Math.abs(raw)) * Number.EPSILON * 2\n ? rounded\n : raw,\n ),\n );\n}\nconst sliderKeys = Object.freeze([\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"PageUp\",\n \"PageDown\",\n \"Home\",\n \"End\",\n]);\nexport class CanvasSliderNode extends CanvasInputNode<number> {\n private readonly range: Range;\n constructor(options: CanvasSliderOptions = {}, style: CanvasStyle = {}) {\n const range = canvasNumericRange(options);\n super(\n \"slider\",\n options.label === undefined ? \"Value\" : options.label,\n options.value === undefined ? range.min : options.value,\n (value) => canvasNumericValue(value, range),\n options.readOnly === undefined ? false : options.readOnly,\n { width: 260, maxWidth: \"100%\", height: 76, ...style },\n sliderKeys,\n \"horizontal\",\n );\n this.range = range;\n }\n private displayed: number | undefined;\n /** Smooth visual value; logical value and ARIA remain authoritative. */\n get displayValue(): number {\n return this.displayed ?? this.value;\n }\n set displayValue(value: number) {\n const next = this.displayNumber(value);\n this.valueIntent();\n this.assertInputAlive();\n this.writeAnimatedDisplayValue(next);\n }\n private displayNumber(value: number): number {\n if (!Number.isFinite(value))\n throw new EngineError(\"INVALID_UI\", \"Display value must be finite\");\n return Math.max(this.min, Math.min(this.max, value));\n }\n /** @internal */ writeAnimatedDisplayValue(value: number): boolean {\n this.assertInputAlive();\n const next = this.displayNumber(value);\n if (next !== this.displayValue) {\n this.displayed = next;\n this.changed();\n }\n return true;\n }\n protected override valueReplaced(): void {\n this.displayed = undefined;\n }\n protected override animationInterrupted(): void {\n if (this.displayed !== undefined) {\n this.displayed = undefined;\n this.changed();\n }\n }\n get min(): number {\n return this.range.min;\n }\n get max(): number {\n return this.range.max;\n }\n get step(): number {\n return this.range.step;\n }\n /** Atomic range validation; clamps/snaps the value and cancels active pointer editing. */\n setRange(patch: CanvasSliderRange): void {\n this.assertInputAlive();\n const next = canvasNumericRange({ ...this.range, ...patch });\n Object.assign(this.range, next);\n this.setValue(this.value);\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"slider\",\n value: this.value,\n ...this.range,\n ratio: (this.displayValue - this.min) / (this.max - this.min),\n readOnly: this.readOnly,\n });\n }\n protected override controlKey(code: string): void {\n if (this.editing || !sliderKeys.includes(code)) return;\n const direction = [\"ArrowRight\", \"ArrowUp\", \"PageUp\"].includes(code)\n ? 1\n : -1;\n this.userValue(\n code === \"Home\"\n ? this.min\n : code === \"End\"\n ? this.max\n : Math.max(\n this.min,\n Math.min(\n this.max,\n this.value +\n direction * this.step * (code.startsWith(\"Page\") ? 10 : 1),\n ),\n ),\n \"keyboard\",\n );\n }\n protected override beginPointer(x: number, y: number): boolean {\n if (!this.beginEdit()) return false;\n if (this.editing) this.movePointer(x, y);\n return this.editing;\n }\n protected override movePointer(x: number, _y: number): void {\n if (!this.editing || !Number.isFinite(x)) return;\n const geometry = canvasSliderGeometry(this);\n if (geometry && geometry.track.width > 0)\n this.userValue(\n this.min +\n Math.max(\n 0,\n Math.min(1, (x - geometry.track.x) / geometry.track.width),\n ) *\n (this.max - this.min),\n \"pointer\",\n false,\n );\n }\n}\nexport function CanvasSlider(\n options: CanvasSliderOptions = {},\n style: CanvasStyle = {},\n): CanvasSliderNode {\n return new CanvasSliderNode(options, style);\n}\n","import type { CanvasActivation } from \"./canvas-control\";\n\n/** UTF-16 offsets, matching native editors; the Host owns grapheme navigation and painting. */\nexport interface CanvasTextSnapshot {\n readonly text: string;\n readonly selectionStart: number;\n readonly selectionEnd: number;\n readonly direction: \"forward\" | \"backward\" | \"none\";\n readonly composing: boolean;\n}\nexport interface CanvasNativeSession<D> {\n readonly id: number;\n readonly active: boolean;\n update(draft: D): boolean;\n commit(): boolean;\n cancel(): void;\n}\nexport interface CanvasNativePort<D> {\n begin(source: CanvasActivation): CanvasNativeSession<D> | undefined;\n /** Blur accepts a valid noncomposing draft; all other interruptions cancel. */\n end(reason: \"blur\" | \"interrupt\"): void;\n}\nexport type CanvasNativeControl =\n | ({ readonly kind: \"select\" } & CanvasNativePort<number>)\n | ({ readonly kind: \"text\" } & CanvasNativePort<CanvasTextSnapshot>);\n\nlet nextSession = 0;\n/** @internal Every callback is bound to this session and its original control generation. */\nexport function nativeSession<D>(\n valid: () => boolean,\n update: (draft: D) => void,\n finish: (commit: boolean) => boolean,\n): CanvasNativeSession<D> {\n let ended = false;\n const active = () => !ended && valid();\n return Object.freeze({\n id: ++nextSession,\n get active() {\n return active();\n },\n update(draft: D) {\n if (!active()) return false;\n update(draft);\n return active();\n },\n commit() {\n if (!active()) return false;\n ended = true;\n return finish(true);\n },\n cancel() {\n if (ended) return;\n ended = true;\n finish(false);\n },\n });\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { defineEvent } from \"../foundation/events\";\nimport type { LifetimeOwner } from \"../foundation/lifetime\";\nimport type { CanvasActivation, CanvasControlModel } from \"./canvas-control\";\nimport { CanvasInputNode } from \"./canvas-input\";\nimport type { CanvasNodeKind, CanvasStyle } from \"./canvas-node\";\nimport {\n type CanvasNativeControl,\n type CanvasNativeSession,\n type CanvasTextSnapshot,\n nativeSession,\n} from \"./native-edit\";\n\nfunction snapshot(text: string): CanvasTextSnapshot {\n return Object.freeze({\n text,\n selectionStart: text.length,\n selectionEnd: text.length,\n direction: \"none\",\n composing: false,\n });\n}\nfunction checkedSnapshot(value: CanvasTextSnapshot): CanvasTextSnapshot {\n if (\n typeof value.text !== \"string\" ||\n /[\\r\\n]/.test(value.text) ||\n !Number.isInteger(value.selectionStart) ||\n !Number.isInteger(value.selectionEnd) ||\n value.selectionStart < 0 ||\n value.selectionStart > value.selectionEnd ||\n value.selectionEnd > value.text.length ||\n ![\"forward\", \"backward\", \"none\"].includes(value.direction) ||\n typeof value.composing !== \"boolean\"\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Native editor requires single-line text and bounded UTF-16 selection\",\n );\n return Object.freeze({ ...value });\n}\nexport interface CanvasDraftChange<T> {\n readonly node: CanvasTextEditorNode<T>;\n readonly draft: CanvasTextSnapshot;\n}\n/** Shared portable native text session. Values are accepted state; drafts include composition and incomplete numbers. */\nexport abstract class CanvasTextEditorNode<T> extends CanvasInputNode<T> {\n private buffer: CanvasTextSnapshot;\n private session: CanvasNativeSession<CanvasTextSnapshot> | undefined;\n private readonly draftEvent =\n defineEvent<CanvasDraftChange<T>>(\"CanvasDraftChange\");\n private hint: string;\n protected constructor(\n kind: CanvasNodeKind,\n label: string,\n value: T,\n normalize: (value: T) => T,\n readOnly: boolean,\n placeholder: string,\n initialText: string,\n style: CanvasStyle,\n keys: readonly string[] = [],\n ) {\n if (typeof placeholder !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"Placeholder must be text\");\n super(\n kind,\n label,\n value,\n normalize,\n readOnly,\n { width: 260, maxWidth: \"100%\", height: 48, textWrap: false, ...style },\n keys,\n );\n this.hint = placeholder;\n this.buffer = snapshot(initialText);\n this.onDispose(() => this.session?.cancel());\n }\n protected abstract format(value: T): string;\n protected abstract parse(text: string): { value: T } | undefined;\n protected get inputMode(): \"text\" | \"numeric\" | \"decimal\" {\n return this.kind === \"number-input\" ? \"decimal\" : \"text\";\n }\n protected get limit(): number | undefined {\n return undefined;\n }\n get draft(): CanvasTextSnapshot {\n return this.buffer;\n }\n get placeholder(): string {\n return this.hint;\n }\n set placeholder(value: string) {\n this.assertInputAlive();\n if (typeof value !== \"string\")\n throw new EngineError(\"INVALID_UI\", \"Placeholder must be text\");\n this.hint = value;\n this.changed();\n }\n onDraftChange(\n handler: (event: CanvasDraftChange<T>) => void,\n owner?: LifetimeOwner,\n ): () => void {\n return this.events.on(this.draftEvent, handler, owner);\n }\n protected override valueReplaced(): void {\n this.buffer = snapshot(this.format(this.value));\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"text\",\n text: this.editing ? this.buffer.text : this.format(this.value),\n placeholder: this.hint,\n maxLength: this.limit,\n inputMode: this.inputMode,\n readOnly: this.readOnly,\n });\n }\n protected override get nativeControl(): CanvasNativeControl & {\n kind: \"text\";\n } {\n return {\n kind: \"text\",\n begin: (source) => this.beginTextEdit(source),\n end: (reason) => {\n if (\n reason === \"blur\" &&\n this.available &&\n !this.readOnly &&\n !this.buffer.composing\n )\n this.session?.commit();\n else this.session?.cancel();\n },\n };\n }\n beginTextEdit(\n source: CanvasActivation = \"keyboard\",\n ): CanvasNativeSession<CanvasTextSnapshot> | undefined {\n if (this.session?.active) return this.session;\n if (!this.beginEdit(source)) return;\n this.buffer = snapshot(this.format(this.value));\n const revision = this.control.revision;\n const session: CanvasNativeSession<CanvasTextSnapshot> =\n nativeSession<CanvasTextSnapshot>(\n () =>\n this.available &&\n !this.readOnly &&\n this.control.revision === revision &&\n this.session === session,\n (draft) => {\n const next = checkedSnapshot(draft);\n if (\n next.text === this.buffer.text &&\n next.selectionStart === this.buffer.selectionStart &&\n next.selectionEnd === this.buffer.selectionEnd &&\n next.direction === this.buffer.direction &&\n next.composing === this.buffer.composing\n )\n return;\n this.buffer = next;\n this.changed();\n this.events.emit(\n this.draftEvent,\n Object.freeze({ node: this, draft: next }),\n );\n },\n (commit) => {\n this.session = undefined;\n const parsed =\n commit && !this.buffer.composing\n ? this.parse(this.buffer.text)\n : undefined;\n const accepted = !!parsed && this.available && !this.readOnly;\n this.buffer = snapshot(this.format(parsed?.value ?? this.value));\n try {\n if (accepted && parsed) this.userValue(parsed.value, source, false);\n } finally {\n this.endPointer(!accepted);\n }\n return accepted;\n },\n );\n this.session = session;\n return session;\n }\n /** Explicit form boundary; composition cannot be committed as a form value. */\n commit(): boolean {\n return this.session?.commit() ?? true;\n }\n cancel(): void {\n this.session?.cancel();\n }\n override changed(layout = false): void {\n if (!this.available) this.session?.cancel();\n super.changed(layout);\n }\n}\n","import type { CanvasControlModel } from \"./canvas-control\";\nimport { CanvasTextEditorNode } from \"./canvas-editor\";\nimport {\n type CanvasSliderRange,\n canvasNumericRange,\n canvasNumericValue,\n} from \"./canvas-input\";\nimport type { CanvasStyle } from \"./canvas-node\";\nexport interface CanvasNumberInputOptions extends CanvasSliderRange {\n label?: string;\n value?: number;\n placeholder?: string;\n readOnly?: boolean;\n}\n/** Locale-independent decimal/exponent input. Incomplete drafts never become numeric values. */\nexport class CanvasNumberInputNode extends CanvasTextEditorNode<number> {\n private readonly range: ReturnType<typeof canvasNumericRange>;\n constructor(options: CanvasNumberInputOptions = {}, style: CanvasStyle = {}) {\n const range = canvasNumericRange(options),\n initial = canvasNumericValue(options.value ?? range.min, range);\n super(\n \"number-input\",\n options.label ?? \"Number\",\n initial,\n (value) => canvasNumericValue(value, range),\n options.readOnly ?? false,\n options.placeholder ?? \"\",\n String(initial),\n style,\n [\"ArrowUp\", \"ArrowDown\", \"PageUp\", \"PageDown\"],\n );\n this.range = range;\n }\n get min(): number {\n return this.range.min;\n }\n get max(): number {\n return this.range.max;\n }\n get step(): number {\n return this.range.step;\n }\n setRange(patch: CanvasSliderRange): void {\n this.assertInputAlive();\n const next = canvasNumericRange({ ...this.range, ...patch });\n this.cancel();\n Object.assign(this.range, next);\n this.setValue(this.value);\n }\n protected override format(value: number): string {\n return String(value);\n }\n protected override parse(text: string): { value: number } | undefined {\n const trimmed = text.trim();\n if (!/^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(trimmed)) return;\n const value = Number(trimmed);\n return Number.isFinite(value)\n ? { value: canvasNumericValue(value, this.range) }\n : undefined;\n }\n protected override model(): CanvasControlModel {\n const model = super.model();\n if (model.kind !== \"text\") return model;\n return Object.freeze({\n ...model,\n numeric: Object.freeze({ value: this.value, ...this.range }),\n });\n }\n protected override controlKey(code: string): void {\n if (\n !this.available ||\n this.readOnly ||\n this.draft.composing ||\n !this.control.keys.includes(code)\n )\n return;\n const base = this.editing\n ? (this.parse(this.draft.text)?.value ?? this.value)\n : this.value;\n this.cancel();\n const direction = code === \"ArrowUp\" || code === \"PageUp\" ? 1 : -1;\n const next = Math.max(\n this.min,\n Math.min(\n this.max,\n base + direction * this.step * (code.startsWith(\"Page\") ? 10 : 1),\n ),\n );\n this.userValue(next, \"keyboard\");\n this.valueReplaced();\n }\n}\nexport function CanvasNumberInput(\n options: CanvasNumberInputOptions = {},\n style: CanvasStyle = {},\n): CanvasNumberInputNode {\n return new CanvasNumberInputNode(options, style);\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport type { CanvasActivation, CanvasControlModel } from \"./canvas-control\";\nimport { CanvasInputNode } from \"./canvas-input\";\nimport type { CanvasStyle } from \"./canvas-node\";\nimport {\n type CanvasNativeControl,\n type CanvasNativeSession,\n nativeSession,\n} from \"./native-edit\";\n\nexport interface CanvasSelectOption<T> {\n readonly label: string;\n readonly value: T;\n readonly disabled?: boolean;\n}\nexport interface CanvasSelectOptions<T> {\n label?: string;\n value?: T;\n readOnly?: boolean;\n}\nfunction copyOptions<T>(options: readonly CanvasSelectOption<T>[]) {\n const result = options.map((option, index) => {\n if (\n typeof option.label !== \"string\" ||\n option.value === undefined ||\n (option.disabled !== undefined && typeof option.disabled !== \"boolean\") ||\n options.some((o, i) => i < index && Object.is(o.value, option.value))\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Select requires labels and unique defined values\",\n );\n return Object.freeze({\n label: option.label,\n value: option.value,\n disabled: option.disabled ?? false,\n });\n });\n return Object.freeze(result);\n}\n/** Native popup presentation is Host-owned; typed values/options and transactions are portable. */\nexport class CanvasSelectNode<T> extends CanvasInputNode<T | undefined> {\n private readonly state: { options: ReturnType<typeof copyOptions<T>> };\n private session: CanvasNativeSession<number> | undefined;\n private draftIndex = -1;\n constructor(\n options: readonly CanvasSelectOption<T>[],\n config: CanvasSelectOptions<T> = {},\n style: CanvasStyle = {},\n ) {\n const state = { options: copyOptions(options) };\n const first = () =>\n (state.options.find((o) => !o.disabled) ?? state.options[0])?.value;\n super(\n \"select\",\n config.label ?? \"Select\",\n config.value === undefined ? first() : config.value,\n (value) => {\n if (value === undefined && state.options.length === 0) return value;\n if (!state.options.some((o) => Object.is(o.value, value)))\n throw new EngineError(\n \"INVALID_UI\",\n \"Select value must belong to its options\",\n );\n return value;\n },\n config.readOnly ?? false,\n { width: 260, maxWidth: \"100%\", height: 48, textWrap: false, ...style },\n );\n this.state = state;\n this.onDispose(() => this.session?.cancel());\n }\n get options(): readonly CanvasSelectOption<T>[] {\n return this.state.options;\n }\n /** Atomically replace copied options. Missing values fall back to the first enabled option (then first option). */\n setOptions(options: readonly CanvasSelectOption<T>[]): void {\n this.assertInputAlive();\n const next = copyOptions(options);\n this.nativeControl.end(\"interrupt\");\n this.state.options = next;\n this.setValue(\n next.some((o) => Object.is(o.value, this.value))\n ? this.value\n : (next.find((o) => !o.disabled) ?? next[0])?.value,\n );\n }\n private get selectedIndex(): number {\n return this.state.options.findIndex((o) => Object.is(o.value, this.value));\n }\n protected override model(): CanvasControlModel {\n return Object.freeze({\n kind: \"select\",\n options: this.state.options,\n selectedIndex: this.selectedIndex,\n readOnly: this.readOnly,\n });\n }\n protected override get nativeControl(): CanvasNativeControl & {\n kind: \"select\";\n } {\n return {\n kind: \"select\",\n begin: (source) => this.beginSelection(source),\n end: (reason) => {\n if (reason === \"blur\" && this.available && !this.readOnly)\n this.session?.commit();\n else this.session?.cancel();\n },\n };\n }\n beginSelection(\n source: CanvasActivation = \"keyboard\",\n ): CanvasNativeSession<number> | undefined {\n if (this.session?.active) return this.session;\n if (!this.beginEdit(source)) return;\n this.draftIndex = this.selectedIndex;\n const revision = this.control.revision;\n const session: CanvasNativeSession<number> = nativeSession<number>(\n () =>\n this.available &&\n !this.readOnly &&\n this.control.revision === revision &&\n this.session === session,\n (index) => {\n if (\n !Number.isInteger(index) ||\n !this.state.options[index] ||\n this.state.options[index]?.disabled\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Selection requires an enabled option index\",\n );\n this.draftIndex = index;\n },\n (commit) => {\n this.session = undefined;\n const option = this.state.options[this.draftIndex];\n try {\n if (\n commit &&\n option &&\n !option.disabled &&\n this.available &&\n !this.readOnly\n )\n this.userValue(option.value, source, false);\n } finally {\n this.endPointer(!commit);\n }\n return commit;\n },\n );\n this.session = session;\n return session;\n }\n override changed(layout = false): void {\n if (!this.available) this.session?.cancel();\n super.changed(layout);\n }\n}\nexport function CanvasSelect<T>(\n options: readonly CanvasSelectOption<T>[],\n config: CanvasSelectOptions<T> = {},\n style: CanvasStyle = {},\n): CanvasSelectNode<T> {\n return new CanvasSelectNode(options, config, style);\n}\n","/** Width-aware wrapping shared by measurement and paint; no global Pixi hooks. */\nconst graphemes = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst words = new Intl.Segmenter(undefined, { granularity: \"word\" });\nconst opening = /[(〔[{〈《「『【([{]$/u;\nconst closing =\n /^[、。,.?!:;)〕]}〉》」』】)\\]!,.:;?ー々ぁぃぅぇぉっゃゅょァィゥェォッャュョ]/u;\nconst cjk = /[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}]/u;\nconst space = /^\\s+$/u;\n\n/** Preserve explicit lines/spaces. Soft-wrap separators are omitted at the line edge.\n * Common Japanese punctuation is kept with its neighbor when a fitting break exists.\n * An indivisible grapheme wider than the box is retained and presentation clips it.\n */\nexport function wrapCanvasText(\n text: string,\n width: number,\n measure: (text: string) => number,\n): string {\n const lines: string[] = [];\n for (const paragraph of text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\")) {\n if (!paragraph || measure(paragraph) <= width) {\n lines.push(paragraph);\n continue;\n }\n const chars = Array.from(graphemes.segment(paragraph), (s) => s.segment);\n const offsets = [0];\n for (const c of chars) offsets.push((offsets.at(-1) ?? 0) + c.length);\n const boundaries = new Set(\n Array.from(words.segment(paragraph), (s) => s.index),\n );\n let start = 0;\n const part = (end: number) => paragraph.slice(offsets[start], offsets[end]);\n while (start < chars.length) {\n let low = start + 1,\n high = chars.length,\n fit = start;\n // Measure complete substrings, preserving kerning/ligature shaping.\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (measure(part(mid)) <= width) {\n fit = mid;\n low = mid + 1;\n } else high = mid - 1;\n }\n if (fit === chars.length) {\n lines.push(part(fit));\n break;\n }\n let end = Math.max(start + 1, fit);\n const legal = (i: number) =>\n !opening.test(chars[i - 1] ?? \"\") && !closing.test(chars[i] ?? \"\");\n const preferred = (i: number) =>\n boundaries.has(offsets[i] ?? -1) ||\n cjk.test(chars[i - 1] ?? \"\") ||\n cjk.test(chars[i] ?? \"\") ||\n space.test(chars[i] ?? \"\");\n let candidate = end;\n while (candidate > start && !(legal(candidate) && preferred(candidate)))\n candidate--;\n if (candidate === start) {\n candidate = end;\n while (candidate > start && !legal(candidate)) candidate--;\n }\n if (candidate > start) end = candidate;\n lines.push(part(end).replace(/[\\t \\u3000]+$/u, \"\"));\n start = end;\n while (start < chars.length && space.test(chars[start] ?? \"\")) start++;\n }\n }\n return lines.join(\"\\n\");\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { CanvasTextEditorNode } from \"./canvas-editor\";\nimport type { CanvasStyle } from \"./canvas-node\";\nexport type CanvasTextInputMode = \"text\" | \"numeric\" | \"decimal\";\nexport interface CanvasTextInputOptions {\n /** Keyboard hint only; accepted text and IME remain unchanged. Default text. */\n inputMode?: CanvasTextInputMode;\n label?: string;\n value?: string;\n placeholder?: string;\n /** Maximum UTF-16 length, matching native maxlength. Composition drafts may temporarily exceed it. */\n maxLength?: number;\n readOnly?: boolean;\n}\nfunction lengthLimit(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))\n throw new EngineError(\n \"INVALID_UI\",\n \"maxLength must be a nonnegative safe integer\",\n );\n return value;\n}\nfunction validText(value: string, limit: number | undefined): string {\n if (\n typeof value !== \"string\" ||\n /[\\r\\n]/.test(value) ||\n (limit !== undefined && value.length > limit)\n )\n throw new EngineError(\n \"INVALID_UI\",\n \"Text value must be single-line and within maxLength\",\n );\n return value;\n}\nexport class CanvasTextInputNode extends CanvasTextEditorNode<string> {\n private readonly constraints: {\n maxLength: number | undefined;\n inputMode: CanvasTextInputMode;\n };\n constructor(options: CanvasTextInputOptions = {}, style: CanvasStyle = {}) {\n const inputMode = options.inputMode ?? \"text\";\n if (![\"text\", \"numeric\", \"decimal\"].includes(inputMode))\n throw new EngineError(\"INVALID_UI\", \"Invalid text keyboard hint\");\n const constraints = {\n maxLength: lengthLimit(options.maxLength),\n inputMode,\n },\n initial = validText(options.value ?? \"\", constraints.maxLength);\n super(\n \"text-input\",\n options.label ?? \"Text\",\n initial,\n (value) => validText(value, constraints.maxLength),\n options.readOnly ?? false,\n options.placeholder ?? \"\",\n initial,\n style,\n );\n this.constraints = constraints;\n }\n protected override format(value: string): string {\n return value;\n }\n protected override parse(text: string): { value: string } | undefined {\n if (this.maxLength !== undefined && text.length > this.maxLength) return;\n return { value: text };\n }\n protected override get inputMode(): CanvasTextInputMode {\n return this.constraints.inputMode;\n }\n protected override get limit(): number | undefined {\n return this.maxLength;\n }\n get maxLength(): number | undefined {\n return this.constraints.maxLength;\n }\n /** Atomic: shrinking below the accepted value is rejected. Valid changes supersede active editing. */\n setMaxLength(value: number | undefined): void {\n this.assertInputAlive();\n const next = lengthLimit(value);\n validText(this.value, next);\n this.constraints.maxLength = next;\n this.setValue(this.value);\n }\n}\nexport function CanvasTextInput(\n options: CanvasTextInputOptions = {},\n style: CanvasStyle = {},\n): CanvasTextInputNode {\n return new CanvasTextInputNode(options, style);\n}\n","import { EngineError } from \"../foundation/diagnostics\";\nimport { Tween, tweenFinite } from \"../foundation/tween\";\nimport type { CanvasSliderNode } from \"./canvas-input\";\nimport type { CanvasNode } from \"./canvas-node\";\n/** Translation is projected together with scroll and inherited by descendants; no Flex property is written. */\nexport function canvasTween(node: CanvasNode) {\n const bind = (key: \"offsetX\" | \"offsetY\" | \"opacity\") =>\n Tween.bind({\n target: node,\n key: `presentation.${key}`,\n owner: node,\n scope: () => node.ui?.scene,\n read: () => node.presentation[key],\n write: (value) => {\n node.setPresentation({ [key]: value });\n return Object.is(node.presentation[key], value);\n },\n validate: (value) => {\n tweenFinite(value, key);\n if (key === \"opacity\" && (value < 0 || value > 1))\n throw new EngineError(\"INVALID_TWEEN\", \"Opacity must be 0..1\");\n },\n });\n return Object.freeze({\n offsetX: bind(\"offsetX\"),\n offsetY: bind(\"offsetY\"),\n opacity: bind(\"opacity\"),\n });\n}\n/** Presentation transparency hides interaction, not program-driven animation. */\nfunction sliderAvailable(node: CanvasNode): boolean {\n for (\n let current: CanvasNode | undefined = node;\n current;\n current = current.parent\n )\n if (\n current.disposed ||\n !current.visible ||\n !current.enabled ||\n current.busy ||\n current.style.pointerEvents === \"none\" ||\n current.ui?.disposed\n )\n return false;\n return true;\n}\n/** Logical and display modes reserve the same channel, so a Slider has one animation authority. */\nexport function sliderTween(\n node: CanvasSliderNode,\n mode: \"value\" | \"display\" = \"value\",\n) {\n if (mode !== \"value\" && mode !== \"display\")\n throw new EngineError(\"INVALID_TWEEN\", \"Unknown Slider animation mode\");\n return Tween.bind({\n target: node,\n key: \"slider-value\",\n owner: node,\n scope: () => node.ui?.scene,\n read: () => (mode === \"value\" ? node.value : node.displayValue),\n write: (value) =>\n mode === \"value\"\n ? node.writeAnimatedValue(value)\n : node.writeAnimatedDisplayValue(value),\n valid: () => sliderAvailable(node) && !node.editing,\n stamp: () => node.animationRevision,\n watch: (invalidate) => {\n const removers = [\n node.observeValueIntent(() => invalidate(\"external-write\")),\n ];\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n removers.push(\n p.observeMutation(() => {\n if (!sliderAvailable(node)) invalidate(\"target-unavailable\");\n }),\n );\n return () => {\n for (const remove of removers) remove();\n };\n },\n });\n}\n","import { EngineError, positive } from \"../foundation/diagnostics\";\nimport {\n cleanupAll,\n Lifetime,\n type LifetimeOwner,\n} from \"../foundation/lifetime\";\nimport {\n containsUI,\n intersectUI,\n layoutCanvas,\n type MeasureText,\n} from \"./canvas-layout\";\nimport type { CanvasNode, UIBounds } from \"./canvas-node\";\nimport {\n type CanvasScrollbar,\n canvasScrollbars,\n scrollbarContains,\n} from \"./scrollbar\";\nexport interface CanvasUIOptions {\n /** Host CSS pixels per UI unit, independent of Camera and DPR. Default 1. */ scale?: number;\n}\n/** A single Scene-owned screen UI tree, prepared detached and mounted at Scene commit. */\nexport class CanvasUI implements LifetimeOwner {\n private readonly lifetime = new Lifetime();\n private focusNode: CanvasNode | undefined;\n private factor: number;\n private dirty = true;\n private measure: MeasureText | undefined;\n private projectionDirty = true;\n private readonly baseBounds = new WeakMap<CanvasNode, UIBounds>();\n private readonly moving = new Set<CanvasNode>();\n private projections = 0;\n private width = -1;\n private height = -1;\n private readonly listeners = new Set<() => void>();\n private removeScene: (() => void) | undefined;\n private visits = 0;\n private layouts = 0;\n private intrinsicVisits = 0;\n private constrainVisits = 0;\n private hits = 0;\n private hitVisits = 0;\n private nodes = 0;\n private errors: (error: unknown) => void = () => {};\n constructor(\n readonly scene: LifetimeOwner,\n readonly root: CanvasNode,\n options: CanvasUIOptions = {},\n ) {\n this.factor = positive(options.scale ?? 1, \"ui.scale\");\n if (scene.disposed || root.disposed || root.parent || root.owner)\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"UI root must be alive and unowned\",\n );\n root.owner = this;\n try {\n this.removeScene = scene.onDispose(() => this.dispose());\n } catch (error) {\n root.owner = undefined;\n throw error;\n }\n }\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n get scale(): number {\n return this.factor;\n }\n set scale(value: number) {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI has been disposed\");\n const next = positive(value, \"ui.scale\");\n if (next !== this.factor) {\n this.stopMotion();\n this.factor = next;\n this.invalidate(true);\n }\n }\n get diagnostics() {\n return {\n layouts: this.layouts,\n scrollProjections: this.projections,\n activeMomentum: this.moving.size,\n layoutVisits: this.visits,\n intrinsicVisits: this.intrinsicVisits,\n constrainVisits: this.constrainVisits,\n nodes: this.nodes,\n hitTests: this.hits,\n hitVisits: this.hitVisits,\n subscriptions: this.listeners.size,\n };\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n /** @internal */ setErrorHandler(handler: (error: unknown) => void): void {\n this.errors = handler;\n }\n /** @internal */ report(error: unknown): void {\n try {\n this.errors(error);\n } catch {\n /* Observers cannot block release. */\n }\n }\n /** @internal */ subscribe(listener: () => void): () => void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI has been disposed\");\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n get focusedNode(): CanvasNode | undefined {\n return this.focusNode;\n }\n /** Logical focus; Hosts mirror it to native controls where available. */\n focus(node?: CanvasNode): void {\n if (this.disposed)\n throw new EngineError(\"OWNER_DISPOSED\", \"UI has been disposed\");\n this.syncFocusLayout();\n if (node && !this.canFocus(node))\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"Focus requires a reachable interactive node in this UI\",\n );\n if (this.focusNode === node) {\n if (node) this.reveal(node);\n return;\n }\n const previous = this.focusNode;\n this.focusNode = node;\n if (previous) {\n previous.focused = false;\n previous.changed();\n }\n if (node) {\n node.focused = true;\n this.reveal(node);\n node.changed();\n }\n previous?.control?.native?.end(\"blur\");\n }\n /** Ordered traversal, including offscreen controls. Undefined leaves focus at the boundary. */\n focusNext(reverse = false): CanvasNode | undefined {\n this.syncFocusLayout();\n const order: CanvasNode[] = [];\n this.walk((node) => {\n if (this.canFocus(node)) order.push(node);\n });\n const index = this.focusNode ? order.indexOf(this.focusNode) : -1;\n const node =\n order[\n index < 0\n ? reverse\n ? order.length - 1\n : 0\n : index + (reverse ? -1 : 1)\n ];\n if (node) this.focus(node);\n return node;\n }\n /** Reuse the Host's last metrics after a dynamic form/list mutation. */\n private syncFocusLayout(): void {\n if (this.measure && (this.dirty || this.projectionDirty))\n this.layout(this.width, this.height, this.measure);\n }\n /** Project scroll reveal before testing clips; static clipped controls must not trap Tab. */\n private canFocus(node: CanvasNode): boolean {\n if (\n node.ui !== this ||\n !node.available ||\n !node.interactive ||\n node.style.pointerEvents !== \"auto\"\n )\n return false;\n let box: UIBounds = node.bounds;\n for (let parent = node.parent; parent; parent = parent.parent) {\n const b = parent.bounds,\n pad = parent.style.padding;\n if (parent.style.scroll) {\n const dx =\n box.x < b.x + pad\n ? box.x - b.x - pad\n : Math.max(0, box.x + box.width - b.x - b.width + pad);\n const dy =\n box.y < b.y + pad\n ? box.y - b.y - pad\n : Math.max(0, box.y + box.height - b.y - b.height + pad);\n const sx =\n Math.max(0, Math.min(parent.maxScrollX, parent.scrollX + dx)) -\n parent.scrollX;\n const sy =\n Math.max(0, Math.min(parent.maxScrollY, parent.scrollY + dy)) -\n parent.scrollY;\n box = { ...box, x: box.x - sx, y: box.y - sy };\n }\n if (parent.style.clip || parent.style.scroll) box = intersectUI(box, b);\n if (box.width <= 0 || box.height <= 0) return false;\n }\n const visible = intersectUI(box, {\n x: 0,\n y: 0,\n width: Math.max(0, this.width / this.factor),\n height: Math.max(0, this.height / this.factor),\n });\n return visible.width > 0 && visible.height > 0;\n }\n /** Scroll ancestors just enough to reveal a focused descendant. */\n private reveal(node: CanvasNode): void {\n let x = node.bounds.x,\n y = node.bounds.y;\n for (let parent = node.parent; parent; parent = parent.parent) {\n if (!parent.style.scroll) continue;\n const b = parent.bounds,\n pad = parent.style.padding;\n const dx =\n x < b.x + pad\n ? x - b.x - pad\n : Math.max(0, x + node.bounds.width - b.x - b.width + pad);\n const dy =\n y < b.y + pad\n ? y - b.y - pad\n : Math.max(0, y + node.bounds.height - b.y - b.height + pad);\n const oldX = parent.scrollX,\n oldY = parent.scrollY;\n parent.scrollBy(dx, dy);\n x -= parent.scrollX - oldX;\n y -= parent.scrollY - oldY;\n }\n }\n /** UI units. Nested scrollers consume only when their offset can change. */\n scrollAt(x: number, y: number, dx: number, dy: number): boolean {\n const targets = this.scrollTargets(x, y);\n for (const node of targets) if (node.scrollBy(dx, dy)) return true;\n return false;\n }\n /** @internal Offset-only invalidation; Flex/text measurements remain cached. */\n scrollChanged(_node: CanvasNode): void {\n this.projectionDirty = true;\n this.invalidate();\n }\n /** @internal Maintain only live animated nodes, never a per-frame scan of the tree. */\n motionChanged(node: CanvasNode, active: boolean): void {\n if (active) this.moving.add(node);\n else this.moving.delete(node);\n }\n stopMotion(): void {\n for (const node of this.moving) node.stopScroll();\n this.moving.clear();\n }\n /** Presentation seconds, independent of simulation timers. Gaps >250ms stop stale motion. */\n advance(seconds: number): void {\n if (!Number.isFinite(seconds) || seconds < 0)\n throw new EngineError(\n \"INVALID_UI\",\n \"UI elapsed time must be finite and nonnegative\",\n );\n if (this.disposed) return;\n if (seconds > 0.25) {\n this.stopMotion();\n return;\n }\n if (seconds === 0) return;\n for (const node of this.moving) {\n if (node.ui !== this || !node.available) {\n this.moving.delete(node);\n node.stopScroll();\n continue;\n }\n node.advanceScroll(seconds);\n }\n }\n /** @internal */ invalidate(layout = false): void {\n if (this.disposed) return;\n if (\n this.focusNode &&\n (this.focusNode.ui !== this || !this.focusNode.available)\n )\n this.focus();\n for (const node of this.moving)\n if (node.ui !== this || !node.available || !node.style.inertia) {\n this.moving.delete(node);\n node.stopScroll();\n }\n if (layout) this.dirty = true;\n cleanupAll([...this.listeners], \"UI invalidation failed\");\n }\n /** @internal Rendering supplies exact text metrics; unchanged frames do no layout. */\n layout(width: number, height: number, measure: MeasureText): boolean {\n if (this.disposed) return false;\n this.measure = measure;\n const geometry =\n this.dirty || this.width !== width || this.height !== height;\n if (!geometry && !this.projectionDirty) return false;\n if (geometry) {\n const visits = layoutCanvas(\n this.root,\n width / this.factor,\n height / this.factor,\n measure,\n );\n this.captureLayout(this.root);\n this.width = width;\n this.height = height;\n this.dirty = false;\n this.layouts++;\n this.visits += visits.nodes;\n this.intrinsicVisits += visits.intrinsicVisits;\n this.constrainVisits += visits.constrainVisits;\n this.nodes = visits.nodes;\n }\n this.projectScroll(this.root, 0, 0);\n this.projectionDirty = false;\n this.projections++;\n if (geometry) this.invalidate();\n return true;\n }\n private captureLayout(node: CanvasNode): void {\n const b = node.bounds;\n this.baseBounds.set(node, b);\n let x = 0,\n y = 0;\n for (const child of node.children) {\n if (!child.visible || child.disposed) continue;\n if (node.style.scroll) {\n x = Math.max(\n x,\n child.bounds.x +\n child.bounds.width -\n b.x -\n b.width +\n node.style.padding,\n );\n y = Math.max(\n y,\n child.bounds.y +\n child.bounds.height -\n b.y -\n b.height +\n node.style.padding,\n );\n }\n this.captureLayout(child);\n }\n node.setScrollRange(\n node.style.scroll && node.style.scroll !== \"vertical\" ? x : 0,\n node.style.scroll && node.style.scroll !== \"horizontal\" ? y : 0,\n );\n }\n private projectScroll(node: CanvasNode, dx: number, dy: number): void {\n if (node.disposed || !node.visible) return;\n const b = this.baseBounds.get(node);\n if (!b) return;\n const x = b.x - dx + node.presentation.offsetX,\n y = b.y - dy + node.presentation.offsetY;\n if (!Number.isFinite(x) || !Number.isFinite(y))\n throw new EngineError(\"INVALID_UI\", \"Composed UI offset must be finite\");\n if (\n node.bounds.x !== x ||\n node.bounds.y !== y ||\n node.bounds.width !== b.width ||\n node.bounds.height !== b.height\n )\n node.boundsValue = Object.freeze({\n x,\n y,\n width: b.width,\n height: b.height,\n });\n for (const child of node.children)\n this.projectScroll(\n child,\n dx + node.scrollX - node.presentation.offsetX,\n dy + node.scrollY - node.presentation.offsetY,\n );\n }\n /** Deepest ancestor path for the original hit; overlays cannot scroll content behind them. */\n scrollTargets(x: number, y: number): CanvasNode[] {\n let hit = this.hitTest(x, y);\n if (!hit) return [];\n const targets: CanvasNode[] = [];\n for (; hit; hit = hit.parent)\n if (hit.style.scroll && hit.available) targets.push(hit);\n return targets;\n }\n containsNode(node: CanvasNode, x: number, y: number): boolean {\n let b = node.bounds;\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n if (p.style.clip || p.style.scroll) b = intersectUI(b, p.bounds);\n return (\n node.available &&\n containsUI(\n intersectUI(b, {\n x: 0,\n y: 0,\n width: this.width / this.factor,\n height: this.height / this.factor,\n }),\n x,\n y,\n )\n );\n }\n /** @internal Same clipped paint order as Pixi and keyboard mirror. */\n walk(\n visit: (node: CanvasNode, clip: UIBounds) => void,\n after?: (node: CanvasNode, clip: UIBounds) => void,\n ): void {\n if (this.disposed) return;\n const walk = (node: CanvasNode, clip: UIBounds) => {\n if (node.disposed || !node.visible) return;\n const c =\n node.style.clip || node.style.scroll\n ? intersectUI(clip, node.bounds)\n : clip;\n visit(node, c);\n for (const child of node.children) walk(child, c);\n after?.(node, c);\n };\n walk(this.root, {\n x: 0,\n y: 0,\n width: Math.max(0, this.width / this.factor),\n height: Math.max(0, this.height / this.factor),\n });\n }\n /** Scroll keyboard commands remain scoped to the focused native/portable control. */\n scrollKey(node: CanvasNode, code: string): boolean {\n for (let p: CanvasNode | undefined = node; p; p = p.parent) {\n if (!p.style.scroll || !p.available) continue;\n const vertical = p.style.scroll !== \"horizontal\";\n let dx = 0,\n dy = 0;\n if (code === \"ArrowDown\") dy = 40;\n else if (code === \"ArrowUp\") dy = -40;\n else if (code === \"ArrowRight\") dx = 40;\n else if (code === \"ArrowLeft\") dx = -40;\n else if (code === \"PageDown\") {\n if (vertical) dy = p.bounds.height * 0.9;\n else dx = p.bounds.width * 0.9;\n } else if (code === \"PageUp\") {\n if (vertical) dy = -p.bounds.height * 0.9;\n else dx = -p.bounds.width * 0.9;\n } else if (code === \"Home\") {\n if (vertical) dy = -p.scrollY;\n else dx = -p.scrollX;\n } else if (code === \"End\") {\n if (vertical) dy = p.maxScrollY - p.scrollY;\n else dx = p.maxScrollX - p.scrollX;\n } else return false;\n if (p.scrollBy(dx, dy)) return true;\n }\n return false;\n }\n hitTest(x: number, y: number): CanvasNode | undefined {\n return this.pick(x, y).node;\n }\n /** One ordered hit pass covers content and post-subtree overlay bars. */\n pick(x: number, y: number): { node?: CanvasNode; bar?: CanvasScrollbar } {\n this.hits++;\n let result: { node?: CanvasNode; bar?: CanvasScrollbar } = {};\n const walk = (node: CanvasNode, clip: UIBounds) => {\n this.hitVisits++;\n if (\n node.disposed ||\n !node.visible ||\n !node.enabled ||\n node.busy ||\n node.presentation.opacity === 0 ||\n node.style.pointerEvents === \"none\" ||\n !containsUI(clip, x, y)\n )\n return;\n const c =\n node.style.clip || node.style.scroll\n ? intersectUI(clip, node.bounds)\n : clip;\n if (!containsUI(c, x, y)) return;\n if (node.style.pointerEvents === \"auto\" && containsUI(node.bounds, x, y))\n result = { node };\n for (const child of node.children) walk(child, c);\n for (const bar of canvasScrollbars(node))\n if (scrollbarContains(bar, x, y, this.factor, c))\n result = { node, bar };\n };\n if (!this.disposed)\n walk(this.root, {\n x: 0,\n y: 0,\n width: Math.max(0, this.width / this.factor),\n height: Math.max(0, this.height / this.factor),\n });\n return result;\n }\n dispose(): void {\n if (this.disposed) return;\n cleanupAll(\n [\n () => this.lifetime.dispose(),\n () => {\n if (this.focusNode) this.focusNode.focused = false;\n this.focusNode = undefined;\n },\n () => this.stopMotion(),\n () => this.root.dispose(),\n () => this.removeScene?.(),\n () => {\n this.listeners.clear();\n this.removeScene = undefined;\n this.nodes = 0;\n this.errors = () => {};\n this.measure = undefined;\n },\n ],\n \"Canvas UI cleanup failed\",\n );\n }\n}\n"],"mappings":"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"}