@simpludify/web 0.1.6 → 0.2.0

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":["CoreCanvasButton","mouseMasks"],"sources":["../src/canvas-node.ts","../src/gamepad-layout.ts","../src/gamepads.ts","../src/ui-keyboard.ts","../src/input.ts","../src/input-capture.ts","../src/pointer.ts","../src/canvas-native.ts","../src/canvas-visual.ts","../src/geometry-tilemap-visual.ts","../src/pixi-ui-cleanup.ts","../src/shared-images.ts","../src/tilemap-visual.ts","../src/virtual-input-visual.ts","../src/renderer.ts","../src/ui.ts","../src/game.ts"],"sourcesContent":["import {\n type CancellationSignal,\n type CanvasNode,\n type CanvasStyle,\n CanvasButton as CoreCanvasButton,\n} from \"@simpludify/core\";\n\nexport {\n CanvasColumn,\n CanvasHoldButton,\n CanvasLabel,\n CanvasNode,\n type CanvasNodeKind,\n type CanvasNodeOwner,\n CanvasPanel,\n CanvasRow,\n type CanvasStyle,\n defaultCanvasStyle,\n type ResolvedCanvasStyle,\n type UIAlign,\n type UIBounds,\n type UIJustify,\n type UISize,\n} from \"@simpludify/core\";\n\n/** Bridge owner cancellation to browser APIs such as fetch. */\nexport function browserAbortSignal(signal: CancellationSignal): AbortSignal {\n const controller = new AbortController();\n signal.onCancel(() => controller.abort());\n return controller.signal;\n}\n/** Preserve Web callbacks' native AbortSignal; portable definitions import Core's factory. */\nexport function CanvasButton(\n text: string,\n click: (signal: AbortSignal) => void | Promise<void>,\n style: CanvasStyle = {},\n): CanvasNode {\n let signal: AbortSignal | undefined;\n return CoreCanvasButton(\n text,\n (owner) => {\n signal ??= browserAbortSignal(owner);\n return click(signal);\n },\n style,\n );\n}\n","import { EngineError } from \"@simpludify/core\";\nimport { GamepadButton, gamepadIndex } from \"./gamepad-bindings\";\n\nexport type GamepadLayout = \"generic\" | \"xbox\" | \"playstation\" | \"nintendo\";\nexport interface GamepadInfo {\n /** Unmodified browser string; never a persistent individual-device identifier. */\n readonly id: string;\n readonly index: number;\n readonly connected: boolean;\n readonly mapping: string;\n readonly standardMapping: boolean;\n readonly buttonCount: number;\n readonly axisCount: number;\n /** Heuristic ID hint, not a browser fact or guaranteed product detection. */\n readonly inferredLayout: GamepadLayout;\n}\nconst positions = Object.fromEntries(\n Object.entries(GamepadButton).map(([name, index]) => [index, name]),\n);\nconst faces: Readonly<Record<GamepadLayout, readonly string[]>> = Object.freeze(\n {\n generic: Object.freeze([\"South\", \"East\", \"West\", \"North\"]),\n xbox: Object.freeze([\"A\", \"B\", \"X\", \"Y\"]),\n playstation: Object.freeze([\"×\", \"○\", \"□\", \"△\"]),\n nintendo: Object.freeze([\"B\", \"A\", \"Y\", \"X\"]),\n },\n);\nexport function gamepadButtonLabel(\n button: number,\n options: {\n readonly layout?: GamepadLayout;\n readonly overrides?: Readonly<Record<number, string>>;\n } = {},\n): string {\n gamepadIndex(button);\n const layout = options.layout ?? \"generic\";\n if (!Object.hasOwn(faces, layout))\n throw new EngineError(\n \"INVALID_GAMEPAD_BINDING\",\n \"Unknown gamepad display layout\",\n );\n if (options.overrides && Object.hasOwn(options.overrides, button)) {\n const label = options.overrides[button];\n if (typeof label !== \"string\")\n throw new EngineError(\n \"INVALID_GAMEPAD_BINDING\",\n \"Button label must be a string\",\n );\n return label;\n }\n return faces[layout][button] ?? positions[button] ?? `Button ${button}`;\n}\nexport function inferredGamepadLayout(id: string): GamepadLayout {\n if (/dualsense|dualshock|playstation|054c/i.test(id)) return \"playstation\";\n if (/nintendo|switch|057e/i.test(id)) return \"nintendo\";\n if (/xbox|xinput|045e/i.test(id)) return \"xbox\";\n return \"generic\";\n}\n","import {\n type ActionController,\n type ActionSet,\n type ActionSource,\n type ActionToken,\n defineEvent,\n EngineError,\n EventBus,\n type InputAdapter,\n type InputSystem,\n Lifetime,\n type LifetimeOwner,\n} from \"@simpludify/core\";\nimport {\n type CheckedGamepadBinding,\n checkedGamepadBindings,\n type GamepadAxisBinding,\n type GamepadBindings,\n type GamepadButtonBinding,\n type GamepadVector3Binding,\n gamepadDeadZone,\n gamepadIndex,\n} from \"./gamepad-bindings\";\nimport { type GamepadInfo, inferredGamepadLayout } from \"./gamepad-layout\";\n\n/** Structural polling boundary also usable by deterministic tests/custom Web hosts. */\nexport interface GamepadState {\n readonly id: string;\n readonly index: number;\n readonly connected: boolean;\n readonly mapping: string;\n readonly axes: readonly number[];\n readonly buttons: readonly {\n readonly value: number;\n readonly pressed: boolean;\n }[];\n}\nexport type GamepadPoll = () => readonly (GamepadState | null)[];\nexport interface GamepadOptions<A extends ActionSet> {\n readonly index: number;\n /** Omit to follow ActionController's common gamepad settings. */\n readonly bindings?: GamepadBindings<A>;\n readonly deadZone?: number;\n /** Positional constants require standard mapping; raw is an explicit opt-in. */\n readonly mapping?: \"standard\" | \"raw\";\n}\nconst finite = (v: unknown, min: number, max: number): number =>\n typeof v === \"number\" && Number.isFinite(v)\n ? Math.max(min, Math.min(max, v))\n : 0;\nconst buttonValue = (pad: GamepadState, index: number): number =>\n finite(pad.buttons[index]?.value, 0, 1);\nfunction scalar(\n pad: GamepadState,\n binding: GamepadAxisBinding,\n deadZone: number,\n): number {\n const group = (indices: readonly number[] | undefined) =>\n (indices ?? []).reduce(\n (maximum, index) => Math.max(maximum, buttonValue(pad, index)),\n 0,\n );\n const raw =\n finite(\n (binding.axis === undefined ? 0 : finite(pad.axes[binding.axis], -1, 1)) +\n group(binding.positive) -\n group(binding.negative),\n -1,\n 1,\n ) * (binding.invert ? -1 : 1);\n const zone = binding.deadZone ?? deadZone;\n return Math.abs(raw) <= zone\n ? 0\n : (Math.sign(raw) * (Math.abs(raw) - zone)) / (1 - zone);\n}\nfunction values(\n pad: GamepadState,\n bindings: readonly CheckedGamepadBinding[],\n zone: number,\n) {\n return bindings.map(([action, binding]) => {\n if (action.kind === \"button\")\n return [\n action,\n (binding as GamepadButtonBinding).buttons?.some(\n (b) =>\n buttonValue(pad, typeof b === \"number\" ? b : b.button) >=\n (typeof b === \"number\" ? 0.5 : (b.threshold ?? 0.5)),\n ) ?? false,\n ] as const;\n if (action.kind === \"axis1d\")\n return [\n action,\n scalar(pad, binding as GamepadAxisBinding, zone),\n ] as const;\n const b = binding as GamepadVector3Binding,\n x = scalar(pad, b.x ?? {}, zone),\n y = scalar(pad, b.y ?? {}, zone);\n return [\n action,\n action.kind === \"axis2d\"\n ? { x, y }\n : { x, y, z: scalar(pad, b.z ?? {}, zone) },\n ] as const;\n });\n}\nfunction neutral(\n value:\n | boolean\n | number\n | { readonly x: number; readonly y: number; readonly z?: number },\n): boolean {\n return typeof value === \"boolean\"\n ? !value\n : typeof value === \"number\"\n ? value === 0\n : value.x === 0 && value.y === 0 && (value.z ?? 0) === 0;\n}\n\n/** A controller-owned device contribution. Reassignment does not replace its readers/Actors. */\nexport class GamepadSource<A extends ActionSet> {\n private readonly life = new Lifetime();\n private readonly source: ActionSource<A>;\n private bindings: readonly CheckedGamepadBinding[];\n private assigned: number;\n private armed = false;\n private signature: string | undefined;\n private readonly zone: number;\n private readonly mapping: \"standard\" | \"raw\";\n private following: boolean;\n private bindingRevision: number;\n private readonly waiting = new Set<ActionToken>();\n constructor(\n private readonly input: GamepadInput,\n private readonly controller: ActionController<A>,\n options: GamepadOptions<A>,\n ) {\n input.assertController(controller);\n this.assigned = gamepadIndex(options.index);\n this.zone = gamepadDeadZone(options.deadZone ?? 0.15);\n this.mapping = options.mapping ?? \"standard\";\n if (this.mapping !== \"standard\" && this.mapping !== \"raw\")\n throw new EngineError(\n \"INVALID_GAMEPAD_BINDING\",\n \"Unknown gamepad mapping policy\",\n );\n this.following = options.bindings === undefined;\n this.bindingRevision = controller.bindingRevision;\n this.bindings = this.following\n ? this.commonBindings()\n : checkedGamepadBindings(controller.actions, options.bindings);\n this.source = controller.createSource();\n this.life.onDispose(() => this.source.dispose());\n this.life.onDispose(controller.onDispose(() => this.dispose()));\n }\n get disposed(): boolean {\n return this.life.disposed;\n }\n get enabled(): boolean {\n return this.source.enabled;\n }\n set enabled(value: boolean) {\n this.alive();\n if (value === this.source.enabled) return;\n this.source.enabled = value;\n this.clear();\n }\n get index(): number {\n return this.assigned;\n }\n get info(): GamepadInfo | undefined {\n return this.input.devices.find((d) => d.index === this.assigned);\n }\n get connected(): boolean {\n return this.info?.connected ?? false;\n }\n get usable(): boolean {\n return (\n this.connected &&\n (this.mapping === \"raw\" || this.info?.standardMapping === true)\n );\n }\n assign(index: number): void {\n this.alive();\n const checked = gamepadIndex(index);\n if (checked === this.assigned) return;\n this.clear();\n this.signature = undefined;\n this.assigned = checked;\n }\n rebind(bindings?: GamepadBindings<A>): void {\n this.alive();\n const checked =\n bindings === undefined\n ? this.commonBindings()\n : checkedGamepadBindings(this.controller.actions, bindings);\n this.clear();\n this.bindings = checked;\n this.following = bindings === undefined;\n this.bindingRevision = this.controller.bindingRevision;\n }\n private commonBindings(): readonly CheckedGamepadBinding[] {\n return Object.freeze(\n Object.values(this.controller.actions).flatMap((action) => {\n const binding = this.controller.getBinding(\n action as A[keyof A],\n ).gamepad;\n return binding ? [Object.freeze([action, binding] as const)] : [];\n }),\n );\n }\n private syncBindings(): void {\n if (\n !this.following ||\n this.bindingRevision === this.controller.bindingRevision\n )\n return;\n const next = this.commonBindings();\n const before = new Map(this.bindings),\n after = new Map(next);\n for (const action of new Set([...before.keys(), ...after.keys()])) {\n if (\n JSON.stringify(before.get(action)) === JSON.stringify(after.get(action))\n )\n continue;\n this.source.resetBinding(action as A[keyof A]);\n if (after.has(action)) this.waiting.add(action);\n else this.waiting.delete(action);\n }\n this.bindings = next;\n this.bindingRevision = this.controller.bindingRevision;\n }\n clear(): void {\n this.source.clear();\n this.armed = false;\n this.waiting.clear();\n }\n private alive(): void {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Gamepad source has been disposed\",\n );\n }\n /** @internal */ sample(\n pad: GamepadState | undefined,\n allowed: boolean,\n ): void {\n if (this.disposed) return;\n this.syncBindings();\n if (\n !allowed ||\n !this.enabled ||\n !this.controller.active ||\n !pad ||\n (this.mapping === \"standard\" && pad.mapping !== \"standard\")\n ) {\n this.clear();\n this.signature = undefined;\n return;\n }\n const signature = JSON.stringify([\n pad.id,\n pad.mapping,\n pad.buttons.length,\n pad.axes.length,\n ]);\n if (signature !== this.signature) {\n this.clear();\n this.signature = signature;\n }\n const next = values(pad, this.bindings, this.zone);\n if (!this.armed) {\n if (next.every(([, value]) => neutral(value))) this.armed = true;\n return;\n }\n for (const [action, value] of next) {\n if (this.waiting.has(action)) {\n if (!neutral(value)) continue;\n this.waiting.delete(action);\n }\n this.source.set(action as A[keyof A], value as never);\n }\n }\n /** @internal */ onDispose(callback: () => void): () => void {\n return this.life.onDispose(callback);\n }\n dispose(): void {\n this.life.dispose();\n }\n}\n\nconst devicesChanged = defineEvent<void>(\"GamepadsChanged\");\n\n/** One Web host adapter; multiple sources share a single snapshot per Engine input boundary. */\nexport class GamepadInput implements InputAdapter {\n private readonly life = new Lifetime();\n private readonly changes = new EventBus();\n private readonly sources = new Set<GamepadSource<ActionSet>>();\n private readonly disconnected = new Set<number>();\n private listed: readonly GamepadInfo[] = Object.freeze([]);\n private readable = false;\n private readonly poll: GamepadPoll;\n private readonly active: () => boolean;\n private readonly observe:\n | ((pads: ReadonlyMap<number, GamepadState>) => void)\n | undefined;\n constructor(\n private readonly input: InputSystem,\n options: {\n readonly poll?: GamepadPoll;\n readonly active?: () => boolean;\n readonly events?: EventTarget;\n /** @internal Host capture observes the same poll before any device contribution. */\n readonly observe?: (pads: ReadonlyMap<number, GamepadState>) => void;\n } = {},\n ) {\n this.life.onDispose(() => this.changes.dispose());\n this.poll =\n options.poll ??\n (() =>\n typeof navigator !== \"undefined\" &&\n typeof navigator.getGamepads === \"function\"\n ? navigator.getGamepads()\n : (() => {\n throw new Error(\"Gamepad API unavailable\");\n })());\n this.active = options.active ?? (() => true);\n this.observe = options.observe;\n this.life.onDispose(input.addAdapter(this));\n const events =\n options.events ?? (typeof window === \"undefined\" ? undefined : window),\n abort = new AbortController();\n this.life.onDispose(() => abort.abort());\n events?.addEventListener(\n \"gamepaddisconnected\",\n (event) => {\n const index = (event as GamepadEvent).gamepad.index;\n this.disconnected.add(index);\n for (const source of this.sources)\n if (source.index === index) source.clear();\n this.publish(this.listed.filter((d) => d.index !== index));\n },\n { signal: abort.signal },\n );\n events?.addEventListener(\n \"gamepadconnected\",\n (event) => {\n const index = (event as GamepadEvent).gamepad.index;\n this.disconnected.delete(index);\n for (const source of this.sources)\n if (source.index === index) source.clear();\n },\n { signal: abort.signal },\n );\n }\n get disposed(): boolean {\n return this.life.disposed;\n }\n /** Whether the most recent polling attempt completed; an empty list may still need a user gesture. */\n get available(): boolean {\n return this.readable;\n }\n get devices(): readonly GamepadInfo[] {\n return this.listed;\n }\n onChange(handler: () => void, owner?: LifetimeOwner): () => void {\n return this.changes.on(devicesChanged, handler, owner);\n }\n private publish(devices: readonly GamepadInfo[], force = false): void {\n const changed = JSON.stringify(this.listed) !== JSON.stringify(devices);\n this.listed = Object.freeze(devices);\n if (changed || force) this.changes.emit(devicesChanged, undefined);\n }\n /** @internal */ assertController(controller: object): void {\n if (!this.input.hasController(controller))\n throw new EngineError(\n \"INVALID_ACTION\",\n \"Gamepad controller must belong to this InputSystem\",\n );\n }\n bind<A extends ActionSet>(\n controller: ActionController<A>,\n options: GamepadOptions<A>,\n ): GamepadSource<A> {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Gamepad input has been disposed\",\n );\n const source = new GamepadSource(this, controller, options);\n const entry = source as unknown as GamepadSource<ActionSet>;\n this.sources.add(entry);\n const remove = this.life.onDispose(() => source.dispose());\n source.onDispose(() => {\n this.sources.delete(entry);\n remove();\n });\n return source;\n }\n sample(): void {\n if (this.disposed) return;\n const wasReadable = this.readable;\n let snapshots: readonly (GamepadState | null)[];\n try {\n snapshots = this.poll();\n if (!Array.isArray(snapshots))\n throw new Error(\"Invalid gamepad snapshot\");\n this.readable = true;\n } catch {\n snapshots = [];\n this.readable = false;\n }\n const pads = new Map<number, GamepadState>();\n for (const pad of snapshots)\n if (\n pad?.connected &&\n typeof pad.id === \"string\" &&\n typeof pad.mapping === \"string\" &&\n Array.isArray(pad.axes) &&\n Array.isArray(pad.buttons) &&\n Number.isSafeInteger(pad.index) &&\n pad.index >= 0\n )\n pads.set(pad.index, pad);\n for (const index of this.disconnected)\n if (!pads.has(index)) this.disconnected.delete(index);\n for (const index of this.disconnected) pads.delete(index);\n const listed = Object.freeze(\n [...pads.values()]\n .sort((a, b) => a.index - b.index)\n .map((p) =>\n Object.freeze({\n id: p.id,\n index: p.index,\n connected: p.connected,\n mapping: p.mapping,\n standardMapping: p.mapping === \"standard\",\n buttonCount: p.buttons.length,\n axisCount: p.axes.length,\n inferredLayout: inferredGamepadLayout(p.id),\n }),\n ),\n );\n this.observe?.(pads);\n const allowed = this.active() && this.input.liveInput;\n for (const source of this.sources) {\n if (source.disposed) this.sources.delete(source);\n else source.sample(pads.get(source.index), allowed);\n }\n this.publish(listed, wasReadable !== this.readable);\n }\n reset(): void {\n for (const source of this.sources) source.clear();\n }\n dispose(): void {\n this.life.dispose();\n this.sources.clear();\n this.listed = Object.freeze([]);\n }\n}\n","/** Host-only ownership metadata; native editing is never reconstructed from game keys. */\nconst gameButtons = new WeakSet<HTMLButtonElement>();\nconst consumed = new WeakSet<KeyboardEvent>();\nexport function registerGameButton(\n button: HTMLButtonElement,\n signal: AbortSignal,\n): void {\n gameButtons.add(button);\n // Preserve native DOM activation defaults while reserving these keys for UI.\n button.addEventListener(\n \"keydown\",\n (event) => {\n if (event.code === \"Enter\" || event.code === \"Space\") consumed.add(event);\n },\n { signal },\n );\n}\nexport function uiConsumesKey(event: KeyboardEvent): boolean {\n return consumed.has(event) || event.defaultPrevented;\n}\n/** Unmanaged native buttons retain the previous isolated keyboard behavior. */\nexport function blocksGameKeyboard(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable || target.closest(\"input,textarea,select\"))\n return true;\n const button = target.closest(\"button\");\n return !!button && !gameButtons.has(button);\n}\n/** Grant surface focus from outside/editing; do not evict a compatible UI button. */\nexport function focusGameSurface(host: HTMLElement): void {\n const active = document.activeElement;\n if (\n active === host ||\n (active instanceof HTMLElement &&\n host.contains(active) &&\n !blocksGameKeyboard(active))\n )\n return;\n host.focus({ preventScroll: true });\n}\n","import { type InputSystem, isKeyCode } from \"@simpludify/core\";\nimport {\n blocksGameKeyboard,\n focusGameSurface,\n uiConsumesKey,\n} from \"./ui-keyboard\";\n/** Scoped keyboard adapter: editors own text; engine buttons consume only their UI keys. */\nexport class BrowserInput {\n private readonly controller = new AbortController();\n constructor(host: HTMLElement, input: InputSystem) {\n const source = input.createKeyboardSource();\n let compositionOwner: EventTarget | null = null;\n const down = (event: KeyboardEvent) => {\n // A removed/replaced editor must not leave a stale global composition lock.\n if (\n compositionOwner &&\n (!(compositionOwner instanceof Node) ||\n !compositionOwner.isConnected ||\n !host.contains(compositionOwner) ||\n document.activeElement !== compositionOwner)\n )\n compositionOwner = null;\n if (\n compositionOwner ||\n event.isComposing ||\n event.keyCode === 229 ||\n blocksGameKeyboard(event.target)\n ) {\n source.clear();\n return;\n }\n if (uiConsumesKey(event) || event.code === \"Tab\") {\n if (isKeyCode(event.code)) source.set(event.code, false);\n return;\n }\n if (!isKeyCode(event.code) || !input.acceptsKey(event.code)) return;\n event.preventDefault();\n // Released/cleared holds require a fresh keydown; autorepeat never restores them.\n if (!event.repeat) source.set(event.code, true);\n };\n const up = (event: KeyboardEvent) => {\n if (isKeyCode(event.code)) source.set(event.code, false);\n };\n const options = { signal: this.controller.signal };\n host.addEventListener(\"keydown\", down, options);\n window.addEventListener(\"keyup\", up, { ...options, capture: true });\n host.addEventListener(\n \"compositionstart\",\n (event) => {\n compositionOwner = event.target;\n source.clear();\n },\n options,\n );\n host.addEventListener(\n \"compositionend\",\n (event) => {\n if (compositionOwner === event.target) compositionOwner = null;\n },\n options,\n );\n window.addEventListener(\n \"blur\",\n () => {\n compositionOwner = null;\n source.clear();\n },\n options,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) {\n compositionOwner = null;\n source.clear();\n }\n },\n options,\n );\n host.addEventListener(\n \"focusin\",\n (event) => {\n if (event.target !== compositionOwner) compositionOwner = null;\n if (blocksGameKeyboard(event.target)) source.clear();\n },\n options,\n );\n host.addEventListener(\n \"focusout\",\n (event) => {\n if (\n !(event.relatedTarget instanceof Node) ||\n !host.contains(event.relatedTarget) ||\n blocksGameKeyboard(event.relatedTarget)\n ) {\n compositionOwner = null;\n source.clear();\n }\n },\n options,\n );\n host.addEventListener(\n \"pointerdown\",\n (event) => {\n if (\n !event.defaultPrevented &&\n (event.target === host ||\n (event.target instanceof HTMLCanvasElement &&\n event.target.parentElement === host))\n )\n focusGameSurface(host);\n },\n options,\n );\n this.clear = () => source.dispose();\n }\n private readonly clear: () => void;\n dispose(): void {\n this.controller.abort();\n this.clear();\n }\n}\n","import {\n EngineError,\n InputCapture,\n type InputCaptureOptions,\n InputCaptureState,\n InputDevice,\n type InputSystem,\n isKeyCode,\n isMouseButton,\n type KeyCode,\n type MouseButton,\n type Scene,\n SceneState,\n} from \"@simpludify/core\";\nimport type { GamepadState } from \"./gamepads\";\nimport { blocksGameKeyboard } from \"./ui-keyboard\";\n\ninterface PadButtons {\n index: number;\n id: string;\n mapping: string;\n signature: string;\n buttons: ReadonlySet<number>;\n}\nconst mouseMasks = [\n [0, 1],\n [1, 4],\n [2, 2],\n [3, 8],\n [4, 16],\n] as const;\n\n/** @internal One Game-owned observer; existing adapters retain gameplay ownership. */\nexport class InputCaptureManager {\n private readonly abort = new AbortController();\n private current: InputCapture | undefined;\n private readonly keys = new Set<KeyCode>();\n private readonly blockedKeys = new Set<KeyCode>();\n private readonly blockedPointers = new Set<number>();\n private readonly blockedAuxiliary = new Set<MouseButton>();\n private mouseButtons = 0;\n private needsPadSample = false;\n private pads = new Map<number, PadButtons>();\n private readonly readyPads = new Set<number>();\n private dead = false;\n constructor(\n private readonly host: HTMLElement,\n private readonly input: InputSystem,\n private readonly scene: () => Scene,\n private readonly releasePointers: () => void,\n private readonly report: (error: unknown) => void,\n ) {\n const options = { capture: true, signal: this.abort.signal };\n window.addEventListener(\n \"keydown\",\n (event) => this.guard(() => this.keyDown(event)),\n options,\n );\n window.addEventListener(\n \"keyup\",\n (event) =>\n this.guard(() => {\n if (isKeyCode(event.code)) {\n this.keys.delete(event.code);\n this.blockedKeys.delete(event.code);\n }\n this.arm();\n }),\n options,\n );\n for (const kind of [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointercancel\",\n ] as const)\n window.addEventListener(\n kind,\n (event) => this.guard(() => this.pointer(event)),\n options,\n );\n for (const kind of [\"auxclick\", \"contextmenu\"] as const)\n window.addEventListener(\n kind,\n (event) => {\n if (\n this.surface(event.target) &&\n isMouseButton(event.button) &&\n this.blockedAuxiliary.has(event.button)\n ) {\n this.consume(event);\n if (kind === \"auxclick\") this.blockedAuxiliary.delete(event.button);\n }\n },\n options,\n );\n window.addEventListener(\n \"blur\",\n (event) => {\n if (event.target === window) this.interrupt();\n },\n options,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) this.interrupt();\n },\n options,\n );\n host.addEventListener(\n \"focusout\",\n (event) => {\n if (\n !(event.relatedTarget instanceof Node) ||\n !host.contains(event.relatedTarget) ||\n blocksGameKeyboard(event.relatedTarget)\n )\n this.interrupt();\n },\n options,\n );\n host.addEventListener(\n \"focusin\",\n (event) => {\n if (blocksGameKeyboard(event.target)) this.interrupt();\n },\n options,\n );\n }\n start(options: InputCaptureOptions = {}): InputCapture {\n if (this.dead)\n throw new EngineError(\"GAME_DISPOSED\", \"Capture host has been disposed\");\n if (this.current)\n throw new EngineError(\n \"INPUT_CAPTURE_ACTIVE\",\n \"Cancel the active capture before starting another\",\n );\n const scene = this.scene();\n if (\n scene.state !== SceneState.Active ||\n document.hidden ||\n !document.hasFocus()\n )\n throw new EngineError(\n \"INPUT_CAPTURE_UNAVAILABLE\",\n \"Capture requires an active Scene and focused visible document\",\n );\n const capture = new InputCapture(options);\n let release: (() => void) | undefined;\n try {\n capture.onDispose(scene.onDispose(() => capture.cancel()));\n capture.onDispose(() => {\n if (this.current === capture) this.current = undefined;\n this.pads.clear();\n this.readyPads.clear();\n this.needsPadSample = false;\n release?.();\n });\n this.current = capture;\n this.needsPadSample = capture.devices.includes(InputDevice.Gamepad);\n for (const key of this.keys) this.blockedKeys.add(key);\n for (const [button, mask] of mouseMasks)\n if (this.mouseButtons & mask) this.blockedAuxiliary.add(button);\n this.releasePointers();\n if (capture.disposed) return capture;\n release = this.input.suspendLiveInput(() => capture.cancel());\n if (capture.disposed) {\n release();\n return capture;\n }\n this.host.focus({ preventScroll: true });\n this.arm();\n return capture;\n } catch (error) {\n capture.cancel();\n throw error;\n }\n }\n private arm(): void {\n const capture = this.current;\n if (\n !capture ||\n capture.state !== InputCaptureState.Arming ||\n this.needsPadSample\n )\n return;\n if (capture.devices.includes(InputDevice.Keyboard) && this.keys.size)\n return;\n if (capture.devices.includes(InputDevice.Mouse) && this.mouseButtons)\n return;\n if (\n capture.devices.includes(InputDevice.Gamepad) &&\n [...this.pads.values()].some(\n (pad) =>\n (capture.gamepadIndex === undefined ||\n capture.gamepadIndex === pad.index) &&\n pad.buttons.size,\n )\n )\n return;\n capture.arm();\n }\n private keyDown(event: KeyboardEvent): void {\n if (event.isComposing || event.keyCode === 229 || !isKeyCode(event.code))\n return;\n // Observe preheld keys even on native openers; only game targets are consumed.\n const previous = this.keys.has(event.code);\n this.keys.add(event.code);\n if (!(event.target instanceof Node) || !this.host.contains(event.target))\n return;\n if (blocksGameKeyboard(event.target)) return;\n // Native settings buttons can still invoke an explicit cancel API.\n if (event.target instanceof HTMLElement && event.target.closest(\"button\"))\n return;\n const capture = this.current;\n if (!capture && !this.blockedKeys.has(event.code)) return;\n this.blockedKeys.add(event.code);\n this.consume(event);\n if (capture && !previous && !event.repeat)\n capture.accept({ device: InputDevice.Keyboard, code: event.code });\n }\n private surface(target: EventTarget | null): boolean {\n return (\n target === this.host ||\n (target instanceof HTMLCanvasElement &&\n target.parentElement === this.host)\n );\n }\n private pointer(event: PointerEvent): void {\n const capture = this.current,\n mouse = event.pointerType === \"mouse\",\n old = this.mouseButtons;\n if (mouse)\n this.mouseButtons = event.type === \"pointercancel\" ? 0 : event.buttons;\n if (event.type === \"pointerdown\" && !capture) {\n this.blockedPointers.delete(event.pointerId);\n if (isMouseButton(event.button))\n this.blockedAuxiliary.delete(event.button);\n }\n const blocked = this.blockedPointers.has(event.pointerId);\n if (capture && this.surface(event.target)) {\n if (event.type === \"pointerdown\")\n this.host.focus({ preventScroll: true });\n this.blockedPointers.add(event.pointerId);\n this.consume(event);\n if (mouse && isMouseButton(event.button)) {\n const mask =\n mouseMasks.find(([button]) => button === event.button)?.[1] ?? 0;\n if (event.buttons & mask && !(old & mask)) {\n this.blockedAuxiliary.add(event.button);\n capture.accept({ device: InputDevice.Mouse, button: event.button });\n }\n }\n } else if (blocked) this.consume(event);\n if (\n event.type === \"pointerup\" ||\n event.type === \"pointercancel\" ||\n (mouse && event.buttons === 0)\n )\n this.blockedPointers.delete(event.pointerId);\n this.arm();\n }\n /** Same validated gamepad poll as gameplay; no navigator polling in this manager. */\n sample(pads: ReadonlyMap<number, GamepadState>): void {\n const capture = this.current;\n if (!capture?.devices.includes(InputDevice.Gamepad)) return;\n const before = this.pads,\n first = this.needsPadSample,\n next = new Map<number, PadButtons>();\n for (const pad of pads.values()) {\n const buttons = new Set<number>();\n pad.buttons.forEach((button, index) => {\n if (Number.isFinite(button?.value) && button.value >= 0.5)\n buttons.add(index);\n });\n const signature = JSON.stringify([\n pad.id,\n pad.mapping,\n pad.buttons.length,\n ]);\n const entry = {\n index: pad.index,\n id: pad.id,\n mapping: pad.mapping,\n signature,\n buttons,\n };\n next.set(pad.index, entry);\n if (first || before.get(pad.index)?.signature !== signature)\n this.readyPads.delete(pad.index);\n if (!buttons.size) this.readyPads.add(pad.index);\n }\n for (const index of this.readyPads)\n if (!next.has(index)) this.readyPads.delete(index);\n this.pads = next;\n this.needsPadSample = false;\n this.arm();\n if (first || capture.state !== InputCaptureState.Listening) return;\n for (const pad of [...next.values()].sort((a, b) => a.index - b.index)) {\n if (\n !this.readyPads.has(pad.index) ||\n before.get(pad.index)?.signature !== pad.signature\n )\n continue;\n for (const button of pad.buttons)\n if (\n !before.get(pad.index)?.buttons.has(button) &&\n capture.accept({\n device: InputDevice.Gamepad,\n index: pad.index,\n id: pad.id,\n mapping: pad.mapping,\n button,\n })\n )\n return;\n }\n }\n private consume(event: Event): void {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n private guard(action: () => void): void {\n try {\n action();\n } catch (error) {\n this.report(error);\n }\n }\n private interrupt(): void {\n this.guard(() => this.current?.cancel());\n this.keys.clear();\n this.blockedKeys.clear();\n this.blockedPointers.clear();\n this.blockedAuxiliary.clear();\n this.mouseButtons = 0;\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n this.abort.abort();\n this.interrupt();\n }\n}\n","import type { InputSystem, MouseSource, PointerInfo } from \"@simpludify/core\";\nimport {\n containsScreenPoint,\n isMouseButton,\n MouseButton,\n PointerRouting,\n screenPoint,\n type ViewTransform,\n type WorldPoint,\n} from \"@simpludify/core\";\nimport { blocksGameKeyboard, focusGameSurface } from \"./ui-keyboard\";\n\nconst mouseMasks = [\n [MouseButton.Left, 1],\n [MouseButton.Middle, 4],\n [MouseButton.Right, 2],\n [MouseButton.Back, 8],\n [MouseButton.Forward, 16],\n] as const;\n/** One DOM capture-phase adapter per Game; Pixi federated events never route these widgets. */\nexport class BrowserPointer {\n readonly routing: PointerRouting;\n private readonly abort = new AbortController();\n private readonly mouse: MouseSource | undefined;\n private readonly mouseStates = new Map<number, number>();\n private readonly blockedMouse = new Set<number>();\n private readonly auxiliary = new Set<MouseButton>();\n private readonly offInput: (() => void) | undefined;\n constructor(\n private readonly host: HTMLElement,\n private readonly project: (event: { clientX: number; clientY: number }) => {\n screen: PointerInfo[\"screen\"];\n world: WorldPoint;\n view: ViewTransform;\n },\n private readonly report: (error: unknown) => void,\n private readonly flush: () => void,\n private readonly input?: InputSystem,\n ) {\n this.routing = new PointerRouting((id) => {\n if (host.hasPointerCapture(id)) host.releasePointerCapture(id);\n });\n this.mouse = input?.createMouseSource();\n this.offInput = input?.addAdapter({\n sample: () => {},\n reset: () => this.resetMouse(),\n dispose: () => this.dispose(),\n });\n const options = { signal: this.abort.signal, capture: true };\n host.addEventListener(\n \"pointerdown\",\n (e) =>\n this.guard(() => {\n if (!this.surface(e.target)) return;\n if (e.pointerType === \"mouse\") {\n this.releaseMouse(e.pointerId);\n this.blockedMouse.delete(e.pointerId);\n if (isMouseButton(e.button)) this.auxiliary.delete(e.button);\n }\n this.flush();\n const data = this.data(e);\n // Capture before delivery: callbacks may remove the target or navigate.\n try {\n host.setPointerCapture(e.pointerId);\n } catch {\n /* Window capture listeners also cover synthetic events. */\n }\n const target = this.routing.down(data);\n this.updateMouse(e);\n if (this.routing.has(e.pointerId)) {\n e.preventDefault();\n // UI gestures retain compatible focus; an explicit world click selects the game.\n if (target) focusGameSurface(host);\n else host.focus({ preventScroll: true });\n } else {\n if (this.routing.owns(e.pointerId)) e.preventDefault();\n if (host.hasPointerCapture(e.pointerId))\n host.releasePointerCapture(e.pointerId);\n }\n }),\n options,\n );\n host.addEventListener(\n \"wheel\",\n (e) =>\n this.guard(() => {\n if (!this.surface(e.target)) return;\n this.flush();\n const { screen } = this.project(e);\n const unit =\n e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? host.clientHeight : 1;\n if (\n this.routing.scroll(\n screen.x,\n screen.y,\n e.deltaX * unit,\n e.deltaY * unit,\n )\n )\n e.preventDefault();\n }),\n { ...options, passive: false },\n );\n window.addEventListener(\n \"pointermove\",\n (e) =>\n this.guard(() => {\n if (!this.routing.owns(e.pointerId) && !this.surface(e.target)) {\n if (e.pointerType === \"mouse\") this.releaseMouse(e.pointerId);\n if (this.routing.hasHover(e.pointerId))\n this.routing.leave(this.data(e));\n return;\n }\n this.flush();\n this.updateMouse(e);\n this.routing.move(this.data(e));\n }),\n options,\n );\n window.addEventListener(\n \"pointerup\",\n (e) =>\n this.guard(() => {\n if (e.pointerType === \"mouse\") this.releaseMouse(e.pointerId);\n if (this.routing.owns(e.pointerId)) {\n e.preventDefault();\n this.flush();\n this.routing.up(this.data(e));\n }\n }),\n options,\n );\n window.addEventListener(\n \"pointercancel\",\n (e) =>\n this.guard(() => {\n this.releaseMouse(e.pointerId);\n this.blockedMouse.delete(e.pointerId);\n this.routing.cancel(e.pointerId, false);\n }),\n options,\n );\n host.addEventListener(\n \"lostpointercapture\",\n (e) =>\n this.guard(() => {\n this.releaseMouse(e.pointerId);\n if (e.pointerType === \"mouse\" && e.buttons !== 0)\n this.blockedMouse.add(e.pointerId);\n else this.blockedMouse.delete(e.pointerId);\n this.routing.cancel(e.pointerId);\n }),\n options,\n );\n host.addEventListener(\n \"pointerleave\",\n (e) => this.guard(() => this.routing.leave(this.data(e))),\n options,\n );\n window.addEventListener(\n \"blur\",\n (event) => {\n if (event.target === window) this.release();\n },\n options,\n );\n host.addEventListener(\n \"focusout\",\n (event) =>\n this.guard(() => {\n if (\n !(event.relatedTarget instanceof Node) ||\n !host.contains(event.relatedTarget) ||\n blocksGameKeyboard(event.relatedTarget)\n ) {\n this.resetMouse();\n this.routing.releaseVirtual();\n }\n }),\n options,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) this.release();\n },\n options,\n );\n for (const kind of [\"auxclick\", \"contextmenu\"] as const)\n host.addEventListener(\n kind,\n (event) => {\n if (\n this.surface(event.target) &&\n isMouseButton(event.button) &&\n this.auxiliary.has(event.button) &&\n input?.acceptsMouse(event.button)\n ) {\n event.preventDefault();\n if (kind === \"auxclick\") this.auxiliary.delete(event.button);\n }\n },\n options,\n );\n }\n private applyMouse(): void {\n let buttons = 0;\n for (const state of this.mouseStates.values()) buttons |= state;\n for (const [button, mask] of mouseMasks)\n this.mouse?.set(button, (buttons & mask) !== 0);\n }\n private releaseMouse(id: number): void {\n if (this.mouseStates.delete(id)) this.applyMouse();\n }\n private updateMouse(event: PointerEvent): void {\n if (event.pointerType !== \"mouse\" || !this.mouse) return;\n if (event.buttons === 0) this.blockedMouse.delete(event.pointerId);\n const world =\n this.routing.worldOwns(event.pointerId) &&\n !this.blockedMouse.has(event.pointerId) &&\n this.input?.liveInput;\n if (world) this.mouseStates.set(event.pointerId, event.buttons);\n else this.mouseStates.delete(event.pointerId);\n if (isMouseButton(event.button)) {\n if (world && this.input?.acceptsMouse(event.button))\n this.auxiliary.add(event.button);\n else this.auxiliary.delete(event.button);\n }\n this.applyMouse();\n }\n private resetMouse(): void {\n for (const id of this.mouseStates.keys()) this.blockedMouse.add(id);\n this.mouseStates.clear();\n this.auxiliary.clear();\n this.mouse?.clear();\n }\n private surface(target: EventTarget | null): boolean {\n return (\n target === this.host ||\n (target instanceof HTMLCanvasElement &&\n target.parentElement === this.host)\n );\n }\n private data(e: PointerEvent): PointerInfo {\n const { screen, world, view } = this.project(e);\n return Object.freeze({\n pointerId: e.pointerId,\n pointerType: e.pointerType,\n button: e.button,\n buttons: e.buttons,\n time: e.timeStamp / 1000,\n screen: Object.freeze(screenPoint(screen.x, screen.y)),\n world: Object.freeze(world),\n inside: containsScreenPoint(view, screen),\n });\n }\n private guard(action: () => void): void {\n try {\n action();\n } catch (error) {\n this.report(error);\n }\n }\n release(): void {\n this.resetMouse();\n this.guard(() => this.routing.release());\n }\n dispose(): void {\n this.abort.abort();\n this.offInput?.();\n this.resetMouse();\n this.mouse?.dispose();\n this.blockedMouse.clear();\n this.guard(() => this.routing.dispose());\n }\n}\n","import {\n type CanvasNativeSession,\n type CanvasNode,\n type CanvasTextSnapshot,\n type CanvasUI,\n cleanupAll,\n intersectUI,\n type UIBounds,\n} from \"@simpludify/core\";\nexport interface NativeControlHost {\n traverse(reverse: boolean): boolean;\n wheel(event: WheelEvent): void;\n}\n/** Engine-owned native surfaces share Core focus/generation/lifetime and never route text through keys. */\nabstract class NativeControl {\n abstract readonly element: HTMLInputElement | HTMLSelectElement;\n readonly revision: number;\n protected readonly abort = new AbortController();\n private readonly unparent: () => void;\n protected constructor(\n protected readonly node: CanvasNode,\n protected readonly ui: CanvasUI,\n parentSignal: AbortSignal,\n protected readonly host: NativeControlHost,\n ) {\n this.revision = node.control?.revision ?? 0;\n const stop = () => {\n try {\n this.dispose();\n } catch (error) {\n ui.report(error);\n }\n };\n parentSignal.addEventListener(\"abort\", stop, { once: true });\n this.unparent = () => parentSignal.removeEventListener(\"abort\", stop);\n }\n get disposed(): boolean {\n return this.abort.signal.aborted;\n }\n protected get live(): boolean {\n return (\n !this.abort.signal.aborted &&\n !this.ui.disposed &&\n this.node.available &&\n this.node.control?.revision === this.revision\n );\n }\n protected run(task: () => void): void {\n if (!this.live) return;\n try {\n task();\n } catch (error) {\n this.ui.report(error);\n }\n }\n protected mount(): void {\n const el = this.element,\n signal = this.abort.signal;\n el.className = \"s-canvas-native\";\n el.addEventListener(\n \"pointerdown\",\n () => this.run(() => this.ui.stopMotion()),\n { signal },\n );\n el.addEventListener(\n \"focus\",\n () => this.run(() => this.ui.focus(this.node)),\n { signal },\n );\n el.addEventListener(\n \"blur\",\n () => {\n if (this.ui.disposed) return;\n try {\n if (this.ui.focusedNode === this.node) this.ui.focus();\n } catch (error) {\n this.ui.report(error);\n }\n },\n { signal },\n );\n el.addEventListener(\n \"wheel\",\n (e) => this.run(() => this.host.wheel(e as WheelEvent)),\n { signal, passive: false },\n );\n }\n protected tab(event: KeyboardEvent): boolean {\n if (event.code !== \"Tab\") return false;\n if (this.host.traverse(event.shiftKey)) event.preventDefault();\n return true;\n }\n abstract update(clip?: UIBounds): void;\n dispose(): void {\n if (this.abort.signal.aborted) return;\n cleanupAll(\n [\n () => this.abort.abort(),\n this.unparent,\n () => this.node.control?.native?.end(\"interrupt\"),\n () => this.element.remove(),\n ],\n \"Native editor cleanup failed\",\n );\n }\n}\n/** Native browser/OS popup supplies viewport placement, list scrolling and platform key conventions. */\nexport class CanvasNativeSelect extends NativeControl {\n readonly element = document.createElement(\"select\");\n private session: CanvasNativeSession<number> | undefined;\n private signature = \"\";\n constructor(\n node: CanvasNode,\n ui: CanvasUI,\n signal: AbortSignal,\n host: NativeControlHost,\n ) {\n super(node, ui, signal, host);\n this.mount();\n const el = this.element,\n options = { signal: this.abort.signal };\n const begin = (source: \"pointer\" | \"keyboard\") => {\n const port = node.control?.native;\n if (port?.kind === \"select\") this.session = port.begin(source);\n };\n el.addEventListener(\n \"pointerdown\",\n (e) =>\n this.run(() => {\n if (node.control?.model.readOnly) {\n e.preventDefault();\n return;\n }\n begin(\"pointer\");\n }),\n options,\n );\n el.addEventListener(\n \"keydown\",\n (e) =>\n this.run(() => {\n if (e.isComposing || e.keyCode === 229) return;\n if (this.tab(e)) return;\n if (e.code === \"Escape\") {\n this.session?.cancel();\n this.session = undefined;\n this.update();\n return;\n }\n if (node.control?.model.readOnly) {\n e.preventDefault();\n return;\n }\n begin(\"keyboard\");\n }),\n options,\n );\n el.addEventListener(\n \"input\",\n () =>\n this.run(() => {\n if (!this.session?.active) begin(\"keyboard\");\n this.session?.update(el.selectedIndex);\n }),\n options,\n );\n el.addEventListener(\n \"change\",\n () =>\n this.run(() => {\n if (!this.session?.active) begin(\"keyboard\");\n this.session?.update(el.selectedIndex);\n this.session?.commit();\n this.session = undefined;\n this.update();\n }),\n options,\n );\n }\n update(clip?: UIBounds): void {\n const model = this.node.control?.model;\n if (model?.kind !== \"select\") return;\n const el = this.element;\n const key = JSON.stringify(model.options.map((o) => [o.label, o.disabled]));\n if (key !== this.signature) {\n this.signature = key;\n el.replaceChildren(\n ...model.options.map((o, index) => {\n const option = document.createElement(\"option\");\n option.textContent = o.label;\n option.value = String(index);\n option.disabled = o.disabled;\n return option;\n }),\n );\n }\n if (!this.session?.active) el.selectedIndex = model.selectedIndex;\n el.setAttribute(\"aria-label\", this.node.text);\n el.setAttribute(\"aria-readonly\", String(model.readOnly));\n if (clip) nativeGeometry(el, this.node, this.ui, clip);\n }\n}\n/** Native caret, selection, clipboard and IME paint replace Canvas text only while focused. */\nexport class CanvasNativeText extends NativeControl {\n readonly element = document.createElement(\"input\");\n private session: CanvasNativeSession<CanvasTextSnapshot> | undefined;\n private composing = false;\n private source: \"pointer\" | \"keyboard\" = \"keyboard\";\n constructor(\n node: CanvasNode,\n ui: CanvasUI,\n signal: AbortSignal,\n host: NativeControlHost,\n ) {\n super(node, ui, signal, host);\n const el = this.element;\n el.type = \"text\";\n el.autocomplete = \"off\";\n el.spellcheck = false;\n this.mount();\n const options = { signal: this.abort.signal };\n el.addEventListener(\n \"pointerdown\",\n () =>\n this.run(() => {\n this.source = \"pointer\";\n this.begin();\n }),\n options,\n );\n el.addEventListener(\n \"blur\",\n () => {\n // Interrupted IME sessions may not deliver compositionend before this surface is reused.\n this.composing = false;\n this.session = undefined;\n this.source = \"keyboard\";\n },\n options,\n );\n el.addEventListener(\"focus\", () => this.run(() => this.begin()), options);\n el.addEventListener(\n \"compositionstart\",\n () =>\n this.run(() => {\n this.composing = true;\n this.send(true);\n }),\n options,\n );\n el.addEventListener(\n \"compositionupdate\",\n () => this.run(() => this.send()),\n options,\n );\n el.addEventListener(\n \"compositionend\",\n () =>\n this.run(() => {\n this.composing = false;\n this.send();\n }),\n options,\n );\n el.addEventListener(\n \"input\",\n () => this.run(() => this.send(true)),\n options,\n );\n for (const event of [\"select\", \"keyup\", \"pointerup\"] as const)\n el.addEventListener(event, () => this.run(() => this.send()), options);\n el.addEventListener(\n \"keydown\",\n (e) =>\n this.run(() => {\n // IME Enter/Escape/Tab remain native; keyCode 229 covers engines with compositionend before keydown.\n if (this.composing || e.isComposing || e.keyCode === 229) return;\n if (this.tab(e)) return;\n if (e.code === \"Escape\" || e.code === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n if (e.code === \"Escape\") this.session?.cancel();\n else {\n this.send();\n this.session?.commit();\n }\n this.session = undefined;\n this.update();\n } else if (node.control?.keys.includes(e.code)) {\n e.preventDefault();\n node.control.key(e.code);\n this.session = undefined;\n this.update();\n }\n }),\n options,\n );\n }\n private begin(): void {\n if (this.session?.active) return;\n const port = this.node.control?.native;\n if (port?.kind === \"text\") this.session = port.begin(this.source);\n }\n private send(begin = false): void {\n if (document.activeElement !== this.element) return;\n if (begin) this.begin();\n if (!this.session?.active) return;\n const el = this.element;\n this.session?.update({\n text: el.value,\n selectionStart: el.selectionStart ?? 0,\n selectionEnd: el.selectionEnd ?? 0,\n direction: el.selectionDirection ?? \"none\",\n composing: this.composing,\n });\n }\n update(clip?: UIBounds): void {\n const model = this.node.control?.model;\n if (model?.kind !== \"text\") return;\n const el = this.element;\n if (!this.session?.active && el.value !== model.text) el.value = model.text;\n el.placeholder = model.placeholder;\n el.readOnly = model.readOnly;\n el.inputMode = model.inputMode;\n if (model.maxLength === undefined || model.maxLength > 2147483647)\n el.removeAttribute(\"maxlength\");\n else el.maxLength = model.maxLength;\n if (model.numeric) {\n el.setAttribute(\"role\", \"spinbutton\");\n el.setAttribute(\"aria-valuemin\", String(model.numeric.min));\n el.setAttribute(\"aria-valuemax\", String(model.numeric.max));\n el.setAttribute(\"aria-valuenow\", String(model.numeric.value));\n }\n el.setAttribute(\"aria-label\", this.node.text);\n el.setAttribute(\"aria-readonly\", String(model.readOnly));\n if (clip) nativeGeometry(el, this.node, this.ui, clip);\n }\n}\n/** Keep full native geometry; clip without shifting text, selection or the IME anchor. */\nexport function nativeGeometry(\n el: HTMLInputElement | HTMLSelectElement,\n node: CanvasNode,\n ui: CanvasUI,\n clip: UIBounds,\n): void {\n const b = node.bounds,\n c = intersectUI(b, clip),\n scale = ui.scale,\n style = node.style;\n el.disabled =\n !node.available ||\n c.width <= 0 ||\n c.height <= 0 ||\n node.style.pointerEvents !== \"auto\";\n const background = style.background ?? 0x23594e;\n const color = `#${style.color.toString(16).padStart(6, \"0\")}`;\n el.style.cssText = `left:${b.x * scale}px;top:${b.y * scale}px;width:${b.width * scale}px;height:${b.height * scale}px;padding:${style.padding * scale}px;font-size:${style.fontSize * scale}px;--s-native-color:${color};--s-native-background:#${background.toString(16).padStart(6, \"0\")};color-scheme:${((background >> 16) * 0.2126 + ((background >> 8) & 255) * 0.7152 + (background & 255) * 0.0722) > 128 ? \"light\" : \"dark\"};clip-path:inset(${Math.max(0, c.y - b.y) * scale}px ${Math.max(0, b.x + b.width - c.x - c.width) * scale}px ${Math.max(0, b.y + b.height - c.y - c.height) * scale}px ${Math.max(0, c.x - b.x) * scale}px);`;\n el.style.fontFamily = style.fontFamily;\n if (el.disabled && document.activeElement === el) el.blur();\n}\n\n/** Native editors must not cover later Canvas hit surfaces or overlay scrollbars. */\nexport function clipNativeRegions(\n element: HTMLInputElement | HTMLSelectElement,\n node: CanvasNode,\n ui: CanvasUI,\n clip: UIBounds,\n covers: readonly UIBounds[],\n): void {\n let regions: UIBounds[] = [intersectUI(node.bounds, clip)];\n for (const cover of covers) {\n const next: UIBounds[] = [];\n for (const region of regions) {\n const cut = intersectUI(region, cover);\n if (cut.width <= 0 || cut.height <= 0) {\n next.push(region);\n continue;\n }\n const right = region.x + region.width,\n bottom = region.y + region.height;\n if (cut.y > region.y)\n next.push({\n x: region.x,\n y: region.y,\n width: region.width,\n height: cut.y - region.y,\n });\n if (cut.y + cut.height < bottom)\n next.push({\n x: region.x,\n y: cut.y + cut.height,\n width: region.width,\n height: bottom - cut.y - cut.height,\n });\n if (cut.x > region.x)\n next.push({\n x: region.x,\n y: cut.y,\n width: cut.x - region.x,\n height: cut.height,\n });\n if (cut.x + cut.width < right)\n next.push({\n x: cut.x + cut.width,\n y: cut.y,\n width: right - cut.x - cut.width,\n height: cut.height,\n });\n }\n regions = next;\n if (!regions.length) break;\n }\n const scale = ui.scale,\n b = node.bounds;\n const path = regions\n .filter((r) => r.width > 0 && r.height > 0)\n .map((r) => {\n const x = (r.x - b.x) * scale,\n y = (r.y - b.y) * scale,\n w = r.width * scale,\n h = r.height * scale;\n return `M${x} ${y}h${w}v${h}h${-w}Z`;\n })\n .join(\" \");\n element.style.clipPath = path ? `path(\"${path}\")` : \"inset(100%)\";\n if (!path) {\n element.disabled = true;\n if (document.activeElement === element) element.blur();\n }\n}\n","import type {\n CanvasNode,\n CanvasUI,\n PointerRouting,\n UIBounds,\n} from \"@simpludify/core\";\nimport {\n canvasControlText,\n canvasHoverHighlight,\n canvasOpacity,\n canvasScrollbars,\n canvasSliderGeometry,\n cleanupAll,\n EngineError,\n intersectUI,\n wrapCanvasText,\n} from \"@simpludify/core\";\nimport {\n CanvasTextMetrics,\n Container,\n Graphics,\n Text,\n TextStyle,\n} from \"pixi.js\";\nimport {\n CanvasNativeSelect,\n CanvasNativeText,\n clipNativeRegions,\n} from \"./canvas-native\";\nimport { registerGameButton } from \"./ui-keyboard\";\n\nexport interface CanvasPresentation {\n update(width: number, height: number): void;\n focus(node: CanvasNode): void;\n dispose(): void;\n}\ninterface Entry {\n display: Container;\n background: Graphics;\n text?: Text;\n mask: Graphics;\n button?: HTMLButtonElement | HTMLSelectElement | HTMLInputElement;\n native?: CanvasNativeSelect | CanvasNativeText;\n label?: HTMLSpanElement;\n abort: AbortController;\n signature?: string;\n paintSignature?: string;\n maskSignature?: string;\n scrollbar?: Graphics;\n scrollbarSignature?: string;\n textStyleKey?: string;\n}\n/** Pixi rendering and a small native focus mirror share the same resolved boxes. */\nexport class CanvasVisual implements CanvasPresentation {\n readonly display = new Container();\n private readonly element = document.createElement(\"div\");\n private readonly entries = new Map<CanvasNode, Entry>();\n private readonly metrics = new Map<\n CanvasNode,\n {\n key: string;\n values: Map<number, { text: string; width: number; height: number }>;\n }\n >();\n private dirty = true;\n private dead = false;\n private active = false;\n private cacheResolution: number | undefined;\n private mirroredFocus: CanvasNode | undefined;\n private readonly subscriptions: Array<() => void> = [];\n private syncs = 0;\n constructor(\n private readonly ui: CanvasUI,\n private readonly host: HTMLElement,\n private readonly routing: PointerRouting,\n private readonly resources: {\n graphics(graphics: Graphics, context: number | undefined): void;\n text(text: Text, key: string | undefined): void;\n changedText(key: string): void;\n cacheResolution(): number | undefined;\n },\n ) {\n this.display.eventMode = \"none\";\n this.display.zIndex = 1;\n this.element.className = \"s-canvas-accessibility\";\n this.element.setAttribute(\"aria-label\", \"Game controls\");\n const nativeEvents = new AbortController();\n const interrupt = () => {\n try {\n cleanupAll(\n [\n ...[...this.entries.values()]\n .filter((e) => e.native)\n .map((entry) => () => {\n try {\n entry.native?.dispose();\n } finally {\n entry.button?.blur();\n }\n }),\n () => {\n if (!this.ui.disposed) this.ui.focus();\n },\n ],\n \"Native controls interruption failed\",\n );\n } catch (error) {\n this.ui.report(error);\n } finally {\n this.dirty = true;\n }\n };\n window.addEventListener(\n \"blur\",\n (event) => {\n if (event.target === window) interrupt();\n },\n { signal: nativeEvents.signal },\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) interrupt();\n },\n { signal: nativeEvents.signal },\n );\n this.host.addEventListener(\n \"keydown\",\n (event) => {\n if (\n !this.active ||\n event.target !== this.host ||\n event.code !== \"Tab\" ||\n event.shiftKey ||\n event.isComposing ||\n event.keyCode === 229\n )\n return;\n this.update(this.host.clientWidth, this.host.clientHeight);\n const next = this.ui.focusNext();\n if (next) {\n event.preventDefault();\n this.update(this.host.clientWidth, this.host.clientHeight);\n this.focus(next);\n }\n },\n { signal: nativeEvents.signal },\n );\n this.subscriptions.push(() => nativeEvents.abort());\n this.subscriptions.push(\n ui.subscribe(() => {\n this.dirty = true;\n }),\n ui.onDispose(() => this.dispose()),\n );\n }\n get diagnostics() {\n return {\n nodes: this.entries.size,\n visibleNodes: [...this.entries.values()].filter((e) => e.display.visible)\n .length,\n buttons: [...this.entries.values()].filter((e) => e.button).length,\n syncs: this.syncs,\n textMetrics: this.metrics.size,\n };\n }\n private measure = (node: CanvasNode, contentWidth = Infinity) => {\n const { fontSize, fontFamily, textWrap } = node.style;\n const content = canvasControlText(node);\n const adornment = node.control?.model.kind === \"checkbox\" ? 30 : 0;\n const key = JSON.stringify([\n content,\n fontSize,\n fontFamily,\n textWrap,\n adornment,\n ]);\n let cache = this.metrics.get(node);\n if (cache?.key !== key) {\n cache = { key, values: new Map() };\n this.metrics.set(node, cache);\n }\n const width = textWrap ? Math.max(0, contentWidth - adornment) : Infinity;\n const previous = cache.values.get(width);\n if (previous) return previous;\n const style = new TextStyle({ fontSize, fontFamily, wordWrap: false });\n const text = Number.isFinite(width)\n ? wrapCanvasText(\n content,\n width,\n (value) => CanvasTextMetrics.measureText(value || \" \", style).width,\n )\n : content.replace(/\\r\\n?/g, \"\\n\");\n const measured = CanvasTextMetrics.measureText(text || \" \", style);\n const result = {\n text,\n width: (text ? measured.width : 0) + adornment,\n height: measured.height,\n };\n if (cache.values.size >= 8)\n cache.values.delete(cache.values.keys().next().value as number);\n cache.values.set(width, result);\n return result;\n };\n private clearCache(): void {\n if (this.cacheResolution === undefined) return;\n // Return the lease intact: unloading a pooled source alone leaves its framebuffer stale on reuse.\n this.display.cacheAsTexture(false);\n this.cacheResolution = undefined;\n }\n beforeResolutionChange(): void {\n this.clearCache();\n this.dirty = true;\n for (const entry of this.entries.values())\n if (entry.text && !entry.text.destroyed)\n this.resources.changedText(entry.text.styleKey);\n }\n focus(node: CanvasNode): void {\n if (node.available)\n this.entries.get(node)?.button?.focus({ preventScroll: true });\n }\n private native(\n node: CanvasNode,\n signal: AbortSignal,\n ): CanvasNativeSelect | CanvasNativeText {\n const host = {\n traverse: (reverse: boolean) => {\n const next = this.ui.focusNext(reverse);\n if (!next) return false;\n this.update(this.host.clientWidth, this.host.clientHeight);\n this.focus(next);\n return true;\n },\n wheel: (event: WheelEvent) => {\n const rect = this.host.getBoundingClientRect();\n const unit =\n event.deltaMode === 1\n ? 16\n : event.deltaMode === 2\n ? this.host.clientHeight\n : 1;\n if (\n this.routing.scroll(\n ((event.clientX - rect.x) * this.host.clientWidth) / rect.width,\n ((event.clientY - rect.y) * this.host.clientHeight) / rect.height,\n event.deltaX * unit,\n event.deltaY * unit,\n )\n )\n event.preventDefault();\n },\n };\n return node.control?.native?.kind === \"select\"\n ? new CanvasNativeSelect(node, this.ui, signal, host)\n : new CanvasNativeText(node, this.ui, signal, host);\n }\n private button(node: CanvasNode): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n const signal = this.entries.get(node)?.abort.signal;\n if (!signal)\n throw new EngineError(\"INVALID_UI\", \"Missing Canvas button entry\");\n const options = { signal };\n registerGameButton(button, signal);\n const run = (task: () => void) => {\n try {\n task();\n } catch (error) {\n this.ui.report(error);\n }\n };\n button.addEventListener(\n \"focus\",\n () =>\n run(() => {\n this.ui.focus(node);\n }),\n options,\n );\n button.addEventListener(\n \"blur\",\n () =>\n run(() => {\n if (this.ui.focusedNode === node) this.ui.focus();\n this.routing.releaseKeys(node);\n }),\n options,\n );\n button.addEventListener(\n \"keydown\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (node.control?.keys.includes(event.code)) {\n event.preventDefault();\n run(() => {\n this.routing.controlKey(node, event.code);\n });\n return;\n }\n if (this.ui.scrollKey(node, event.code)) {\n event.preventDefault();\n return;\n }\n if (event.code === \"Tab\") {\n run(() => {\n const next = this.ui.focusNext(event.shiftKey);\n if (next) {\n event.preventDefault();\n this.update(this.host.clientWidth, this.host.clientHeight);\n this.focus(next);\n }\n });\n return;\n }\n if (event.code !== \"Enter\" && event.code !== \"Space\") return;\n event.preventDefault();\n if (!event.repeat)\n run(() => {\n this.routing.key(node, event.code, true);\n });\n },\n options,\n );\n button.addEventListener(\n \"keyup\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.code !== \"Enter\" && event.code !== \"Space\") return;\n event.preventDefault();\n run(() => {\n this.routing.key(node, event.code, false);\n });\n },\n options,\n );\n // AT/automation can activate the semantic control without a physical key.\n button.addEventListener(\n \"click\",\n () =>\n run(() => {\n if (node.kind !== \"hold-button\" && node.available)\n node.activate(\"accessibility\");\n }),\n options,\n );\n return button;\n }\n private updateButton(entry: Entry, node: CanvasNode, clip: UIBounds): void {\n if (entry.native) {\n entry.native.update(clip);\n return;\n }\n if (!entry.button) return;\n const button = entry.button,\n b = node.bounds,\n s = this.ui.scale,\n c = intersectUI(b, clip);\n if (button.textContent !== node.text) button.textContent = node.text;\n // Busy Canvas controls leave Core focus/Tab order. Hand off before native disable\n // would blur to the page and clear unrelated held gameplay keys.\n if (node.busy && document.activeElement === button)\n this.host.focus({ preventScroll: true });\n button.disabled =\n !node.available ||\n c.width <= 0 ||\n c.height <= 0 ||\n node.style.pointerEvents !== \"auto\";\n if (node.kind === \"hold-button\")\n button.setAttribute(\"aria-pressed\", String(node.held));\n const model = node.control?.model;\n if (model) {\n button.setAttribute(\"role\", model.kind);\n button.setAttribute(\"aria-label\", node.text);\n button.setAttribute(\"aria-readonly\", String(model.readOnly));\n if (model.kind === \"checkbox\")\n button.setAttribute(\"aria-checked\", String(model.checked));\n else if (model.kind === \"slider\") {\n button.setAttribute(\"aria-orientation\", \"horizontal\");\n button.setAttribute(\"aria-valuemin\", String(model.min));\n button.setAttribute(\"aria-valuemax\", String(model.max));\n button.setAttribute(\"aria-valuenow\", String(model.value));\n }\n }\n button.setAttribute(\"aria-busy\", String(node.busy));\n button.style.cssText = `left:${c.x * s}px;top:${c.y * s}px;width:${c.width * s}px;height:${c.height * s}px;`;\n if (button.disabled && document.activeElement === button) button.blur();\n }\n update(width: number, height: number): void {\n if (this.dead || this.ui.disposed) return;\n const layout = this.ui.layout(width, height, this.measure);\n if (!this.active) {\n this.host.append(this.element);\n this.active = true;\n }\n if (!this.dirty && !layout) return;\n this.dirty = false;\n this.syncs++;\n this.display.scale.set(this.ui.scale);\n const visited = new Set<CanvasNode>(),\n buttons: HTMLElement[] = [];\n const paint: {\n node?: CanvasNode;\n box: UIBounds;\n native?: CanvasNativeSelect | CanvasNativeText;\n clip?: UIBounds;\n }[] = [];\n let order = 0;\n let scrollVisible = false;\n let restoreNativeFocus: CanvasNode | undefined;\n this.ui.walk(\n (node, parentClip) => {\n const measuredText =\n node.kind === \"panel\"\n ? undefined\n : this.measure(\n node,\n Math.max(0, node.bounds.width - node.style.padding * 2),\n );\n const clip =\n measuredText &&\n (measuredText.width > node.bounds.width - node.style.padding * 2 ||\n measuredText.height > node.bounds.height - node.style.padding * 2)\n ? intersectUI(parentClip, node.bounds)\n : parentClip;\n visited.add(node);\n let entry = this.entries.get(node);\n if (!entry) {\n const display = new Container(),\n background = new Graphics(),\n mask = new Graphics();\n display.addChild(background);\n this.display.addChild(display, mask);\n mask.renderable = false;\n entry = { display, background, mask, abort: new AbortController() };\n this.entries.set(node, entry);\n if (node.interactive) {\n if (node.control?.native) {\n entry.native = this.native(node, entry.abort.signal);\n entry.button = entry.native.element;\n } else entry.button = this.button(node);\n this.element.append(entry.button);\n } else if (node.kind === \"label\") {\n entry.label = document.createElement(\"span\");\n entry.label.className = \"s-canvas-label\";\n const semantics = node.labelSemantics;\n if (semantics?.role) {\n entry.label.setAttribute(\"role\", semantics.role);\n if (semantics.role === \"heading\")\n entry.label.setAttribute(\"aria-level\", String(semantics.level));\n else {\n entry.label.setAttribute(\n \"aria-live\",\n semantics.role === \"alert\" ? \"assertive\" : \"polite\",\n );\n entry.label.setAttribute(\"aria-atomic\", \"true\");\n }\n }\n this.element.append(entry.label);\n }\n if (node.kind !== \"panel\") {\n entry.text = new Text({ text: node.text });\n display.addChild(entry.text);\n }\n }\n if (\n entry.native &&\n (entry.native.disposed ||\n entry.native.revision !== node.control?.revision)\n ) {\n if (document.activeElement === entry.button)\n restoreNativeFocus = node;\n entry.native.dispose();\n entry.native = this.native(node, entry.abort.signal);\n entry.button = entry.native.element;\n this.element.append(entry.button);\n delete entry.signature;\n }\n this.display.setChildIndex(entry.display, order++);\n this.display.setChildIndex(entry.mask, order++);\n if (node.style.pointerEvents === \"auto\")\n paint.push({\n node,\n box: intersectUI(node.bounds, clip),\n ...(entry.native ? { native: entry.native, clip } : {}),\n });\n if (entry.button) buttons.push(entry.button);\n if (entry.label) {\n buttons.push(entry.label);\n if (entry.label.textContent !== node.text)\n entry.label.textContent = node.text;\n entry.label.setAttribute(\n \"aria-hidden\",\n String(canvasOpacity(node) === 0),\n );\n }\n const b = node.bounds,\n s = node.style;\n const scrollBox = intersectUI(b, clip);\n if (\n node.style.scroll &&\n scrollBox.width > 0 &&\n scrollBox.height > 0 &&\n canvasOpacity(node) > 0\n )\n scrollVisible = true;\n let enabled = !node.busy;\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n enabled &&= p.enabled;\n const signature = JSON.stringify([\n node.paintRevision,\n b.x,\n b.y,\n b.width,\n b.height,\n clip.x,\n clip.y,\n clip.width,\n clip.height,\n node.available,\n enabled,\n this.ui.scale,\n canvasOpacity(node),\n ]);\n if (entry.signature === signature) return;\n entry.signature = signature;\n entry.display.position.set(b.x, b.y);\n const paintBox = intersectUI(b, clip);\n const visible =\n paintBox.width > 0 && paintBox.height > 0 && canvasOpacity(node) > 0;\n entry.display.visible = visible;\n const clipped =\n clip.x !== 0 ||\n clip.y !== 0 ||\n clip.width !== width / this.ui.scale ||\n clip.height !== height / this.ui.scale;\n entry.display.mask = clipped ? entry.mask : null;\n // StencilMaskPipe collects renderables; includeInBuild is managed by Pixi.\n entry.mask.renderable = clipped && visible;\n const maskSignature = JSON.stringify([\n clipped,\n clip.x,\n clip.y,\n clip.width,\n clip.height,\n ]);\n if (clipped && entry.maskSignature !== maskSignature)\n entry.mask\n .clear()\n .rect(clip.x, clip.y, clip.width, clip.height)\n .fill(0xffffff);\n entry.maskSignature = maskSignature;\n const paintSignature = JSON.stringify([\n node.paintRevision,\n b.width,\n b.height,\n enabled,\n ]);\n if (entry.paintSignature !== paintSignature) {\n entry.paintSignature = paintSignature;\n entry.background.visible =\n s.background !== undefined || node.interactive;\n entry.background.clear();\n if (s.background !== undefined || node.interactive) {\n entry.background\n .roundRect(\n 0,\n 0,\n b.width,\n b.height,\n Math.min(s.radius, b.width / 2, b.height / 2),\n )\n .fill(s.background ?? 0x23594e);\n if (node.held)\n entry.background\n .roundRect(0, 0, b.width, b.height, s.radius)\n .fill({ color: 0xffffff, alpha: 0.18 });\n else if (canvasHoverHighlight(node))\n entry.background\n .roundRect(0, 0, b.width, b.height, s.radius)\n .fill({ color: 0xffffff, alpha: 0.08 });\n if (node.focused)\n entry.background\n .roundRect(\n 2,\n 2,\n Math.max(0, b.width - 4),\n Math.max(0, b.height - 4),\n s.radius,\n )\n .stroke({ color: 0xffd36b, width: 3 });\n }\n const model = node.control?.model;\n if (model?.kind === \"checkbox\") {\n const size = Math.min(\n 20,\n Math.max(0, b.height - 8),\n Math.max(0, b.width - 8),\n ),\n x = Math.min(s.padding, b.width - size),\n y = (b.height - size) / 2;\n entry.background\n .rect(x, y, size, size)\n .fill({ color: s.color, alpha: 0.15 })\n .stroke({ color: s.color, width: 2 });\n if (model.checked)\n entry.background\n .moveTo(x + size * 0.2, y + size * 0.5)\n .lineTo(x + size * 0.43, y + size * 0.75)\n .lineTo(x + size * 0.83, y + size * 0.22)\n .stroke({ color: s.color, width: 3 });\n } else if (model?.kind === \"slider\") {\n const geometry = canvasSliderGeometry(node);\n if (geometry) {\n const t = geometry.track,\n thumb = geometry.thumb;\n entry.background\n .rect(t.x - b.x, t.y - b.y, t.width, t.height)\n .fill({ color: s.color, alpha: 0.25 });\n entry.background\n .rect(t.x - b.x, t.y - b.y, t.width * model.ratio, t.height)\n .fill(s.color);\n entry.background\n .circle(\n thumb.x - b.x + thumb.width / 2,\n thumb.y - b.y + thumb.height / 2,\n thumb.width / 2,\n )\n .fill(s.color);\n }\n }\n\n if (entry.text) {\n entry.text.visible =\n !entry.native ||\n (node.control?.model.kind === \"text\" && !node.focused);\n const m = measuredText ?? this.measure(node);\n if (entry.text.text !== m.text) {\n this.resources.changedText(entry.text.styleKey);\n entry.text.text = m.text;\n }\n const textStyleKey = JSON.stringify([\n s.fontFamily,\n s.fontSize,\n s.color,\n ]);\n if (entry.textStyleKey !== textStyleKey) {\n this.resources.changedText(entry.text.styleKey);\n entry.textStyleKey = textStyleKey;\n entry.text.style = {\n fontFamily: s.fontFamily,\n fontSize: s.fontSize,\n fill: s.color,\n };\n }\n entry.text.position.set(\n model?.kind === \"checkbox\"\n ? s.padding + 30\n : model?.kind === \"slider\"\n ? s.padding\n : node.interactive\n ? Math.max(s.padding, (b.width - m.width) / 2)\n : s.padding,\n model?.kind === \"slider\"\n ? s.padding\n : node.interactive\n ? Math.max(s.padding, (b.height - m.height) / 2)\n : s.padding,\n );\n }\n }\n const opacity =\n canvasOpacity(node) *\n (enabled ? (node.control?.model.readOnly ? 0.7 : 1) : 0.45);\n entry.display.alpha = opacity;\n this.updateButton(entry, node, clip);\n if (entry.native) entry.native.element.style.opacity = String(opacity);\n },\n (node, clip) => {\n const entry = this.entries.get(node);\n if (!entry) return;\n const bars = canvasScrollbars(node);\n for (const bar of bars)\n paint.push({ box: intersectUI(bar.track, clip) });\n if (!entry.scrollbar && bars.length) {\n entry.scrollbar = new Graphics();\n entry.scrollbar.eventMode = \"none\";\n this.display.addChild(entry.scrollbar);\n }\n const display = entry.scrollbar;\n if (!display) return;\n this.display.setChildIndex(display, order++);\n const viewport = intersectUI(node.bounds, clip);\n display.visible =\n bars.length > 0 &&\n viewport.width > 0 &&\n viewport.height > 0 &&\n canvasOpacity(node) > 0;\n display.mask = entry.display.mask;\n const signature = JSON.stringify([\n node.style.color,\n clip.x,\n clip.y,\n clip.width,\n clip.height,\n ...bars.map((b) => [b.axis, b.track, b.thumb, b.enabled]),\n ]);\n if (entry.scrollbarSignature === signature) return;\n entry.scrollbarSignature = signature;\n display.clear();\n for (const bar of bars) {\n const t = bar.track,\n b = bar.thumb;\n if (t.width <= 0 || t.height <= 0) continue;\n display\n .roundRect(\n t.x,\n t.y,\n t.width,\n t.height,\n Math.min(4, t.width / 2, t.height / 2),\n )\n .fill({ color: node.style.color, alpha: 0.13 });\n display\n .roundRect(\n b.x,\n b.y,\n b.width,\n b.height,\n Math.min(4, b.width / 2, b.height / 2),\n )\n .fill({ color: node.style.color, alpha: bar.enabled ? 0.7 : 0.25 });\n }\n },\n );\n for (let i = 0; i < paint.length; i++) {\n const item = paint[i];\n if (item?.native && item.node && item.clip)\n clipNativeRegions(\n item.native.element,\n item.node,\n this.ui,\n item.clip,\n paint.slice(i + 1).map((p) => p.box),\n );\n }\n for (const [node, entry] of this.entries)\n if (!visited.has(node)) {\n this.entries.delete(node);\n this.metrics.delete(node);\n this.releaseEntry(entry);\n }\n // Move siblings around the active element: detaching it would end selection/IME.\n let anchor: Element | null = null;\n for (let i = buttons.length - 1; i >= 0; i--) {\n const button = buttons[i];\n if (!button) continue;\n if (\n button !== document.activeElement &&\n button.nextElementSibling !== anchor\n )\n this.element.insertBefore(button, anchor);\n anchor = button;\n }\n const focused = this.ui.focusedNode;\n if (!focused && this.mirroredFocus) {\n const previous = this.entries.get(this.mirroredFocus)?.button;\n if (previous && document.activeElement === previous) previous.blur();\n }\n const button = focused ? this.entries.get(focused)?.button : undefined;\n if (\n (focused !== this.mirroredFocus || focused === restoreNativeFocus) &&\n button &&\n !button.disabled &&\n document.activeElement !== button\n )\n button.focus({ preventScroll: true });\n this.mirroredFocus = this.ui.focusedNode;\n // Bounded scroll screens amortize stencil/text work across unchanged world frames.\n const ratio = this.resources.cacheResolution();\n const cache =\n scrollVisible &&\n ratio !== undefined &&\n Math.max(width, height) * ratio <= 4096\n ? ratio * this.ui.scale\n : undefined;\n if (cache !== this.cacheResolution) {\n this.clearCache();\n this.cacheResolution = cache;\n if (cache !== undefined)\n this.display.cacheAsTexture({ resolution: cache });\n }\n if (cache !== undefined) this.display.updateCacheTexture();\n }\n private releaseEntry(entry: Entry): void {\n const backgroundContext = entry.background.context?.uid,\n maskContext = entry.mask.context?.uid;\n const scrollbarContext = entry.scrollbar?.context?.uid;\n const textKey =\n entry.text && !entry.text.destroyed ? entry.text.styleKey : undefined;\n cleanupAll(\n [\n () => entry.abort.abort(),\n () => entry.native?.dispose(),\n () => entry.button?.remove(),\n () => entry.label?.remove(),\n // These Graphics contexts and Text styles are private to this presentation.\n // An options object with only children:true does not destroy owned GraphicsContext in Pixi8.\n () => entry.background.destroy({ context: true }),\n () => entry.scrollbar?.destroy({ context: true }),\n () => entry.text?.destroy({ style: true }),\n () => entry.display.destroy({ children: true }),\n () => entry.mask.destroy({ context: true }),\n () => this.resources.graphics(entry.background, backgroundContext),\n () => this.resources.graphics(entry.mask, maskContext),\n () => {\n if (entry.scrollbar)\n this.resources.graphics(entry.scrollbar, scrollbarContext);\n },\n () => {\n if (entry.text) this.resources.text(entry.text, textKey);\n },\n ],\n \"Canvas visual entry cleanup failed\",\n );\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const entries = [...this.entries.values()];\n this.entries.clear();\n this.metrics.clear();\n cleanupAll(\n [\n ...this.subscriptions.splice(0),\n ...entries.map((e) => () => this.releaseEntry(e)),\n () => this.clearCache(),\n () => this.display.destroy({ children: true }),\n () => this.element.remove(),\n ],\n \"Canvas visual cleanup failed\",\n );\n }\n}\n","import {\n cleanupAll,\n type GeometryTilemap,\n type ViewTransform,\n} from \"@simpludify/core\";\nimport { Container, Graphics } from \"pixi.js\";\n\n/** Visible-cell Graphics with no image/UV contract; no full Grid walk per frame. */\nexport class GeometryTilemapVisual {\n readonly display = new Container();\n readonly graphics = new Map<number, Graphics>();\n readonly stats = {\n visitedCells: 0,\n updatedTiles: 0,\n createdGraphics: 0,\n destroyedGraphics: 0,\n };\n order = 0;\n depth = NaN;\n disposed = false;\n private readonly dirty = new Set<number>();\n private visibleCells = new Set<number>();\n private invalid = true;\n private boundsKey = \"\";\n private readonly off: () => void;\n private readonly offDispose: () => void;\n constructor(\n readonly map: GeometryTilemap,\n private readonly released: () => void,\n ) {\n this.off = map.onTilesChanged((index) => {\n if (index === null) {\n this.invalid = true;\n this.bulk = true;\n this.dirty.clear();\n } else if (this.visibleCells.has(index)) this.dirty.add(index);\n });\n this.offDispose = map.onDispose(() => this.dispose());\n }\n private remove(index: number): void {\n const g = this.graphics.get(index);\n if (g) {\n this.graphics.delete(index);\n g.destroy({ context: true });\n this.stats.destroyedGraphics++;\n }\n }\n private cell(x: number, y: number): void {\n this.stats.visitedCells++;\n const index = y * this.map.width + x,\n color = this.map.get(x, y);\n if (color === null) {\n this.remove(index);\n return;\n }\n let g = this.graphics.get(index);\n if (!g) {\n g = new Graphics();\n this.graphics.set(index, g);\n this.display.addChild(g);\n this.stats.createdGraphics++;\n }\n g.clear()\n .poly(\n this.map.geometry.vertices(x, y).flatMap((p) => [p.x, p.y]),\n true,\n )\n .fill(color);\n this.stats.updatedTiles++;\n }\n render(view: ViewTransform): void {\n if (this.disposed) return;\n const m = this.map;\n this.display.position.set(m.x, m.y);\n this.display.visible = m.visible && m.enabled;\n if (!this.display.visible) {\n this.invalid = true;\n this.bulk = true;\n this.dirty.clear();\n return;\n }\n const c = view.clip;\n const bounds = {\n x: (c.x - view.x) / view.scale,\n y: (c.y - view.y) / view.scale,\n width: c.width / view.scale,\n height: c.height / view.scale,\n };\n const key = [\n bounds.x - m.x,\n bounds.y - m.y,\n bounds.width,\n bounds.height,\n ].join(\",\");\n if (this.invalid || key !== this.boundsKey) {\n this.boundsKey = key;\n this.invalid = false;\n const retained = new Set<number>();\n for (const p of m.tilesInBounds(bounds)) {\n const index = p.y * m.width + p.x;\n retained.add(index);\n if (!this.graphics.has(index) || this.dirty.has(index) || this.bulk)\n this.cell(p.x, p.y);\n }\n for (const index of this.graphics.keys())\n if (!retained.has(index)) this.remove(index);\n this.visibleCells = retained;\n this.bulk = false;\n } else\n for (const index of this.dirty) {\n const x = index % m.width,\n y = Math.floor(index / m.width),\n b = m.tileBounds(x, y);\n if (\n b.x <= bounds.x + bounds.width &&\n b.x + b.width >= bounds.x &&\n b.y <= bounds.y + bounds.height &&\n b.y + b.height >= bounds.y\n )\n this.cell(x, y);\n }\n this.dirty.clear();\n }\n private bulk = false;\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.stats.destroyedGraphics += this.graphics.size;\n this.graphics.clear();\n this.visibleCells.clear();\n this.dirty.clear();\n cleanupAll(\n [\n this.off,\n this.offDispose,\n () => this.display.removeFromParent(),\n () => this.display.destroy({ children: true, context: true }),\n this.released,\n ],\n \"Geometry tilemap cleanup failed\",\n );\n }\n}\n","import type { Graphics, Text } from \"pixi.js\";\n\ninterface Hash {\n items: Record<string, unknown>;\n}\ninterface PinnedRenderer {\n renderPipes: {\n graphics?: { _managedGraphics?: Hash };\n text?: { _managedTexts?: Hash };\n };\n graphicsContext?: { _managedContexts?: Hash };\n canvasText?: { _activeTextures?: Record<string, unknown> };\n}\nfunction drop(\n hash: Hash | undefined,\n id: number,\n resource?: Graphics | Text,\n): void {\n if (!hash) return;\n const value = hash.items[id];\n if (value === null || (resource?.destroyed && value === resource))\n delete hash.items[id];\n}\n/** Renderer-local compatibility for pinned Pixi8.22. Drop only destroyed UI owners/null bookkeeping.\n * CanvasGraphicsPipe has no GPU data for its Graphics; GCManagedHash.remove returns early there.\n * Text/style keys otherwise accumulate null entries after dynamic text updates. */\nexport function releaseUIGraphics(\n renderer: unknown,\n graphics: Graphics,\n context: number | undefined,\n): void {\n if (!graphics.destroyed) return;\n const r = renderer as PinnedRenderer;\n drop(r.renderPipes.graphics?._managedGraphics, graphics.uid, graphics);\n if (context !== undefined) drop(r.graphicsContext?._managedContexts, context);\n}\nexport function releaseUIText(\n renderer: unknown,\n text: Text,\n key: string | undefined,\n): void {\n if (!text.destroyed) return;\n const r = renderer as PinnedRenderer;\n drop(r.renderPipes.text?._managedTexts, text.uid, text);\n if (key !== undefined && r.canvasText?._activeTextures?.[key] === null)\n delete r.canvasText._activeTextures[key];\n}\n/** Called after rendering so replaced text has released its old managed texture. Never drops a live key. */\nexport function pruneUITextKeys(renderer: unknown, keys: Set<string>): void {\n const textures = (renderer as PinnedRenderer).canvasText?._activeTextures;\n for (const key of keys) {\n if (textures?.[key] != null) continue;\n if (textures?.[key] === null) delete textures[key];\n keys.delete(key);\n }\n}\n","import {\n EngineError,\n type SpriteFrame,\n spriteFrameBounds,\n} from \"@simpludify/core\";\nimport { Rectangle, Texture } from \"pixi.js\";\n\n/** Internal ownership boundary: the loader owns a Texture and its TextureSource. */\nexport interface ImageResource {\n readonly texture: Texture;\n release(): void;\n}\nexport interface ImageLease extends ImageResource {\n textureFor(frame?: SpriteFrame): Texture;\n}\ninterface Consumer {\n ready(resource: ImageResource): void;\n fail(error: unknown): void;\n release(): void;\n}\ninterface Entry {\n readonly key: string;\n readonly controller: AbortController;\n readonly consumers: Set<Consumer>;\n readonly frames: Map<string, Texture>;\n resource?: ImageResource;\n}\n\n/** Renderer-local, live-reference cache. No idle retention or process-global state. */\nexport class SharedImages {\n private readonly entries = new Map<string, Entry>();\n private references = 0;\n private dead = false;\n constructor(\n private readonly load: (\n url: string,\n signal: AbortSignal,\n ) => Promise<ImageResource>,\n ) {}\n get diagnostics() {\n let pending = 0;\n for (const entry of this.entries.values()) if (!entry.resource) pending++;\n return {\n imageReferences: this.references,\n imageEntries: this.entries.size,\n pendingImages: pending,\n };\n }\n acquire(key: string, signal: AbortSignal): Promise<ImageLease> {\n const cancelled = () =>\n new EngineError(\"GAME_DISPOSED\", \"Image use cancelled\", { path: key });\n if (this.dead || signal.aborted) return Promise.reject(cancelled());\n let entry = this.entries.get(key);\n const fresh = !entry;\n if (!entry) {\n entry = {\n key,\n controller: new AbortController(),\n consumers: new Set(),\n frames: new Map(),\n };\n this.entries.set(key, entry);\n }\n const current = entry;\n const promise = new Promise<ImageLease>((resolve, reject) => {\n let released = false,\n settled = false;\n const release = () => {\n if (released) return;\n released = true;\n signal.removeEventListener(\"abort\", release);\n current.consumers.delete(consumer);\n this.references--;\n if (!settled) {\n settled = true;\n reject(cancelled());\n }\n if (!current.consumers.size) {\n if (this.entries.get(key) === current) this.entries.delete(key);\n current.controller.abort();\n const resource = current.resource;\n delete current.resource;\n for (const texture of current.frames.values()) texture.destroy(false);\n current.frames.clear();\n resource?.release();\n }\n };\n const consumer: Consumer = {\n ready: (resource) => {\n if (released || settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", release);\n // A resolved lease survives request-controller cleanup. Its owner must\n // explicitly release it after replacing/destroying the displayed image.\n resolve({\n texture: resource.texture,\n release,\n textureFor: (frame) => {\n if (released)\n throw new EngineError(\"GAME_DISPOSED\", \"Image lease released\");\n if (!frame) return resource.texture;\n const rect = spriteFrameBounds(\n frame,\n resource.texture.width,\n resource.texture.height,\n );\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n let texture = current.frames.get(key);\n if (!texture) {\n texture = new Texture({\n source: resource.texture.source,\n frame: new Rectangle(rect.x, rect.y, rect.width, rect.height),\n });\n current.frames.set(key, texture);\n }\n return texture;\n },\n });\n },\n fail: (error) => {\n if (released || settled) return;\n settled = true;\n reject(error);\n release();\n },\n release,\n };\n this.references++;\n current.consumers.add(consumer);\n signal.addEventListener(\"abort\", release, { once: true });\n if (current.resource) consumer.ready(current.resource);\n });\n if (fresh) {\n // Register the first consumer before invoking even a synchronous/throwing\n // loader. Both completion branches handle abandoned entries explicitly.\n void Promise.resolve()\n .then(() => this.load(key, current.controller.signal))\n .then(\n (resource) => {\n if (!current.consumers.size) {\n resource.release();\n return;\n }\n current.resource = resource;\n for (const consumer of current.consumers) consumer.ready(resource);\n },\n (error) => {\n if (this.entries.get(key) === current) this.entries.delete(key);\n for (const consumer of [...current.consumers]) consumer.fail(error);\n },\n );\n }\n return promise;\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n for (const entry of [...this.entries.values()])\n for (const consumer of [...entry.consumers]) consumer.release();\n }\n}\n","import {\n cleanupAll,\n type Scene,\n type Tilemap,\n type ViewTransform,\n} from \"@simpludify/core\";\nimport { Container, Sprite, type Texture } from \"pixi.js\";\nimport type { ImageLease } from \"./shared-images\";\n\n/** Renderer-owned sparse visible set; sheet pixels are owned by SharedImages. */\nexport class TilemapVisual {\n readonly display = new Container();\n readonly sprites = new Map<number, Sprite>();\n order = 0;\n depth = NaN;\n controller: AbortController | undefined = new AbortController();\n error: unknown;\n disposed = false;\n readonly stats = {\n visitedCells: 0,\n updatedTiles: 0,\n createdSprites: 0,\n destroyedSprites: 0,\n validatedFrames: 0,\n };\n private lease: ImageLease | undefined;\n private readonly textures = new Map<number | string, Texture>();\n private readonly dirty = new Set<number>();\n private revision = -1;\n private range = { left: -1, top: -1, right: -1, bottom: -1 };\n private invalid = true;\n private readonly off: () => void;\n private readonly offDispose: () => void;\n constructor(\n readonly map: Tilemap<string>,\n scene: Scene,\n acquire: (url: string, signal: AbortSignal) => Promise<ImageLease>,\n private readonly changed: () => void,\n private readonly onError: (error: unknown) => void,\n private readonly released: () => void,\n ) {\n this.off = map.onTilesChanged((index) => {\n if (index === null) {\n this.invalid = true;\n this.dirty.clear();\n } else {\n const x = index % map.width,\n y = Math.floor(index / map.width),\n r = this.range;\n if (x >= r.left && x < r.right && y >= r.top && y < r.bottom)\n this.dirty.add(index);\n }\n });\n this.offDispose = map.onDispose(() => this.dispose());\n const controller = this.controller;\n if (!controller) throw Error(\"Missing tilemap request controller\");\n void acquire(map.sheet.url, controller.signal)\n .then((lease) => {\n if (this.disposed || map.disposed || map.scene !== scene) {\n lease.release();\n return;\n }\n this.lease = lease;\n this.sync();\n })\n .catch((error: unknown) => {\n if (!this.disposed) this.fail(error);\n })\n .finally(() => {\n this.controller = undefined;\n changed();\n });\n }\n private fail(error: unknown): void {\n this.error = error;\n try {\n this.onError(error);\n } catch {\n /* Diagnostics must not invalidate cleanup. */\n }\n }\n sync(): void {\n if (!this.lease || this.disposed || this.revision === this.map.revision)\n return;\n this.revision = this.map.revision;\n this.error = undefined;\n try {\n for (const id of this.map.tileIds()) {\n if (!this.textures.has(id)) {\n this.stats.validatedFrames++;\n this.textures.set(\n id,\n this.lease.textureFor(this.map.sheet.get(id).frame),\n );\n }\n }\n } catch (error) {\n this.fail(error);\n }\n }\n private remove(index: number): void {\n const sprite = this.sprites.get(index);\n if (sprite) {\n this.sprites.delete(index);\n sprite.destroy();\n this.stats.destroyedSprites++;\n }\n }\n private cell(x: number, y: number): void {\n this.stats.visitedCells++;\n const index = y * this.map.width + x,\n id = this.map.get(x, y);\n if (id === null) {\n this.remove(index);\n return;\n }\n const texture = this.textures.get(id);\n if (!texture) return;\n let sprite = this.sprites.get(index);\n if (!sprite) {\n sprite = new Sprite(texture);\n sprite.position.set(x * this.map.tileWidth, y * this.map.tileHeight);\n this.sprites.set(index, sprite);\n this.display.addChild(sprite);\n this.stats.createdSprites++;\n }\n sprite.texture = texture;\n sprite.width = this.map.tileWidth;\n sprite.height = this.map.tileHeight;\n this.stats.updatedTiles++;\n }\n render(view: ViewTransform): void {\n if (this.disposed) return;\n this.sync();\n const m = this.map;\n this.display.position.set(m.x, m.y);\n this.display.visible = m.visible && m.enabled;\n if (!this.display.visible) {\n this.invalid = true;\n return;\n }\n if (!this.lease || this.error) return;\n const c = view.clip;\n const left = Math.max(\n 0,\n Math.min(\n m.width,\n Math.floor(((c.x - view.x) / view.scale - m.x) / m.tileWidth),\n ),\n );\n const top = Math.max(\n 0,\n Math.min(\n m.height,\n Math.floor(((c.y - view.y) / view.scale - m.y) / m.tileHeight),\n ),\n );\n const right = Math.max(\n left,\n Math.min(\n m.width,\n Math.ceil(((c.x + c.width - view.x) / view.scale - m.x) / m.tileWidth),\n ),\n );\n const bottom = Math.max(\n top,\n Math.min(\n m.height,\n Math.ceil(\n ((c.y + c.height - view.y) / view.scale - m.y) / m.tileHeight,\n ),\n ),\n );\n const old = this.range;\n if (\n this.invalid ||\n left !== old.left ||\n top !== old.top ||\n right !== old.right ||\n bottom !== old.bottom\n ) {\n this.range = { left, top, right, bottom };\n this.invalid = false;\n for (const index of this.sprites.keys()) {\n const x = index % m.width,\n y = Math.floor(index / m.width);\n if (x < left || x >= right || y < top || y >= bottom)\n this.remove(index);\n }\n for (let y = top; y < bottom; y++)\n for (let x = left; x < right; x++) this.cell(x, y);\n } else\n for (const index of this.dirty)\n this.cell(index % m.width, Math.floor(index / m.width));\n this.dirty.clear();\n }\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.controller?.abort();\n this.controller = undefined;\n\n this.stats.destroyedSprites += this.sprites.size;\n this.sprites.clear();\n this.textures.clear();\n this.dirty.clear();\n const lease = this.lease;\n this.lease = undefined;\n cleanupAll(\n [\n this.off,\n this.offDispose,\n () => this.display.removeFromParent(),\n () => this.display.destroy({ children: true }),\n () => lease?.release(),\n this.released,\n this.changed,\n ],\n \"Tilemap presentation cleanup failed\",\n );\n }\n}\n","import {\n cleanupAll,\n type VirtualControl,\n type VirtualInput,\n} from \"@simpludify/core\";\nimport { Container, Graphics } from \"pixi.js\";\n\nexport interface VirtualInputPresentation {\n update(): void;\n dispose(): void;\n}\n/** Screen-space presentation only. The existing BrowserPointer is the sole event adapter. */\nexport class VirtualInputVisual implements VirtualInputPresentation {\n readonly display = new Container();\n private readonly entries = new Map<\n VirtualControl,\n { graphics: Graphics; signature: string }\n >();\n private dead = false;\n private readonly off: () => void;\n constructor(\n private readonly input: VirtualInput,\n private readonly release: (graphics: Graphics) => void,\n ) {\n this.display.eventMode = \"none\";\n this.display.sortableChildren = true;\n this.display.zIndex = 0.5;\n this.off = input.onDispose(() => this.dispose());\n }\n get diagnostics() {\n return {\n controls: this.entries.size,\n visible: [...this.entries.values()].filter((e) => e.graphics.visible)\n .length,\n };\n }\n update(): void {\n if (this.dead) return;\n const live = new Set(this.input.controls);\n for (const [control, entry] of this.entries)\n if (!live.has(control)) {\n this.entries.delete(control);\n this.release(entry.graphics);\n }\n this.display.visible = this.input.visible;\n for (const control of live) {\n let entry = this.entries.get(control);\n if (!entry) {\n entry = { graphics: new Graphics(), signature: \"\" };\n entry.graphics.zIndex = control.kind === \"button\" ? 1 : 0;\n this.entries.set(control, entry);\n this.display.addChild(entry.graphics);\n }\n entry.graphics.visible = control.visible;\n if (!control.visible || !this.input.visible) continue;\n const center = control.center,\n knob = control.knob,\n radius = control.radius;\n const signature = JSON.stringify([\n center,\n knob,\n radius,\n control.color,\n control.enabled,\n this.input.enabled,\n control.pressed,\n control.kind,\n ]);\n if (signature === entry.signature) continue;\n entry.signature = signature;\n const g = entry.graphics;\n g.clear();\n g.alpha = control.enabled && this.input.enabled ? 1 : 0.35;\n g.circle(center.x, center.y, radius)\n .fill({ color: control.color, alpha: 0.12 })\n .stroke({ color: control.color, alpha: 0.75, width: 2 });\n if (control.kind === \"stick\") {\n g.moveTo(center.x, center.y)\n .lineTo(knob.x, knob.y)\n .stroke({ color: control.color, alpha: 0.5, width: 3 });\n g.circle(knob.x, knob.y, radius * 0.36).fill({\n color: control.color,\n alpha: control.pressed ? 0.85 : 0.45,\n });\n } else {\n if (control.pressed)\n g.circle(center.x, center.y, radius * 0.7).fill({\n color: control.color,\n alpha: 0.65,\n });\n if (control.directional && control.pressed)\n g.moveTo(center.x, center.y)\n .lineTo(knob.x, knob.y)\n .stroke({ color: control.color, width: 4 });\n }\n }\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const entries = [...this.entries.values()];\n this.entries.clear();\n cleanupAll(\n [\n this.off,\n ...entries.map((e) => () => this.release(e.graphics)),\n () => this.display.destroy({ children: true }),\n ],\n \"Virtual input presentation cleanup failed\",\n );\n }\n}\n","import type { CanvasUI, PointerRouting, VirtualInput } from \"@simpludify/core\";\nimport {\n type Actor,\n cleanupAll,\n EngineError,\n GeometryTilemapLayer,\n imageSize,\n type PreparedScene,\n Renderable,\n type RendererPort,\n type Scene,\n Shape,\n TilemapLayer,\n Transform,\n type VisualSource,\n} from \"@simpludify/core\";\nimport {\n Application,\n Container,\n Graphics,\n RendererType,\n Sprite,\n Texture,\n} from \"pixi.js\";\nimport { type CanvasPresentation, CanvasVisual } from \"./canvas-visual\";\nimport { GeometryTilemapVisual } from \"./geometry-tilemap-visual\";\nimport {\n pruneUITextKeys,\n releaseUIGraphics,\n releaseUIText,\n} from \"./pixi-ui-cleanup\";\nimport {\n type ImageLease,\n type ImageResource,\n SharedImages,\n} from \"./shared-images\";\nimport { TilemapVisual } from \"./tilemap-visual\";\nimport {\n type VirtualInputPresentation,\n VirtualInputVisual,\n} from \"./virtual-input-visual\";\n\ninterface Visual {\n actor: Actor;\n component: Renderable;\n transform: Transform;\n revision: number;\n generation: number;\n requestUrl?: string;\n controller?: AbortController;\n order: number;\n depth: number;\n scaleX: number;\n scaleY: number;\n display?: Sprite | Graphics;\n displayedSource?: VisualSource;\n geometryShape?: Shape;\n geometryWidth: number;\n geometryHeight: number;\n geometryColor: number;\n image?: ImageLease;\n requestedSource?: VisualSource;\n error?: unknown;\n disposed: boolean;\n dispose(): void;\n}\nexport class PixiRenderer implements RendererPort {\n private readonly app = new Application();\n private readonly pendingUITextKeys = new Set<string>();\n private readonly canvasPresentations = new Set<CanvasVisual>();\n private readonly virtualPresentations = new Set<VirtualInputVisual>();\n get virtualInputDiagnostics() {\n let controls = 0,\n visible = 0;\n for (const visual of this.virtualPresentations) {\n controls += visual.diagnostics.controls;\n visible += visual.diagnostics.visible;\n }\n return { presentations: this.virtualPresentations.size, controls, visible };\n }\n prepareVirtualInput(input: VirtualInput): VirtualInputPresentation {\n if (!this.ready || this.dead)\n throw new EngineError(\"RENDERER_NOT_READY\", \"Renderer is not available\");\n const visual = new VirtualInputVisual(input, (graphics) => {\n const context = graphics.context.uid;\n graphics.destroy({ context: true });\n releaseUIGraphics(this.app.renderer, graphics, context);\n });\n this.virtualPresentations.add(visual);\n const off = input.onDispose(() => {\n this.virtualPresentations.delete(visual);\n });\n let disposed = false;\n return {\n update: () => {\n if (disposed || input.disposed) return;\n if (!visual.display.parent) this.app.stage.addChild(visual.display);\n visual.update();\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n off();\n this.virtualPresentations.delete(visual);\n visual.dispose();\n },\n };\n }\n get canvasDiagnostics() {\n let nodes = 0,\n visibleNodes = 0,\n buttons = 0,\n syncs = 0,\n textMetrics = 0;\n for (const p of this.canvasPresentations) {\n const d = p.diagnostics;\n nodes += d.nodes;\n visibleNodes += d.visibleNodes;\n buttons += d.buttons;\n syncs += d.syncs;\n textMetrics += d.textMetrics;\n }\n return {\n presentations: this.canvasPresentations.size,\n nodes,\n visibleNodes,\n buttons,\n syncs,\n textMetrics,\n };\n }\n prepareCanvasUI(ui: CanvasUI, routing: PointerRouting): CanvasPresentation {\n if (!this.ready || this.dead)\n throw new EngineError(\"RENDERER_NOT_READY\", \"Renderer is not available\");\n const visual = new CanvasVisual(ui, this.host, routing, {\n graphics: (graphics, context) =>\n releaseUIGraphics(this.app.renderer, graphics, context),\n text: (text, key) => releaseUIText(this.app.renderer, text, key),\n changedText: (key) => this.pendingUITextKeys.add(key),\n cacheResolution: () =>\n this.app.renderer.type === RendererType.WEBGL\n ? this.app.renderer.resolution\n : undefined,\n });\n this.canvasPresentations.add(visual);\n let disposed = false;\n const off = ui.onDispose(() => {\n this.canvasPresentations.delete(visual);\n });\n return {\n update: (width, height) => {\n if (disposed || ui.disposed) return;\n if (!visual.display.parent) this.app.stage.addChild(visual.display);\n visual.update(width, height);\n },\n focus: (node) => visual.focus(node),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n off();\n this.canvasPresentations.delete(visual);\n visual.dispose();\n },\n };\n }\n private readonly scenes = new Set<PreparedScene>();\n private readonly images = new SharedImages((url, signal) =>\n this.image(url, signal),\n );\n private readonly tilemaps = new Set<TilemapVisual>();\n get tilemapDiagnostics() {\n let sprites = 0,\n visibleTiles = 0,\n visitedCells = 0,\n updatedTiles = 0,\n createdSprites = 0,\n destroyedSprites = 0,\n validatedFrames = 0;\n for (const t of this.tilemaps) {\n sprites += t.sprites.size;\n if (t.display.visible) visibleTiles += t.sprites.size;\n visitedCells += t.stats.visitedCells;\n updatedTiles += t.stats.updatedTiles;\n createdSprites += t.stats.createdSprites;\n destroyedSprites += t.stats.destroyedSprites;\n validatedFrames += t.stats.validatedFrames;\n }\n return {\n maps: this.tilemaps.size,\n sprites,\n visibleTiles,\n visitedCells,\n updatedTiles,\n createdSprites,\n destroyedSprites,\n validatedFrames,\n };\n }\n private readonly geometryTilemaps = new Set<GeometryTilemapVisual>();\n get geometryTilemapDiagnostics() {\n let graphics = 0,\n visitedCells = 0,\n updatedTiles = 0,\n createdGraphics = 0,\n destroyedGraphics = 0;\n for (const t of this.geometryTilemaps) {\n graphics += t.graphics.size;\n visitedCells += t.stats.visitedCells;\n updatedTiles += t.stats.updatedTiles;\n createdGraphics += t.stats.createdGraphics;\n destroyedGraphics += t.stats.destroyedGraphics;\n }\n return {\n maps: this.geometryTilemaps.size,\n graphics,\n visitedCells,\n updatedTiles,\n createdGraphics,\n destroyedGraphics,\n };\n }\n private ready = false;\n private dead = false;\n private visualCount = 0;\n private textureCount = 0;\n get diagnostics() {\n return {\n presentations: this.scenes.size,\n visuals: this.visualCount,\n textures: this.textureCount,\n ...this.images.diagnostics,\n };\n }\n constructor(\n private readonly host: HTMLElement,\n private readonly background = \"#101922\",\n private readonly onError: (error: unknown) => void = () => {},\n ) {}\n async init(): Promise<void> {\n await this.app.init({\n width: 800,\n height: 450,\n background: this.background,\n antialias: true,\n autoStart: false,\n sharedTicker: false,\n preference: \"webgl\",\n resolution: 1,\n autoDensity: true,\n });\n this.ready = true;\n if (this.dead) {\n this.destroyApp();\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Renderer disposed during initialization\",\n );\n }\n this.app.stage.sortableChildren = true;\n this.app.canvas.setAttribute(\"aria-label\", \"Game world\");\n this.host.prepend(this.app.canvas);\n }\n private async image(\n url: string,\n signal: AbortSignal,\n ): Promise<ImageResource> {\n const image = new Image();\n await new Promise<void>((resolve, reject) => {\n const clear = () => {\n image.onload = null;\n image.onerror = null;\n signal.removeEventListener(\"abort\", abort);\n };\n const abort = () => {\n clear();\n image.src = \"\";\n reject(\n new EngineError(\"GAME_DISPOSED\", \"Image loading cancelled\", {\n path: url,\n }),\n );\n };\n image.onload = () => {\n clear();\n resolve();\n };\n image.onerror = () => {\n clear();\n reject(\n new EngineError(\"ASSET_LOAD_FAILED\", \"Could not load sprite\", {\n path: url,\n }),\n );\n };\n if (signal.aborted) {\n abort();\n return;\n }\n signal.addEventListener(\"abort\", abort, { once: true });\n image.crossOrigin = \"anonymous\";\n image.src = url;\n });\n if (signal.aborted)\n throw new EngineError(\"GAME_DISPOSED\", \"Image loading cancelled\", {\n path: url,\n });\n const texture = Texture.from(image, true);\n if (!(texture.width > 0 && texture.height > 0)) {\n texture.destroy(true);\n throw new EngineError(\n \"ASSET_LOAD_FAILED\",\n \"Image has no drawable dimensions\",\n { path: url },\n );\n }\n this.textureCount++;\n let released = false;\n return {\n texture,\n release: () => {\n if (released) return;\n released = true;\n this.textureCount--;\n texture.destroy(true);\n },\n };\n }\n\n private acquireImage(url: string, signal: AbortSignal): Promise<ImageLease> {\n // Image.src resolves against document.baseURI too. Retain query, fragment and\n // credentials; anonymous CORS is fixed for every request in this renderer.\n try {\n const parsed = new URL(url, document.baseURI);\n if (\n ![\"http:\", \"https:\", \"data:\", \"blob:\", \"file:\"].includes(\n parsed.protocol,\n )\n )\n throw new Error(\"Unsupported image URL protocol\");\n return this.images.acquire(parsed.href, signal);\n } catch {\n return Promise.reject(\n new EngineError(\"ASSET_LOAD_FAILED\", \"Invalid image URL\", {\n path: url,\n }),\n );\n }\n }\n\n async prepare(scene: Scene): Promise<PreparedScene> {\n if (!this.ready || this.dead)\n throw new EngineError(\"RENDERER_NOT_READY\", \"Renderer is not available\");\n const root = new Container(),\n world = new Container(),\n mask = new Graphics();\n world.sortableChildren = true;\n root.addChild(world, mask);\n root.mask = mask;\n const visuals = new Map<Actor, Visual>();\n const tilemaps = new Map<Actor, TilemapVisual | GeometryTilemapVisual>();\n const drawOrder: {\n display: Sprite | Graphics | Container;\n order: number;\n zIndex: number;\n }[] = [];\n let depthDirty = true;\n let revision = -1,\n disposed = false,\n clipX = NaN,\n clipY = NaN,\n clipWidth = NaN,\n clipHeight = NaN,\n removeSceneCleanup: (() => void) | undefined;\n const valid = (entry: Visual) =>\n !disposed &&\n !scene.disposed &&\n !entry.actor.disposed &&\n entry.actor.scene === scene &&\n entry.actor.get(Renderable.type) === entry.component &&\n !entry.component.disposed;\n // Waiters follow the current requests of this presentation. No polling timer,\n // replay hook or Core subscription is needed when no readiness call is pending.\n let wake: Promise<void> | undefined;\n let wakeResolve: (() => void) | undefined;\n const changed = () => {\n const resolve = wakeResolve;\n wake = undefined;\n wakeResolve = undefined;\n resolve?.();\n };\n const cancel = (entry: Visual) => {\n entry.generation++;\n const controller = entry.controller;\n delete entry.controller;\n if (controller) {\n controller.abort();\n }\n };\n const appearance = (entry: Visual) => {\n const { component, display, displayedSource: source } = entry;\n if (!display || !source) return;\n if (source.kind === \"image\" && display instanceof Sprite && entry.image) {\n const texture = display.texture;\n const size = imageSize(\n texture.width,\n texture.height,\n component.width,\n component.height,\n source.fit,\n );\n entry.scaleX = size.width / texture.width;\n entry.scaleY = size.height / texture.height;\n display.tint = component.color;\n } else if (source.kind === \"shape\" && display instanceof Graphics) {\n const width = component.width,\n height = component.height;\n if (\n entry.geometryShape === source.shape &&\n entry.geometryWidth === width &&\n entry.geometryHeight === height &&\n entry.geometryColor === component.color\n )\n return;\n entry.geometryShape = source.shape;\n entry.geometryWidth = width;\n entry.geometryHeight = height;\n entry.geometryColor = component.color;\n display.clear();\n if (source.shape === Shape.Circle)\n display\n .circle(0, 0, Math.min(width, height) / 2)\n .fill(component.color);\n else if (source.shape === Shape.Hexagon)\n display\n .poly(\n [\n 0,\n -height / 2,\n width / 2,\n -height / 4,\n width / 2,\n height / 4,\n 0,\n height / 2,\n -width / 2,\n height / 4,\n -width / 2,\n -height / 4,\n ],\n true,\n )\n .fill(component.color);\n else if (source.shape === Shape.Triangle)\n display\n .poly(\n [0, -height / 2, width / 2, height / 2, -width / 2, height / 2],\n true,\n )\n .fill(component.color);\n else\n display\n .roundRect(\n -width / 2,\n -height / 2,\n width,\n height,\n source.shape === Shape.Character\n ? Math.min(width, height) / 4\n : 2,\n )\n .fill(component.color);\n if (source.shape === Shape.Character)\n display\n .circle(-width / 7, -height / 10, Math.min(width, height) / 18)\n .fill(0x102c28)\n .circle(width / 7, -height / 10, Math.min(width, height) / 18)\n .fill(0x102c28);\n entry.scaleX = entry.scaleY = 1;\n }\n };\n const replace = (\n entry: Visual,\n display: Sprite | Graphics,\n source: VisualSource,\n ) => {\n if (entry.display !== display) {\n entry.display?.destroy();\n entry.display = display;\n delete entry.geometryShape;\n world.addChild(display);\n depthDirty = true;\n }\n entry.displayedSource = source;\n };\n const fail = (entry: Visual, error: unknown) => {\n entry.error = error;\n try {\n this.onError(error);\n } catch {\n /* Keep diagnostics separate from cleanup. */\n }\n };\n const commitImage = (\n entry: Visual,\n resource: ImageLease,\n source: VisualSource,\n ) => {\n if (source.kind !== \"image\") return;\n // Resolve and validate before mutating the retained Sprite or releasing its lease.\n const texture = resource.textureFor(source.frame);\n const previous = entry.image;\n const sprite =\n entry.display instanceof Sprite ? entry.display : new Sprite(texture);\n sprite.texture = texture;\n sprite.anchor.set(0.5);\n entry.image = resource;\n replace(entry, sprite, source);\n appearance(entry);\n if (previous !== resource) previous?.release();\n };\n const update = (entry: Visual) => {\n const component = entry.component;\n if (entry.revision === component.revision) return;\n entry.revision = component.revision;\n const source = component.source;\n const sourceChanged = entry.requestedSource !== source;\n entry.requestedSource = source;\n if (source.kind === \"shape\") {\n cancel(entry);\n delete entry.requestUrl;\n delete entry.error;\n const previous = entry.image;\n delete entry.image;\n replace(\n entry,\n entry.display instanceof Graphics ? entry.display : new Graphics(),\n source,\n );\n previous?.release();\n changed();\n } else if (\n entry.requestUrl !== source.url ||\n (sourceChanged &&\n !entry.controller &&\n (!entry.image ||\n entry.displayedSource?.kind !== \"image\" ||\n entry.displayedSource.url !== source.url))\n ) {\n cancel(entry);\n entry.requestUrl = source.url;\n delete entry.error;\n // Returning to the still-displayed image needs no new load.\n if (\n entry.image &&\n entry.displayedSource?.kind === \"image\" &&\n entry.displayedSource.url === source.url\n ) {\n try {\n commitImage(entry, entry.image, source);\n } catch (error) {\n fail(entry, error);\n }\n } else {\n const controller = new AbortController(),\n generation = entry.generation;\n entry.controller = controller;\n const current = () =>\n !entry.disposed &&\n valid(entry) &&\n entry.generation === generation &&\n component.source.kind === \"image\" &&\n component.source.url === source.url;\n void this.acquireImage(source.url, controller.signal)\n .then((resource) => {\n if (!current()) {\n resource.release();\n return;\n }\n try {\n commitImage(entry, resource, component.source);\n } catch (error) {\n resource.release();\n throw error;\n }\n })\n .catch((error) => {\n if (current()) {\n fail(entry, error);\n }\n })\n .finally(() => {\n if (entry.controller === controller) delete entry.controller;\n changed();\n });\n }\n changed();\n } else if (\n entry.image &&\n entry.displayedSource?.kind === \"image\" &&\n entry.displayedSource.url === source.url\n ) {\n if (sourceChanged) delete entry.error;\n try {\n commitImage(entry, entry.image, source);\n } catch (error) {\n fail(entry, error);\n }\n }\n // Layout/color changes also apply to the retained display while a new image loads.\n appearance(entry);\n };\n const create = (actor: Actor, component: Renderable): Visual => {\n this.visualCount++;\n let removeActorCleanup = () => {},\n removeComponentCleanup = () => {};\n const entry: Visual = {\n revision: -1,\n generation: 0,\n disposed: false,\n geometryWidth: NaN,\n geometryHeight: NaN,\n geometryColor: NaN,\n order: 0,\n depth: NaN,\n scaleX: 1,\n scaleY: 1,\n actor,\n component,\n transform: actor.require(Transform.type),\n dispose: () => {\n if (entry.disposed) return;\n entry.disposed = true;\n this.visualCount--;\n depthDirty = true;\n drawOrder.length = 0;\n cancel(entry);\n changed();\n const display = entry.display,\n image = entry.image;\n delete entry.display;\n delete entry.image;\n cleanupAll(\n [\n removeActorCleanup,\n removeComponentCleanup,\n () => display?.destroy(),\n () => image?.release(),\n ],\n \"Visual cleanup failed\",\n );\n },\n };\n removeActorCleanup = actor.onDispose(entry.dispose);\n removeComponentCleanup = component.onDispose(entry.dispose);\n update(entry);\n return entry;\n };\n const reconcile = () => {\n if (disposed || scene.disposed) return;\n if (revision === scene.revision) return;\n revision = scene.revision;\n depthDirty = true;\n for (const [actor, entry] of visuals)\n if (!valid(entry)) {\n entry.dispose();\n visuals.delete(actor);\n }\n for (const [actor, entry] of tilemaps)\n if (\n actor.disposed ||\n actor.scene !== scene ||\n !(entry instanceof TilemapVisual\n ? actor.get(TilemapLayer.type)\n : actor.get(GeometryTilemapLayer.type)) ||\n entry.disposed\n ) {\n entry.dispose();\n if (entry instanceof TilemapVisual) this.tilemaps.delete(entry);\n else this.geometryTilemaps.delete(entry);\n tilemaps.delete(actor);\n }\n let order = 0;\n for (const actor of scene.actors) {\n const layer = actor.get(TilemapLayer.type);\n if (layer) {\n let tile = tilemaps.get(actor);\n if (!tile) {\n tile = new TilemapVisual(\n layer.map,\n scene,\n (url, signal) => this.acquireImage(url, signal),\n changed,\n this.onError,\n () => {\n if (tile instanceof TilemapVisual) this.tilemaps.delete(tile);\n depthDirty = true;\n },\n );\n world.addChild(tile.display);\n tilemaps.set(actor, tile);\n this.tilemaps.add(tile);\n }\n tile.order = order;\n }\n const geometryLayer = actor.get(GeometryTilemapLayer.type);\n if (geometryLayer) {\n let tile = tilemaps.get(actor);\n if (!tile) {\n const created = new GeometryTilemapVisual(geometryLayer.map, () => {\n this.geometryTilemaps.delete(created);\n depthDirty = true;\n });\n tile = created;\n world.addChild(tile.display);\n tilemaps.set(actor, tile);\n this.geometryTilemaps.add(created);\n }\n tile.order = order;\n }\n const component = actor.get(Renderable.type);\n if (component) {\n let entry = visuals.get(actor);\n if (!entry) {\n entry = create(actor, component);\n visuals.set(actor, entry);\n }\n entry.order = order;\n }\n order++;\n }\n };\n const sync = () => {\n reconcile();\n for (const entry of visuals.values()) update(entry);\n for (const entry of tilemaps.values())\n if (entry instanceof TilemapVisual) entry.sync();\n };\n const prepared: PreparedScene = {\n ready: async () => {\n for (;;) {\n if (disposed || this.dead || scene.disposed)\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Scene presentation has been disposed\",\n );\n sync();\n let pending = false;\n for (const entry of visuals.values()) {\n if (entry.error) throw entry.error;\n if (entry.controller) pending = true;\n }\n for (const entry of tilemaps.values()) {\n if (!(entry instanceof TilemapVisual)) continue;\n if (entry.error) throw entry.error;\n if (entry.controller) pending = true;\n }\n if (!pending) return;\n wake ??= new Promise<void>((resolve) => {\n wakeResolve = resolve;\n });\n await wake;\n }\n },\n render: (view) => {\n if (disposed || this.dead || scene.disposed) return;\n reconcile();\n if (!root.parent) this.app.stage.addChild(root);\n const c = view.clip;\n if (\n c.x !== clipX ||\n c.y !== clipY ||\n c.width !== clipWidth ||\n c.height !== clipHeight\n ) {\n clipX = c.x;\n clipY = c.y;\n clipWidth = c.width;\n clipHeight = c.height;\n mask.clear().rect(c.x, c.y, c.width, c.height).fill(0xffffff);\n }\n world.scale.set(view.scale);\n world.position.set(view.x, view.y);\n for (const entry of visuals.values()) {\n update(entry);\n if (entry.display) {\n const t = entry.transform;\n entry.display.visible =\n entry.actor.enabled &&\n entry.component.enabled &&\n entry.component.visible;\n entry.display.alpha = entry.component.opacity;\n if (entry.depth !== entry.component.zIndex) {\n entry.depth = entry.component.zIndex;\n depthDirty = true;\n }\n const x = t.x + entry.component.offsetX,\n y = t.y + entry.component.offsetY,\n rotation = t.rotation + entry.component.rotation,\n scaleX = entry.scaleX * t.scaleX * entry.component.scaleX,\n scaleY = entry.scaleY * t.scaleY * entry.component.scaleY;\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n !Number.isFinite(rotation) ||\n !Number.isFinite(scaleX) ||\n !Number.isFinite(scaleY)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Composed visual transform must be finite\",\n );\n entry.display.position.set(x, y);\n entry.display.rotation = rotation;\n entry.display.scale.set(scaleX, scaleY);\n }\n }\n for (const entry of tilemaps.values()) {\n entry.render(view);\n if (entry.depth !== entry.map.zIndex) {\n entry.depth = entry.map.zIndex;\n depthDirty = true;\n }\n }\n if (depthDirty) {\n drawOrder.length = 0;\n for (const entry of visuals.values())\n if (entry.display)\n drawOrder.push({\n display: entry.display,\n order: entry.order,\n zIndex: entry.component.zIndex,\n });\n for (const entry of tilemaps.values())\n drawOrder.push({\n display: entry.display,\n order: entry.order,\n zIndex: entry.map.zIndex,\n });\n drawOrder.sort((a, b) => a.zIndex - b.zIndex || a.order - b.order);\n for (let i = 0; i < drawOrder.length; i++) {\n const entry = drawOrder[i];\n if (entry?.display) entry.display.zIndex = i;\n }\n depthDirty = false;\n }\n this.app.render();\n if (this.pendingUITextKeys.size)\n pruneUITextKeys(this.app.renderer, this.pendingUITextKeys);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n changed();\n this.scenes.delete(prepared);\n const entries = [...visuals.values()];\n visuals.clear();\n drawOrder.length = 0;\n cleanupAll(\n [\n () => removeSceneCleanup?.(),\n ...entries.map((entry) => entry.dispose),\n () => {\n for (const entry of tilemaps.values()) {\n entry.dispose();\n if (entry instanceof TilemapVisual) this.tilemaps.delete(entry);\n else this.geometryTilemaps.delete(entry);\n }\n tilemaps.clear();\n },\n () => root.destroy({ children: true, context: true }),\n ],\n \"Presentation cleanup failed\",\n );\n },\n };\n removeSceneCleanup = scene.onDispose(prepared.dispose);\n this.scenes.add(prepared);\n try {\n await prepared.ready?.();\n return prepared;\n } catch (error) {\n prepared.dispose();\n throw error;\n }\n }\n resize(width: number, height: number, devicePixelRatio: number): void {\n if (!this.ready || this.dead) return;\n if (this.app.renderer.resolution !== devicePixelRatio)\n for (const visual of this.canvasPresentations)\n visual.beforeResolutionChange();\n this.app.renderer.resolution = devicePixelRatio;\n this.app.renderer.resize(width, height);\n }\n private destroyApp(): void {\n if (this.ready) {\n this.ready = false;\n this.app.destroy({ removeView: true }, { children: true, context: true });\n }\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const scenes = [...this.scenes];\n this.scenes.clear();\n cleanupAll(\n [\n ...scenes.map((scene) => scene.dispose),\n ...[...this.virtualPresentations].map((p) => () => {\n this.virtualPresentations.delete(p);\n p.dispose();\n }),\n ...[...this.canvasPresentations].map((p) => () => {\n this.canvasPresentations.delete(p);\n p.dispose();\n }),\n () => this.pendingUITextKeys.clear(),\n () => this.images.dispose(),\n () => this.destroyApp(),\n ],\n \"Renderer cleanup failed\",\n );\n }\n}\n","import { cleanupAll } from \"@simpludify/core\";\nimport { registerGameButton } from \"./ui-keyboard\";\nexport const Layout = { Column: \"column\", Row: \"row\", Grid: \"grid\" } as const;\nexport type Layout = (typeof Layout)[keyof typeof Layout];\nexport const Theme = { Dark: \"dark\", Light: \"light\" } as const;\nexport type Theme = (typeof Theme)[keyof typeof Theme];\nexport interface ThemeTokens {\n background: string;\n surface: string;\n text: string;\n muted: string;\n accent: string;\n font: string;\n}\nexport const Themes: Readonly<Record<Theme, ThemeTokens>> = {\n dark: {\n background: \"#101922\",\n surface: \"#172630\",\n text: \"#eff7f6\",\n muted: \"#afc4ca\",\n accent: \"#73e3c0\",\n font: \"system-ui, sans-serif\",\n },\n light: {\n background: \"#eaf2ef\",\n surface: \"#ffffff\",\n text: \"#17332d\",\n muted: \"#45645d\",\n accent: \"#17654f\",\n font: \"system-ui, sans-serif\",\n },\n};\n\nexport const Placement = {\n Top: \"top\",\n Center: \"center\",\n Bottom: \"bottom\",\n} as const;\nexport type Placement = (typeof Placement)[keyof typeof Placement];\nexport interface TextBinding {\n readonly text: string;\n setText(text: string): void;\n subscribe(listener: (text: string) => void): () => void;\n}\nexport interface LabelNode extends TextBinding {\n readonly kind: \"label\";\n readonly muted: boolean;\n}\nexport interface ButtonNode extends TextBinding {\n readonly kind: \"button\";\n readonly onClick: (signal: AbortSignal) => void | Promise<void>;\n}\nexport interface HoldButtonNode extends TextBinding {\n readonly kind: \"hold-button\";\n readonly onHold: (held: boolean) => void;\n}\nexport interface PanelNode {\n readonly kind: \"panel\";\n readonly layout: Layout;\n readonly placement: Placement;\n readonly children: readonly UINode[];\n readonly title?: string;\n}\nexport type UINode = LabelNode | ButtonNode | HoldButtonNode | PanelNode;\nfunction textBinding(text: string): TextBinding {\n let value = text;\n const listeners = new Set<(text: string) => void>();\n let plan: readonly ((text: string) => void)[] = [];\n return {\n get text() {\n return value;\n },\n setText(next) {\n if (next === value) return;\n value = next;\n const errors: unknown[] = [];\n for (const listener of plan)\n if (listeners.has(listener)) {\n try {\n listener(value);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Text subscribers failed\");\n },\n subscribe(listener) {\n listeners.add(listener);\n plan = [...listeners];\n return () => {\n listeners.delete(listener);\n plan = [...listeners];\n };\n },\n };\n}\nfunction withText<T extends object>(node: T, text: string): T & TextBinding {\n return Object.defineProperties(\n node,\n Object.getOwnPropertyDescriptors(textBinding(text)),\n ) as T & TextBinding;\n}\nexport function Label(\n text: string,\n options: { muted?: boolean } = {},\n): LabelNode {\n return withText(\n { kind: \"label\" as const, muted: options.muted ?? false },\n text,\n );\n}\nexport function Button(\n text: string,\n onClick: (signal: AbortSignal) => void | Promise<void>,\n): ButtonNode {\n return withText({ kind: \"button\" as const, onClick }, text);\n}\nexport function HoldButton(\n text: string,\n onHold: (held: boolean) => void,\n): HoldButtonNode {\n return withText({ kind: \"hold-button\" as const, onHold }, text);\n}\nexport function Panel(\n children: readonly UINode[],\n options: { layout?: Layout; title?: string; placement?: Placement } = {},\n): PanelNode {\n return {\n kind: \"panel\",\n children: [...children],\n layout: options.layout ?? Layout.Column,\n placement: options.placement ?? Placement.Top,\n ...(options.title === undefined ? {} : { title: options.title }),\n };\n}\nexport interface MountedUI {\n readonly element: HTMLDivElement;\n dispose(): void;\n}\nexport function mountUI(\n nodes: readonly UINode[],\n onError: (error: unknown) => void,\n): MountedUI {\n const element = document.createElement(\"div\");\n element.className = \"s-ui\";\n const controller = new AbortController(),\n subscriptions: Array<() => void> = [];\n let disposed = false;\n const report = (error: unknown) => {\n try {\n onError(error);\n } catch {\n /* Observers cannot interrupt cleanup. */\n }\n };\n const render = (node: UINode): HTMLElement => {\n if (node.kind === \"label\") {\n const label = document.createElement(\"p\");\n label.textContent = node.text;\n if (node.muted) label.className = \"s-muted\";\n subscriptions.push(\n node.subscribe((text) => {\n label.textContent = text;\n }),\n );\n return label;\n }\n if (node.kind === \"button\" || node.kind === \"hold-button\") {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = node.text;\n subscriptions.push(\n node.subscribe((text) => {\n button.textContent = text;\n }),\n );\n const options = { signal: controller.signal };\n registerGameButton(button, controller.signal);\n if (node.kind === \"button\") {\n let pending = false;\n button.addEventListener(\n \"click\",\n () => {\n if (pending || button.disabled) return;\n try {\n const result = node.onClick(controller.signal);\n if (!result || typeof result.then !== \"function\") return;\n pending = true;\n button.setAttribute(\"aria-disabled\", \"true\");\n button.setAttribute(\"aria-busy\", \"true\");\n button.tabIndex = -1;\n void Promise.resolve(result)\n .catch((error) => {\n if (!controller.signal.aborted) report(error);\n })\n .finally(() => {\n pending = false;\n button.removeAttribute(\"aria-disabled\");\n button.removeAttribute(\"aria-busy\");\n button.tabIndex = 0;\n });\n } catch (error) {\n if (!controller.signal.aborted) report(error);\n }\n },\n options,\n );\n } else {\n button.classList.add(\"s-hold\");\n button.setAttribute(\"aria-pressed\", \"false\");\n const pointers = new Set<number>(),\n keys = new Set<string>();\n let held = false;\n const update = () => {\n const next = pointers.size > 0 || keys.size > 0;\n if (held === next) return;\n held = next;\n button.setAttribute(\"aria-pressed\", String(held));\n try {\n node.onHold(held);\n } catch (error) {\n report(error);\n }\n };\n const release = () => {\n pointers.clear();\n keys.clear();\n update();\n };\n button.addEventListener(\n \"pointerdown\",\n (event) => {\n if (event.button !== 0) return;\n pointers.add(event.pointerId);\n button.setPointerCapture(event.pointerId);\n update();\n },\n options,\n );\n for (const type of [\n \"pointerup\",\n \"pointercancel\",\n \"lostpointercapture\",\n ] as const)\n button.addEventListener(\n type,\n (event) => {\n pointers.delete(event.pointerId);\n update();\n },\n options,\n );\n button.addEventListener(\n \"keydown\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.code !== \"Space\" && event.code !== \"Enter\") return;\n event.preventDefault();\n keys.add(event.code);\n update();\n },\n options,\n );\n button.addEventListener(\n \"keyup\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.code !== \"Space\" && event.code !== \"Enter\") return;\n event.preventDefault();\n keys.delete(event.code);\n update();\n },\n options,\n );\n button.addEventListener(\n \"blur\",\n () => {\n keys.clear();\n update();\n },\n options,\n );\n window.addEventListener(\"blur\", release, options);\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) release();\n },\n options,\n );\n subscriptions.push(release);\n }\n return button;\n }\n const panel = document.createElement(\"section\");\n panel.className = \"s-panel s-\" + node.layout + \" s-\" + node.placement;\n if (node.title) {\n const title = document.createElement(\"h2\");\n title.textContent = node.title;\n panel.append(title);\n }\n panel.append(...node.children.map(render));\n return panel;\n };\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n controller.abort();\n const cleanup = subscriptions.splice(0).reverse();\n cleanupAll([...cleanup, () => element.remove()], \"UI cleanup failed\");\n };\n try {\n element.append(...nodes.map(render));\n } catch (error) {\n try {\n dispose();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n \"UI creation and cleanup failed\",\n );\n }\n throw error;\n }\n return { element, dispose };\n}\n","import type { CanvasNode } from \"@simpludify/core\";\nimport {\n type ActionBindings,\n ActionController,\n type ActionSet,\n type Actor,\n Aspect,\n Camera,\n CanvasUI,\n type CanvasUIOptions,\n createViewTransform,\n Engine,\n EngineError,\n type FixedStepOptions,\n FixedStepRunner,\n type FrameDriver,\n type InputCapture,\n type InputCaptureOptions,\n type JsonValue,\n type LogicalResolution,\n type PointerRouting,\n type PreparedScene,\n positive,\n type RendererPort,\n type ReplayControllers,\n ReplayPlayer,\n Scene,\n ScenePointer,\n SceneState,\n type ScreenPoint,\n screenPoint,\n screenToWorld,\n type TweenScheduler,\n type Viewport,\n type ViewTransform,\n VirtualInput,\n type WorldPoint,\n worldToScreen,\n} from \"@simpludify/core\";\nimport type { CanvasPresentation } from \"./canvas-visual\";\nimport { GamepadInput } from \"./gamepads\";\nimport { BrowserInput } from \"./input\";\nimport { InputCaptureManager } from \"./input-capture\";\nimport { BrowserPointer } from \"./pointer\";\nimport { PixiRenderer } from \"./renderer\";\nimport {\n type MountedUI,\n mountUI,\n Theme,\n Themes,\n type ThemeTokens,\n type UINode,\n} from \"./ui\";\nimport { blocksGameKeyboard } from \"./ui-keyboard\";\nimport type { VirtualInputPresentation } from \"./virtual-input-visual\";\n\nexport interface SceneContext {\n readonly scene: Scene;\n readonly signal: AbortSignal;\n readonly tweens: TweenScheduler;\n readonly presentationTweens: TweenScheduler;\n add<T extends Actor>(actor: T): T;\n ui(...nodes: UINode[]): void;\n canvasUI(root: CanvasNode, options?: CanvasUIOptions): CanvasUI;\n readonly pointer: ScenePointer;\n readonly virtualInput: VirtualInput;\n actions<A extends ActionSet>(\n actions: A,\n bindings?: ActionBindings<A>,\n ): ActionController<A>;\n onUpdate(callback: (seconds: number) => void): () => void;\n onActivate(callback: () => void): () => void;\n onDeactivate(callback: () => void): () => void;\n onDispose(callback: () => void): () => void;\n}\nexport type SceneSetup = (context: SceneContext) => void | Promise<void>;\nexport interface GameOptions {\n parent?: HTMLElement;\n resolution?: LogicalResolution;\n aspect?: Aspect;\n camera?: Camera;\n viewport?: Viewport;\n pixelRatio?: number;\n theme?: Theme;\n tokens?: Partial<ThemeTokens>;\n seed?: number;\n maxDelta?: number;\n fixedStep?: FixedStepOptions;\n renderer?: (host: HTMLElement) => RendererPort;\n frames?: FrameDriver;\n onError?: (error: unknown) => void;\n}\nexport class Game<SceneId extends string = string> {\n readonly engine: Engine;\n readonly element: HTMLDivElement;\n readonly camera: Camera;\n readonly gamepads: GamepadInput;\n private readonly renderer: RendererPort;\n private readonly keyboard: BrowserInput;\n private readonly captures: InputCaptureManager;\n captureInput(options: InputCaptureOptions = {}): InputCapture {\n this.assertAlive();\n return this.captures.start(options);\n }\n private readonly pointers: BrowserPointer;\n private readonly pointerChannels = new WeakMap<Scene, ScenePointer>();\n private readonly virtualInputs = new WeakMap<Scene, VirtualInput>();\n private virtualPresentation: VirtualInputPresentation | undefined;\n get virtualInput(): VirtualInput {\n this.assertAlive();\n return this.virtualFor(this.engine.scene);\n }\n private virtualFor(scene: Scene): VirtualInput {\n let input = this.virtualInputs.get(scene);\n if (!input) {\n input = new VirtualInput(this.channelFor(scene), this.engine.input);\n this.virtualInputs.set(scene, input);\n const owned = input;\n input.onDispose(() => {\n if (this.virtualInputs.get(scene) === owned)\n this.virtualInputs.delete(scene);\n if (this.engine.scene === scene) {\n this.virtualPresentation?.dispose();\n this.virtualPresentation = undefined;\n }\n });\n }\n return input;\n }\n private prepareVirtual(scene: Scene): VirtualInputPresentation | undefined {\n const input = this.virtualInputs.get(scene);\n if (!input || input.controls.length === 0) return;\n const renderer = this.renderer as RendererPort & {\n prepareVirtualInput?: (input: VirtualInput) => VirtualInputPresentation;\n };\n if (!renderer.prepareVirtualInput)\n throw new EngineError(\n \"RENDERER_CAPABILITY\",\n \"Renderer does not support virtual input presentation\",\n );\n const presentation = renderer.prepareVirtualInput(input);\n input.onDispose(() => presentation.dispose());\n return presentation;\n }\n private canvas: CanvasUI | undefined;\n private canvasPresentation: CanvasPresentation | undefined;\n private defaultCanvas: CanvasUI | undefined;\n private readonly ownedCanvas = new WeakSet<CanvasUI>();\n private readonly viewportBindings = new WeakMap<\n CanvasUI,\n { node: CanvasNode; dispose: () => void }\n >();\n get pointer(): ScenePointer {\n this.assertAlive();\n return this.channelFor(this.engine.scene);\n }\n get pointerDiagnostics() {\n return this.pointers.routing.diagnostics;\n }\n private channelFor(scene: Scene): ScenePointer {\n let channel = this.pointerChannels.get(scene);\n if (!channel) {\n channel = new ScenePointer(scene);\n this.pointerChannels.set(scene, channel);\n }\n return channel;\n }\n private readonly observer: ResizeObserver;\n private readonly frames: FrameDriver;\n private readonly options: GameOptions;\n private readonly resolution: LogicalResolution;\n private readonly aspect: Aspect;\n private readonly maxDelta: number;\n private readonly fixed: FixedStepRunner | undefined;\n private playback: ReplayPlayer | undefined;\n private playbackScene: Scene | undefined;\n private removeReplayOwner: (() => void) | undefined;\n private requestedViewport: Viewport | undefined;\n private projection: ViewTransform;\n private projectionDirty = true;\n private cameraX = NaN;\n private cameraY = NaN;\n private cameraZoom = NaN;\n private width = 800;\n private height = 450;\n private ratio = 1;\n private readonly scenes = new Map<SceneId, SceneSetup>();\n private readonly pendingScenes = new Map<SceneId, Promise<void>>();\n private readonly defaultUI: UINode[] = [];\n private ui: MountedUI | undefined;\n private prepared: PreparedScene | undefined;\n private startPromise: Promise<void> | undefined;\n private queue: Promise<void> = Promise.resolve();\n private frame: number | undefined;\n private previousTime: number | undefined;\n private dead = false;\n private ready = false;\n private rendererReady = false;\n private rendererSized = false;\n private staging: Scene | undefined;\n private readonly shutdown = new AbortController();\n private readonly errorBox: HTMLParagraphElement;\n constructor(options: GameOptions = {}) {\n this.options = options;\n this.engine = new Engine(\n options.seed === undefined ? {} : { seed: options.seed },\n );\n this.fixed = options.fixedStep\n ? new FixedStepRunner(this.engine, options.fixedStep)\n : undefined;\n this.camera = options.camera ?? new Camera();\n this.maxDelta = positive(options.maxDelta ?? 0.05, \"maxDelta\");\n this.resolution = {\n width: positive(options.resolution?.width ?? 800, \"resolution.width\"),\n height: positive(options.resolution?.height ?? 450, \"resolution.height\"),\n };\n this.aspect = options.aspect ?? Aspect.Fit;\n this.requestedViewport = options.viewport\n ? { ...options.viewport }\n : undefined;\n this.projection = createViewTransform({\n viewport: this.requestedViewport ?? {\n x: 0,\n y: 0,\n width: this.width,\n height: this.height,\n },\n resolution: this.resolution,\n aspect: this.aspect,\n camera: this.camera,\n });\n if (options.pixelRatio !== undefined)\n positive(options.pixelRatio, \"pixelRatio\");\n const themeName = options.theme ?? Theme.Dark;\n if (!Object.hasOwn(Themes, themeName))\n throw new EngineError(\"INVALID_THEME\", \"Unknown theme\");\n const theme = Themes[themeName];\n for (const [name, value] of Object.entries(options.tokens ?? {}))\n if (\n !Object.hasOwn(theme, name) ||\n typeof value !== \"string\" ||\n (name === \"font\"\n ? !validFontFamily(value)\n : !value.trim().length ||\n /[;{}<>\\r\\n\\0]|url\\s*\\(/i.test(value) ||\n !CSS.supports(\"color\", value))\n )\n throw new EngineError(\"INVALID_THEME_TOKEN\", `Invalid token: ${name}`);\n const tokens = { ...theme, ...options.tokens };\n this.element = document.createElement(\"div\");\n this.element.className = \"simpludify\";\n this.element.tabIndex = 0;\n this.element.setAttribute(\n \"aria-label\",\n \"Game. Focus this area to use movement keys.\",\n );\n for (const [name, value] of Object.entries(tokens))\n this.element.style.setProperty(`--s-${name}`, value);\n this.errorBox = document.createElement(\"p\");\n this.errorBox.className = \"s-error\";\n this.errorBox.setAttribute(\"role\", \"alert\");\n this.errorBox.hidden = true;\n this.element.append(this.errorBox);\n (options.parent ?? document.body).append(this.element);\n try {\n this.renderer =\n options.renderer?.(this.element) ??\n new PixiRenderer(this.element, tokens.background, (error) =>\n this.report(error),\n );\n } catch (error) {\n this.element.remove();\n this.engine.dispose();\n throw error;\n }\n this.frames = options.frames ?? {\n request: (callback) => requestAnimationFrame(callback),\n cancel: (handle) => cancelAnimationFrame(handle),\n };\n this.captures = new InputCaptureManager(\n this.element,\n this.engine.input,\n () => this.engine.scene,\n () => this.pointers.release(),\n this.report,\n );\n this.keyboard = new BrowserInput(this.element, this.engine.input);\n this.gamepads = new GamepadInput(this.engine.input, {\n observe: (pads) => this.captures.sample(pads),\n active: () =>\n !document.hidden &&\n document.hasFocus() &&\n this.element.contains(document.activeElement) &&\n !blocksGameKeyboard(document.activeElement),\n });\n this.pointers = new BrowserPointer(\n this.element,\n (event) => {\n const rect = this.element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0)\n throw new EngineError(\n \"VIEWPORT_UNAVAILABLE\",\n \"Game has no visible bounds\",\n );\n const screen = screenPoint(\n ((event.clientX - rect.left) * this.width) / rect.width,\n ((event.clientY - rect.top) * this.height) / rect.height,\n );\n return { screen, world: this.screenToWorld(screen), view: this.view };\n },\n this.report,\n () => this.updateProjection(),\n this.engine.input,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n this.previousTime = undefined;\n this.fixed?.reset();\n this.engine.input.clear();\n },\n { signal: this.shutdown.signal },\n );\n this.observer = new ResizeObserver(() => {\n try {\n this.resize();\n } catch (error) {\n this.report(error);\n this.dispose();\n }\n });\n this.observer.observe(this.element);\n }\n private assertAlive(): void {\n if (this.dead)\n throw new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\");\n }\n get tweens(): TweenScheduler {\n return this.engine.scene.tweens;\n }\n get presentationTweens(): TweenScheduler {\n return this.engine.scene.presentationTweens;\n }\n get paused(): boolean {\n return this.engine.paused;\n }\n pause(): void {\n this.assertAlive();\n this.pointers.release();\n this.engine.pause();\n this.previousTime = undefined;\n this.fixed?.reset();\n }\n resume(): void {\n this.assertAlive();\n this.pointers.release();\n this.engine.resume();\n this.previousTime = undefined;\n this.fixed?.reset();\n }\n /** Configure inside the initial Scene factory after game setup, before the first Engine step. */\n playReplay(\n data: unknown,\n options: {\n scene: Scene;\n controllers: ReplayControllers;\n expectedMetadata?: Readonly<Record<string, JsonValue>>;\n },\n ): ReplayPlayer {\n this.assertAlive();\n if (options.scene !== this.engine.scene && options.scene !== this.staging)\n throw new EngineError(\n \"REPLAY_STATE\",\n \"Replay Scene must be current or staged by this Game\",\n );\n if (this.playback)\n throw new EngineError(\"REPLAY_STATE\", \"Game already has a Replay player\");\n const player = new ReplayPlayer(this.engine, data, options);\n this.playback = player;\n this.playbackScene = options.scene;\n try {\n this.removeReplayOwner = options.scene.onDispose(() => this.stopReplay());\n } catch (error) {\n this.stopReplay();\n throw error;\n }\n return player;\n }\n stopReplay(): void {\n const player = this.playback,\n off = this.removeReplayOwner;\n this.playback = undefined;\n this.playbackScene = undefined;\n this.removeReplayOwner = undefined;\n off?.();\n player?.dispose();\n this.previousTime = undefined;\n this.fixed?.reset();\n }\n add<T extends Actor>(actor: T): T {\n this.assertAlive();\n return this.engine.scene.add(actor);\n }\n /** Scene-owned Actions for the current Scene. In a staged factory use context.actions. */\n actions<A extends ActionSet>(\n actions: A,\n bindings?: ActionBindings<A>,\n ): ActionController<A> {\n this.assertAlive();\n return new ActionController(actions, {\n scene: this.engine.scene,\n input: this.engine.input,\n ...(bindings === undefined ? {} : { bindings }),\n });\n }\n remove(actor: Actor | string): boolean {\n this.assertAlive();\n return this.engine.scene.remove(actor);\n }\n canvasUI(root: CanvasNode, options: CanvasUIOptions = {}): CanvasUI {\n this.assertAlive();\n if (this.startPromise || this.defaultCanvas)\n throw new EngineError(\n \"UI_ALREADY_STARTED\",\n \"Define one default Canvas UI before run\",\n );\n this.defaultCanvas = new CanvasUI(this.engine.scene, root, options);\n this.ownedCanvas.add(this.defaultCanvas);\n return this.defaultCanvas;\n }\n uiOverlay(...nodes: UINode[]): void {\n this.assertAlive();\n if (this.startPromise)\n throw new EngineError(\n \"UI_ALREADY_STARTED\",\n \"Define default UI before run\",\n );\n this.defaultUI.push(...nodes);\n }\n scene(id: SceneId, setup: SceneSetup): this {\n this.assertAlive();\n if (this.scenes.has(id))\n throw new EngineError(\n \"DUPLICATE_SCENE\",\n \"Scene id is already registered\",\n { sceneId: id },\n );\n this.scenes.set(id, setup);\n return this;\n }\n private wait<T>(promise: Promise<T>): Promise<T> {\n if (this.dead)\n return Promise.reject(\n new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"),\n );\n const signal = this.shutdown.signal;\n return new Promise<T>((resolve, reject) => {\n const abort = () => {\n signal.removeEventListener(\"abort\", abort);\n reject(new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"));\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n promise\n .then(resolve, reject)\n .finally(() => signal.removeEventListener(\"abort\", abort));\n });\n }\n run(initialScene?: SceneId): Promise<void> {\n if (this.dead)\n return Promise.reject(\n new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"),\n );\n if (this.startPromise) return this.startPromise;\n this.startPromise = (async () => {\n try {\n await this.wait(this.renderer.init());\n this.assertAlive();\n this.rendererReady = true;\n if (initialScene !== undefined) await this.navigate(initialScene);\n else\n await this.present(\n this.engine.scene,\n this.defaultUI,\n this.defaultCanvas,\n );\n this.assertAlive();\n this.defaultCanvas = undefined;\n this.defaultUI.length = 0;\n this.ready = true;\n this.resize();\n this.render();\n this.assertAlive();\n this.frame = this.frames.request(this.tick);\n } catch (error) {\n this.dispose();\n throw error;\n }\n })();\n return this.startPromise;\n }\n goTo(id: SceneId): Promise<void> {\n if (this.dead)\n return Promise.reject(\n new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"),\n );\n if (!this.ready)\n return Promise.reject(\n new EngineError(\"GAME_NOT_READY\", \"Await run before navigating\"),\n );\n return this.navigate(id);\n }\n private navigate(id: SceneId): Promise<void> {\n const setup = this.scenes.get(id);\n if (!setup)\n return Promise.reject(\n new EngineError(\"SCENE_NOT_FOUND\", \"Unknown scene\", { sceneId: id }),\n );\n const existing = this.pendingScenes.get(id);\n if (existing) return existing;\n const task = this.queue\n .then(async () => {\n this.assertAlive();\n const scene = new Scene(id),\n nodes: UINode[] = [],\n controller = new AbortController();\n let canvas: CanvasUI | undefined;\n const pointer = this.channelFor(scene);\n const virtualFor = () => this.virtualFor(scene);\n this.staging = scene;\n scene.onDispose(() => controller.abort());\n try {\n await this.wait(\n Promise.resolve(\n setup({\n scene,\n get tweens() {\n return scene.tweens;\n },\n get presentationTweens() {\n return scene.presentationTweens;\n },\n signal: controller.signal,\n add: (actor) => scene.add(actor),\n ui: (...items) => nodes.push(...items),\n pointer,\n get virtualInput() {\n return virtualFor();\n },\n canvasUI: (root, options) => {\n if (canvas)\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"A Scene has one Canvas UI root\",\n );\n canvas = new CanvasUI(scene, root, options);\n this.ownedCanvas.add(canvas);\n return canvas;\n },\n actions: (actions, bindings) =>\n new ActionController(actions, {\n scene,\n input: this.engine.input,\n ...(bindings === undefined ? {} : { bindings }),\n }),\n onUpdate: (callback) => scene.onUpdate(callback),\n onActivate: (callback) => scene.onActivate(callback),\n onDeactivate: (callback) => scene.onDeactivate(callback),\n onDispose: (callback) => scene.onDispose(callback),\n }),\n ),\n );\n this.assertAlive();\n await this.present(scene, nodes, canvas);\n } catch (error) {\n try {\n scene.dispose();\n } catch (cleanupError) {\n this.report(cleanupError);\n }\n throw error;\n } finally {\n if (this.staging === scene) this.staging = undefined;\n }\n })\n .finally(() => {\n if (this.pendingScenes.get(id) === task) this.pendingScenes.delete(id);\n });\n this.pendingScenes.set(id, task);\n this.queue = task.catch(() => {});\n return task;\n }\n private async present(\n scene: Scene,\n nodes: readonly UINode[],\n canvas?: CanvasUI,\n ): Promise<void> {\n let prepared: PreparedScene | undefined,\n ui: MountedUI | undefined,\n committed = false;\n let canvasPresentation: CanvasPresentation | undefined;\n let virtualPresentation: VirtualInputPresentation | undefined;\n try {\n const preparing = this.renderer.prepare(scene);\n void preparing.then(\n (value) => {\n if (this.dead || scene.disposed) {\n try {\n value.dispose();\n } catch (error) {\n this.report(error);\n }\n }\n },\n () => {},\n );\n prepared = await this.wait(preparing);\n this.assertAlive();\n ui = mountUI(nodes, this.report);\n scene.onDispose(ui.dispose);\n if (canvas) {\n canvas.setErrorHandler(this.report);\n const renderer = this.renderer as RendererPort & {\n prepareCanvasUI?: (\n ui: CanvasUI,\n routing: PointerRouting,\n ) => CanvasPresentation;\n };\n if (!renderer.prepareCanvasUI)\n throw new EngineError(\n \"RENDERER_CAPABILITY\",\n \"Renderer does not support Canvas UI\",\n );\n canvasPresentation = renderer.prepareCanvasUI(\n canvas,\n this.pointers.routing,\n );\n scene.onDispose(() => canvasPresentation?.dispose());\n }\n virtualPresentation = this.prepareVirtual(scene);\n scene.markReady();\n this.errorBox.hidden = true;\n try {\n if (this.playback && this.playbackScene !== scene) this.stopReplay();\n this.engine.activate(scene);\n } catch (error) {\n if (this.engine.scene !== scene || scene.state !== SceneState.Active)\n throw error;\n this.report(error);\n }\n this.assertAlive();\n const oldPrepared = this.prepared,\n oldUI = this.ui,\n oldCanvas = this.canvasPresentation,\n oldVirtual = this.virtualPresentation;\n this.prepared = prepared;\n this.ui = ui;\n this.canvas = canvas;\n this.canvasPresentation = canvasPresentation;\n this.virtualPresentation = virtualPresentation;\n this.pointers.routing.setScene(this.channelFor(scene), canvas);\n committed = true;\n this.element.append(ui.element);\n for (const cleanup of [\n () => oldPrepared?.dispose(),\n () => oldUI?.dispose(),\n () => oldCanvas?.dispose(),\n () => oldVirtual?.dispose(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n this.report(error);\n }\n }\n this.assertAlive();\n this.previousTime = undefined;\n this.fixed?.reset();\n this.updateProjection();\n this.render();\n this.assertAlive();\n } catch (error) {\n if (!committed)\n for (const cleanup of [\n () => prepared?.dispose(),\n () => ui?.dispose(),\n () => canvasPresentation?.dispose(),\n () => virtualPresentation?.dispose(),\n ]) {\n try {\n cleanup();\n } catch (cleanupError) {\n this.report(cleanupError);\n }\n }\n if (committed) this.dispose();\n throw error;\n }\n }\n get viewport(): Viewport {\n this.updateProjection();\n return this.projection.viewport;\n }\n get view(): ViewTransform {\n this.updateProjection();\n return this.projection;\n }\n /** Bind the mounted UI's resolved region to the world viewport. UI units become CSS pixels.\n * One binding per UI; replacement/unbind restores the manual viewport. UI/node disposal unbinds.\n * A collapsed/hidden region clips all world rendering and pointer input. No extra frame/observer.\n */\n bindViewport(ui: CanvasUI, node: CanvasNode): () => void {\n this.assertAlive();\n if (\n !this.ownedCanvas.has(ui) ||\n ui.disposed ||\n node.disposed ||\n node.ui !== ui\n )\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"Viewport region must belong to this Game's Canvas UI\",\n );\n this.viewportBindings.get(ui)?.dispose();\n let removed = false;\n const off: (() => void)[] = [];\n const binding = {\n node,\n dispose: () => {\n if (removed) return;\n removed = true;\n if (this.viewportBindings.get(ui) === binding)\n this.viewportBindings.delete(ui);\n for (const unregister of off) unregister();\n this.projectionDirty = true;\n },\n };\n this.viewportBindings.set(ui, binding);\n off.push(ui.onDispose(binding.dispose), node.onDispose(binding.dispose));\n this.projectionDirty = true;\n return binding.dispose;\n }\n setViewport(viewport?: Viewport): void {\n this.assertAlive();\n const next = viewport ? { ...viewport } : undefined;\n createViewTransform({\n viewport: next ?? { x: 0, y: 0, width: this.width, height: this.height },\n resolution: this.resolution,\n aspect: this.aspect,\n camera: this.camera,\n });\n this.requestedViewport = next;\n this.projectionDirty = true;\n this.updateProjection();\n if (this.ready) this.render();\n }\n worldToScreen(point: WorldPoint): ScreenPoint {\n return worldToScreen(this.view, point);\n }\n screenToWorld(point: ScreenPoint): WorldPoint {\n return screenToWorld(this.view, point);\n }\n pointerToWorld(pointer: {\n readonly clientX: number;\n readonly clientY: number;\n }): WorldPoint {\n const rect = this.element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0)\n throw new EngineError(\n \"VIEWPORT_UNAVAILABLE\",\n \"Game has no visible bounds\",\n );\n return this.screenToWorld(\n screenPoint(\n ((pointer.clientX - rect.left) * this.width) / rect.width,\n ((pointer.clientY - rect.top) * this.height) / rect.height,\n ),\n );\n }\n async whenReady(): Promise<void> {\n if (!this.startPromise)\n throw new EngineError(\n \"GAME_NOT_READY\",\n \"Call run before waiting for resources\",\n );\n await this.startPromise;\n this.assertAlive();\n const prepared = this.prepared;\n this.render();\n await this.wait(prepared?.ready?.() ?? Promise.resolve());\n this.assertAlive();\n if (prepared !== this.prepared)\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Scene presentation changed while waiting for resources\",\n );\n this.render();\n }\n private updateProjection(): void {\n // Resolve UI before projection so drawing, getters and pointer conversion see one layout.\n this.canvasPresentation?.update(this.width, this.height);\n const ui = this.canvas;\n const region = ui ? this.viewportBindings.get(ui)?.node : undefined;\n let v = this.requestedViewport;\n let empty = false;\n if (ui && region) {\n const b = region.bounds,\n scale = ui.scale;\n const x = Math.max(0, Math.min(this.width, b.x * scale));\n const y = Math.max(0, Math.min(this.height, b.y * scale));\n const right = Math.max(x, Math.min(this.width, (b.x + b.width) * scale));\n const bottom = Math.max(\n y,\n Math.min(this.height, (b.y + b.height) * scale),\n );\n // Input transparency of the slot does not hide its world. Visibility and enable\n // state do; a dedicated slot may use pointerEvents: \"none\" for pass-through.\n let visible = region.ui === ui;\n for (let node: CanvasNode | undefined = region; node; node = node.parent)\n if (node.disposed || !node.visible || !node.enabled) visible = false;\n empty = !visible || right <= x || bottom <= y;\n v = {\n x,\n y,\n width: empty ? 0 : right - x,\n height: empty ? 0 : bottom - y,\n };\n }\n const viewport = v ?? {\n x: 0,\n y: 0,\n width: this.width,\n height: this.height,\n };\n this.virtualInputs.get(this.engine.scene)?.refresh(viewport);\n const previous = this.projection.viewport;\n const c = this.camera;\n if (\n !this.projectionDirty &&\n previous.x === viewport.x &&\n previous.y === viewport.y &&\n previous.width === viewport.width &&\n previous.height === viewport.height &&\n this.cameraX === c.x &&\n this.cameraY === c.y &&\n this.cameraZoom === c.zoom\n )\n return;\n this.projectionDirty = false;\n this.cameraX = c.x;\n this.cameraY = c.y;\n this.cameraZoom = c.zoom;\n this.projection = createViewTransform({\n viewport: empty ? { ...viewport, width: 1, height: 1 } : viewport,\n resolution: this.resolution,\n aspect: this.aspect,\n camera: c,\n });\n if (empty)\n this.projection = {\n ...this.projection,\n viewport,\n clip: { ...viewport, width: 0, height: 0 },\n };\n }\n private resize(): void {\n if (this.dead || !this.rendererReady) return;\n const width = this.element.clientWidth,\n height = this.element.clientHeight;\n if (width <= 0 || height <= 0) return;\n const ratio =\n this.options.pixelRatio ?? Math.min(window.devicePixelRatio || 1, 2);\n if (\n this.rendererSized &&\n this.width === width &&\n this.height === height &&\n this.ratio === ratio\n )\n return;\n this.rendererSized = true;\n if (this.width !== width || this.height !== height)\n this.projectionDirty = true;\n this.width = width;\n this.height = height;\n this.ratio = ratio;\n this.renderer.resize(width, height, this.ratio);\n this.updateProjection();\n if (this.ready) this.render();\n }\n private render(): void {\n this.updateProjection();\n this.virtualPresentation ??= this.prepareVirtual(this.engine.scene);\n this.virtualPresentation?.update();\n this.prepared?.render(this.projection);\n }\n private readonly tick = (time: number): void => {\n if (this.dead) return;\n try {\n if (document.hidden) {\n this.canvas?.stopMotion();\n this.previousTime = undefined;\n this.fixed?.reset();\n this.engine.input.clear();\n } else {\n const elapsed =\n this.previousTime === undefined\n ? 0\n : Math.max(0, (time - this.previousTime) / 1000);\n this.previousTime = time;\n if (this.virtualInputs.has(this.engine.scene)) this.updateProjection();\n if (this.playback)\n this.playback.advance(elapsed, this.options.fixedStep?.maxSteps ?? 8);\n else if (this.fixed) this.fixed.advance(elapsed);\n else this.engine.step(Math.min(this.maxDelta, elapsed));\n if (!this.dead && !this.engine.scene.disposed)\n this.engine.scene.advancePresentation(\n Math.min(this.maxDelta, elapsed),\n );\n if (this.engine.paused) this.canvas?.stopMotion();\n else this.canvas?.advance(elapsed);\n this.virtualInputs\n .get(this.engine.scene)\n ?.advance(Math.min(this.maxDelta, elapsed));\n if (\n this.ratio !==\n (this.options.pixelRatio ?? Math.min(window.devicePixelRatio || 1, 2))\n )\n this.resize();\n this.render();\n }\n if (!this.dead) this.frame = this.frames.request(this.tick);\n } catch (error) {\n this.report(error);\n this.dispose();\n }\n };\n private readonly report = (error: unknown): void => {\n this.errorBox.textContent =\n error instanceof Error ? error.message : String(error);\n this.errorBox.hidden = false;\n try {\n if (this.options.onError) this.options.onError(error);\n else console.error(error);\n } catch {\n /* Observers must not prevent cleanup. */\n }\n };\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n this.shutdown.abort();\n if (this.frame !== undefined) this.frames.cancel(this.frame);\n for (const cleanup of [\n () => this.stopReplay(),\n () => this.staging?.dispose(),\n () => this.captures.dispose(),\n () => this.pointers.dispose(),\n () => this.gamepads.dispose(),\n () => this.keyboard.dispose(),\n () => this.canvasPresentation?.dispose(),\n () => this.virtualPresentation?.dispose(),\n () => this.canvas?.dispose(),\n () => this.observer.disconnect(),\n () => this.ui?.dispose(),\n () => this.prepared?.dispose(),\n () => this.renderer.dispose(),\n () => this.engine.dispose(),\n () => this.element.remove(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n this.report(error);\n }\n }\n this.ui = undefined;\n this.prepared = undefined;\n this.staging = undefined;\n this.canvas = undefined;\n this.canvasPresentation = undefined;\n this.virtualPresentation = undefined;\n this.defaultCanvas = undefined;\n this.defaultUI.length = 0;\n this.scenes.clear();\n this.pendingScenes.clear();\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["CoreCanvasButton","mouseMasks"],"sources":["../src/canvas-node.ts","../src/shared-images.ts","../src/asset-loaders.ts","../src/assets.ts","../src/audio.ts","../src/gamepad-layout.ts","../src/gamepads.ts","../src/ui-keyboard.ts","../src/input.ts","../src/input-capture.ts","../src/pointer.ts","../src/canvas-native.ts","../src/canvas-visual.ts","../src/geometry-tilemap-visual.ts","../src/pixi-ui-cleanup.ts","../src/tilemap-visual.ts","../src/virtual-input-visual.ts","../src/renderer.ts","../src/ui.ts","../src/game.ts"],"sourcesContent":["import {\n type CancellationSignal,\n type CanvasNode,\n type CanvasStyle,\n CanvasButton as CoreCanvasButton,\n} from \"@simpludify/core\";\n\nexport {\n CanvasColumn,\n CanvasHoldButton,\n CanvasLabel,\n CanvasNode,\n type CanvasNodeKind,\n type CanvasNodeOwner,\n CanvasPanel,\n CanvasRow,\n type CanvasStyle,\n defaultCanvasStyle,\n type ResolvedCanvasStyle,\n type UIAlign,\n type UIBounds,\n type UIJustify,\n type UISize,\n} from \"@simpludify/core\";\n\n/** Bridge owner cancellation to browser APIs such as fetch. */\nexport function browserAbortSignal(signal: CancellationSignal): AbortSignal {\n const controller = new AbortController();\n signal.onCancel(() => controller.abort());\n return controller.signal;\n}\n/** Preserve Web callbacks' native AbortSignal; portable definitions import Core's factory. */\nexport function CanvasButton(\n text: string,\n click: (signal: AbortSignal) => void | Promise<void>,\n style: CanvasStyle = {},\n): CanvasNode {\n let signal: AbortSignal | undefined;\n return CoreCanvasButton(\n text,\n (owner) => {\n signal ??= browserAbortSignal(owner);\n return click(signal);\n },\n style,\n );\n}\n","import {\n EngineError,\n type SpriteFrame,\n spriteFrameBounds,\n} from \"@simpludify/core\";\nimport { Rectangle, Texture } from \"pixi.js\";\n\n/** Internal ownership boundary: the loader owns a Texture and its TextureSource. */\nexport interface ImageResource {\n readonly texture: Texture;\n release(): void;\n}\nexport interface ImageLease extends ImageResource {\n textureFor(frame?: SpriteFrame): Texture;\n useFrames?(frames: () => Iterable<SpriteFrame>): void;\n onChange?(listener: () => void): () => void;\n}\ninterface Consumer {\n ready(resource: ImageResource): void;\n fail(error: unknown): void;\n release(): void;\n}\ninterface Entry {\n readonly controller: AbortController;\n readonly consumers: Set<Consumer>;\n readonly frames: Map<string, Texture>;\n resource?: ImageResource;\n}\n\n/** Renderer-local, live-reference cache. No idle retention or process-global state. */\nexport class SharedImages {\n private readonly entries = new Map<string | symbol, Entry>();\n private loaded = 0;\n private references = 0;\n private dead = false;\n constructor(\n private readonly load: (\n url: string,\n signal: AbortSignal,\n mode?: \"explicit\" | \"reload\",\n ) => Promise<ImageResource>,\n ) {}\n get diagnostics() {\n let pending = 0;\n for (const entry of this.entries.values()) if (!entry.resource) pending++;\n return {\n imageReferences: this.references,\n imageEntries: this.entries.size,\n pendingImages: pending,\n };\n }\n get textures(): number {\n return this.loaded;\n }\n acquire(\n key: string | symbol,\n signal: AbortSignal,\n request?: { url: string; mode: \"explicit\" | \"reload\" },\n ): Promise<ImageLease> {\n const url = request?.url ?? String(key);\n const cancelled = () =>\n new EngineError(\"GAME_DISPOSED\", \"Image use cancelled\", { path: url });\n if (this.dead || signal.aborted) return Promise.reject(cancelled());\n let entry = this.entries.get(key);\n const fresh = !entry;\n if (!entry) {\n entry = {\n controller: new AbortController(),\n consumers: new Set(),\n frames: new Map(),\n };\n this.entries.set(key, entry);\n }\n const current = entry;\n const promise = new Promise<ImageLease>((resolve, reject) => {\n let released = false,\n settled = false;\n const release = () => {\n if (released) return;\n released = true;\n signal.removeEventListener(\"abort\", release);\n current.consumers.delete(consumer);\n this.references--;\n if (!settled) {\n settled = true;\n reject(cancelled());\n }\n if (!current.consumers.size) {\n if (this.entries.get(key) === current) this.entries.delete(key);\n current.controller.abort();\n const resource = current.resource;\n delete current.resource;\n for (const texture of current.frames.values()) texture.destroy(false);\n current.frames.clear();\n if (resource) {\n this.loaded--;\n resource.release();\n }\n }\n };\n const consumer: Consumer = {\n ready: (resource) => {\n if (released || settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", release);\n // A resolved lease survives request-controller cleanup. Its owner must\n // explicitly release it after replacing/destroying the displayed image.\n resolve({\n texture: resource.texture,\n release,\n textureFor: (frame) => {\n if (released)\n throw new EngineError(\"GAME_DISPOSED\", \"Image lease released\");\n if (!frame) return resource.texture;\n const rect = spriteFrameBounds(\n frame,\n resource.texture.width,\n resource.texture.height,\n );\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n let texture = current.frames.get(key);\n if (!texture) {\n texture = new Texture({\n source: resource.texture.source,\n frame: new Rectangle(rect.x, rect.y, rect.width, rect.height),\n });\n current.frames.set(key, texture);\n }\n return texture;\n },\n });\n },\n fail: (error) => {\n if (released || settled) return;\n settled = true;\n reject(error);\n release();\n },\n release,\n };\n this.references++;\n current.consumers.add(consumer);\n signal.addEventListener(\"abort\", release, { once: true });\n if (current.resource) consumer.ready(current.resource);\n });\n if (fresh) {\n // Register the first consumer before invoking even a synchronous/throwing\n // loader. Both completion branches handle abandoned entries explicitly.\n void Promise.resolve()\n .then(() => this.load(url, current.controller.signal, request?.mode))\n .then(\n (resource) => {\n if (!current.consumers.size) {\n resource.release();\n return;\n }\n current.resource = resource;\n this.loaded++;\n for (const consumer of current.consumers) consumer.ready(resource);\n },\n (error) => {\n if (this.entries.get(key) === current) this.entries.delete(key);\n for (const consumer of [...current.consumers]) consumer.fail(error);\n },\n );\n }\n return promise;\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n for (const entry of [...this.entries.values()])\n for (const consumer of [...entry.consumers]) consumer.release();\n }\n}\n","import { EngineError } from \"@simpludify/core\";\nimport { Texture } from \"pixi.js\";\nimport type { AssetAdapter, AssetKind, AssetResource } from \"./assets\";\nimport {\n type ImageLease,\n type ImageResource,\n SharedImages,\n} from \"./shared-images\";\n\nconst missing = \"simpludify:missing-image\";\n\nexport async function assetResponse(\n url: string,\n signal: AbortSignal,\n reload: boolean,\n): Promise<Response> {\n let response: Response;\n try {\n response = await fetch(url, {\n signal,\n cache: reload ? \"reload\" : \"default\",\n });\n } catch (cause) {\n signal.throwIfAborted();\n throw new EngineError(\n \"ASSET_NETWORK\",\n \"Asset request did not complete\",\n {},\n { cause },\n );\n }\n if (!response.ok) {\n const status = response.status;\n const transient = status === 408 || status === 429 || status >= 500;\n throw new EngineError(\n transient ? \"ASSET_NETWORK\" : \"ASSET_LOAD_FAILED\",\n \"Asset request failed\",\n { status },\n );\n }\n return response;\n}\n\nfunction decodeImage(\n url: string,\n signal: AbortSignal,\n): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n signal.throwIfAborted();\n const image = new Image();\n const cleanup = () => {\n image.onload = image.onerror = null;\n signal.removeEventListener(\"abort\", abort);\n };\n const abort = () => {\n cleanup();\n image.removeAttribute(\"src\");\n reject(signal.reason);\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n image.onload = () => {\n cleanup();\n resolve(image);\n };\n image.onerror = () => {\n cleanup();\n reject(\n new EngineError(\"ASSET_LOAD_FAILED\", \"Image could not be decoded\", {\n path: url,\n }),\n );\n };\n image.crossOrigin = \"anonymous\";\n image.src = url;\n });\n}\n\nfunction checkerboard(): HTMLCanvasElement {\n const canvas = document.createElement(\"canvas\");\n canvas.width = canvas.height = 16;\n const draw = canvas.getContext(\"2d\");\n if (draw) {\n draw.fillStyle = \"#000\";\n draw.fillRect(0, 0, 16, 16);\n draw.fillStyle = \"#f0f\";\n draw.fillRect(0, 0, 8, 8);\n draw.fillRect(8, 8, 8, 8);\n }\n return canvas;\n}\n\nexport async function loadImageResource(\n url: string,\n signal: AbortSignal,\n mode?: \"explicit\" | \"reload\",\n): Promise<ImageResource> {\n let objectURL: string | undefined;\n try {\n if (mode && url !== missing) {\n const response = await assetResponse(url, signal, mode === \"reload\");\n objectURL = URL.createObjectURL(await response.blob());\n }\n const image =\n url === missing\n ? checkerboard()\n : await decodeImage(objectURL ?? url, signal);\n signal.throwIfAborted();\n const texture = Texture.from(image, true);\n if (!(texture.width > 0 && texture.height > 0)) {\n texture.destroy(true);\n throw new EngineError(\n \"ASSET_LOAD_FAILED\",\n \"Image has no drawable dimensions\",\n );\n }\n let released = false;\n return {\n texture,\n release: () => {\n if (released) return;\n released = true;\n texture.destroy(true);\n },\n };\n } finally {\n if (objectURL) URL.revokeObjectURL(objectURL);\n }\n}\n\nexport function createImagePool(load = loadImageResource): SharedImages {\n return new SharedImages(load);\n}\n\nfunction imageAsset(image: ImageLease): AssetResource {\n return {\n value: Object.freeze({\n width: image.texture.width,\n height: image.texture.height,\n }),\n image,\n release: image.release,\n };\n}\n\nlet nextFont = 0;\nconst systemFont = \"system-ui, sans-serif\";\n\nasync function registerFont(\n data: ArrayBuffer,\n signal: AbortSignal,\n): Promise<AssetResource> {\n const family = `SimpludifyFont${++nextFont}`;\n const face = await new FontFace(family, data).load();\n signal.throwIfAborted();\n document.fonts.add(face);\n return {\n value: `${family}, ${systemFont}`,\n release: () => {\n document.fonts.delete(face);\n },\n };\n}\n\nexport function browserAssetAdapter(\n images: SharedImages,\n decode: (data: ArrayBuffer) => Promise<AudioBuffer>,\n): AssetAdapter {\n const load = async (\n kind: AssetKind,\n url: string,\n signal: AbortSignal,\n reload: boolean,\n ): Promise<AssetResource> => {\n if (kind === \"image\")\n return imageAsset(\n await images.acquire(reload ? Symbol() : url, signal, {\n url,\n mode: reload ? \"reload\" : \"explicit\",\n }),\n );\n const response = await assetResponse(url, signal, reload);\n if (kind === \"json\") return { value: await response.json(), release() {} };\n const data = await response.arrayBuffer();\n signal.throwIfAborted();\n if (kind === \"font\") return await registerFont(data, signal);\n return { value: await decode(data), release() {} };\n };\n return {\n load,\n fallback: async (kind, url, signal) => {\n if (url) return await load(kind, url, signal, false);\n if (kind === \"image\")\n return imageAsset(await images.acquire(missing, signal));\n if (kind === \"audio\") return { value: null, release() {} };\n if (kind === \"font\") return { value: systemFont, release() {} };\n },\n };\n}\n","import {\n EngineError,\n Lifetime,\n type LifetimeOwner,\n type Logger,\n type SpriteFrame,\n} from \"@simpludify/core\";\nimport type { ImageLease } from \"./shared-images\";\n\nexport interface AssetData {\n image: Readonly<{ width: number; height: number }>;\n audio: AudioBuffer | null;\n font: string;\n json: unknown;\n}\nexport type AssetKind = keyof AssetData;\nexport type AssetStatus =\n | \"loading\"\n | \"ready\"\n | \"fallback\"\n | \"failed\"\n | \"released\";\n\nexport interface AssetRetry {\n /** One retry for a non-network failure. A promise can represent a caller-owned event. */\n readonly once?:\n | \"immediate\"\n | { readonly delayMs: number }\n | { readonly until: PromiseLike<unknown> };\n /** Additional attempts after network failures, from zero to five. */\n readonly network?: number;\n readonly networkDelayMs?: number;\n}\nexport interface AssetLoadOptions {\n readonly retry?: AssetRetry;\n /** Deadline for the load and its retries, including any wait for a signal. */\n readonly timeoutMs?: number;\n}\nexport interface AssetRequest<K extends AssetKind = AssetKind>\n extends AssetLoadOptions {\n readonly kind: K;\n readonly url: string | URL;\n}\nexport interface AssetOptions {\n /** Maximum number of idle, successfully loaded Assets per Game. */\n readonly cacheEntries?: number;\n readonly fallback?: Readonly<\n Partial<Record<Exclude<AssetKind, \"json\">, string | URL>>\n >;\n}\nexport interface AssetProgress {\n readonly total: number;\n readonly completed: number;\n readonly failed: number;\n readonly fallback: number;\n readonly loading: number;\n readonly ratio: number;\n readonly state: \"idle\" | \"loading\" | \"complete\";\n}\nexport interface ImageAssetSource {\n readonly kind: \"image\";\n readonly url: string;\n}\n\nexport interface AssetResource {\n readonly value: unknown;\n readonly image?: ImageLease;\n release(): void;\n}\nexport interface AssetAdapter {\n load(\n kind: AssetKind,\n url: string,\n signal: AbortSignal,\n reload: boolean,\n ): Promise<AssetResource>;\n fallback(\n kind: AssetKind,\n url: string | undefined,\n signal: AbortSignal,\n ): Promise<AssetResource | undefined>;\n}\n\ninterface Entry {\n readonly key: string;\n readonly kind: AssetKind;\n readonly url: string;\n readonly id: string;\n readonly listeners: Set<() => void>;\n readonly validators: Set<(asset: AssetResource) => void>;\n readonly users: Set<() => void>;\n readonly first: Promise<void>;\n usable(): void;\n fail(error: unknown): void;\n status: Exclude<AssetStatus, \"released\">;\n asset: AssetResource | undefined;\n task: Promise<void> | undefined;\n controller: AbortController | undefined;\n error: unknown;\n}\nconst cancelled = () =>\n new EngineError(\"ASSET_CANCELLED\", \"Asset use has been released\");\nconst invalid = (field: string) =>\n new EngineError(\"INVALID_VALUE\", `Invalid asset ${field}`);\n\nfunction numberIn(\n value: number,\n min: number,\n max: number,\n field: string,\n): number {\n if (!Number.isSafeInteger(value) || value < min || value > max)\n throw invalid(field);\n return value;\n}\n\nfunction settings(options: AssetLoadOptions) {\n const retry = options.retry;\n const once = retry?.once;\n if (once !== undefined && once !== \"immediate\") {\n if (!once || typeof once !== \"object\") throw invalid(\"retry\");\n if (\"delayMs\" in once) numberIn(once.delayMs, 0, 300000, \"retry delay\");\n else if (!(\"until\" in once) || typeof once.until?.then !== \"function\")\n throw invalid(\"retry event\");\n }\n return {\n timeoutMs: numberIn(options.timeoutMs ?? 30000, 1, 300000, \"timeout\"),\n network: numberIn(retry?.network ?? 0, 0, 5, \"network retries\"),\n networkDelayMs: numberIn(\n retry?.networkDelayMs ?? 250,\n 0,\n 300000,\n \"network retry delay\",\n ),\n once,\n };\n}\n\nfunction assetURL(value: string | URL, base: string): string {\n if (typeof value === \"string\" && !value.trim()) throw invalid(\"URL\");\n if (typeof value !== \"string\" && !(value instanceof URL))\n throw invalid(\"URL\");\n try {\n const url = new URL(value, base);\n if (\n ![\"http:\", \"https:\", \"data:\", \"blob:\"].includes(url.protocol) ||\n url.username ||\n url.password\n )\n throw invalid(\"URL\");\n return url.href;\n } catch {\n throw invalid(\"URL\");\n }\n}\n\nfunction wait<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(signal.reason);\n return new Promise<T>((resolve, reject) => {\n const abort = () => reject(signal.reason);\n signal.addEventListener(\"abort\", abort, { once: true });\n void promise\n .then(resolve, reject)\n .finally(() => signal.removeEventListener(\"abort\", abort));\n });\n}\n\nfunction pause(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) return Promise.reject(signal.reason);\n if (!ms) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const abort = () => {\n clearTimeout(timer);\n reject(signal.reason);\n };\n const timer = setTimeout(() => {\n signal.removeEventListener(\"abort\", abort);\n resolve();\n }, ms);\n signal.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\nfunction progress(entries: Iterable<Entry>): AssetProgress {\n let total = 0;\n let failed = 0;\n let fallback = 0;\n let loading = 0;\n let completed = 0;\n for (const entry of entries) {\n total++;\n if (entry.task) loading++;\n if (entry.status === \"failed\") failed++;\n if (entry.status === \"fallback\") fallback++;\n if (entry.status !== \"loading\") completed++;\n }\n return Object.freeze({\n total,\n completed,\n failed,\n fallback,\n loading,\n ratio: total ? completed / total : 1,\n state: loading ? \"loading\" : total ? \"complete\" : \"idle\",\n });\n}\n\nlet nextStore = 0;\n\nexport class AssetHandle<K extends AssetKind> {\n readonly ready: Promise<this>;\n private readonly cancelled = new AbortController();\n private readonly imageSource: ImageAssetSource | undefined;\n\n /** @internal */\n constructor(\n readonly kind: K,\n private readonly entry: Entry,\n private readonly store: AssetStore,\n private readonly remove: () => void,\n ) {\n this.imageSource =\n kind === \"image\"\n ? Object.freeze({ kind: \"image\", url: entry.id })\n : undefined;\n this.ready = store.ready(entry, this.cancelled.signal).then(() => this);\n void this.ready.catch(() => {});\n }\n\n get id(): string {\n return this.entry.id;\n }\n get url(): string {\n return this.entry.url;\n }\n get status(): AssetStatus {\n return this.cancelled.signal.aborted ? \"released\" : this.entry.status;\n }\n get loading(): boolean {\n return !this.cancelled.signal.aborted && this.entry.task !== undefined;\n }\n get value(): AssetData[K] | undefined {\n return this.status === \"released\"\n ? undefined\n : (this.entry.asset?.value as AssetData[K] | undefined);\n }\n get error(): unknown {\n return this.status === \"released\" ? undefined : this.entry.error;\n }\n get progress(): AssetProgress {\n return progress(this.status === \"released\" ? [] : [this.entry]);\n }\n /** Stable Renderable source. SpriteSheet accepts its URL. */\n get source(): K extends \"image\" ? ImageAssetSource : undefined {\n return this.imageSource as K extends \"image\" ? ImageAssetSource : undefined;\n }\n\n onChange(listener: (asset: this) => void): () => void {\n const signal = this.cancelled.signal;\n signal.throwIfAborted();\n const notify = () => listener(this);\n const off = () => {\n this.entry.listeners.delete(notify);\n signal.removeEventListener(\"abort\", off);\n };\n this.entry.listeners.add(notify);\n signal.addEventListener(\"abort\", off, { once: true });\n return off;\n }\n\n /** @internal A playback or Game font owns a separate reference. */\n retain(store: AssetStore): AssetHandle<K> {\n this.cancelled.signal.throwIfAborted();\n if (this.store !== store)\n throw new EngineError(\"ASSET_OWNERSHIP\", \"Asset belongs to another Game\");\n let release = () => {};\n const use = new AssetHandle(this.kind, this.entry, store, () => release());\n release = store.retain(this.entry, () => use.release());\n return use;\n }\n\n async reload(options: AssetLoadOptions = {}): Promise<this> {\n if (this.cancelled.signal.aborted) throw cancelled();\n await wait(\n this.store.start(this.entry, options, true),\n this.cancelled.signal,\n );\n return this;\n }\n\n release(): void {\n if (this.cancelled.signal.aborted) return;\n this.cancelled.abort(cancelled());\n this.remove();\n }\n}\n\nexport class AssetScope implements LifetimeOwner {\n private readonly lifetime = new Lifetime();\n private readonly handles = new Map<Entry, AssetHandle<AssetKind>>();\n private readonly listeners = new Set<(value: AssetProgress) => void>();\n private previous: AssetProgress | undefined;\n\n /** @internal */\n constructor(\n private readonly store: AssetStore,\n owner?: LifetimeOwner,\n private readonly global = false,\n ) {\n if (owner?.disposed) throw cancelled();\n const unregister = store.register(this);\n let removeOwner: (() => void) | undefined;\n try {\n removeOwner = owner?.onDispose(() => this.dispose());\n } catch (error) {\n unregister();\n throw error;\n }\n const off = store.observe(() => this.notify());\n this.lifetime.onDispose(() => {\n off();\n unregister();\n removeOwner?.();\n this.listeners.clear();\n });\n }\n\n get disposed(): boolean {\n return this.lifetime.disposed;\n }\n onDispose(callback: () => void): () => void {\n return this.lifetime.onDispose(callback);\n }\n\n scope(owner: LifetimeOwner = this): AssetScope {\n if (this.disposed) throw cancelled();\n return new AssetScope(this.store, owner);\n }\n\n load<K extends AssetKind>(request: AssetRequest<K>): AssetHandle<K> {\n if (this.disposed) throw cancelled();\n const entry = this.store.entry(request);\n const existing = this.handles.get(entry);\n if (existing) return existing as AssetHandle<K>;\n let drop: () => void = () => {};\n const handle = new AssetHandle(request.kind, entry, this.store, () => {\n this.handles.delete(entry);\n drop();\n });\n this.handles.set(entry, handle as AssetHandle<AssetKind>);\n drop = this.store.retain(entry, () => handle.release());\n if (entry.status === \"loading\" && !entry.task) {\n void this.store.start(entry, request, false).catch(() => {});\n } else this.store.changed();\n return handle;\n }\n\n get progress(): AssetProgress {\n return this.global ? this.store.progress : progress(this.handles.keys());\n }\n\n onProgress(listener: (value: AssetProgress) => void): () => void {\n if (this.disposed) throw cancelled();\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private notify(): void {\n if (!this.listeners.size) return;\n const snapshot = this.progress;\n const previous = this.previous;\n if (\n previous &&\n previous.total === snapshot.total &&\n previous.completed === snapshot.completed &&\n previous.failed === snapshot.failed &&\n previous.fallback === snapshot.fallback &&\n previous.loading === snapshot.loading\n )\n return;\n this.previous = snapshot;\n for (const listener of [...this.listeners])\n if (this.listeners.has(listener))\n this.store.deliver(() => listener(snapshot));\n }\n\n dispose(): void {\n if (this.disposed) return;\n try {\n this.lifetime.dispose();\n } finally {\n for (const handle of [...this.handles.values()]) handle.release();\n }\n }\n}\n\n/** @internal One resource directory per Game. The adapter owns decoded resources. */\nexport class AssetStore {\n private readonly prefix = `simpludify-asset:${++nextStore}:`;\n private readonly entries = new Map<string, Entry>();\n private readonly images = new Map<string, Entry>();\n private readonly idle = new Set<Entry>();\n private readonly listeners = new Set<() => void>();\n private readonly scopes = new Set<AssetScope>();\n private notifying = false;\n private notificationScheduled = false;\n private readonly capacity: number;\n private readonly customFallback: Partial<Record<AssetKind, string>> = {};\n private sequence = 0;\n private dead = false;\n\n constructor(\n private readonly adapter: AssetAdapter,\n private readonly logger: Logger,\n private readonly base: string,\n options: AssetOptions = {},\n ) {\n this.capacity = numberIn(\n options.cacheEntries ?? 16,\n 0,\n 1024,\n \"cache capacity\",\n );\n for (const kind of [\"image\", \"audio\", \"font\"] as const) {\n const custom = options.fallback?.[kind];\n if (custom !== undefined)\n this.customFallback[kind] = assetURL(custom, base);\n }\n }\n\n register(scope: AssetScope): () => void {\n if (this.dead) throw cancelled();\n this.scopes.add(scope);\n return () => {\n this.scopes.delete(scope);\n };\n }\n\n observe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n deliver(listener: () => unknown): void {\n const report = (cause: unknown) => {\n this.logger.report(cause, {\n source: \"engine.assets\",\n message: \"Asset observer failed\",\n fatal: false,\n });\n };\n try {\n const result = listener();\n if (result != null) void Promise.resolve(result).catch(report);\n } catch (cause) {\n report(cause);\n }\n }\n\n changed(): void {\n if (this.notifying) {\n if (!this.notificationScheduled) {\n this.notificationScheduled = true;\n queueMicrotask(() => {\n this.notificationScheduled = false;\n this.changed();\n });\n }\n return;\n }\n this.notifying = true;\n try {\n for (const listener of [...this.listeners])\n if (this.listeners.has(listener)) this.deliver(listener);\n } finally {\n this.notifying = false;\n }\n }\n\n get progress(): AssetProgress {\n return progress(\n [...this.entries.values()].filter((entry) => entry.users.size > 0),\n );\n }\n\n entry<K extends AssetKind>(request: AssetRequest<K>): Entry {\n if (this.dead) throw cancelled();\n if (![\"image\", \"audio\", \"font\", \"json\"].includes(request.kind))\n throw invalid(\"kind\");\n settings(request);\n const url = assetURL(request.url, this.base);\n const key = `${request.kind}\\0${url}`;\n const existing = this.entries.get(key);\n if (existing) return existing;\n let usable: () => void = () => {};\n let fail: (error: unknown) => void = () => {};\n const first = new Promise<void>((resolve, reject) => {\n usable = resolve;\n fail = reject;\n });\n void first.catch(() => {});\n const entry: Entry = {\n key,\n url,\n kind: request.kind,\n id: this.prefix + ++this.sequence,\n first,\n usable,\n fail,\n users: new Set(),\n listeners: new Set(),\n validators: new Set(),\n status: \"loading\",\n asset: undefined,\n task: undefined,\n controller: undefined,\n error: undefined,\n };\n this.entries.set(key, entry);\n if (entry.kind === \"image\") this.images.set(entry.id, entry);\n return entry;\n }\n\n retain(entry: Entry, dispose: () => void): () => void {\n this.idle.delete(entry);\n entry.users.add(dispose);\n return () => {\n if (!entry.users.delete(dispose)) return;\n if (!entry.users.size) {\n if (\n !this.dead &&\n !entry.task &&\n entry.status === \"ready\" &&\n this.capacity\n ) {\n this.idle.add(entry);\n if (this.idle.size > this.capacity) {\n const oldest = this.idle.values().next().value;\n if (oldest) this.evict(oldest);\n }\n } else this.evict(entry);\n }\n this.changed();\n };\n }\n\n private release(resource: AssetResource | undefined): void {\n if (resource) this.deliver(() => resource.release());\n }\n\n private evict(entry: Entry): void {\n if (this.entries.get(entry.key) === entry) this.entries.delete(entry.key);\n this.images.delete(entry.id);\n this.idle.delete(entry);\n entry.controller?.abort(cancelled());\n entry.fail(cancelled());\n const asset = entry.asset;\n entry.asset = undefined;\n this.release(asset);\n }\n\n async ready(entry: Entry, signal: AbortSignal): Promise<void> {\n signal.throwIfAborted();\n if (entry.asset) return;\n await wait(\n entry.status === \"failed\" && entry.task ? entry.task : entry.first,\n signal,\n );\n signal.throwIfAborted();\n if (!entry.asset) throw entry.error ?? cancelled();\n }\n\n start(\n entry: Entry,\n options: AssetLoadOptions,\n reload: boolean,\n ): Promise<void> {\n if (entry.task) return entry.task;\n if (this.dead || !entry.users.size) return Promise.reject(cancelled());\n const policy = settings(options);\n const controller = new AbortController();\n entry.controller = controller;\n entry.task = Promise.resolve().then(async () => {\n try {\n await this.load(entry, policy, reload, controller.signal);\n } finally {\n entry.task = undefined;\n entry.controller = undefined;\n this.changed();\n }\n });\n void entry.task.catch(() => {});\n const task = entry.task;\n this.changed();\n return task;\n }\n\n private async attempt(\n promise: Promise<AssetResource | undefined>,\n signal: AbortSignal,\n ): Promise<AssetResource | undefined> {\n void promise.then(\n (asset) => {\n if (signal.aborted) this.release(asset);\n },\n () => {},\n );\n return await wait(promise, signal);\n }\n\n private commit(entry: Entry, asset: AssetResource, fallback: boolean): void {\n try {\n for (const validate of entry.validators) validate(asset);\n } catch (error) {\n this.release(asset);\n throw error;\n }\n const old = entry.asset;\n entry.asset = asset;\n entry.status = fallback ? \"fallback\" : \"ready\";\n if (!fallback) entry.error = undefined;\n entry.usable();\n for (const listener of [...entry.listeners])\n if (entry.listeners.has(listener)) this.deliver(listener);\n this.release(old);\n this.changed();\n }\n\n private async fallback(\n entry: Entry,\n signal: AbortSignal,\n owner: AbortSignal,\n ): Promise<void> {\n const custom = this.customFallback[entry.kind];\n if (custom && !signal.aborted) {\n try {\n const asset = await this.attempt(\n this.adapter.fallback(entry.kind, custom, signal),\n signal,\n );\n if (asset) {\n if (owner.aborted) {\n this.release(asset);\n throw owner.reason;\n }\n this.commit(entry, asset, true);\n return;\n }\n } catch (cause) {\n if (owner.aborted) throw owner.reason;\n this.logger.warn(\"Custom asset fallback failed\", {\n source: \"engine.assets\",\n cause,\n });\n }\n }\n const asset = await this.attempt(\n this.adapter.fallback(entry.kind, undefined, owner),\n owner,\n );\n if (asset) {\n if (owner.aborted) {\n this.release(asset);\n throw owner.reason;\n }\n this.commit(entry, asset, true);\n }\n }\n\n private async load(\n entry: Entry,\n policy: ReturnType<typeof settings>,\n reload: boolean,\n owner: AbortSignal,\n ): Promise<void> {\n const deadline = AbortSignal.timeout(policy.timeoutMs);\n const signal = AbortSignal.any([owner, deadline]);\n let network = policy.network;\n let once = policy.once;\n let failure: unknown;\n try {\n for (;;) {\n try {\n signal.throwIfAborted();\n const asset = await this.attempt(\n this.adapter.load(entry.kind, entry.url, signal, reload),\n signal,\n );\n if (!asset) throw invalid(\"adapter result\");\n if (signal.aborted) {\n this.release(asset);\n throw signal.reason;\n }\n this.commit(entry, asset, false);\n return;\n } catch (cause) {\n owner.throwIfAborted();\n failure = cause;\n entry.error = cause;\n if (!entry.asset) {\n await this.fallback(entry, signal, owner);\n if (entry.asset)\n this.logger.warn(\"Using an asset fallback\", {\n source: \"engine.assets\",\n code: \"ASSET_FALLBACK\",\n details: { kind: entry.kind, id: entry.id },\n cause,\n });\n }\n if (signal.aborted) break;\n if (cause instanceof EngineError && cause.code === \"ASSET_NETWORK\") {\n if (!network) break;\n network--;\n await pause(policy.networkDelayMs, signal);\n } else {\n const retry = once;\n once = undefined;\n if (!retry) break;\n if (retry !== \"immediate\")\n if (\"delayMs\" in retry) await pause(retry.delayMs, signal);\n else await wait(Promise.resolve(retry.until), signal);\n }\n }\n }\n } catch (cause) {\n owner.throwIfAborted();\n failure = cause;\n }\n if (deadline.aborted)\n failure = new EngineError(\n \"ASSET_TIMEOUT\",\n \"Asset load deadline expired\",\n {},\n { cause: failure },\n );\n failure ??= new EngineError(\n \"ASSET_LOAD_FAILED\",\n \"Asset could not be loaded\",\n );\n entry.error = failure;\n if (!entry.asset) {\n entry.status = \"failed\";\n entry.fail(failure);\n }\n this.logger.report(failure, {\n source: \"engine.assets\",\n message: \"Asset loading failed\",\n fatal: false,\n });\n if (reload || !entry.asset) throw failure;\n }\n\n async image(id: string, signal: AbortSignal): Promise<ImageLease> {\n const entry = this.images.get(id);\n if (!entry || this.dead || signal.aborted) throw cancelled();\n const controller = new AbortController();\n const pending = AbortSignal.any([signal, controller.signal]);\n let frames: (() => Iterable<SpriteFrame>) | undefined;\n const subscriptions = new Set<() => void>();\n const validate = (asset: AssetResource) => {\n for (const frame of frames?.() ?? []) asset.image?.textureFor(frame);\n };\n const release = () => {\n if (controller.signal.aborted) return;\n controller.abort(cancelled());\n for (const listener of subscriptions) entry.listeners.delete(listener);\n subscriptions.clear();\n entry.validators.delete(validate);\n drop();\n };\n const drop = this.retain(entry, release);\n try {\n await this.ready(entry, pending);\n pending.throwIfAborted();\n entry.validators.add(validate);\n const current = () => {\n if (controller.signal.aborted || !entry.asset?.image) throw cancelled();\n return entry.asset.image;\n };\n return {\n get texture() {\n return current().texture;\n },\n textureFor: (frame) => {\n const lease = current();\n if (!frame) return lease.texture;\n return entry.status === \"fallback\"\n ? lease.texture\n : lease.textureFor(frame);\n },\n useFrames: (required) => {\n frames = required;\n },\n onChange: (listener) => {\n if (controller.signal.aborted) return () => {};\n subscriptions.add(listener);\n entry.listeners.add(listener);\n return () => {\n subscriptions.delete(listener);\n entry.listeners.delete(listener);\n };\n },\n release,\n };\n } catch (error) {\n release();\n throw error;\n }\n }\n\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n this.listeners.clear();\n for (const scope of [...this.scopes]) this.deliver(() => scope.dispose());\n for (const entry of [...this.entries.values()]) {\n for (const dispose of [...entry.users]) this.deliver(dispose);\n if (this.entries.get(entry.key) === entry) this.evict(entry);\n }\n }\n}\n\nexport function isAssetImage(url: string): boolean {\n return url.startsWith(\"simpludify-asset:\");\n}\n","import {\n cleanupAll,\n EngineError,\n type LifetimeOwner,\n type Logger,\n} from \"@simpludify/core\";\nimport type { AssetHandle, AssetStore } from \"./assets\";\n\nexport interface AudioGroupOptions {\n readonly parent?: string;\n readonly volume?: number;\n readonly maxVoices?: number;\n}\n\nexport interface AudioPlayOptions {\n readonly group?: string;\n readonly owner?: LifetimeOwner;\n readonly volume?: number;\n readonly loop?: boolean;\n /** Optional cap for simultaneous instances of this asset. */\n readonly maxVoices?: number;\n}\n\nexport type AudioEndReason = \"ended\" | \"stopped\" | \"replaced\" | \"failed\";\nexport type AudioPlaybackState =\n | \"pending\"\n | \"playing\"\n | \"paused\"\n | AudioEndReason;\n\nfunction volume(value: number): number {\n if (!Number.isFinite(value) || value < 0 || value > 1)\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Audio volume must be between zero and one\",\n );\n return value;\n}\nfunction voiceLimit(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0))\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Audio voice limit must be a positive integer\",\n );\n return value;\n}\n\nexport class AudioGroup {\n private gain: GainNode | undefined;\n private level: number;\n readonly maxVoices: number | undefined;\n\n /** @internal */\n constructor(\n readonly name: string,\n readonly parent: AudioGroup | undefined,\n options: AudioGroupOptions = {},\n ) {\n this.level = volume(options.volume ?? 1);\n this.maxVoices = voiceLimit(options.maxVoices);\n }\n\n get volume(): number {\n return this.level;\n }\n set volume(value: number) {\n this.level = volume(value);\n if (this.gain) this.gain.gain.value = this.level;\n }\n\n /** @internal */\n node(context: AudioContext): GainNode {\n if (this.gain) return this.gain;\n const output = this.parent?.node(context) ?? context.destination;\n const gain = context.createGain();\n gain.gain.value = this.level;\n gain.connect(output);\n this.gain = gain;\n return gain;\n }\n\n /** @internal */\n disconnect(): void {\n this.gain?.disconnect();\n this.gain = undefined;\n }\n}\n\nexport class AudioPlayback {\n readonly finished: Promise<AudioEndReason>;\n readonly assetId: string;\n private resolve: (reason: AudioEndReason) => void = () => {};\n private phase: AudioPlaybackState = \"pending\";\n private done = false;\n private source: AudioBufferSourceNode | undefined;\n private gain: GainNode | undefined;\n private buffer: AudioBuffer | null | undefined;\n private position = 0;\n private startedAt = 0;\n private level: number;\n private looping: boolean;\n private offOwner: (() => void) | undefined;\n\n /** @internal */\n constructor(\n private readonly audio: GameAudio,\n private readonly use: AssetHandle<\"audio\">,\n readonly group: AudioGroup,\n options: AudioPlayOptions,\n ) {\n this.assetId = use.id;\n this.level = volume(options.volume ?? 1);\n this.looping = options.loop ?? false;\n this.finished = new Promise((resolve) => {\n this.resolve = resolve;\n });\n this.offOwner = options.owner?.onDispose(() => this.stop());\n void use.ready\n .then(() => this.startIfReady())\n .catch((cause) => this.fail(cause));\n }\n\n get state(): AudioPlaybackState {\n return this.phase;\n }\n get volume(): number {\n return this.level;\n }\n set volume(value: number) {\n this.level = volume(value);\n if (this.gain) this.gain.gain.value = this.level;\n }\n get loop(): boolean {\n return this.looping;\n }\n set loop(value: boolean) {\n if (typeof value !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"Audio loop must be boolean\");\n this.looping = value;\n if (this.source) this.source.loop = value;\n }\n\n pause(): void {\n if (this.phase !== \"playing\" && this.phase !== \"pending\") return;\n try {\n if (this.phase === \"playing\") {\n this.position += Math.max(\n 0,\n this.audio.device().currentTime - this.startedAt,\n );\n this.clearSource(true);\n }\n this.phase = \"paused\";\n } catch (cause) {\n this.fail(cause);\n }\n }\n\n resume(): void {\n if (this.phase !== \"paused\") return;\n this.phase = \"pending\";\n this.startIfReady();\n }\n\n stop(): void {\n this.finish(\"stopped\");\n }\n\n /** @internal */\n replace(): void {\n this.finish(\"replaced\");\n }\n\n /** @internal */\n startIfReady(): void {\n if (this.phase !== \"pending\") return;\n const current = this.buffer === undefined ? this.use.value : this.buffer;\n if (current === undefined) return;\n try {\n const context = this.audio.device();\n if (context.state !== \"running\") return;\n this.buffer = current;\n const buffer = current ?? context.createBuffer(1, 1, context.sampleRate);\n if (this.position >= buffer.duration) {\n if (!this.looping) {\n this.finish(\"ended\");\n return;\n }\n this.position %= buffer.duration;\n }\n if (!this.gain) {\n this.gain = context.createGain();\n this.gain.gain.value = this.level;\n this.gain.connect(this.group.node(context));\n }\n const source = context.createBufferSource();\n this.source = source;\n source.buffer = buffer;\n source.loop = this.looping;\n source.connect(this.gain);\n source.onended = () => {\n if (this.source === source) this.finish(\"ended\");\n };\n this.startedAt = context.currentTime;\n source.start(0, this.position);\n this.phase = \"playing\";\n } catch (cause) {\n this.fail(cause);\n }\n }\n\n private clearSource(stop: boolean): void {\n const source = this.source;\n this.source = undefined;\n if (!source) return;\n source.onended = null;\n try {\n if (stop) source.stop();\n } finally {\n source.disconnect();\n }\n }\n\n private fail(cause: unknown): void {\n if (this.done) return;\n this.audio.report(cause, \"Audio playback failed\");\n this.finish(\"failed\");\n }\n\n private finish(reason: AudioEndReason): void {\n if (this.done) return;\n this.done = true;\n this.phase = reason;\n this.buffer = undefined;\n this.audio.remove(this);\n try {\n cleanupAll(\n [\n () => this.clearSource(reason !== \"ended\"),\n () => this.gain?.disconnect(),\n () => this.offOwner?.(),\n () => this.use.release(),\n ],\n \"Audio playback cleanup failed\",\n );\n } catch (cause) {\n this.audio.report(cause, \"Audio playback cleanup failed\");\n } finally {\n this.offOwner = undefined;\n this.gain = undefined;\n this.resolve(reason);\n }\n }\n}\n\n/** One Web Audio context per Game, created only when audio is requested. */\nexport class GameAudio {\n private readonly shutdown = new AbortController();\n private readonly groups = new Map<string, AudioGroup>();\n private readonly voices = new Set<AudioPlayback>();\n private context: AudioContext | undefined;\n readonly master = new AudioGroup(\"master\", undefined);\n\n /** @internal */\n constructor(\n host: HTMLElement,\n private readonly assets: AssetStore,\n private readonly logger: Logger,\n ) {\n this.groups.set(\"master\", this.master);\n this.group(\"music\");\n this.group(\"effects\");\n const gesture = (event: Event) => {\n if (event.isTrusted && (this.context || this.voices.size))\n void this.unlock();\n };\n const options = { capture: true, signal: this.shutdown.signal };\n host.addEventListener(\"pointerup\", gesture, options);\n host.addEventListener(\"keydown\", gesture, options);\n }\n\n get state(): AudioContextState | \"idle\" {\n return (\n this.context?.state ?? (this.shutdown.signal.aborted ? \"closed\" : \"idle\")\n );\n }\n\n group(name: string, options?: AudioGroupOptions): AudioGroup {\n this.assertAlive();\n if (typeof name !== \"string\" || !name.trim())\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Audio group name cannot be empty\",\n );\n const existing = this.groups.get(name);\n if (existing) {\n if (options)\n throw new EngineError(\n \"AUDIO_GROUP_EXISTS\",\n \"Audio group is already configured\",\n );\n return existing;\n }\n const parent = this.groups.get(options?.parent ?? \"master\");\n if (!parent)\n throw new EngineError(\n \"AUDIO_GROUP_UNKNOWN\",\n \"Unknown parent audio group\",\n );\n const group = new AudioGroup(name, parent, options);\n this.groups.set(name, group);\n return group;\n }\n\n play(\n asset: AssetHandle<\"audio\">,\n options: AudioPlayOptions = {},\n ): AudioPlayback {\n this.assertAlive();\n if (asset?.kind !== \"audio\")\n throw new EngineError(\"INVALID_VALUE\", \"An audio asset is required\");\n if (options.owner?.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Audio playback owner is disposed\",\n );\n volume(options.volume ?? 1);\n if (options.loop !== undefined && typeof options.loop !== \"boolean\")\n throw new EngineError(\"INVALID_VALUE\", \"Audio loop must be boolean\");\n const limit = voiceLimit(options.maxVoices);\n const group = this.groups.get(options.group ?? \"effects\");\n if (!group)\n throw new EngineError(\"AUDIO_GROUP_UNKNOWN\", \"Unknown playback group\");\n const use = asset.retain(this.assets);\n let voice: AudioPlayback;\n try {\n voice = new AudioPlayback(this, use, group, options);\n } catch (error) {\n use.release();\n throw error;\n }\n this.voices.add(voice);\n if (limit !== undefined)\n this.enforceLimit(limit, (item) => item.assetId === voice.assetId);\n for (let node: AudioGroup | undefined = group; node; node = node.parent) {\n const limit = node.maxVoices;\n const ancestor = node;\n if (limit !== undefined)\n this.enforceLimit(limit, (item) => {\n for (\n let parent: AudioGroup | undefined = item.group;\n parent;\n parent = parent.parent\n )\n if (parent === ancestor) return true;\n return false;\n });\n }\n return voice;\n }\n\n private enforceLimit(\n limit: number,\n applies: (voice: AudioPlayback) => boolean,\n ): void {\n const voices = [...this.voices].filter(applies);\n for (const voice of voices.slice(0, Math.max(0, voices.length - limit)))\n voice.replace();\n }\n\n private assertAlive(): void {\n if (this.shutdown.signal.aborted)\n throw new EngineError(\"GAME_DISPOSED\", \"Audio is disposed\");\n }\n\n /** @internal */\n device(): AudioContext {\n this.assertAlive();\n if (!this.context) {\n this.context = new AudioContext();\n this.context.addEventListener(\"statechange\", this.drain, {\n signal: this.shutdown.signal,\n });\n }\n return this.context;\n }\n\n /** @internal */\n decode(bytes: ArrayBuffer): Promise<AudioBuffer> {\n return this.device().decodeAudioData(bytes);\n }\n\n /** Call from a trusted user gesture to start pending playback. */\n async unlock(): Promise<boolean> {\n if (this.shutdown.signal.aborted) return false;\n try {\n const context = this.device();\n if (context.state !== \"running\") {\n if (navigator.userActivation?.isActive === false) return false;\n const signal = this.shutdown.signal;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let abort: () => void = () => {};\n try {\n await Promise.race([\n context.resume(),\n new Promise<void>((resolve) => {\n abort = resolve;\n signal.addEventListener(\"abort\", abort, { once: true });\n timer = setTimeout(resolve, 1500);\n }),\n ]);\n } finally {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort);\n }\n }\n if (this.shutdown.signal.aborted || context.state !== \"running\")\n return false;\n this.drain();\n return true;\n } catch (cause) {\n if (!this.shutdown.signal.aborted)\n this.report(cause, \"Audio context could not resume\");\n return false;\n }\n }\n\n private readonly drain = () => {\n for (const voice of [...this.voices]) voice.startIfReady();\n };\n\n /** @internal */\n remove(voice: AudioPlayback): void {\n this.voices.delete(voice);\n }\n\n /** @internal */\n report(cause: unknown, message: string): void {\n this.logger.report(cause, {\n source: \"engine.audio\",\n message,\n fatal: false,\n });\n }\n\n /** @internal */\n dispose(): void {\n if (this.shutdown.signal.aborted) return;\n this.shutdown.abort();\n const context = this.context;\n this.context = undefined;\n try {\n cleanupAll(\n [\n ...[...this.voices].map((voice) => () => voice.stop()),\n ...[...this.groups.values()]\n .reverse()\n .map((group) => () => group.disconnect()),\n ],\n \"Audio cleanup failed\",\n );\n } finally {\n this.groups.clear();\n if (context && context.state !== \"closed\")\n void context\n .close()\n .catch((cause) =>\n this.report(cause, \"Audio context could not close\"),\n );\n }\n }\n}\n","import { EngineError } from \"@simpludify/core\";\nimport { GamepadButton, gamepadIndex } from \"./gamepad-bindings\";\n\nexport type GamepadLayout = \"generic\" | \"xbox\" | \"playstation\" | \"nintendo\";\nexport interface GamepadInfo {\n /** Unmodified browser string; never a persistent individual-device identifier. */\n readonly id: string;\n readonly index: number;\n readonly connected: boolean;\n readonly mapping: string;\n readonly standardMapping: boolean;\n readonly buttonCount: number;\n readonly axisCount: number;\n /** Heuristic ID hint, not a browser fact or guaranteed product detection. */\n readonly inferredLayout: GamepadLayout;\n}\nconst positions = Object.fromEntries(\n Object.entries(GamepadButton).map(([name, index]) => [index, name]),\n);\nconst faces: Readonly<Record<GamepadLayout, readonly string[]>> = Object.freeze(\n {\n generic: Object.freeze([\"South\", \"East\", \"West\", \"North\"]),\n xbox: Object.freeze([\"A\", \"B\", \"X\", \"Y\"]),\n playstation: Object.freeze([\"×\", \"○\", \"□\", \"△\"]),\n nintendo: Object.freeze([\"B\", \"A\", \"Y\", \"X\"]),\n },\n);\nexport function gamepadButtonLabel(\n button: number,\n options: {\n readonly layout?: GamepadLayout;\n readonly overrides?: Readonly<Record<number, string>>;\n } = {},\n): string {\n gamepadIndex(button);\n const layout = options.layout ?? \"generic\";\n if (!Object.hasOwn(faces, layout))\n throw new EngineError(\n \"INVALID_GAMEPAD_BINDING\",\n \"Unknown gamepad display layout\",\n );\n if (options.overrides && Object.hasOwn(options.overrides, button)) {\n const label = options.overrides[button];\n if (typeof label !== \"string\")\n throw new EngineError(\n \"INVALID_GAMEPAD_BINDING\",\n \"Button label must be a string\",\n );\n return label;\n }\n return faces[layout][button] ?? positions[button] ?? `Button ${button}`;\n}\nexport function inferredGamepadLayout(id: string): GamepadLayout {\n if (/dualsense|dualshock|playstation|054c/i.test(id)) return \"playstation\";\n if (/nintendo|switch|057e/i.test(id)) return \"nintendo\";\n if (/xbox|xinput|045e/i.test(id)) return \"xbox\";\n return \"generic\";\n}\n","import {\n type ActionController,\n type ActionSet,\n type ActionSource,\n type ActionToken,\n defineEvent,\n EngineError,\n EventBus,\n type InputAdapter,\n type InputSystem,\n Lifetime,\n type LifetimeOwner,\n} from \"@simpludify/core\";\nimport {\n type CheckedGamepadBinding,\n checkedGamepadBindings,\n type GamepadAxisBinding,\n type GamepadBindings,\n type GamepadButtonBinding,\n type GamepadVector3Binding,\n gamepadDeadZone,\n gamepadIndex,\n} from \"./gamepad-bindings\";\nimport { type GamepadInfo, inferredGamepadLayout } from \"./gamepad-layout\";\n\n/** Structural polling boundary also usable by deterministic tests/custom Web hosts. */\nexport interface GamepadState {\n readonly id: string;\n readonly index: number;\n readonly connected: boolean;\n readonly mapping: string;\n readonly axes: readonly number[];\n readonly buttons: readonly {\n readonly value: number;\n readonly pressed: boolean;\n }[];\n}\nexport type GamepadPoll = () => readonly (GamepadState | null)[];\nexport interface GamepadOptions<A extends ActionSet> {\n readonly index: number;\n /** Omit to follow ActionController's common gamepad settings. */\n readonly bindings?: GamepadBindings<A>;\n readonly deadZone?: number;\n /** Positional constants require standard mapping; raw is an explicit opt-in. */\n readonly mapping?: \"standard\" | \"raw\";\n}\nconst finite = (v: unknown, min: number, max: number): number =>\n typeof v === \"number\" && Number.isFinite(v)\n ? Math.max(min, Math.min(max, v))\n : 0;\nconst buttonValue = (pad: GamepadState, index: number): number =>\n finite(pad.buttons[index]?.value, 0, 1);\nfunction scalar(\n pad: GamepadState,\n binding: GamepadAxisBinding,\n deadZone: number,\n): number {\n const group = (indices: readonly number[] | undefined) =>\n (indices ?? []).reduce(\n (maximum, index) => Math.max(maximum, buttonValue(pad, index)),\n 0,\n );\n const raw =\n finite(\n (binding.axis === undefined ? 0 : finite(pad.axes[binding.axis], -1, 1)) +\n group(binding.positive) -\n group(binding.negative),\n -1,\n 1,\n ) * (binding.invert ? -1 : 1);\n const zone = binding.deadZone ?? deadZone;\n return Math.abs(raw) <= zone\n ? 0\n : (Math.sign(raw) * (Math.abs(raw) - zone)) / (1 - zone);\n}\nfunction values(\n pad: GamepadState,\n bindings: readonly CheckedGamepadBinding[],\n zone: number,\n) {\n return bindings.map(([action, binding]) => {\n if (action.kind === \"button\")\n return [\n action,\n (binding as GamepadButtonBinding).buttons?.some(\n (b) =>\n buttonValue(pad, typeof b === \"number\" ? b : b.button) >=\n (typeof b === \"number\" ? 0.5 : (b.threshold ?? 0.5)),\n ) ?? false,\n ] as const;\n if (action.kind === \"axis1d\")\n return [\n action,\n scalar(pad, binding as GamepadAxisBinding, zone),\n ] as const;\n const b = binding as GamepadVector3Binding,\n x = scalar(pad, b.x ?? {}, zone),\n y = scalar(pad, b.y ?? {}, zone);\n return [\n action,\n action.kind === \"axis2d\"\n ? { x, y }\n : { x, y, z: scalar(pad, b.z ?? {}, zone) },\n ] as const;\n });\n}\nfunction neutral(\n value:\n | boolean\n | number\n | { readonly x: number; readonly y: number; readonly z?: number },\n): boolean {\n return typeof value === \"boolean\"\n ? !value\n : typeof value === \"number\"\n ? value === 0\n : value.x === 0 && value.y === 0 && (value.z ?? 0) === 0;\n}\n\n/** A controller-owned device contribution. Reassignment does not replace its readers/Actors. */\nexport class GamepadSource<A extends ActionSet> {\n private readonly life = new Lifetime();\n private readonly source: ActionSource<A>;\n private bindings: readonly CheckedGamepadBinding[];\n private assigned: number;\n private armed = false;\n private signature: string | undefined;\n private readonly zone: number;\n private readonly mapping: \"standard\" | \"raw\";\n private following: boolean;\n private bindingRevision: number;\n private readonly waiting = new Set<ActionToken>();\n constructor(\n private readonly input: GamepadInput,\n private readonly controller: ActionController<A>,\n options: GamepadOptions<A>,\n ) {\n input.assertController(controller);\n this.assigned = gamepadIndex(options.index);\n this.zone = gamepadDeadZone(options.deadZone ?? 0.15);\n this.mapping = options.mapping ?? \"standard\";\n if (this.mapping !== \"standard\" && this.mapping !== \"raw\")\n throw new EngineError(\n \"INVALID_GAMEPAD_BINDING\",\n \"Unknown gamepad mapping policy\",\n );\n this.following = options.bindings === undefined;\n this.bindingRevision = controller.bindingRevision;\n this.bindings = this.following\n ? this.commonBindings()\n : checkedGamepadBindings(controller.actions, options.bindings);\n this.source = controller.createSource();\n this.life.onDispose(() => this.source.dispose());\n this.life.onDispose(controller.onDispose(() => this.dispose()));\n }\n get disposed(): boolean {\n return this.life.disposed;\n }\n get enabled(): boolean {\n return this.source.enabled;\n }\n set enabled(value: boolean) {\n this.alive();\n if (value === this.source.enabled) return;\n this.source.enabled = value;\n this.clear();\n }\n get index(): number {\n return this.assigned;\n }\n get info(): GamepadInfo | undefined {\n return this.input.devices.find((d) => d.index === this.assigned);\n }\n get connected(): boolean {\n return this.info?.connected ?? false;\n }\n get usable(): boolean {\n return (\n this.connected &&\n (this.mapping === \"raw\" || this.info?.standardMapping === true)\n );\n }\n assign(index: number): void {\n this.alive();\n const checked = gamepadIndex(index);\n if (checked === this.assigned) return;\n this.clear();\n this.signature = undefined;\n this.assigned = checked;\n }\n rebind(bindings?: GamepadBindings<A>): void {\n this.alive();\n const checked =\n bindings === undefined\n ? this.commonBindings()\n : checkedGamepadBindings(this.controller.actions, bindings);\n this.clear();\n this.bindings = checked;\n this.following = bindings === undefined;\n this.bindingRevision = this.controller.bindingRevision;\n }\n private commonBindings(): readonly CheckedGamepadBinding[] {\n return Object.freeze(\n Object.values(this.controller.actions).flatMap((action) => {\n const binding = this.controller.getBinding(\n action as A[keyof A],\n ).gamepad;\n return binding ? [Object.freeze([action, binding] as const)] : [];\n }),\n );\n }\n private syncBindings(): void {\n if (\n !this.following ||\n this.bindingRevision === this.controller.bindingRevision\n )\n return;\n const next = this.commonBindings();\n const before = new Map(this.bindings),\n after = new Map(next);\n for (const action of new Set([...before.keys(), ...after.keys()])) {\n if (\n JSON.stringify(before.get(action)) === JSON.stringify(after.get(action))\n )\n continue;\n this.source.resetBinding(action as A[keyof A]);\n if (after.has(action)) this.waiting.add(action);\n else this.waiting.delete(action);\n }\n this.bindings = next;\n this.bindingRevision = this.controller.bindingRevision;\n }\n clear(): void {\n this.source.clear();\n this.armed = false;\n this.waiting.clear();\n }\n private alive(): void {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Gamepad source has been disposed\",\n );\n }\n /** @internal */ sample(\n pad: GamepadState | undefined,\n allowed: boolean,\n ): void {\n if (this.disposed) return;\n this.syncBindings();\n if (\n !allowed ||\n !this.enabled ||\n !this.controller.active ||\n !pad ||\n (this.mapping === \"standard\" && pad.mapping !== \"standard\")\n ) {\n this.clear();\n this.signature = undefined;\n return;\n }\n const signature = JSON.stringify([\n pad.id,\n pad.mapping,\n pad.buttons.length,\n pad.axes.length,\n ]);\n if (signature !== this.signature) {\n this.clear();\n this.signature = signature;\n }\n const next = values(pad, this.bindings, this.zone);\n if (!this.armed) {\n if (next.every(([, value]) => neutral(value))) this.armed = true;\n return;\n }\n for (const [action, value] of next) {\n if (this.waiting.has(action)) {\n if (!neutral(value)) continue;\n this.waiting.delete(action);\n }\n this.source.set(action as A[keyof A], value as never);\n }\n }\n /** @internal */ onDispose(callback: () => void): () => void {\n return this.life.onDispose(callback);\n }\n dispose(): void {\n this.life.dispose();\n }\n}\n\nconst devicesChanged = defineEvent<void>(\"GamepadsChanged\");\n\n/** One Web host adapter; multiple sources share a single snapshot per Engine input boundary. */\nexport class GamepadInput implements InputAdapter {\n private readonly life = new Lifetime();\n private readonly changes = new EventBus();\n private readonly sources = new Set<GamepadSource<ActionSet>>();\n private readonly disconnected = new Set<number>();\n private listed: readonly GamepadInfo[] = Object.freeze([]);\n private readable = false;\n private readonly poll: GamepadPoll;\n private readonly active: () => boolean;\n private readonly observe:\n | ((pads: ReadonlyMap<number, GamepadState>) => void)\n | undefined;\n constructor(\n private readonly input: InputSystem,\n options: {\n readonly poll?: GamepadPoll;\n readonly active?: () => boolean;\n readonly events?: EventTarget;\n /** @internal Host capture observes the same poll before any device contribution. */\n readonly observe?: (pads: ReadonlyMap<number, GamepadState>) => void;\n } = {},\n ) {\n this.life.onDispose(() => this.changes.dispose());\n this.poll =\n options.poll ??\n (() =>\n typeof navigator !== \"undefined\" &&\n typeof navigator.getGamepads === \"function\"\n ? navigator.getGamepads()\n : (() => {\n throw new Error(\"Gamepad API unavailable\");\n })());\n this.active = options.active ?? (() => true);\n this.observe = options.observe;\n this.life.onDispose(input.addAdapter(this));\n const events =\n options.events ?? (typeof window === \"undefined\" ? undefined : window),\n abort = new AbortController();\n this.life.onDispose(() => abort.abort());\n events?.addEventListener(\n \"gamepaddisconnected\",\n (event) => {\n const index = (event as GamepadEvent).gamepad.index;\n this.disconnected.add(index);\n for (const source of this.sources)\n if (source.index === index) source.clear();\n this.publish(this.listed.filter((d) => d.index !== index));\n },\n { signal: abort.signal },\n );\n events?.addEventListener(\n \"gamepadconnected\",\n (event) => {\n const index = (event as GamepadEvent).gamepad.index;\n this.disconnected.delete(index);\n for (const source of this.sources)\n if (source.index === index) source.clear();\n },\n { signal: abort.signal },\n );\n }\n get disposed(): boolean {\n return this.life.disposed;\n }\n /** Whether the most recent polling attempt completed; an empty list may still need a user gesture. */\n get available(): boolean {\n return this.readable;\n }\n get devices(): readonly GamepadInfo[] {\n return this.listed;\n }\n onChange(handler: () => void, owner?: LifetimeOwner): () => void {\n return this.changes.on(devicesChanged, handler, owner);\n }\n private publish(devices: readonly GamepadInfo[], force = false): void {\n const changed = JSON.stringify(this.listed) !== JSON.stringify(devices);\n this.listed = Object.freeze(devices);\n if (changed || force) this.changes.emit(devicesChanged, undefined);\n }\n /** @internal */ assertController(controller: object): void {\n if (!this.input.hasController(controller))\n throw new EngineError(\n \"INVALID_ACTION\",\n \"Gamepad controller must belong to this InputSystem\",\n );\n }\n bind<A extends ActionSet>(\n controller: ActionController<A>,\n options: GamepadOptions<A>,\n ): GamepadSource<A> {\n if (this.disposed)\n throw new EngineError(\n \"OWNER_DISPOSED\",\n \"Gamepad input has been disposed\",\n );\n const source = new GamepadSource(this, controller, options);\n const entry = source as unknown as GamepadSource<ActionSet>;\n this.sources.add(entry);\n const remove = this.life.onDispose(() => source.dispose());\n source.onDispose(() => {\n this.sources.delete(entry);\n remove();\n });\n return source;\n }\n sample(): void {\n if (this.disposed) return;\n const wasReadable = this.readable;\n let snapshots: readonly (GamepadState | null)[];\n try {\n snapshots = this.poll();\n if (!Array.isArray(snapshots))\n throw new Error(\"Invalid gamepad snapshot\");\n this.readable = true;\n } catch {\n snapshots = [];\n this.readable = false;\n }\n const pads = new Map<number, GamepadState>();\n for (const pad of snapshots)\n if (\n pad?.connected &&\n typeof pad.id === \"string\" &&\n typeof pad.mapping === \"string\" &&\n Array.isArray(pad.axes) &&\n Array.isArray(pad.buttons) &&\n Number.isSafeInteger(pad.index) &&\n pad.index >= 0\n )\n pads.set(pad.index, pad);\n for (const index of this.disconnected)\n if (!pads.has(index)) this.disconnected.delete(index);\n for (const index of this.disconnected) pads.delete(index);\n const listed = Object.freeze(\n [...pads.values()]\n .sort((a, b) => a.index - b.index)\n .map((p) =>\n Object.freeze({\n id: p.id,\n index: p.index,\n connected: p.connected,\n mapping: p.mapping,\n standardMapping: p.mapping === \"standard\",\n buttonCount: p.buttons.length,\n axisCount: p.axes.length,\n inferredLayout: inferredGamepadLayout(p.id),\n }),\n ),\n );\n this.observe?.(pads);\n const allowed = this.active() && this.input.liveInput;\n for (const source of this.sources) {\n if (source.disposed) this.sources.delete(source);\n else source.sample(pads.get(source.index), allowed);\n }\n this.publish(listed, wasReadable !== this.readable);\n }\n reset(): void {\n for (const source of this.sources) source.clear();\n }\n dispose(): void {\n this.life.dispose();\n this.sources.clear();\n this.listed = Object.freeze([]);\n }\n}\n","/** Host-only ownership metadata; native editing is never reconstructed from game keys. */\nconst gameButtons = new WeakSet<HTMLButtonElement>();\nconst consumed = new WeakSet<KeyboardEvent>();\nexport function registerGameButton(\n button: HTMLButtonElement,\n signal: AbortSignal,\n): void {\n gameButtons.add(button);\n // Preserve native DOM activation defaults while reserving these keys for UI.\n button.addEventListener(\n \"keydown\",\n (event) => {\n if (event.code === \"Enter\" || event.code === \"Space\") consumed.add(event);\n },\n { signal },\n );\n}\nexport function uiConsumesKey(event: KeyboardEvent): boolean {\n return consumed.has(event) || event.defaultPrevented;\n}\n/** Unmanaged native buttons retain the previous isolated keyboard behavior. */\nexport function blocksGameKeyboard(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable || target.closest(\"input,textarea,select\"))\n return true;\n const button = target.closest(\"button\");\n return !!button && !gameButtons.has(button);\n}\n/** Grant surface focus from outside/editing; do not evict a compatible UI button. */\nexport function focusGameSurface(host: HTMLElement): void {\n const active = document.activeElement;\n if (\n active === host ||\n (active instanceof HTMLElement &&\n host.contains(active) &&\n !blocksGameKeyboard(active))\n )\n return;\n host.focus({ preventScroll: true });\n}\n","import { type InputSystem, isKeyCode } from \"@simpludify/core\";\nimport {\n blocksGameKeyboard,\n focusGameSurface,\n uiConsumesKey,\n} from \"./ui-keyboard\";\n/** Scoped keyboard adapter: editors own text; engine buttons consume only their UI keys. */\nexport class BrowserInput {\n private readonly controller = new AbortController();\n constructor(host: HTMLElement, input: InputSystem) {\n const source = input.createKeyboardSource();\n let compositionOwner: EventTarget | null = null;\n const down = (event: KeyboardEvent) => {\n // A removed/replaced editor must not leave a stale global composition lock.\n if (\n compositionOwner &&\n (!(compositionOwner instanceof Node) ||\n !compositionOwner.isConnected ||\n !host.contains(compositionOwner) ||\n document.activeElement !== compositionOwner)\n )\n compositionOwner = null;\n if (\n compositionOwner ||\n event.isComposing ||\n event.keyCode === 229 ||\n blocksGameKeyboard(event.target)\n ) {\n source.clear();\n return;\n }\n if (uiConsumesKey(event) || event.code === \"Tab\") {\n if (isKeyCode(event.code)) source.set(event.code, false);\n return;\n }\n if (!isKeyCode(event.code) || !input.acceptsKey(event.code)) return;\n event.preventDefault();\n // Released/cleared holds require a fresh keydown; autorepeat never restores them.\n if (!event.repeat) source.set(event.code, true);\n };\n const up = (event: KeyboardEvent) => {\n if (isKeyCode(event.code)) source.set(event.code, false);\n };\n const options = { signal: this.controller.signal };\n host.addEventListener(\"keydown\", down, options);\n window.addEventListener(\"keyup\", up, { ...options, capture: true });\n host.addEventListener(\n \"compositionstart\",\n (event) => {\n compositionOwner = event.target;\n source.clear();\n },\n options,\n );\n host.addEventListener(\n \"compositionend\",\n (event) => {\n if (compositionOwner === event.target) compositionOwner = null;\n },\n options,\n );\n window.addEventListener(\n \"blur\",\n () => {\n compositionOwner = null;\n source.clear();\n },\n options,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) {\n compositionOwner = null;\n source.clear();\n }\n },\n options,\n );\n host.addEventListener(\n \"focusin\",\n (event) => {\n if (event.target !== compositionOwner) compositionOwner = null;\n if (blocksGameKeyboard(event.target)) source.clear();\n },\n options,\n );\n host.addEventListener(\n \"focusout\",\n (event) => {\n if (\n !(event.relatedTarget instanceof Node) ||\n !host.contains(event.relatedTarget) ||\n blocksGameKeyboard(event.relatedTarget)\n ) {\n compositionOwner = null;\n source.clear();\n }\n },\n options,\n );\n host.addEventListener(\n \"pointerdown\",\n (event) => {\n if (\n !event.defaultPrevented &&\n (event.target === host ||\n (event.target instanceof HTMLCanvasElement &&\n event.target.parentElement === host))\n )\n focusGameSurface(host);\n },\n options,\n );\n this.clear = () => source.dispose();\n }\n private readonly clear: () => void;\n dispose(): void {\n this.controller.abort();\n this.clear();\n }\n}\n","import {\n EngineError,\n InputCapture,\n type InputCaptureOptions,\n InputCaptureState,\n InputDevice,\n type InputSystem,\n isKeyCode,\n isMouseButton,\n type KeyCode,\n type MouseButton,\n type Scene,\n SceneState,\n} from \"@simpludify/core\";\nimport type { GamepadState } from \"./gamepads\";\nimport { blocksGameKeyboard } from \"./ui-keyboard\";\n\ninterface PadButtons {\n index: number;\n id: string;\n mapping: string;\n signature: string;\n buttons: ReadonlySet<number>;\n}\nconst mouseMasks = [\n [0, 1],\n [1, 4],\n [2, 2],\n [3, 8],\n [4, 16],\n] as const;\n\n/** @internal One Game-owned observer; existing adapters retain gameplay ownership. */\nexport class InputCaptureManager {\n private readonly abort = new AbortController();\n private current: InputCapture | undefined;\n private readonly keys = new Set<KeyCode>();\n private readonly blockedKeys = new Set<KeyCode>();\n private readonly blockedPointers = new Set<number>();\n private readonly blockedAuxiliary = new Set<MouseButton>();\n private mouseButtons = 0;\n private needsPadSample = false;\n private pads = new Map<number, PadButtons>();\n private readonly readyPads = new Set<number>();\n private dead = false;\n constructor(\n private readonly host: HTMLElement,\n private readonly input: InputSystem,\n private readonly scene: () => Scene,\n private readonly releasePointers: () => void,\n private readonly report: (error: unknown) => void,\n ) {\n const options = { capture: true, signal: this.abort.signal };\n window.addEventListener(\n \"keydown\",\n (event) => this.guard(() => this.keyDown(event)),\n options,\n );\n window.addEventListener(\n \"keyup\",\n (event) =>\n this.guard(() => {\n if (isKeyCode(event.code)) {\n this.keys.delete(event.code);\n this.blockedKeys.delete(event.code);\n }\n this.arm();\n }),\n options,\n );\n for (const kind of [\n \"pointerdown\",\n \"pointermove\",\n \"pointerup\",\n \"pointercancel\",\n ] as const)\n window.addEventListener(\n kind,\n (event) => this.guard(() => this.pointer(event)),\n options,\n );\n for (const kind of [\"auxclick\", \"contextmenu\"] as const)\n window.addEventListener(\n kind,\n (event) => {\n if (\n this.surface(event.target) &&\n isMouseButton(event.button) &&\n this.blockedAuxiliary.has(event.button)\n ) {\n this.consume(event);\n if (kind === \"auxclick\") this.blockedAuxiliary.delete(event.button);\n }\n },\n options,\n );\n window.addEventListener(\n \"blur\",\n (event) => {\n if (event.target === window) this.interrupt();\n },\n options,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) this.interrupt();\n },\n options,\n );\n host.addEventListener(\n \"focusout\",\n (event) => {\n if (\n !(event.relatedTarget instanceof Node) ||\n !host.contains(event.relatedTarget) ||\n blocksGameKeyboard(event.relatedTarget)\n )\n this.interrupt();\n },\n options,\n );\n host.addEventListener(\n \"focusin\",\n (event) => {\n if (blocksGameKeyboard(event.target)) this.interrupt();\n },\n options,\n );\n }\n start(options: InputCaptureOptions = {}): InputCapture {\n if (this.dead)\n throw new EngineError(\"GAME_DISPOSED\", \"Capture host has been disposed\");\n if (this.current)\n throw new EngineError(\n \"INPUT_CAPTURE_ACTIVE\",\n \"Cancel the active capture before starting another\",\n );\n const scene = this.scene();\n if (\n scene.state !== SceneState.Active ||\n document.hidden ||\n !document.hasFocus()\n )\n throw new EngineError(\n \"INPUT_CAPTURE_UNAVAILABLE\",\n \"Capture requires an active Scene and focused visible document\",\n );\n const capture = new InputCapture(options);\n let release: (() => void) | undefined;\n try {\n capture.onDispose(scene.onDispose(() => capture.cancel()));\n capture.onDispose(() => {\n if (this.current === capture) this.current = undefined;\n this.pads.clear();\n this.readyPads.clear();\n this.needsPadSample = false;\n release?.();\n });\n this.current = capture;\n this.needsPadSample = capture.devices.includes(InputDevice.Gamepad);\n for (const key of this.keys) this.blockedKeys.add(key);\n for (const [button, mask] of mouseMasks)\n if (this.mouseButtons & mask) this.blockedAuxiliary.add(button);\n this.releasePointers();\n if (capture.disposed) return capture;\n release = this.input.suspendLiveInput(() => capture.cancel());\n if (capture.disposed) {\n release();\n return capture;\n }\n this.host.focus({ preventScroll: true });\n this.arm();\n return capture;\n } catch (error) {\n capture.cancel();\n throw error;\n }\n }\n private arm(): void {\n const capture = this.current;\n if (\n !capture ||\n capture.state !== InputCaptureState.Arming ||\n this.needsPadSample\n )\n return;\n if (capture.devices.includes(InputDevice.Keyboard) && this.keys.size)\n return;\n if (capture.devices.includes(InputDevice.Mouse) && this.mouseButtons)\n return;\n if (\n capture.devices.includes(InputDevice.Gamepad) &&\n [...this.pads.values()].some(\n (pad) =>\n (capture.gamepadIndex === undefined ||\n capture.gamepadIndex === pad.index) &&\n pad.buttons.size,\n )\n )\n return;\n capture.arm();\n }\n private keyDown(event: KeyboardEvent): void {\n if (event.isComposing || event.keyCode === 229 || !isKeyCode(event.code))\n return;\n // Observe preheld keys even on native openers; only game targets are consumed.\n const previous = this.keys.has(event.code);\n this.keys.add(event.code);\n if (!(event.target instanceof Node) || !this.host.contains(event.target))\n return;\n if (blocksGameKeyboard(event.target)) return;\n // Native settings buttons can still invoke an explicit cancel API.\n if (event.target instanceof HTMLElement && event.target.closest(\"button\"))\n return;\n const capture = this.current;\n if (!capture && !this.blockedKeys.has(event.code)) return;\n this.blockedKeys.add(event.code);\n this.consume(event);\n if (capture && !previous && !event.repeat)\n capture.accept({ device: InputDevice.Keyboard, code: event.code });\n }\n private surface(target: EventTarget | null): boolean {\n return (\n target === this.host ||\n (target instanceof HTMLCanvasElement &&\n target.parentElement === this.host)\n );\n }\n private pointer(event: PointerEvent): void {\n const capture = this.current,\n mouse = event.pointerType === \"mouse\",\n old = this.mouseButtons;\n if (mouse)\n this.mouseButtons = event.type === \"pointercancel\" ? 0 : event.buttons;\n if (event.type === \"pointerdown\" && !capture) {\n this.blockedPointers.delete(event.pointerId);\n if (isMouseButton(event.button))\n this.blockedAuxiliary.delete(event.button);\n }\n const blocked = this.blockedPointers.has(event.pointerId);\n if (capture && this.surface(event.target)) {\n if (event.type === \"pointerdown\")\n this.host.focus({ preventScroll: true });\n this.blockedPointers.add(event.pointerId);\n this.consume(event);\n if (mouse && isMouseButton(event.button)) {\n const mask =\n mouseMasks.find(([button]) => button === event.button)?.[1] ?? 0;\n if (event.buttons & mask && !(old & mask)) {\n this.blockedAuxiliary.add(event.button);\n capture.accept({ device: InputDevice.Mouse, button: event.button });\n }\n }\n } else if (blocked) this.consume(event);\n if (\n event.type === \"pointerup\" ||\n event.type === \"pointercancel\" ||\n (mouse && event.buttons === 0)\n )\n this.blockedPointers.delete(event.pointerId);\n this.arm();\n }\n /** Same validated gamepad poll as gameplay; no navigator polling in this manager. */\n sample(pads: ReadonlyMap<number, GamepadState>): void {\n const capture = this.current;\n if (!capture?.devices.includes(InputDevice.Gamepad)) return;\n const before = this.pads,\n first = this.needsPadSample,\n next = new Map<number, PadButtons>();\n for (const pad of pads.values()) {\n const buttons = new Set<number>();\n pad.buttons.forEach((button, index) => {\n if (Number.isFinite(button?.value) && button.value >= 0.5)\n buttons.add(index);\n });\n const signature = JSON.stringify([\n pad.id,\n pad.mapping,\n pad.buttons.length,\n ]);\n const entry = {\n index: pad.index,\n id: pad.id,\n mapping: pad.mapping,\n signature,\n buttons,\n };\n next.set(pad.index, entry);\n if (first || before.get(pad.index)?.signature !== signature)\n this.readyPads.delete(pad.index);\n if (!buttons.size) this.readyPads.add(pad.index);\n }\n for (const index of this.readyPads)\n if (!next.has(index)) this.readyPads.delete(index);\n this.pads = next;\n this.needsPadSample = false;\n this.arm();\n if (first || capture.state !== InputCaptureState.Listening) return;\n for (const pad of [...next.values()].sort((a, b) => a.index - b.index)) {\n if (\n !this.readyPads.has(pad.index) ||\n before.get(pad.index)?.signature !== pad.signature\n )\n continue;\n for (const button of pad.buttons)\n if (\n !before.get(pad.index)?.buttons.has(button) &&\n capture.accept({\n device: InputDevice.Gamepad,\n index: pad.index,\n id: pad.id,\n mapping: pad.mapping,\n button,\n })\n )\n return;\n }\n }\n private consume(event: Event): void {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n private guard(action: () => void): void {\n try {\n action();\n } catch (error) {\n this.report(error);\n }\n }\n private interrupt(): void {\n this.guard(() => this.current?.cancel());\n this.keys.clear();\n this.blockedKeys.clear();\n this.blockedPointers.clear();\n this.blockedAuxiliary.clear();\n this.mouseButtons = 0;\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n this.abort.abort();\n this.interrupt();\n }\n}\n","import type { InputSystem, MouseSource, PointerInfo } from \"@simpludify/core\";\nimport {\n containsScreenPoint,\n isMouseButton,\n MouseButton,\n PointerRouting,\n screenPoint,\n type ViewTransform,\n type WorldPoint,\n} from \"@simpludify/core\";\nimport { blocksGameKeyboard, focusGameSurface } from \"./ui-keyboard\";\n\ninterface PointerProjection {\n screen: PointerInfo[\"screen\"];\n world: WorldPoint;\n view: ViewTransform;\n}\n\nconst mouseMasks = [\n [MouseButton.Left, 1],\n [MouseButton.Middle, 4],\n [MouseButton.Right, 2],\n [MouseButton.Back, 8],\n [MouseButton.Forward, 16],\n] as const;\n/** One DOM capture-phase adapter per Game; Pixi federated events never route these widgets. */\nexport class BrowserPointer {\n readonly routing: PointerRouting;\n private readonly abort = new AbortController();\n private readonly mouse: MouseSource | undefined;\n private readonly mouseStates = new Map<number, number>();\n private readonly blockedMouse = new Set<number>();\n private readonly auxiliary = new Set<MouseButton>();\n private readonly offInput: (() => void) | undefined;\n constructor(\n private readonly host: HTMLElement,\n private readonly project: (event: {\n clientX: number;\n clientY: number;\n }) => PointerProjection | undefined,\n private readonly report: (error: unknown) => void,\n private readonly flush: () => void,\n private readonly input?: InputSystem,\n ) {\n this.routing = new PointerRouting((id) => {\n if (host.hasPointerCapture(id)) host.releasePointerCapture(id);\n });\n this.mouse = input?.createMouseSource();\n this.offInput = input?.addAdapter({\n sample: () => {},\n reset: () => this.resetMouse(),\n dispose: () => this.dispose(),\n });\n const options = { signal: this.abort.signal, capture: true };\n host.addEventListener(\n \"pointerdown\",\n (e) =>\n this.guard(() => {\n if (!this.surface(e.target)) return;\n if (e.pointerType === \"mouse\") {\n this.releaseMouse(e.pointerId);\n this.blockedMouse.delete(e.pointerId);\n if (isMouseButton(e.button)) this.auxiliary.delete(e.button);\n }\n this.flush();\n const data = this.data(e);\n if (!data) return this.release();\n // Capture before delivery: callbacks may remove the target or navigate.\n try {\n host.setPointerCapture(e.pointerId);\n } catch {\n /* Window capture listeners also cover synthetic events. */\n }\n const target = this.routing.down(data);\n this.updateMouse(e);\n if (this.routing.has(e.pointerId)) {\n e.preventDefault();\n // UI gestures retain compatible focus; an explicit world click selects the game.\n if (target) focusGameSurface(host);\n else host.focus({ preventScroll: true });\n } else {\n if (this.routing.owns(e.pointerId)) e.preventDefault();\n if (host.hasPointerCapture(e.pointerId))\n host.releasePointerCapture(e.pointerId);\n }\n }),\n options,\n );\n host.addEventListener(\n \"wheel\",\n (e) =>\n this.guard(() => {\n if (!this.surface(e.target)) return;\n this.flush();\n const projected = this.project(e);\n if (!projected) return;\n const { screen } = projected;\n const unit =\n e.deltaMode === 1 ? 16 : e.deltaMode === 2 ? host.clientHeight : 1;\n if (\n this.routing.scroll(\n screen.x,\n screen.y,\n e.deltaX * unit,\n e.deltaY * unit,\n )\n )\n e.preventDefault();\n }),\n { ...options, passive: false },\n );\n window.addEventListener(\n \"pointermove\",\n (e) =>\n this.guard(() => {\n if (!this.routing.owns(e.pointerId) && !this.surface(e.target)) {\n if (e.pointerType === \"mouse\") this.releaseMouse(e.pointerId);\n if (this.routing.hasHover(e.pointerId)) {\n const data = this.data(e);\n if (data) this.routing.leave(data);\n else this.release();\n }\n return;\n }\n this.flush();\n const data = this.data(e);\n if (!data) return this.release();\n this.updateMouse(e);\n this.routing.move(data);\n }),\n options,\n );\n window.addEventListener(\n \"pointerup\",\n (e) =>\n this.guard(() => {\n if (e.pointerType === \"mouse\") this.releaseMouse(e.pointerId);\n if (this.routing.owns(e.pointerId)) {\n e.preventDefault();\n this.flush();\n const data = this.data(e);\n if (data) this.routing.up(data);\n else this.release();\n }\n }),\n options,\n );\n window.addEventListener(\n \"pointercancel\",\n (e) =>\n this.guard(() => {\n this.releaseMouse(e.pointerId);\n this.blockedMouse.delete(e.pointerId);\n this.routing.cancel(e.pointerId, false);\n }),\n options,\n );\n host.addEventListener(\n \"lostpointercapture\",\n (e) =>\n this.guard(() => {\n this.releaseMouse(e.pointerId);\n if (e.pointerType === \"mouse\" && e.buttons !== 0)\n this.blockedMouse.add(e.pointerId);\n else this.blockedMouse.delete(e.pointerId);\n this.routing.cancel(e.pointerId);\n }),\n options,\n );\n host.addEventListener(\n \"pointerleave\",\n (e) =>\n this.guard(() => {\n const data = this.data(e);\n if (data) this.routing.leave(data);\n else this.release();\n }),\n options,\n );\n window.addEventListener(\n \"blur\",\n (event) => {\n if (event.target === window) this.release();\n },\n options,\n );\n host.addEventListener(\n \"focusout\",\n (event) =>\n this.guard(() => {\n if (\n !(event.relatedTarget instanceof Node) ||\n !host.contains(event.relatedTarget) ||\n blocksGameKeyboard(event.relatedTarget)\n ) {\n this.resetMouse();\n this.routing.releaseVirtual();\n }\n }),\n options,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) this.release();\n },\n options,\n );\n for (const kind of [\"auxclick\", \"contextmenu\"] as const)\n host.addEventListener(\n kind,\n (event) => {\n if (\n this.surface(event.target) &&\n isMouseButton(event.button) &&\n this.auxiliary.has(event.button) &&\n input?.acceptsMouse(event.button)\n ) {\n event.preventDefault();\n if (kind === \"auxclick\") this.auxiliary.delete(event.button);\n }\n },\n options,\n );\n }\n private applyMouse(): void {\n let buttons = 0;\n for (const state of this.mouseStates.values()) buttons |= state;\n for (const [button, mask] of mouseMasks)\n this.mouse?.set(button, (buttons & mask) !== 0);\n }\n private releaseMouse(id: number): void {\n if (this.mouseStates.delete(id)) this.applyMouse();\n }\n private updateMouse(event: PointerEvent): void {\n if (event.pointerType !== \"mouse\" || !this.mouse) return;\n if (event.buttons === 0) this.blockedMouse.delete(event.pointerId);\n const world =\n this.routing.worldOwns(event.pointerId) &&\n !this.blockedMouse.has(event.pointerId) &&\n this.input?.liveInput;\n if (world) this.mouseStates.set(event.pointerId, event.buttons);\n else this.mouseStates.delete(event.pointerId);\n if (isMouseButton(event.button)) {\n if (world && this.input?.acceptsMouse(event.button))\n this.auxiliary.add(event.button);\n else this.auxiliary.delete(event.button);\n }\n this.applyMouse();\n }\n private resetMouse(): void {\n for (const id of this.mouseStates.keys()) this.blockedMouse.add(id);\n this.mouseStates.clear();\n this.auxiliary.clear();\n this.mouse?.clear();\n }\n private surface(target: EventTarget | null): boolean {\n return (\n target === this.host ||\n (target instanceof HTMLCanvasElement &&\n target.parentElement === this.host)\n );\n }\n private data(e: PointerEvent): PointerInfo | undefined {\n const projected = this.project(e);\n if (!projected) return undefined;\n const { screen, world, view } = projected;\n return Object.freeze({\n pointerId: e.pointerId,\n pointerType: e.pointerType,\n button: e.button,\n buttons: e.buttons,\n time: e.timeStamp / 1000,\n screen: Object.freeze(screenPoint(screen.x, screen.y)),\n world: Object.freeze(world),\n inside: containsScreenPoint(view, screen),\n });\n }\n private guard(action: () => void): void {\n try {\n action();\n } catch (error) {\n this.report(error);\n }\n }\n release(): void {\n this.resetMouse();\n this.guard(() => this.routing.release());\n }\n dispose(): void {\n this.abort.abort();\n this.offInput?.();\n this.resetMouse();\n this.mouse?.dispose();\n this.blockedMouse.clear();\n this.guard(() => this.routing.dispose());\n }\n}\n","import {\n type CanvasNativeSession,\n type CanvasNode,\n type CanvasTextSnapshot,\n type CanvasUI,\n cleanupAll,\n defaultCanvasStyle,\n intersectUI,\n type UIBounds,\n} from \"@simpludify/core\";\nexport interface NativeControlHost {\n traverse(reverse: boolean): boolean;\n wheel(event: WheelEvent): void;\n}\n/** Engine-owned native surfaces share Core focus/generation/lifetime and never route text through keys. */\nabstract class NativeControl {\n abstract readonly element: HTMLInputElement | HTMLSelectElement;\n readonly revision: number;\n protected readonly abort = new AbortController();\n private readonly unparent: () => void;\n protected constructor(\n protected readonly node: CanvasNode,\n protected readonly ui: CanvasUI,\n parentSignal: AbortSignal,\n protected readonly host: NativeControlHost,\n ) {\n this.revision = node.control?.revision ?? 0;\n const stop = () => {\n try {\n this.dispose();\n } catch (error) {\n ui.report(error);\n }\n };\n parentSignal.addEventListener(\"abort\", stop, { once: true });\n this.unparent = () => parentSignal.removeEventListener(\"abort\", stop);\n }\n get disposed(): boolean {\n return this.abort.signal.aborted;\n }\n protected get live(): boolean {\n return (\n !this.abort.signal.aborted &&\n !this.ui.disposed &&\n this.node.available &&\n this.node.control?.revision === this.revision\n );\n }\n protected run(task: () => void): void {\n if (!this.live) return;\n try {\n task();\n } catch (error) {\n this.ui.report(error);\n }\n }\n protected mount(): void {\n const el = this.element,\n signal = this.abort.signal;\n el.className = \"s-canvas-native\";\n el.addEventListener(\n \"pointerdown\",\n () => this.run(() => this.ui.stopMotion()),\n { signal },\n );\n el.addEventListener(\n \"focus\",\n () => this.run(() => this.ui.focus(this.node)),\n { signal },\n );\n el.addEventListener(\n \"blur\",\n () => {\n if (this.ui.disposed) return;\n try {\n if (this.ui.focusedNode === this.node) this.ui.focus();\n } catch (error) {\n this.ui.report(error);\n }\n },\n { signal },\n );\n el.addEventListener(\n \"wheel\",\n (e) => this.run(() => this.host.wheel(e as WheelEvent)),\n { signal, passive: false },\n );\n }\n protected tab(event: KeyboardEvent): boolean {\n if (event.code !== \"Tab\") return false;\n if (this.host.traverse(event.shiftKey)) event.preventDefault();\n return true;\n }\n abstract update(clip?: UIBounds): void;\n dispose(): void {\n if (this.abort.signal.aborted) return;\n cleanupAll(\n [\n () => this.abort.abort(),\n this.unparent,\n () => this.node.control?.native?.end(\"interrupt\"),\n () => this.element.remove(),\n ],\n \"Native editor cleanup failed\",\n );\n }\n}\n/** Native browser/OS popup supplies viewport placement, list scrolling and platform key conventions. */\nexport class CanvasNativeSelect extends NativeControl {\n readonly element = document.createElement(\"select\");\n private session: CanvasNativeSession<number> | undefined;\n private signature = \"\";\n constructor(\n node: CanvasNode,\n ui: CanvasUI,\n signal: AbortSignal,\n host: NativeControlHost,\n ) {\n super(node, ui, signal, host);\n this.mount();\n const el = this.element,\n options = { signal: this.abort.signal };\n const begin = (source: \"pointer\" | \"keyboard\") => {\n const port = node.control?.native;\n if (port?.kind === \"select\") this.session = port.begin(source);\n };\n el.addEventListener(\n \"pointerdown\",\n (e) =>\n this.run(() => {\n if (node.control?.model.readOnly) {\n e.preventDefault();\n return;\n }\n begin(\"pointer\");\n }),\n options,\n );\n el.addEventListener(\n \"keydown\",\n (e) =>\n this.run(() => {\n if (e.isComposing || e.keyCode === 229) return;\n if (this.tab(e)) return;\n if (e.code === \"Escape\") {\n this.session?.cancel();\n this.session = undefined;\n this.update();\n return;\n }\n if (node.control?.model.readOnly) {\n e.preventDefault();\n return;\n }\n begin(\"keyboard\");\n }),\n options,\n );\n el.addEventListener(\n \"input\",\n () =>\n this.run(() => {\n if (!this.session?.active) begin(\"keyboard\");\n this.session?.update(el.selectedIndex);\n }),\n options,\n );\n el.addEventListener(\n \"change\",\n () =>\n this.run(() => {\n if (!this.session?.active) begin(\"keyboard\");\n this.session?.update(el.selectedIndex);\n this.session?.commit();\n this.session = undefined;\n this.update();\n }),\n options,\n );\n }\n update(clip?: UIBounds): void {\n const model = this.node.control?.model;\n if (model?.kind !== \"select\") return;\n const el = this.element;\n const key = JSON.stringify(model.options.map((o) => [o.label, o.disabled]));\n if (key !== this.signature) {\n this.signature = key;\n el.replaceChildren(\n ...model.options.map((o, index) => {\n const option = document.createElement(\"option\");\n option.textContent = o.label;\n option.value = String(index);\n option.disabled = o.disabled;\n return option;\n }),\n );\n }\n if (!this.session?.active) el.selectedIndex = model.selectedIndex;\n el.setAttribute(\"aria-label\", this.node.text);\n el.setAttribute(\"aria-readonly\", String(model.readOnly));\n if (clip) nativeGeometry(el, this.node, this.ui, clip);\n }\n}\n/** Native caret, selection, clipboard and IME paint replace Canvas text only while focused. */\nexport class CanvasNativeText extends NativeControl {\n readonly element = document.createElement(\"input\");\n private session: CanvasNativeSession<CanvasTextSnapshot> | undefined;\n private composing = false;\n private source: \"pointer\" | \"keyboard\" = \"keyboard\";\n constructor(\n node: CanvasNode,\n ui: CanvasUI,\n signal: AbortSignal,\n host: NativeControlHost,\n ) {\n super(node, ui, signal, host);\n const el = this.element;\n el.type = \"text\";\n el.autocomplete = \"off\";\n el.spellcheck = false;\n this.mount();\n const options = { signal: this.abort.signal };\n el.addEventListener(\n \"pointerdown\",\n () =>\n this.run(() => {\n this.source = \"pointer\";\n this.begin();\n }),\n options,\n );\n el.addEventListener(\n \"blur\",\n () => {\n // Interrupted IME sessions may not deliver compositionend before this surface is reused.\n this.composing = false;\n this.session = undefined;\n this.source = \"keyboard\";\n },\n options,\n );\n el.addEventListener(\"focus\", () => this.run(() => this.begin()), options);\n el.addEventListener(\n \"compositionstart\",\n () =>\n this.run(() => {\n this.composing = true;\n this.send(true);\n }),\n options,\n );\n el.addEventListener(\n \"compositionupdate\",\n () => this.run(() => this.send()),\n options,\n );\n el.addEventListener(\n \"compositionend\",\n () =>\n this.run(() => {\n this.composing = false;\n this.send();\n }),\n options,\n );\n el.addEventListener(\n \"input\",\n () => this.run(() => this.send(true)),\n options,\n );\n for (const event of [\"select\", \"keyup\", \"pointerup\"] as const)\n el.addEventListener(event, () => this.run(() => this.send()), options);\n el.addEventListener(\n \"keydown\",\n (e) =>\n this.run(() => {\n // IME Enter/Escape/Tab remain native; keyCode 229 covers engines with compositionend before keydown.\n if (this.composing || e.isComposing || e.keyCode === 229) return;\n if (this.tab(e)) return;\n if (e.code === \"Escape\" || e.code === \"Enter\") {\n e.preventDefault();\n e.stopPropagation();\n if (e.code === \"Escape\") this.session?.cancel();\n else {\n this.send();\n this.session?.commit();\n }\n this.session = undefined;\n this.update();\n } else if (node.control?.keys.includes(e.code)) {\n e.preventDefault();\n node.control.key(e.code);\n this.session = undefined;\n this.update();\n }\n }),\n options,\n );\n }\n private begin(): void {\n if (this.session?.active) return;\n const port = this.node.control?.native;\n if (port?.kind === \"text\") this.session = port.begin(this.source);\n }\n private send(begin = false): void {\n if (document.activeElement !== this.element) return;\n if (begin) this.begin();\n if (!this.session?.active) return;\n const el = this.element;\n this.session?.update({\n text: el.value,\n selectionStart: el.selectionStart ?? 0,\n selectionEnd: el.selectionEnd ?? 0,\n direction: el.selectionDirection ?? \"none\",\n composing: this.composing,\n });\n }\n update(clip?: UIBounds): void {\n const model = this.node.control?.model;\n if (model?.kind !== \"text\") return;\n const el = this.element;\n if (!this.session?.active && el.value !== model.text) el.value = model.text;\n el.placeholder = model.placeholder;\n el.readOnly = model.readOnly;\n el.inputMode = model.inputMode;\n if (model.maxLength === undefined || model.maxLength > 2147483647)\n el.removeAttribute(\"maxlength\");\n else el.maxLength = model.maxLength;\n if (model.numeric) {\n el.setAttribute(\"role\", \"spinbutton\");\n el.setAttribute(\"aria-valuemin\", String(model.numeric.min));\n el.setAttribute(\"aria-valuemax\", String(model.numeric.max));\n el.setAttribute(\"aria-valuenow\", String(model.numeric.value));\n }\n el.setAttribute(\"aria-label\", this.node.text);\n el.setAttribute(\"aria-readonly\", String(model.readOnly));\n if (clip) nativeGeometry(el, this.node, this.ui, clip);\n }\n}\n/** Keep full native geometry; clip without shifting text, selection or the IME anchor. */\nexport function nativeGeometry(\n el: HTMLInputElement | HTMLSelectElement,\n node: CanvasNode,\n ui: CanvasUI,\n clip: UIBounds,\n): void {\n const b = node.bounds,\n c = intersectUI(b, clip),\n scale = ui.scale,\n style = node.style;\n el.disabled =\n !node.available ||\n c.width <= 0 ||\n c.height <= 0 ||\n node.style.pointerEvents !== \"auto\";\n const background = style.background ?? 0x23594e;\n const color = `#${style.color.toString(16).padStart(6, \"0\")}`;\n el.style.cssText = `left:${b.x * scale}px;top:${b.y * scale}px;width:${b.width * scale}px;height:${b.height * scale}px;padding:${style.padding * scale}px;font-size:${style.fontSize * scale}px;--s-native-color:${color};--s-native-background:#${background.toString(16).padStart(6, \"0\")};color-scheme:${((background >> 16) * 0.2126 + ((background >> 8) & 255) * 0.7152 + (background & 255) * 0.0722) > 128 ? \"light\" : \"dark\"};clip-path:inset(${Math.max(0, c.y - b.y) * scale}px ${Math.max(0, b.x + b.width - c.x - c.width) * scale}px ${Math.max(0, b.y + b.height - c.y - c.height) * scale}px ${Math.max(0, c.x - b.x) * scale}px);`;\n el.style.fontFamily = node.inheritsFont\n ? `var(--s-font, ${defaultCanvasStyle.fontFamily})`\n : style.fontFamily;\n if (el.disabled && document.activeElement === el) el.blur();\n}\n\n/** Native editors must not cover later Canvas hit surfaces or overlay scrollbars. */\nexport function clipNativeRegions(\n element: HTMLInputElement | HTMLSelectElement,\n node: CanvasNode,\n ui: CanvasUI,\n clip: UIBounds,\n covers: readonly UIBounds[],\n): void {\n let regions: UIBounds[] = [intersectUI(node.bounds, clip)];\n for (const cover of covers) {\n const next: UIBounds[] = [];\n for (const region of regions) {\n const cut = intersectUI(region, cover);\n if (cut.width <= 0 || cut.height <= 0) {\n next.push(region);\n continue;\n }\n const right = region.x + region.width,\n bottom = region.y + region.height;\n if (cut.y > region.y)\n next.push({\n x: region.x,\n y: region.y,\n width: region.width,\n height: cut.y - region.y,\n });\n if (cut.y + cut.height < bottom)\n next.push({\n x: region.x,\n y: cut.y + cut.height,\n width: region.width,\n height: bottom - cut.y - cut.height,\n });\n if (cut.x > region.x)\n next.push({\n x: region.x,\n y: cut.y,\n width: cut.x - region.x,\n height: cut.height,\n });\n if (cut.x + cut.width < right)\n next.push({\n x: cut.x + cut.width,\n y: cut.y,\n width: right - cut.x - cut.width,\n height: cut.height,\n });\n }\n regions = next;\n if (!regions.length) break;\n }\n const scale = ui.scale,\n b = node.bounds;\n const path = regions\n .filter((r) => r.width > 0 && r.height > 0)\n .map((r) => {\n const x = (r.x - b.x) * scale,\n y = (r.y - b.y) * scale,\n w = r.width * scale,\n h = r.height * scale;\n return `M${x} ${y}h${w}v${h}h${-w}Z`;\n })\n .join(\" \");\n element.style.clipPath = path ? `path(\"${path}\")` : \"inset(100%)\";\n if (!path) {\n element.disabled = true;\n if (document.activeElement === element) element.blur();\n }\n}\n","import type {\n CanvasNode,\n CanvasUI,\n PointerRouting,\n UIBounds,\n} from \"@simpludify/core\";\nimport {\n canvasControlText,\n canvasHoverHighlight,\n canvasOpacity,\n canvasScrollbars,\n canvasSliderGeometry,\n cleanupAll,\n defaultCanvasStyle,\n EngineError,\n intersectUI,\n wrapCanvasText,\n} from \"@simpludify/core\";\nimport {\n CanvasTextMetrics,\n Container,\n Graphics,\n Text,\n TextStyle,\n} from \"pixi.js\";\nimport {\n CanvasNativeSelect,\n CanvasNativeText,\n clipNativeRegions,\n} from \"./canvas-native\";\nimport { registerGameButton } from \"./ui-keyboard\";\n\nexport interface CanvasPresentation {\n update(width: number, height: number): void;\n focus(node: CanvasNode): void;\n dispose(): void;\n}\ninterface Entry {\n display: Container;\n background: Graphics;\n text?: Text;\n mask: Graphics;\n button?: HTMLButtonElement | HTMLSelectElement | HTMLInputElement;\n native?: CanvasNativeSelect | CanvasNativeText;\n label?: HTMLSpanElement;\n abort: AbortController;\n signature?: string;\n paintSignature?: string;\n maskSignature?: string;\n scrollbar?: Graphics;\n scrollbarSignature?: string;\n textStyleKey?: string;\n}\n/** Pixi rendering and a small native focus mirror share the same resolved boxes. */\nexport class CanvasVisual implements CanvasPresentation {\n readonly display = new Container();\n private readonly element = document.createElement(\"div\");\n private readonly entries = new Map<CanvasNode, Entry>();\n private readonly metrics = new Map<\n CanvasNode,\n {\n key: string;\n values: Map<number, { text: string; width: number; height: number }>;\n }\n >();\n private dirty = true;\n private defaultFont: string = defaultCanvasStyle.fontFamily;\n private dead = false;\n private active = false;\n private cacheResolution: number | undefined;\n private mirroredFocus: CanvasNode | undefined;\n private readonly subscriptions: Array<() => void> = [];\n private syncs = 0;\n constructor(\n private readonly ui: CanvasUI,\n private readonly host: HTMLElement,\n private readonly routing: PointerRouting,\n private readonly resources: {\n graphics(graphics: Graphics, context: number | undefined): void;\n text(text: Text, key: string | undefined): void;\n changedText(key: string): void;\n cacheResolution(): number | undefined;\n },\n ) {\n this.display.eventMode = \"none\";\n this.display.zIndex = 1;\n this.element.className = \"s-canvas-accessibility\";\n this.element.setAttribute(\"aria-label\", \"Game controls\");\n const nativeEvents = new AbortController();\n const interrupt = () => {\n try {\n cleanupAll(\n [\n ...[...this.entries.values()]\n .filter((e) => e.native)\n .map((entry) => () => {\n try {\n entry.native?.dispose();\n } finally {\n entry.button?.blur();\n }\n }),\n () => {\n if (!this.ui.disposed) this.ui.focus();\n },\n ],\n \"Native controls interruption failed\",\n );\n } catch (error) {\n this.ui.report(error);\n } finally {\n this.dirty = true;\n }\n };\n window.addEventListener(\n \"blur\",\n (event) => {\n if (event.target === window) interrupt();\n },\n { signal: nativeEvents.signal },\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) interrupt();\n },\n { signal: nativeEvents.signal },\n );\n this.host.addEventListener(\n \"keydown\",\n (event) => {\n if (\n !this.active ||\n event.target !== this.host ||\n event.code !== \"Tab\" ||\n event.shiftKey ||\n event.isComposing ||\n event.keyCode === 229\n )\n return;\n this.update(this.host.clientWidth, this.host.clientHeight);\n const next = this.ui.focusNext();\n if (next) {\n event.preventDefault();\n this.update(this.host.clientWidth, this.host.clientHeight);\n this.focus(next);\n }\n },\n { signal: nativeEvents.signal },\n );\n this.subscriptions.push(() => nativeEvents.abort());\n this.subscriptions.push(\n ui.subscribe(() => {\n this.dirty = true;\n }),\n ui.onDispose(() => this.dispose()),\n );\n }\n get diagnostics() {\n return {\n nodes: this.entries.size,\n visibleNodes: [...this.entries.values()].filter((e) => e.display.visible)\n .length,\n buttons: [...this.entries.values()].filter((e) => e.button).length,\n syncs: this.syncs,\n textMetrics: this.metrics.size,\n };\n }\n private measure = (node: CanvasNode, contentWidth = Infinity) => {\n const { fontSize, textWrap } = node.style;\n const fontFamily = this.fontFamily(node);\n const content = canvasControlText(node);\n const adornment = node.control?.model.kind === \"checkbox\" ? 30 : 0;\n const key = JSON.stringify([\n content,\n fontSize,\n fontFamily,\n textWrap,\n adornment,\n ]);\n let cache = this.metrics.get(node);\n if (cache?.key !== key) {\n cache = { key, values: new Map() };\n this.metrics.set(node, cache);\n }\n const width = textWrap ? Math.max(0, contentWidth - adornment) : Infinity;\n const previous = cache.values.get(width);\n if (previous) return previous;\n const style = new TextStyle({ fontSize, fontFamily, wordWrap: false });\n const text = Number.isFinite(width)\n ? wrapCanvasText(\n content,\n width,\n (value) => CanvasTextMetrics.measureText(value || \" \", style).width,\n )\n : content.replace(/\\r\\n?/g, \"\\n\");\n const measured = CanvasTextMetrics.measureText(text || \" \", style);\n const result = {\n text,\n width: (text ? measured.width : 0) + adornment,\n height: measured.height,\n };\n if (cache.values.size >= 8)\n cache.values.delete(cache.values.keys().next().value as number);\n cache.values.set(width, result);\n return result;\n };\n private clearCache(): void {\n if (this.cacheResolution === undefined) return;\n // Return the lease intact: unloading a pooled source alone leaves its framebuffer stale on reuse.\n this.display.cacheAsTexture(false);\n this.cacheResolution = undefined;\n }\n beforeResolutionChange(): void {\n this.clearCache();\n this.dirty = true;\n for (const entry of this.entries.values())\n if (entry.text && !entry.text.destroyed)\n this.resources.changedText(entry.text.styleKey);\n }\n focus(node: CanvasNode): void {\n if (node.available)\n this.entries.get(node)?.button?.focus({ preventScroll: true });\n }\n private native(\n node: CanvasNode,\n signal: AbortSignal,\n ): CanvasNativeSelect | CanvasNativeText {\n const host = {\n traverse: (reverse: boolean) => {\n const next = this.ui.focusNext(reverse);\n if (!next) return false;\n this.update(this.host.clientWidth, this.host.clientHeight);\n this.focus(next);\n return true;\n },\n wheel: (event: WheelEvent) => {\n const rect = this.host.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return;\n const unit =\n event.deltaMode === 1\n ? 16\n : event.deltaMode === 2\n ? this.host.clientHeight\n : 1;\n if (\n this.routing.scroll(\n ((event.clientX - rect.x) * this.host.clientWidth) / rect.width,\n ((event.clientY - rect.y) * this.host.clientHeight) / rect.height,\n event.deltaX * unit,\n event.deltaY * unit,\n )\n )\n event.preventDefault();\n },\n };\n return node.control?.native?.kind === \"select\"\n ? new CanvasNativeSelect(node, this.ui, signal, host)\n : new CanvasNativeText(node, this.ui, signal, host);\n }\n private button(node: CanvasNode): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n const signal = this.entries.get(node)?.abort.signal;\n if (!signal)\n throw new EngineError(\"INVALID_UI\", \"Missing Canvas button entry\");\n const options = { signal };\n registerGameButton(button, signal);\n const run = (task: () => void) => {\n try {\n task();\n } catch (error) {\n this.ui.report(error);\n }\n };\n button.addEventListener(\n \"focus\",\n () =>\n run(() => {\n this.ui.focus(node);\n }),\n options,\n );\n button.addEventListener(\n \"blur\",\n () =>\n run(() => {\n if (this.ui.focusedNode === node) this.ui.focus();\n this.routing.releaseKeys(node);\n }),\n options,\n );\n button.addEventListener(\n \"keydown\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (node.control?.keys.includes(event.code)) {\n event.preventDefault();\n run(() => {\n this.routing.controlKey(node, event.code);\n });\n return;\n }\n if (this.ui.scrollKey(node, event.code)) {\n event.preventDefault();\n return;\n }\n if (event.code === \"Tab\") {\n run(() => {\n const next = this.ui.focusNext(event.shiftKey);\n if (next) {\n event.preventDefault();\n this.update(this.host.clientWidth, this.host.clientHeight);\n this.focus(next);\n }\n });\n return;\n }\n if (event.code !== \"Enter\" && event.code !== \"Space\") return;\n event.preventDefault();\n if (!event.repeat)\n run(() => {\n this.routing.key(node, event.code, true);\n });\n },\n options,\n );\n button.addEventListener(\n \"keyup\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.code !== \"Enter\" && event.code !== \"Space\") return;\n event.preventDefault();\n run(() => {\n this.routing.key(node, event.code, false);\n });\n },\n options,\n );\n // AT/automation can activate the semantic control without a physical key.\n button.addEventListener(\n \"click\",\n () =>\n run(() => {\n if (node.kind !== \"hold-button\" && node.available)\n node.activate(\"accessibility\");\n }),\n options,\n );\n return button;\n }\n private updateButton(entry: Entry, node: CanvasNode, clip: UIBounds): void {\n if (entry.native) {\n entry.native.update(clip);\n return;\n }\n if (!entry.button) return;\n const button = entry.button,\n b = node.bounds,\n s = this.ui.scale,\n c = intersectUI(b, clip);\n if (button.textContent !== node.text) button.textContent = node.text;\n // Busy Canvas controls leave Core focus/Tab order. Hand off before native disable\n // would blur to the page and clear unrelated held gameplay keys.\n if (node.busy && document.activeElement === button)\n this.host.focus({ preventScroll: true });\n button.disabled =\n !node.available ||\n c.width <= 0 ||\n c.height <= 0 ||\n node.style.pointerEvents !== \"auto\";\n if (node.kind === \"hold-button\")\n button.setAttribute(\"aria-pressed\", String(node.held));\n const model = node.control?.model;\n if (model) {\n button.setAttribute(\"role\", model.kind);\n button.setAttribute(\"aria-label\", node.text);\n button.setAttribute(\"aria-readonly\", String(model.readOnly));\n if (model.kind === \"checkbox\")\n button.setAttribute(\"aria-checked\", String(model.checked));\n else if (model.kind === \"slider\") {\n button.setAttribute(\"aria-orientation\", \"horizontal\");\n button.setAttribute(\"aria-valuemin\", String(model.min));\n button.setAttribute(\"aria-valuemax\", String(model.max));\n button.setAttribute(\"aria-valuenow\", String(model.value));\n }\n }\n button.setAttribute(\"aria-busy\", String(node.busy));\n button.style.cssText = `left:${c.x * s}px;top:${c.y * s}px;width:${c.width * s}px;height:${c.height * s}px;`;\n if (button.disabled && document.activeElement === button) button.blur();\n }\n private fontFamily(node: CanvasNode): string {\n return node.inheritsFont ? this.defaultFont : node.style.fontFamily;\n }\n update(width: number, height: number): void {\n if (this.dead || this.ui.disposed) return;\n const family =\n this.host.style.getPropertyValue(\"--s-font\").trim() ||\n defaultCanvasStyle.fontFamily;\n if (this.defaultFont !== family) {\n this.defaultFont = family;\n this.ui.invalidate(true);\n }\n const layout = this.ui.layout(width, height, this.measure);\n if (!this.active) {\n this.host.append(this.element);\n this.active = true;\n }\n if (!this.dirty && !layout) return;\n this.dirty = false;\n this.syncs++;\n this.display.scale.set(this.ui.scale);\n const visited = new Set<CanvasNode>(),\n buttons: HTMLElement[] = [];\n const paint: {\n node?: CanvasNode;\n box: UIBounds;\n native?: CanvasNativeSelect | CanvasNativeText;\n clip?: UIBounds;\n }[] = [];\n let order = 0;\n let scrollVisible = false;\n let restoreNativeFocus: CanvasNode | undefined;\n this.ui.walk(\n (node, parentClip) => {\n const measuredText =\n node.kind === \"panel\"\n ? undefined\n : this.measure(\n node,\n Math.max(0, node.bounds.width - node.style.padding * 2),\n );\n const clip =\n measuredText &&\n (measuredText.width > node.bounds.width - node.style.padding * 2 ||\n measuredText.height > node.bounds.height - node.style.padding * 2)\n ? intersectUI(parentClip, node.bounds)\n : parentClip;\n visited.add(node);\n let entry = this.entries.get(node);\n if (!entry) {\n const display = new Container(),\n background = new Graphics(),\n mask = new Graphics();\n display.addChild(background);\n this.display.addChild(display, mask);\n mask.renderable = false;\n entry = { display, background, mask, abort: new AbortController() };\n this.entries.set(node, entry);\n if (node.interactive) {\n if (node.control?.native) {\n entry.native = this.native(node, entry.abort.signal);\n entry.button = entry.native.element;\n } else entry.button = this.button(node);\n this.element.append(entry.button);\n } else if (node.kind === \"label\") {\n entry.label = document.createElement(\"span\");\n entry.label.className = \"s-canvas-label\";\n const semantics = node.labelSemantics;\n if (semantics?.role) {\n entry.label.setAttribute(\"role\", semantics.role);\n if (semantics.role === \"heading\")\n entry.label.setAttribute(\"aria-level\", String(semantics.level));\n else {\n entry.label.setAttribute(\n \"aria-live\",\n semantics.role === \"alert\" ? \"assertive\" : \"polite\",\n );\n entry.label.setAttribute(\"aria-atomic\", \"true\");\n }\n }\n this.element.append(entry.label);\n }\n if (node.kind !== \"panel\") {\n entry.text = new Text({ text: node.text });\n display.addChild(entry.text);\n }\n }\n if (\n entry.native &&\n (entry.native.disposed ||\n entry.native.revision !== node.control?.revision)\n ) {\n if (document.activeElement === entry.button)\n restoreNativeFocus = node;\n entry.native.dispose();\n entry.native = this.native(node, entry.abort.signal);\n entry.button = entry.native.element;\n this.element.append(entry.button);\n delete entry.signature;\n }\n this.display.setChildIndex(entry.display, order++);\n this.display.setChildIndex(entry.mask, order++);\n if (node.style.pointerEvents === \"auto\")\n paint.push({\n node,\n box: intersectUI(node.bounds, clip),\n ...(entry.native ? { native: entry.native, clip } : {}),\n });\n if (entry.button) buttons.push(entry.button);\n if (entry.label) {\n buttons.push(entry.label);\n if (entry.label.textContent !== node.text)\n entry.label.textContent = node.text;\n entry.label.setAttribute(\n \"aria-hidden\",\n String(canvasOpacity(node) === 0),\n );\n }\n const b = node.bounds,\n s = node.style;\n const fontFamily = this.fontFamily(node);\n const scrollBox = intersectUI(b, clip);\n if (\n node.style.scroll &&\n scrollBox.width > 0 &&\n scrollBox.height > 0 &&\n canvasOpacity(node) > 0\n )\n scrollVisible = true;\n let enabled = !node.busy;\n for (let p: CanvasNode | undefined = node; p; p = p.parent)\n enabled &&= p.enabled;\n const signature = JSON.stringify([\n node.paintRevision,\n fontFamily,\n b.x,\n b.y,\n b.width,\n b.height,\n clip.x,\n clip.y,\n clip.width,\n clip.height,\n node.available,\n enabled,\n this.ui.scale,\n canvasOpacity(node),\n ]);\n if (entry.signature === signature) return;\n entry.signature = signature;\n entry.display.position.set(b.x, b.y);\n const paintBox = intersectUI(b, clip);\n const visible =\n paintBox.width > 0 && paintBox.height > 0 && canvasOpacity(node) > 0;\n entry.display.visible = visible;\n const clipped =\n clip.x !== 0 ||\n clip.y !== 0 ||\n clip.width !== width / this.ui.scale ||\n clip.height !== height / this.ui.scale;\n entry.display.mask = clipped ? entry.mask : null;\n // StencilMaskPipe collects renderables; includeInBuild is managed by Pixi.\n entry.mask.renderable = clipped && visible;\n const maskSignature = JSON.stringify([\n clipped,\n clip.x,\n clip.y,\n clip.width,\n clip.height,\n ]);\n if (clipped && entry.maskSignature !== maskSignature)\n entry.mask\n .clear()\n .rect(clip.x, clip.y, clip.width, clip.height)\n .fill(0xffffff);\n entry.maskSignature = maskSignature;\n const paintSignature = JSON.stringify([\n node.paintRevision,\n fontFamily,\n b.width,\n b.height,\n enabled,\n ]);\n if (entry.paintSignature !== paintSignature) {\n entry.paintSignature = paintSignature;\n entry.background.visible =\n s.background !== undefined || node.interactive;\n entry.background.clear();\n if (s.background !== undefined || node.interactive) {\n entry.background\n .roundRect(\n 0,\n 0,\n b.width,\n b.height,\n Math.min(s.radius, b.width / 2, b.height / 2),\n )\n .fill(s.background ?? 0x23594e);\n if (node.held)\n entry.background\n .roundRect(0, 0, b.width, b.height, s.radius)\n .fill({ color: 0xffffff, alpha: 0.18 });\n else if (canvasHoverHighlight(node))\n entry.background\n .roundRect(0, 0, b.width, b.height, s.radius)\n .fill({ color: 0xffffff, alpha: 0.08 });\n if (node.focused)\n entry.background\n .roundRect(\n 2,\n 2,\n Math.max(0, b.width - 4),\n Math.max(0, b.height - 4),\n s.radius,\n )\n .stroke({ color: 0xffd36b, width: 3 });\n }\n const model = node.control?.model;\n if (model?.kind === \"checkbox\") {\n const size = Math.min(\n 20,\n Math.max(0, b.height - 8),\n Math.max(0, b.width - 8),\n ),\n x = Math.min(s.padding, b.width - size),\n y = (b.height - size) / 2;\n entry.background\n .rect(x, y, size, size)\n .fill({ color: s.color, alpha: 0.15 })\n .stroke({ color: s.color, width: 2 });\n if (model.checked)\n entry.background\n .moveTo(x + size * 0.2, y + size * 0.5)\n .lineTo(x + size * 0.43, y + size * 0.75)\n .lineTo(x + size * 0.83, y + size * 0.22)\n .stroke({ color: s.color, width: 3 });\n } else if (model?.kind === \"slider\") {\n const geometry = canvasSliderGeometry(node);\n if (geometry) {\n const t = geometry.track,\n thumb = geometry.thumb;\n entry.background\n .rect(t.x - b.x, t.y - b.y, t.width, t.height)\n .fill({ color: s.color, alpha: 0.25 });\n entry.background\n .rect(t.x - b.x, t.y - b.y, t.width * model.ratio, t.height)\n .fill(s.color);\n entry.background\n .circle(\n thumb.x - b.x + thumb.width / 2,\n thumb.y - b.y + thumb.height / 2,\n thumb.width / 2,\n )\n .fill(s.color);\n }\n }\n\n if (entry.text) {\n entry.text.visible =\n !entry.native ||\n (node.control?.model.kind === \"text\" && !node.focused);\n const m = measuredText ?? this.measure(node);\n if (entry.text.text !== m.text) {\n this.resources.changedText(entry.text.styleKey);\n entry.text.text = m.text;\n }\n const textStyleKey = JSON.stringify([\n fontFamily,\n s.fontSize,\n s.color,\n ]);\n if (entry.textStyleKey !== textStyleKey) {\n this.resources.changedText(entry.text.styleKey);\n entry.textStyleKey = textStyleKey;\n entry.text.style = {\n fontFamily,\n fontSize: s.fontSize,\n fill: s.color,\n };\n }\n entry.text.position.set(\n model?.kind === \"checkbox\"\n ? s.padding + 30\n : model?.kind === \"slider\"\n ? s.padding\n : node.interactive\n ? Math.max(s.padding, (b.width - m.width) / 2)\n : s.padding,\n model?.kind === \"slider\"\n ? s.padding\n : node.interactive\n ? Math.max(s.padding, (b.height - m.height) / 2)\n : s.padding,\n );\n }\n }\n const opacity =\n canvasOpacity(node) *\n (enabled ? (node.control?.model.readOnly ? 0.7 : 1) : 0.45);\n entry.display.alpha = opacity;\n this.updateButton(entry, node, clip);\n if (entry.native) entry.native.element.style.opacity = String(opacity);\n },\n (node, clip) => {\n const entry = this.entries.get(node);\n if (!entry) return;\n const bars = canvasScrollbars(node);\n for (const bar of bars)\n paint.push({ box: intersectUI(bar.track, clip) });\n if (!entry.scrollbar && bars.length) {\n entry.scrollbar = new Graphics();\n entry.scrollbar.eventMode = \"none\";\n this.display.addChild(entry.scrollbar);\n }\n const display = entry.scrollbar;\n if (!display) return;\n this.display.setChildIndex(display, order++);\n const viewport = intersectUI(node.bounds, clip);\n display.visible =\n bars.length > 0 &&\n viewport.width > 0 &&\n viewport.height > 0 &&\n canvasOpacity(node) > 0;\n display.mask = entry.display.mask;\n const signature = JSON.stringify([\n node.style.color,\n clip.x,\n clip.y,\n clip.width,\n clip.height,\n ...bars.map((b) => [b.axis, b.track, b.thumb, b.enabled]),\n ]);\n if (entry.scrollbarSignature === signature) return;\n entry.scrollbarSignature = signature;\n display.clear();\n for (const bar of bars) {\n const t = bar.track,\n b = bar.thumb;\n if (t.width <= 0 || t.height <= 0) continue;\n display\n .roundRect(\n t.x,\n t.y,\n t.width,\n t.height,\n Math.min(4, t.width / 2, t.height / 2),\n )\n .fill({ color: node.style.color, alpha: 0.13 });\n display\n .roundRect(\n b.x,\n b.y,\n b.width,\n b.height,\n Math.min(4, b.width / 2, b.height / 2),\n )\n .fill({ color: node.style.color, alpha: bar.enabled ? 0.7 : 0.25 });\n }\n },\n );\n for (let i = 0; i < paint.length; i++) {\n const item = paint[i];\n if (item?.native && item.node && item.clip)\n clipNativeRegions(\n item.native.element,\n item.node,\n this.ui,\n item.clip,\n paint.slice(i + 1).map((p) => p.box),\n );\n }\n for (const [node, entry] of this.entries)\n if (!visited.has(node)) {\n this.entries.delete(node);\n this.metrics.delete(node);\n this.releaseEntry(entry);\n }\n // Move siblings around the active element: detaching it would end selection/IME.\n let anchor: Element | null = null;\n for (let i = buttons.length - 1; i >= 0; i--) {\n const button = buttons[i];\n if (!button) continue;\n if (\n button !== document.activeElement &&\n button.nextElementSibling !== anchor\n )\n this.element.insertBefore(button, anchor);\n anchor = button;\n }\n const focused = this.ui.focusedNode;\n if (!focused && this.mirroredFocus) {\n const previous = this.entries.get(this.mirroredFocus)?.button;\n if (previous && document.activeElement === previous) previous.blur();\n }\n const button = focused ? this.entries.get(focused)?.button : undefined;\n if (\n (focused !== this.mirroredFocus || focused === restoreNativeFocus) &&\n button &&\n !button.disabled &&\n document.activeElement !== button\n )\n button.focus({ preventScroll: true });\n this.mirroredFocus = this.ui.focusedNode;\n // Bounded scroll screens amortize stencil/text work across unchanged world frames.\n const ratio = this.resources.cacheResolution();\n const cache =\n scrollVisible &&\n ratio !== undefined &&\n Math.max(width, height) * ratio <= 4096\n ? ratio * this.ui.scale\n : undefined;\n if (cache !== this.cacheResolution) {\n this.clearCache();\n this.cacheResolution = cache;\n if (cache !== undefined)\n this.display.cacheAsTexture({ resolution: cache });\n }\n if (cache !== undefined) this.display.updateCacheTexture();\n }\n private releaseEntry(entry: Entry): void {\n const backgroundContext = entry.background.context?.uid,\n maskContext = entry.mask.context?.uid;\n const scrollbarContext = entry.scrollbar?.context?.uid;\n const textKey =\n entry.text && !entry.text.destroyed ? entry.text.styleKey : undefined;\n cleanupAll(\n [\n () => entry.abort.abort(),\n () => entry.native?.dispose(),\n () => entry.button?.remove(),\n () => entry.label?.remove(),\n // These Graphics contexts and Text styles are private to this presentation.\n // An options object with only children:true does not destroy owned GraphicsContext in Pixi8.\n () => entry.background.destroy({ context: true }),\n () => entry.scrollbar?.destroy({ context: true }),\n () => entry.text?.destroy({ style: true }),\n () => entry.display.destroy({ children: true }),\n () => entry.mask.destroy({ context: true }),\n () => this.resources.graphics(entry.background, backgroundContext),\n () => this.resources.graphics(entry.mask, maskContext),\n () => {\n if (entry.scrollbar)\n this.resources.graphics(entry.scrollbar, scrollbarContext);\n },\n () => {\n if (entry.text) this.resources.text(entry.text, textKey);\n },\n ],\n \"Canvas visual entry cleanup failed\",\n );\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const entries = [...this.entries.values()];\n this.entries.clear();\n this.metrics.clear();\n cleanupAll(\n [\n ...this.subscriptions.splice(0),\n ...entries.map((e) => () => this.releaseEntry(e)),\n () => this.clearCache(),\n () => this.display.destroy({ children: true }),\n () => this.element.remove(),\n ],\n \"Canvas visual cleanup failed\",\n );\n }\n}\n","import {\n cleanupAll,\n type GeometryTilemap,\n type ViewTransform,\n} from \"@simpludify/core\";\nimport { Container, Graphics } from \"pixi.js\";\n\n/** Visible-cell Graphics with no image/UV contract; no full Grid walk per frame. */\nexport class GeometryTilemapVisual {\n readonly display = new Container();\n readonly graphics = new Map<number, Graphics>();\n readonly stats = {\n visitedCells: 0,\n updatedTiles: 0,\n createdGraphics: 0,\n destroyedGraphics: 0,\n };\n order = 0;\n depth = NaN;\n disposed = false;\n private readonly dirty = new Set<number>();\n private visibleCells = new Set<number>();\n private invalid = true;\n private boundsKey = \"\";\n private readonly off: () => void;\n private readonly offDispose: () => void;\n constructor(\n readonly map: GeometryTilemap,\n private readonly released: () => void,\n ) {\n this.off = map.onTilesChanged((index) => {\n if (index === null) {\n this.invalid = true;\n this.bulk = true;\n this.dirty.clear();\n } else if (this.visibleCells.has(index)) this.dirty.add(index);\n });\n this.offDispose = map.onDispose(() => this.dispose());\n }\n private remove(index: number): void {\n const g = this.graphics.get(index);\n if (g) {\n this.graphics.delete(index);\n g.destroy({ context: true });\n this.stats.destroyedGraphics++;\n }\n }\n private cell(x: number, y: number): void {\n this.stats.visitedCells++;\n const index = y * this.map.width + x,\n color = this.map.get(x, y);\n if (color === null) {\n this.remove(index);\n return;\n }\n let g = this.graphics.get(index);\n if (!g) {\n g = new Graphics();\n this.graphics.set(index, g);\n this.display.addChild(g);\n this.stats.createdGraphics++;\n }\n g.clear()\n .poly(\n this.map.geometry.vertices(x, y).flatMap((p) => [p.x, p.y]),\n true,\n )\n .fill(color);\n this.stats.updatedTiles++;\n }\n render(view: ViewTransform, enabled = true): void {\n if (this.disposed) return;\n const m = this.map;\n this.display.position.set(m.x, m.y);\n this.display.visible = enabled && m.visible && m.enabled;\n if (!this.display.visible) {\n this.invalid = true;\n this.bulk = true;\n this.dirty.clear();\n return;\n }\n const c = view.clip;\n const bounds = {\n x: (c.x - view.x) / view.scale,\n y: (c.y - view.y) / view.scale,\n width: c.width / view.scale,\n height: c.height / view.scale,\n };\n const key = [\n bounds.x - m.x,\n bounds.y - m.y,\n bounds.width,\n bounds.height,\n ].join(\",\");\n if (this.invalid || key !== this.boundsKey) {\n this.boundsKey = key;\n this.invalid = false;\n const retained = new Set<number>();\n for (const p of m.tilesInBounds(bounds)) {\n const index = p.y * m.width + p.x;\n retained.add(index);\n if (!this.graphics.has(index) || this.dirty.has(index) || this.bulk)\n this.cell(p.x, p.y);\n }\n for (const index of this.graphics.keys())\n if (!retained.has(index)) this.remove(index);\n this.visibleCells = retained;\n this.bulk = false;\n } else\n for (const index of this.dirty) {\n const x = index % m.width,\n y = Math.floor(index / m.width),\n b = m.tileBounds(x, y);\n if (\n b.x <= bounds.x + bounds.width &&\n b.x + b.width >= bounds.x &&\n b.y <= bounds.y + bounds.height &&\n b.y + b.height >= bounds.y\n )\n this.cell(x, y);\n }\n this.dirty.clear();\n }\n private bulk = false;\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.stats.destroyedGraphics += this.graphics.size;\n this.graphics.clear();\n this.visibleCells.clear();\n this.dirty.clear();\n cleanupAll(\n [\n this.off,\n this.offDispose,\n () => this.display.removeFromParent(),\n () => this.display.destroy({ children: true, context: true }),\n this.released,\n ],\n \"Geometry tilemap cleanup failed\",\n );\n }\n}\n","import type { Graphics, Text } from \"pixi.js\";\n\ninterface Hash {\n items: Record<string, unknown>;\n}\ninterface PinnedRenderer {\n renderPipes: {\n graphics?: { _managedGraphics?: Hash };\n text?: { _managedTexts?: Hash };\n };\n graphicsContext?: { _managedContexts?: Hash };\n canvasText?: { _activeTextures?: Record<string, unknown> };\n}\nfunction drop(\n hash: Hash | undefined,\n id: number,\n resource?: Graphics | Text,\n): void {\n if (!hash) return;\n const value = hash.items[id];\n if (value === null || (resource?.destroyed && value === resource))\n delete hash.items[id];\n}\n/** Renderer-local compatibility for pinned Pixi8.22. Drop only destroyed UI owners/null bookkeeping.\n * CanvasGraphicsPipe has no GPU data for its Graphics; GCManagedHash.remove returns early there.\n * Text/style keys otherwise accumulate null entries after dynamic text updates. */\nexport function releaseUIGraphics(\n renderer: unknown,\n graphics: Graphics,\n context: number | undefined,\n): void {\n if (!graphics.destroyed) return;\n const r = renderer as PinnedRenderer;\n drop(r.renderPipes.graphics?._managedGraphics, graphics.uid, graphics);\n if (context !== undefined) drop(r.graphicsContext?._managedContexts, context);\n}\nexport function releaseUIText(\n renderer: unknown,\n text: Text,\n key: string | undefined,\n): void {\n if (!text.destroyed) return;\n const r = renderer as PinnedRenderer;\n drop(r.renderPipes.text?._managedTexts, text.uid, text);\n if (key !== undefined && r.canvasText?._activeTextures?.[key] === null)\n delete r.canvasText._activeTextures[key];\n}\n/** Called after rendering so replaced text has released its old managed texture. Never drops a live key. */\nexport function pruneUITextKeys(renderer: unknown, keys: Set<string>): void {\n const textures = (renderer as PinnedRenderer).canvasText?._activeTextures;\n for (const key of keys) {\n if (textures?.[key] != null) continue;\n if (textures?.[key] === null) delete textures[key];\n keys.delete(key);\n }\n}\n","import { cleanupAll, type Tilemap, type ViewTransform } from \"@simpludify/core\";\nimport { Container, Sprite, type Texture } from \"pixi.js\";\nimport type { ImageLease } from \"./shared-images\";\n\n/** Renderer-owned sparse visible set; sheet pixels are owned by SharedImages. */\nexport class TilemapVisual {\n readonly display = new Container();\n readonly sprites = new Map<number, Sprite>();\n order = 0;\n depth = NaN;\n controller: AbortController | undefined = new AbortController();\n error: unknown;\n disposed = false;\n readonly stats = {\n visitedCells: 0,\n updatedTiles: 0,\n createdSprites: 0,\n destroyedSprites: 0,\n validatedFrames: 0,\n };\n private lease: ImageLease | undefined;\n private readonly textures = new Map<number | string, Texture>();\n private readonly dirty = new Set<number>();\n private revision = -1;\n private range = { left: -1, top: -1, right: -1, bottom: -1 };\n private invalid = true;\n private readonly off: () => void;\n private readonly offDispose: () => void;\n constructor(\n readonly map: Tilemap<string>,\n isCurrent: () => boolean,\n acquire: (url: string, signal: AbortSignal) => Promise<ImageLease>,\n private readonly changed: () => void,\n private readonly onError: (error: unknown) => void,\n private readonly released: () => void,\n ) {\n this.off = map.onTilesChanged((index) => {\n if (index === null) {\n this.invalid = true;\n this.dirty.clear();\n } else {\n const x = index % map.width,\n y = Math.floor(index / map.width),\n r = this.range;\n if (x >= r.left && x < r.right && y >= r.top && y < r.bottom)\n this.dirty.add(index);\n }\n });\n this.offDispose = map.onDispose(() => this.dispose());\n const controller = this.controller;\n if (!controller) throw Error(\"Missing tilemap request controller\");\n void acquire(map.sheet.url, controller.signal)\n .then((lease) => {\n if (this.disposed || map.disposed || !isCurrent()) {\n lease.release();\n return;\n }\n this.lease = lease;\n lease.useFrames?.(() =>\n Array.from(this.map.tileIds(), (id) => this.map.sheet.get(id).frame),\n );\n this.sync();\n lease.onChange?.(() => {\n if (this.disposed || !isCurrent()) return;\n this.textures.clear();\n this.revision = -1;\n this.invalid = true;\n this.sync();\n this.changed();\n });\n })\n .catch((error: unknown) => {\n if (!this.disposed) this.fail(error);\n })\n .finally(() => {\n this.controller = undefined;\n changed();\n });\n }\n private fail(error: unknown): void {\n this.error = error;\n try {\n this.onError(error);\n } catch {\n /* Diagnostics must not invalidate cleanup. */\n }\n }\n sync(): void {\n if (!this.lease || this.disposed || this.revision === this.map.revision)\n return;\n this.revision = this.map.revision;\n this.error = undefined;\n try {\n for (const id of this.map.tileIds()) {\n if (!this.textures.has(id)) {\n this.stats.validatedFrames++;\n this.textures.set(\n id,\n this.lease.textureFor(this.map.sheet.get(id).frame),\n );\n }\n }\n } catch (error) {\n this.fail(error);\n }\n }\n private remove(index: number): void {\n const sprite = this.sprites.get(index);\n if (sprite) {\n this.sprites.delete(index);\n sprite.destroy();\n this.stats.destroyedSprites++;\n }\n }\n private cell(x: number, y: number): void {\n this.stats.visitedCells++;\n const index = y * this.map.width + x,\n id = this.map.get(x, y);\n if (id === null) {\n this.remove(index);\n return;\n }\n const texture = this.textures.get(id);\n if (!texture) return;\n let sprite = this.sprites.get(index);\n if (!sprite) {\n sprite = new Sprite(texture);\n sprite.position.set(x * this.map.tileWidth, y * this.map.tileHeight);\n this.sprites.set(index, sprite);\n this.display.addChild(sprite);\n this.stats.createdSprites++;\n }\n sprite.texture = texture;\n sprite.width = this.map.tileWidth;\n sprite.height = this.map.tileHeight;\n this.stats.updatedTiles++;\n }\n render(view: ViewTransform, enabled = true): void {\n if (this.disposed) return;\n this.sync();\n const m = this.map;\n this.display.position.set(m.x, m.y);\n this.display.visible = enabled && m.visible && m.enabled;\n if (!this.display.visible) {\n this.invalid = true;\n return;\n }\n if (!this.lease || this.error) return;\n const c = view.clip;\n const left = Math.max(\n 0,\n Math.min(\n m.width,\n Math.floor(((c.x - view.x) / view.scale - m.x) / m.tileWidth),\n ),\n );\n const top = Math.max(\n 0,\n Math.min(\n m.height,\n Math.floor(((c.y - view.y) / view.scale - m.y) / m.tileHeight),\n ),\n );\n const right = Math.max(\n left,\n Math.min(\n m.width,\n Math.ceil(((c.x + c.width - view.x) / view.scale - m.x) / m.tileWidth),\n ),\n );\n const bottom = Math.max(\n top,\n Math.min(\n m.height,\n Math.ceil(\n ((c.y + c.height - view.y) / view.scale - m.y) / m.tileHeight,\n ),\n ),\n );\n const old = this.range;\n if (\n this.invalid ||\n left !== old.left ||\n top !== old.top ||\n right !== old.right ||\n bottom !== old.bottom\n ) {\n this.range = { left, top, right, bottom };\n this.invalid = false;\n for (const index of this.sprites.keys()) {\n const x = index % m.width,\n y = Math.floor(index / m.width);\n if (x < left || x >= right || y < top || y >= bottom)\n this.remove(index);\n }\n for (let y = top; y < bottom; y++)\n for (let x = left; x < right; x++) this.cell(x, y);\n } else\n for (const index of this.dirty)\n this.cell(index % m.width, Math.floor(index / m.width));\n this.dirty.clear();\n }\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.controller?.abort();\n this.controller = undefined;\n\n this.stats.destroyedSprites += this.sprites.size;\n this.sprites.clear();\n this.textures.clear();\n this.dirty.clear();\n const lease = this.lease;\n this.lease = undefined;\n cleanupAll(\n [\n this.off,\n this.offDispose,\n () => this.display.removeFromParent(),\n () => this.display.destroy({ children: true }),\n () => lease?.release(),\n this.released,\n this.changed,\n ],\n \"Tilemap presentation cleanup failed\",\n );\n }\n}\n","import {\n cleanupAll,\n type VirtualControl,\n type VirtualInput,\n} from \"@simpludify/core\";\nimport { Container, Graphics } from \"pixi.js\";\n\nexport interface VirtualInputPresentation {\n update(): void;\n dispose(): void;\n}\n/** Screen-space presentation only. The existing BrowserPointer is the sole event adapter. */\nexport class VirtualInputVisual implements VirtualInputPresentation {\n readonly display = new Container();\n private readonly entries = new Map<\n VirtualControl,\n { graphics: Graphics; signature: string }\n >();\n private dead = false;\n private readonly off: () => void;\n constructor(\n private readonly input: VirtualInput,\n private readonly release: (graphics: Graphics) => void,\n ) {\n this.display.eventMode = \"none\";\n this.display.sortableChildren = true;\n this.display.zIndex = 0.5;\n this.off = input.onDispose(() => this.dispose());\n }\n get diagnostics() {\n return {\n controls: this.entries.size,\n visible: [...this.entries.values()].filter((e) => e.graphics.visible)\n .length,\n };\n }\n update(): void {\n if (this.dead) return;\n const live = new Set(this.input.controls);\n for (const [control, entry] of this.entries)\n if (!live.has(control)) {\n this.entries.delete(control);\n this.release(entry.graphics);\n }\n this.display.visible = this.input.visible;\n for (const control of live) {\n let entry = this.entries.get(control);\n if (!entry) {\n entry = { graphics: new Graphics(), signature: \"\" };\n entry.graphics.zIndex = control.kind === \"button\" ? 1 : 0;\n this.entries.set(control, entry);\n this.display.addChild(entry.graphics);\n }\n entry.graphics.visible = control.visible;\n if (!control.visible || !this.input.visible) continue;\n const center = control.center,\n knob = control.knob,\n radius = control.radius;\n const signature = JSON.stringify([\n center,\n knob,\n radius,\n control.color,\n control.enabled,\n this.input.enabled,\n control.pressed,\n control.kind,\n ]);\n if (signature === entry.signature) continue;\n entry.signature = signature;\n const g = entry.graphics;\n g.clear();\n g.alpha = control.enabled && this.input.enabled ? 1 : 0.35;\n g.circle(center.x, center.y, radius)\n .fill({ color: control.color, alpha: 0.12 })\n .stroke({ color: control.color, alpha: 0.75, width: 2 });\n if (control.kind === \"stick\") {\n g.moveTo(center.x, center.y)\n .lineTo(knob.x, knob.y)\n .stroke({ color: control.color, alpha: 0.5, width: 3 });\n g.circle(knob.x, knob.y, radius * 0.36).fill({\n color: control.color,\n alpha: control.pressed ? 0.85 : 0.45,\n });\n } else {\n if (control.pressed)\n g.circle(center.x, center.y, radius * 0.7).fill({\n color: control.color,\n alpha: 0.65,\n });\n if (control.directional && control.pressed)\n g.moveTo(center.x, center.y)\n .lineTo(knob.x, knob.y)\n .stroke({ color: control.color, width: 4 });\n }\n }\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const entries = [...this.entries.values()];\n this.entries.clear();\n cleanupAll(\n [\n this.off,\n ...entries.map((e) => () => this.release(e.graphics)),\n () => this.display.destroy({ children: true }),\n ],\n \"Virtual input presentation cleanup failed\",\n );\n }\n}\n","import type { CanvasUI, PointerRouting, VirtualInput } from \"@simpludify/core\";\nimport {\n type Actor,\n cleanupAll,\n EngineError,\n GeometryTilemapLayer,\n imageSize,\n type PreparedScene,\n Renderable,\n type RendererPort,\n type Scene,\n Shape,\n TilemapLayer,\n Transform,\n type VisualSource,\n} from \"@simpludify/core\";\nimport {\n Application,\n Container,\n Graphics,\n RendererType,\n Sprite,\n} from \"pixi.js\";\nimport { createImagePool, loadImageResource } from \"./asset-loaders\";\nimport { type AssetStore, isAssetImage } from \"./assets\";\nimport { type CanvasPresentation, CanvasVisual } from \"./canvas-visual\";\nimport { GeometryTilemapVisual } from \"./geometry-tilemap-visual\";\nimport {\n pruneUITextKeys,\n releaseUIGraphics,\n releaseUIText,\n} from \"./pixi-ui-cleanup\";\nimport type { ImageLease, SharedImages } from \"./shared-images\";\nimport { TilemapVisual } from \"./tilemap-visual\";\nimport {\n type VirtualInputPresentation,\n VirtualInputVisual,\n} from \"./virtual-input-visual\";\n\ninterface Visual {\n actor: Actor;\n component: Renderable;\n transform: Transform;\n revision: number;\n generation: number;\n requestUrl?: string;\n controller?: AbortController;\n order: number;\n depth: number;\n scaleX: number;\n scaleY: number;\n display?: Sprite | Graphics;\n displayedSource?: VisualSource;\n geometryShape?: Shape;\n geometryWidth: number;\n geometryHeight: number;\n geometryColor: number;\n image?: ImageLease;\n requestedSource?: VisualSource;\n error?: unknown;\n disposed: boolean;\n dispose(): void;\n}\nexport class PixiRenderer implements RendererPort {\n private readonly app = new Application();\n private readonly pendingUITextKeys = new Set<string>();\n private readonly canvasPresentations = new Set<CanvasVisual>();\n private readonly virtualPresentations = new Set<VirtualInputVisual>();\n get virtualInputDiagnostics() {\n let controls = 0,\n visible = 0;\n for (const visual of this.virtualPresentations) {\n controls += visual.diagnostics.controls;\n visible += visual.diagnostics.visible;\n }\n return { presentations: this.virtualPresentations.size, controls, visible };\n }\n prepareVirtualInput(input: VirtualInput): VirtualInputPresentation {\n if (!this.ready || this.dead)\n throw new EngineError(\"RENDERER_NOT_READY\", \"Renderer is not available\");\n const visual = new VirtualInputVisual(input, (graphics) => {\n const context = graphics.context.uid;\n graphics.destroy({ context: true });\n releaseUIGraphics(this.app.renderer, graphics, context);\n });\n this.virtualPresentations.add(visual);\n const off = input.onDispose(() => {\n this.virtualPresentations.delete(visual);\n });\n let disposed = false;\n return {\n update: () => {\n if (disposed || input.disposed) return;\n if (!visual.display.parent) this.app.stage.addChild(visual.display);\n visual.update();\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n off();\n this.virtualPresentations.delete(visual);\n visual.dispose();\n },\n };\n }\n get canvasDiagnostics() {\n let nodes = 0,\n visibleNodes = 0,\n buttons = 0,\n syncs = 0,\n textMetrics = 0;\n for (const p of this.canvasPresentations) {\n const d = p.diagnostics;\n nodes += d.nodes;\n visibleNodes += d.visibleNodes;\n buttons += d.buttons;\n syncs += d.syncs;\n textMetrics += d.textMetrics;\n }\n return {\n presentations: this.canvasPresentations.size,\n nodes,\n visibleNodes,\n buttons,\n syncs,\n textMetrics,\n };\n }\n prepareCanvasUI(ui: CanvasUI, routing: PointerRouting): CanvasPresentation {\n if (!this.ready || this.dead)\n throw new EngineError(\"RENDERER_NOT_READY\", \"Renderer is not available\");\n const visual = new CanvasVisual(ui, this.host, routing, {\n graphics: (graphics, context) =>\n releaseUIGraphics(this.app.renderer, graphics, context),\n text: (text, key) => releaseUIText(this.app.renderer, text, key),\n changedText: (key) => this.pendingUITextKeys.add(key),\n cacheResolution: () =>\n this.app.renderer.type === RendererType.WEBGL\n ? this.app.renderer.resolution\n : undefined,\n });\n this.canvasPresentations.add(visual);\n let disposed = false;\n const off = ui.onDispose(() => {\n this.canvasPresentations.delete(visual);\n });\n return {\n update: (width, height) => {\n if (disposed || ui.disposed) return;\n if (!visual.display.parent) this.app.stage.addChild(visual.display);\n visual.update(width, height);\n },\n focus: (node) => visual.focus(node),\n dispose: () => {\n if (disposed) return;\n disposed = true;\n off();\n this.canvasPresentations.delete(visual);\n visual.dispose();\n },\n };\n }\n private readonly scenes = new Set<PreparedScene>();\n private readonly images: SharedImages;\n private readonly tilemaps = new Set<TilemapVisual>();\n get tilemapDiagnostics() {\n let sprites = 0,\n visibleTiles = 0,\n visitedCells = 0,\n updatedTiles = 0,\n createdSprites = 0,\n destroyedSprites = 0,\n validatedFrames = 0;\n for (const t of this.tilemaps) {\n sprites += t.sprites.size;\n if (t.display.visible) visibleTiles += t.sprites.size;\n visitedCells += t.stats.visitedCells;\n updatedTiles += t.stats.updatedTiles;\n createdSprites += t.stats.createdSprites;\n destroyedSprites += t.stats.destroyedSprites;\n validatedFrames += t.stats.validatedFrames;\n }\n return {\n maps: this.tilemaps.size,\n sprites,\n visibleTiles,\n visitedCells,\n updatedTiles,\n createdSprites,\n destroyedSprites,\n validatedFrames,\n };\n }\n private readonly geometryTilemaps = new Set<GeometryTilemapVisual>();\n get geometryTilemapDiagnostics() {\n let graphics = 0,\n visitedCells = 0,\n updatedTiles = 0,\n createdGraphics = 0,\n destroyedGraphics = 0;\n for (const t of this.geometryTilemaps) {\n graphics += t.graphics.size;\n visitedCells += t.stats.visitedCells;\n updatedTiles += t.stats.updatedTiles;\n createdGraphics += t.stats.createdGraphics;\n destroyedGraphics += t.stats.destroyedGraphics;\n }\n return {\n maps: this.geometryTilemaps.size,\n graphics,\n visitedCells,\n updatedTiles,\n createdGraphics,\n destroyedGraphics,\n };\n }\n private ready = false;\n private dead = false;\n private visualCount = 0;\n get diagnostics() {\n return {\n presentations: this.scenes.size,\n visuals: this.visualCount,\n textures: this.images.textures,\n ...this.images.diagnostics,\n };\n }\n constructor(\n private readonly host: HTMLElement,\n private readonly background = \"#101922\",\n private readonly onError: (error: unknown) => void = () => {},\n private readonly assetServices?: {\n store: AssetStore;\n images: SharedImages;\n },\n ) {\n this.images =\n assetServices?.images ??\n createImagePool((...args) => this.image(...args));\n }\n async init(): Promise<void> {\n await this.app.init({\n width: 800,\n height: 450,\n background: this.background,\n antialias: true,\n autoStart: false,\n sharedTicker: false,\n preference: \"webgl\",\n resolution: 1,\n autoDensity: true,\n });\n this.ready = true;\n if (this.dead) {\n this.destroyApp();\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Renderer disposed during initialization\",\n );\n }\n this.app.stage.sortableChildren = true;\n this.app.canvas.setAttribute(\"aria-label\", \"Game world\");\n this.host.prepend(this.app.canvas);\n }\n private image(\n url: string,\n signal: AbortSignal,\n mode?: \"explicit\" | \"reload\",\n ) {\n return loadImageResource(url, signal, mode);\n }\n\n private acquireImage(url: string, signal: AbortSignal): Promise<ImageLease> {\n if (isAssetImage(url))\n return (\n this.assetServices?.store.image(url, signal) ??\n Promise.reject(\n new EngineError(\n \"ASSET_CANCELLED\",\n \"Image asset does not belong to this renderer\",\n ),\n )\n );\n // Image.src resolves against document.baseURI too. Retain query, fragment and\n // credentials; anonymous CORS is fixed for every request in this renderer.\n try {\n const parsed = new URL(url, document.baseURI);\n if (\n ![\"http:\", \"https:\", \"data:\", \"blob:\", \"file:\"].includes(\n parsed.protocol,\n )\n )\n throw new Error(\"Unsupported image URL protocol\");\n return this.images.acquire(parsed.href, signal);\n } catch {\n return Promise.reject(\n new EngineError(\"ASSET_LOAD_FAILED\", \"Invalid image URL\", {\n path: url,\n }),\n );\n }\n }\n\n async prepare(scene: Scene): Promise<PreparedScene> {\n if (!this.ready || this.dead)\n throw new EngineError(\"RENDERER_NOT_READY\", \"Renderer is not available\");\n const root = new Container(),\n world = new Container(),\n mask = new Graphics();\n world.sortableChildren = true;\n root.addChild(world, mask);\n root.mask = mask;\n const visuals = new Map<Actor, Visual>();\n const tilemaps = new Map<Actor, TilemapVisual>();\n const geometryTilemaps = new Map<Actor, GeometryTilemapVisual>();\n const drawOrder: {\n display: Sprite | Graphics | Container;\n order: number;\n zIndex: number;\n }[] = [];\n let depthDirty = true;\n let revision = -1,\n disposed = false,\n clipX = NaN,\n clipY = NaN,\n clipWidth = NaN,\n clipHeight = NaN,\n removeSceneCleanup: (() => void) | undefined;\n const valid = (entry: Visual) =>\n !disposed &&\n !scene.disposed &&\n !entry.actor.disposed &&\n entry.actor.scene === scene &&\n entry.actor.get(Renderable.type) === entry.component &&\n !entry.component.disposed;\n // Waiters follow the current requests of this presentation. No polling timer,\n // replay hook or Core subscription is needed when no readiness call is pending.\n let wake: Promise<void> | undefined;\n let wakeResolve: (() => void) | undefined;\n const changed = () => {\n const resolve = wakeResolve;\n wake = undefined;\n wakeResolve = undefined;\n resolve?.();\n };\n const cancel = (entry: Visual) => {\n entry.generation++;\n const controller = entry.controller;\n delete entry.controller;\n if (controller) {\n controller.abort();\n }\n };\n const appearance = (entry: Visual) => {\n const { component, display, displayedSource: source } = entry;\n if (!display || !source) return;\n if (source.kind === \"image\" && display instanceof Sprite && entry.image) {\n const texture = display.texture;\n const size = imageSize(\n texture.width,\n texture.height,\n component.width,\n component.height,\n source.fit,\n );\n entry.scaleX = size.width / texture.width;\n entry.scaleY = size.height / texture.height;\n display.tint = component.color;\n } else if (source.kind === \"shape\" && display instanceof Graphics) {\n const width = component.width,\n height = component.height;\n if (\n entry.geometryShape === source.shape &&\n entry.geometryWidth === width &&\n entry.geometryHeight === height &&\n entry.geometryColor === component.color\n )\n return;\n entry.geometryShape = source.shape;\n entry.geometryWidth = width;\n entry.geometryHeight = height;\n entry.geometryColor = component.color;\n display.clear();\n if (source.shape === Shape.Circle)\n display\n .circle(0, 0, Math.min(width, height) / 2)\n .fill(component.color);\n else if (source.shape === Shape.Hexagon)\n display\n .poly(\n [\n 0,\n -height / 2,\n width / 2,\n -height / 4,\n width / 2,\n height / 4,\n 0,\n height / 2,\n -width / 2,\n height / 4,\n -width / 2,\n -height / 4,\n ],\n true,\n )\n .fill(component.color);\n else if (source.shape === Shape.Triangle)\n display\n .poly(\n [0, -height / 2, width / 2, height / 2, -width / 2, height / 2],\n true,\n )\n .fill(component.color);\n else\n display\n .roundRect(\n -width / 2,\n -height / 2,\n width,\n height,\n source.shape === Shape.Character\n ? Math.min(width, height) / 4\n : 2,\n )\n .fill(component.color);\n if (source.shape === Shape.Character)\n display\n .circle(-width / 7, -height / 10, Math.min(width, height) / 18)\n .fill(0x102c28)\n .circle(width / 7, -height / 10, Math.min(width, height) / 18)\n .fill(0x102c28);\n entry.scaleX = entry.scaleY = 1;\n }\n };\n const replace = (\n entry: Visual,\n display: Sprite | Graphics,\n source: VisualSource,\n ) => {\n if (entry.display !== display) {\n entry.display?.destroy();\n entry.display = display;\n delete entry.geometryShape;\n world.addChild(display);\n depthDirty = true;\n }\n entry.displayedSource = source;\n };\n const fail = (entry: Visual, error: unknown) => {\n entry.error = error;\n try {\n this.onError(error);\n } catch {\n /* Keep diagnostics separate from cleanup. */\n }\n };\n const commitImage = (\n entry: Visual,\n resource: ImageLease,\n source: VisualSource,\n ) => {\n if (source.kind !== \"image\") return;\n // Resolve and validate before mutating the retained Sprite or releasing its lease.\n const texture = resource.textureFor(source.frame);\n resource.useFrames?.(() => (source.frame ? [source.frame] : []));\n const previous = entry.image;\n const sprite =\n entry.display instanceof Sprite ? entry.display : new Sprite(texture);\n sprite.texture = texture;\n sprite.anchor.set(0.5);\n entry.image = resource;\n replace(entry, sprite, source);\n appearance(entry);\n if (previous !== resource) {\n previous?.release();\n resource.onChange?.(() => {\n if (\n !valid(entry) ||\n entry.image !== resource ||\n !entry.displayedSource\n )\n return;\n try {\n commitImage(entry, resource, entry.displayedSource);\n } catch (error) {\n fail(entry, error);\n }\n });\n }\n };\n const update = (entry: Visual) => {\n const component = entry.component;\n if (entry.revision === component.revision) return;\n entry.revision = component.revision;\n const source = component.source;\n const sourceChanged = entry.requestedSource !== source;\n entry.requestedSource = source;\n if (source.kind === \"shape\") {\n cancel(entry);\n delete entry.requestUrl;\n delete entry.error;\n const previous = entry.image;\n delete entry.image;\n replace(\n entry,\n entry.display instanceof Graphics ? entry.display : new Graphics(),\n source,\n );\n previous?.release();\n changed();\n } else if (\n entry.requestUrl !== source.url ||\n (sourceChanged &&\n !entry.controller &&\n (!entry.image ||\n entry.displayedSource?.kind !== \"image\" ||\n entry.displayedSource.url !== source.url))\n ) {\n cancel(entry);\n entry.requestUrl = source.url;\n delete entry.error;\n // Returning to the still-displayed image needs no new load.\n if (\n entry.image &&\n entry.displayedSource?.kind === \"image\" &&\n entry.displayedSource.url === source.url\n ) {\n try {\n commitImage(entry, entry.image, source);\n } catch (error) {\n fail(entry, error);\n }\n } else {\n const controller = new AbortController(),\n generation = entry.generation;\n entry.controller = controller;\n const current = () =>\n !entry.disposed &&\n valid(entry) &&\n entry.generation === generation &&\n component.source.kind === \"image\" &&\n component.source.url === source.url;\n void this.acquireImage(source.url, controller.signal)\n .then((resource) => {\n if (!current()) {\n resource.release();\n return;\n }\n try {\n commitImage(entry, resource, component.source);\n } catch (error) {\n resource.release();\n throw error;\n }\n })\n .catch((error) => {\n if (current()) {\n fail(entry, error);\n }\n })\n .finally(() => {\n if (entry.controller === controller) delete entry.controller;\n changed();\n });\n }\n changed();\n } else if (\n entry.image &&\n entry.displayedSource?.kind === \"image\" &&\n entry.displayedSource.url === source.url\n ) {\n if (sourceChanged) delete entry.error;\n try {\n commitImage(entry, entry.image, source);\n } catch (error) {\n fail(entry, error);\n }\n }\n // Layout/color changes also apply to the retained display while a new image loads.\n appearance(entry);\n };\n const create = (actor: Actor, component: Renderable): Visual => {\n this.visualCount++;\n let removeActorCleanup = () => {},\n removeComponentCleanup = () => {};\n const entry: Visual = {\n revision: -1,\n generation: 0,\n disposed: false,\n geometryWidth: NaN,\n geometryHeight: NaN,\n geometryColor: NaN,\n order: 0,\n depth: NaN,\n scaleX: 1,\n scaleY: 1,\n actor,\n component,\n transform: actor.require(Transform.type),\n dispose: () => {\n if (entry.disposed) return;\n entry.disposed = true;\n this.visualCount--;\n depthDirty = true;\n drawOrder.length = 0;\n cancel(entry);\n changed();\n const display = entry.display,\n image = entry.image;\n delete entry.display;\n delete entry.image;\n cleanupAll(\n [\n removeActorCleanup,\n removeComponentCleanup,\n () => display?.destroy(),\n () => image?.release(),\n ],\n \"Visual cleanup failed\",\n );\n },\n };\n removeActorCleanup = actor.onDispose(entry.dispose);\n removeComponentCleanup = component.onDispose(entry.dispose);\n update(entry);\n return entry;\n };\n const reconcile = () => {\n if (disposed || scene.disposed) return;\n if (revision === scene.revision) return;\n revision = scene.revision;\n depthDirty = true;\n for (const [actor, entry] of visuals)\n if (!valid(entry)) {\n entry.dispose();\n visuals.delete(actor);\n }\n for (const [actor, entry] of tilemaps) {\n const layer = actor.get(TilemapLayer.type);\n if (\n actor.disposed ||\n actor.scene !== scene ||\n !layer ||\n layer.disposed ||\n layer.map !== entry.map ||\n entry.disposed\n ) {\n entry.dispose();\n this.tilemaps.delete(entry);\n tilemaps.delete(actor);\n }\n }\n for (const [actor, entry] of geometryTilemaps) {\n const layer = actor.get(GeometryTilemapLayer.type);\n if (\n actor.disposed ||\n actor.scene !== scene ||\n !layer ||\n layer.disposed ||\n layer.map !== entry.map ||\n entry.disposed\n ) {\n entry.dispose();\n this.geometryTilemaps.delete(entry);\n geometryTilemaps.delete(actor);\n }\n }\n let order = 0;\n for (const actor of scene.actors) {\n const layer = actor.get(TilemapLayer.type);\n if (layer && !layer.disposed && !layer.map.disposed) {\n let tile = tilemaps.get(actor);\n if (!tile) {\n tile = new TilemapVisual(\n layer.map,\n () =>\n actor.scene === scene &&\n actor.get(TilemapLayer.type)?.map === layer.map,\n (url, signal) => this.acquireImage(url, signal),\n changed,\n this.onError,\n () => {\n if (tile) this.tilemaps.delete(tile);\n depthDirty = true;\n },\n );\n world.addChild(tile.display);\n tilemaps.set(actor, tile);\n this.tilemaps.add(tile);\n }\n tile.order = order;\n }\n const geometryLayer = actor.get(GeometryTilemapLayer.type);\n if (\n geometryLayer &&\n !geometryLayer.disposed &&\n !geometryLayer.map.disposed\n ) {\n let tile = geometryTilemaps.get(actor);\n if (!tile) {\n const created = new GeometryTilemapVisual(geometryLayer.map, () => {\n this.geometryTilemaps.delete(created);\n depthDirty = true;\n });\n tile = created;\n world.addChild(tile.display);\n geometryTilemaps.set(actor, tile);\n this.geometryTilemaps.add(created);\n }\n tile.order = order;\n }\n const component = actor.get(Renderable.type);\n if (component) {\n let entry = visuals.get(actor);\n if (!entry) {\n entry = create(actor, component);\n visuals.set(actor, entry);\n }\n entry.order = order;\n }\n order++;\n }\n };\n const sync = () => {\n reconcile();\n for (const entry of visuals.values()) update(entry);\n for (const entry of tilemaps.values()) entry.sync();\n };\n const prepared: PreparedScene = {\n ready: async () => {\n for (;;) {\n if (disposed || this.dead || scene.disposed)\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Scene presentation has been disposed\",\n );\n sync();\n let pending = false;\n for (const entry of visuals.values()) {\n if (entry.error) throw entry.error;\n if (entry.controller) pending = true;\n }\n for (const entry of tilemaps.values()) {\n if (entry.error) throw entry.error;\n if (entry.controller) pending = true;\n }\n if (!pending) return;\n wake ??= new Promise<void>((resolve) => {\n wakeResolve = resolve;\n });\n await wake;\n }\n },\n render: (view) => {\n if (disposed || this.dead || scene.disposed) return;\n reconcile();\n if (!root.parent) this.app.stage.addChild(root);\n const c = view.clip;\n if (\n c.x !== clipX ||\n c.y !== clipY ||\n c.width !== clipWidth ||\n c.height !== clipHeight\n ) {\n clipX = c.x;\n clipY = c.y;\n clipWidth = c.width;\n clipHeight = c.height;\n mask.clear().rect(c.x, c.y, c.width, c.height).fill(0xffffff);\n }\n world.scale.set(view.scale);\n world.position.set(view.x, view.y);\n for (const entry of visuals.values()) {\n update(entry);\n if (entry.display) {\n const t = entry.transform;\n entry.display.visible =\n entry.actor.enabled &&\n entry.component.enabled &&\n entry.component.visible;\n entry.display.alpha = entry.component.opacity;\n if (entry.depth !== entry.component.zIndex) {\n entry.depth = entry.component.zIndex;\n depthDirty = true;\n }\n const x = t.x + entry.component.offsetX,\n y = t.y + entry.component.offsetY,\n rotation = t.rotation + entry.component.rotation,\n scaleX = entry.scaleX * t.scaleX * entry.component.scaleX,\n scaleY = entry.scaleY * t.scaleY * entry.component.scaleY;\n if (\n !Number.isFinite(x) ||\n !Number.isFinite(y) ||\n !Number.isFinite(rotation) ||\n !Number.isFinite(scaleX) ||\n !Number.isFinite(scaleY)\n )\n throw new EngineError(\n \"INVALID_VALUE\",\n \"Composed visual transform must be finite\",\n );\n entry.display.position.set(x, y);\n entry.display.rotation = rotation;\n entry.display.scale.set(scaleX, scaleY);\n }\n }\n for (const [actor, entry] of tilemaps) {\n entry.render(\n view,\n actor.enabled && actor.get(TilemapLayer.type)?.enabled === true,\n );\n if (entry.depth !== entry.map.zIndex) {\n entry.depth = entry.map.zIndex;\n depthDirty = true;\n }\n }\n for (const [actor, entry] of geometryTilemaps) {\n entry.render(\n view,\n actor.enabled &&\n actor.get(GeometryTilemapLayer.type)?.enabled === true,\n );\n if (entry.depth !== entry.map.zIndex) {\n entry.depth = entry.map.zIndex;\n depthDirty = true;\n }\n }\n if (depthDirty) {\n drawOrder.length = 0;\n for (const entry of visuals.values())\n if (entry.display)\n drawOrder.push({\n display: entry.display,\n order: entry.order,\n zIndex: entry.component.zIndex,\n });\n for (const entry of tilemaps.values())\n drawOrder.push({\n display: entry.display,\n order: entry.order,\n zIndex: entry.map.zIndex,\n });\n for (const entry of geometryTilemaps.values())\n drawOrder.push({\n display: entry.display,\n order: entry.order,\n zIndex: entry.map.zIndex,\n });\n drawOrder.sort((a, b) => a.zIndex - b.zIndex || a.order - b.order);\n for (let i = 0; i < drawOrder.length; i++) {\n const entry = drawOrder[i];\n if (entry?.display) entry.display.zIndex = i;\n }\n depthDirty = false;\n }\n this.app.render();\n if (this.pendingUITextKeys.size)\n pruneUITextKeys(this.app.renderer, this.pendingUITextKeys);\n },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n changed();\n this.scenes.delete(prepared);\n const entries = [...visuals.values()];\n visuals.clear();\n drawOrder.length = 0;\n cleanupAll(\n [\n () => removeSceneCleanup?.(),\n ...entries.map((entry) => entry.dispose),\n () => {\n for (const entry of tilemaps.values()) {\n entry.dispose();\n this.tilemaps.delete(entry);\n }\n tilemaps.clear();\n for (const entry of geometryTilemaps.values()) {\n entry.dispose();\n this.geometryTilemaps.delete(entry);\n }\n geometryTilemaps.clear();\n },\n () => root.destroy({ children: true, context: true }),\n ],\n \"Presentation cleanup failed\",\n );\n },\n };\n removeSceneCleanup = scene.onDispose(prepared.dispose);\n this.scenes.add(prepared);\n try {\n await prepared.ready?.();\n return prepared;\n } catch (error) {\n prepared.dispose();\n throw error;\n }\n }\n resize(width: number, height: number, devicePixelRatio: number): void {\n if (!this.ready || this.dead) return;\n if (this.app.renderer.resolution !== devicePixelRatio)\n for (const visual of this.canvasPresentations)\n visual.beforeResolutionChange();\n this.app.renderer.resolution = devicePixelRatio;\n this.app.renderer.resize(width, height);\n }\n private destroyApp(): void {\n if (this.ready) {\n this.ready = false;\n this.app.destroy({ removeView: true }, { children: true, context: true });\n }\n }\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n const scenes = [...this.scenes];\n this.scenes.clear();\n cleanupAll(\n [\n ...scenes.map((scene) => scene.dispose),\n ...[...this.virtualPresentations].map((p) => () => {\n this.virtualPresentations.delete(p);\n p.dispose();\n }),\n ...[...this.canvasPresentations].map((p) => () => {\n this.canvasPresentations.delete(p);\n p.dispose();\n }),\n () => this.pendingUITextKeys.clear(),\n () => {\n if (!this.assetServices) this.images.dispose();\n },\n () => this.destroyApp(),\n ],\n \"Renderer cleanup failed\",\n );\n }\n}\n","import { cleanupAll } from \"@simpludify/core\";\nimport { registerGameButton } from \"./ui-keyboard\";\nexport const Layout = { Column: \"column\", Row: \"row\", Grid: \"grid\" } as const;\nexport type Layout = (typeof Layout)[keyof typeof Layout];\nexport const Theme = { Dark: \"dark\", Light: \"light\" } as const;\nexport type Theme = (typeof Theme)[keyof typeof Theme];\nexport interface ThemeTokens {\n background: string;\n surface: string;\n text: string;\n muted: string;\n accent: string;\n font: string;\n}\nexport const Themes: Readonly<Record<Theme, ThemeTokens>> = {\n dark: {\n background: \"#101922\",\n surface: \"#172630\",\n text: \"#eff7f6\",\n muted: \"#afc4ca\",\n accent: \"#73e3c0\",\n font: \"system-ui, sans-serif\",\n },\n light: {\n background: \"#eaf2ef\",\n surface: \"#ffffff\",\n text: \"#17332d\",\n muted: \"#45645d\",\n accent: \"#17654f\",\n font: \"system-ui, sans-serif\",\n },\n};\n\nexport const Placement = {\n Top: \"top\",\n Center: \"center\",\n Bottom: \"bottom\",\n} as const;\nexport type Placement = (typeof Placement)[keyof typeof Placement];\nexport interface TextBinding {\n readonly text: string;\n setText(text: string): void;\n subscribe(listener: (text: string) => void): () => void;\n}\nexport interface LabelNode extends TextBinding {\n readonly kind: \"label\";\n readonly muted: boolean;\n}\nexport interface ButtonNode extends TextBinding {\n readonly kind: \"button\";\n readonly onClick: (signal: AbortSignal) => void | Promise<void>;\n}\nexport interface HoldButtonNode extends TextBinding {\n readonly kind: \"hold-button\";\n readonly onHold: (held: boolean) => void;\n}\nexport interface PanelNode {\n readonly kind: \"panel\";\n readonly layout: Layout;\n readonly placement: Placement;\n readonly children: readonly UINode[];\n readonly title?: string;\n}\nexport type UINode = LabelNode | ButtonNode | HoldButtonNode | PanelNode;\nfunction textBinding(text: string): TextBinding {\n let value = text;\n const listeners = new Set<(text: string) => void>();\n let plan: readonly ((text: string) => void)[] = [];\n return {\n get text() {\n return value;\n },\n setText(next) {\n if (next === value) return;\n value = next;\n const errors: unknown[] = [];\n for (const listener of plan)\n if (listeners.has(listener)) {\n try {\n listener(value);\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length)\n throw new AggregateError(errors, \"Text subscribers failed\");\n },\n subscribe(listener) {\n listeners.add(listener);\n plan = [...listeners];\n return () => {\n listeners.delete(listener);\n plan = [...listeners];\n };\n },\n };\n}\nfunction withText<T extends object>(node: T, text: string): T & TextBinding {\n return Object.defineProperties(\n node,\n Object.getOwnPropertyDescriptors(textBinding(text)),\n ) as T & TextBinding;\n}\nexport function Label(\n text: string,\n options: { muted?: boolean } = {},\n): LabelNode {\n return withText(\n { kind: \"label\" as const, muted: options.muted ?? false },\n text,\n );\n}\nexport function Button(\n text: string,\n onClick: (signal: AbortSignal) => void | Promise<void>,\n): ButtonNode {\n return withText({ kind: \"button\" as const, onClick }, text);\n}\nexport function HoldButton(\n text: string,\n onHold: (held: boolean) => void,\n): HoldButtonNode {\n return withText({ kind: \"hold-button\" as const, onHold }, text);\n}\nexport function Panel(\n children: readonly UINode[],\n options: { layout?: Layout; title?: string; placement?: Placement } = {},\n): PanelNode {\n return {\n kind: \"panel\",\n children: [...children],\n layout: options.layout ?? Layout.Column,\n placement: options.placement ?? Placement.Top,\n ...(options.title === undefined ? {} : { title: options.title }),\n };\n}\nexport interface MountedUI {\n readonly element: HTMLDivElement;\n dispose(): void;\n}\nexport function mountUI(\n nodes: readonly UINode[],\n onError: (error: unknown) => void,\n): MountedUI {\n const element = document.createElement(\"div\");\n element.className = \"s-ui\";\n const controller = new AbortController(),\n subscriptions: Array<() => void> = [];\n let disposed = false;\n const report = (error: unknown) => {\n try {\n onError(error);\n } catch {\n /* Observers cannot interrupt cleanup. */\n }\n };\n const render = (node: UINode): HTMLElement => {\n if (node.kind === \"label\") {\n const label = document.createElement(\"p\");\n label.textContent = node.text;\n if (node.muted) label.className = \"s-muted\";\n subscriptions.push(\n node.subscribe((text) => {\n label.textContent = text;\n }),\n );\n return label;\n }\n if (node.kind === \"button\" || node.kind === \"hold-button\") {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = node.text;\n subscriptions.push(\n node.subscribe((text) => {\n button.textContent = text;\n }),\n );\n const options = { signal: controller.signal };\n registerGameButton(button, controller.signal);\n if (node.kind === \"button\") {\n let pending = false;\n button.addEventListener(\n \"click\",\n () => {\n if (pending || button.disabled) return;\n try {\n const result = node.onClick(controller.signal);\n if (!result || typeof result.then !== \"function\") return;\n pending = true;\n button.setAttribute(\"aria-disabled\", \"true\");\n button.setAttribute(\"aria-busy\", \"true\");\n button.tabIndex = -1;\n void Promise.resolve(result)\n .catch((error) => {\n if (!controller.signal.aborted) report(error);\n })\n .finally(() => {\n pending = false;\n button.removeAttribute(\"aria-disabled\");\n button.removeAttribute(\"aria-busy\");\n button.tabIndex = 0;\n });\n } catch (error) {\n if (!controller.signal.aborted) report(error);\n }\n },\n options,\n );\n } else {\n button.classList.add(\"s-hold\");\n button.setAttribute(\"aria-pressed\", \"false\");\n const pointers = new Set<number>(),\n keys = new Set<string>();\n let held = false;\n const update = () => {\n const next = pointers.size > 0 || keys.size > 0;\n if (held === next) return;\n held = next;\n button.setAttribute(\"aria-pressed\", String(held));\n try {\n node.onHold(held);\n } catch (error) {\n report(error);\n }\n };\n const release = () => {\n pointers.clear();\n keys.clear();\n update();\n };\n button.addEventListener(\n \"pointerdown\",\n (event) => {\n if (event.button !== 0) return;\n pointers.add(event.pointerId);\n button.setPointerCapture(event.pointerId);\n update();\n },\n options,\n );\n for (const type of [\n \"pointerup\",\n \"pointercancel\",\n \"lostpointercapture\",\n ] as const)\n button.addEventListener(\n type,\n (event) => {\n pointers.delete(event.pointerId);\n update();\n },\n options,\n );\n button.addEventListener(\n \"keydown\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.code !== \"Space\" && event.code !== \"Enter\") return;\n event.preventDefault();\n keys.add(event.code);\n update();\n },\n options,\n );\n button.addEventListener(\n \"keyup\",\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.code !== \"Space\" && event.code !== \"Enter\") return;\n event.preventDefault();\n keys.delete(event.code);\n update();\n },\n options,\n );\n button.addEventListener(\n \"blur\",\n () => {\n keys.clear();\n update();\n },\n options,\n );\n window.addEventListener(\"blur\", release, options);\n document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) release();\n },\n options,\n );\n subscriptions.push(release);\n }\n return button;\n }\n const panel = document.createElement(\"section\");\n panel.className = \"s-panel s-\" + node.layout + \" s-\" + node.placement;\n if (node.title) {\n const title = document.createElement(\"h2\");\n title.textContent = node.title;\n panel.append(title);\n }\n panel.append(...node.children.map(render));\n return panel;\n };\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n controller.abort();\n const cleanup = subscriptions.splice(0).reverse();\n cleanupAll([...cleanup, () => element.remove()], \"UI cleanup failed\");\n };\n try {\n element.append(...nodes.map(render));\n } catch (error) {\n try {\n dispose();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n \"UI creation and cleanup failed\",\n );\n }\n throw error;\n }\n return { element, dispose };\n}\n","import type { CanvasNode } from \"@simpludify/core\";\nimport {\n type ActionBindings,\n ActionController,\n type ActionSet,\n type Actor,\n Aspect,\n Camera,\n CanvasUI,\n type CanvasUIOptions,\n createViewTransform,\n Engine,\n EngineError,\n type FixedStepOptions,\n FixedStepRunner,\n type FrameDriver,\n type InputCapture,\n type InputCaptureOptions,\n type JsonValue,\n Logger,\n type LoggerOptions,\n type LogicalResolution,\n type PointerRouting,\n type PreparedScene,\n positive,\n type RendererPort,\n type ReplayControllers,\n ReplayPlayer,\n Scene,\n ScenePointer,\n type SceneRetention,\n SceneState,\n type ScreenPoint,\n screenPoint,\n screenToWorld,\n type TweenScheduler,\n type Viewport,\n type ViewTransform,\n VirtualInput,\n type WorldPoint,\n worldToScreen,\n} from \"@simpludify/core\";\nimport { browserAssetAdapter, createImagePool } from \"./asset-loaders\";\nimport {\n type AssetHandle,\n type AssetOptions,\n AssetScope,\n AssetStore,\n} from \"./assets\";\nimport { GameAudio } from \"./audio\";\nimport type { CanvasPresentation } from \"./canvas-visual\";\nimport { GamepadInput } from \"./gamepads\";\nimport { BrowserInput } from \"./input\";\nimport { InputCaptureManager } from \"./input-capture\";\nimport { BrowserPointer } from \"./pointer\";\nimport { PixiRenderer } from \"./renderer\";\nimport {\n type MountedUI,\n mountUI,\n Theme,\n Themes,\n type ThemeTokens,\n type UINode,\n} from \"./ui\";\nimport { blocksGameKeyboard } from \"./ui-keyboard\";\nimport type { VirtualInputPresentation } from \"./virtual-input-visual\";\n\nexport interface SceneContext {\n readonly scene: Scene;\n readonly assets: AssetScope;\n readonly signal: AbortSignal;\n readonly tweens: TweenScheduler;\n readonly presentationTweens: TweenScheduler;\n add<T extends Actor>(actor: T): T;\n ui(...nodes: UINode[]): void;\n canvasUI(root: CanvasNode, options?: CanvasUIOptions): CanvasUI;\n readonly pointer: ScenePointer;\n readonly virtualInput: VirtualInput;\n actions<A extends ActionSet>(\n actions: A,\n bindings?: ActionBindings<A>,\n ): ActionController<A>;\n onUpdate(callback: (seconds: number) => void): () => void;\n onActivate(callback: () => void): () => void;\n onDeactivate(callback: () => void): () => void;\n onDispose(callback: () => void): () => void;\n}\nexport type SceneSetup = (context: SceneContext) => void | Promise<void>;\nexport interface SceneOptions {\n readonly retention?: SceneRetention;\n}\ninterface SceneRegistration {\n readonly setup: SceneSetup;\n readonly retention: SceneRetention;\n}\ninterface SceneSession {\n readonly scene: Scene;\n readonly nodes: readonly UINode[];\n readonly canvas: CanvasUI | undefined;\n}\nexport interface GameLoggingOptions extends Omit<LoggerOptions, \"sink\"> {\n /** Controls Console output only. Diagnostic subscribers remain active. */\n readonly console?: boolean;\n}\nexport interface GameOptions {\n parent?: HTMLElement;\n resolution?: LogicalResolution;\n aspect?: Aspect;\n camera?: Camera;\n viewport?: Viewport;\n pixelRatio?: number;\n theme?: Theme;\n tokens?: Partial<ThemeTokens>;\n seed?: number;\n maxDelta?: number;\n fixedStep?: FixedStepOptions;\n renderer?: (host: HTMLElement) => RendererPort;\n frames?: FrameDriver;\n logging?: GameLoggingOptions;\n assets?: AssetOptions;\n sceneRetention?: SceneRetention;\n /** @deprecated Subscribe to Game.logger for structured diagnostics. */\n onError?: (error: unknown) => void;\n}\nexport class Game<SceneId extends string = string> {\n readonly engine: Engine;\n readonly element: HTMLDivElement;\n readonly camera: Camera;\n readonly gamepads: GamepadInput;\n readonly logger: Logger;\n readonly assets: AssetScope;\n readonly audio: GameAudio;\n private readonly defaultFont: string;\n private fontUse: AssetHandle<\"font\"> | undefined;\n private readonly imagePool = createImagePool();\n private readonly assetStore: AssetStore;\n private readonly renderer: RendererPort;\n private readonly keyboard: BrowserInput;\n private readonly captures: InputCaptureManager;\n captureInput(options: InputCaptureOptions = {}): InputCapture {\n this.assertAlive();\n return this.captures.start(options);\n }\n private readonly pointers: BrowserPointer;\n private readonly pointerChannels = new WeakMap<Scene, ScenePointer>();\n private readonly virtualInputs = new WeakMap<Scene, VirtualInput>();\n private virtualPresentation: VirtualInputPresentation | undefined;\n get virtualInput(): VirtualInput {\n this.assertAlive();\n return this.virtualFor(this.engine.scene);\n }\n private virtualFor(scene: Scene): VirtualInput {\n let input = this.virtualInputs.get(scene);\n if (!input) {\n input = new VirtualInput(this.channelFor(scene), this.engine.input);\n this.virtualInputs.set(scene, input);\n const owned = input;\n input.onDispose(() => {\n if (this.virtualInputs.get(scene) === owned)\n this.virtualInputs.delete(scene);\n if (this.engine.scene === scene) {\n this.virtualPresentation?.dispose();\n this.virtualPresentation = undefined;\n }\n });\n }\n return input;\n }\n private prepareVirtual(scene: Scene): VirtualInputPresentation | undefined {\n const input = this.virtualInputs.get(scene);\n if (!input || input.controls.length === 0) return;\n const renderer = this.renderer as RendererPort & {\n prepareVirtualInput?: (input: VirtualInput) => VirtualInputPresentation;\n };\n if (!renderer.prepareVirtualInput)\n throw new EngineError(\n \"RENDERER_CAPABILITY\",\n \"Renderer does not support virtual input presentation\",\n );\n const presentation = renderer.prepareVirtualInput(input);\n const off = input.onDispose(() => presentation.dispose());\n return {\n update: () => presentation.update(),\n dispose: () => {\n off();\n presentation.dispose();\n },\n };\n }\n private canvas: CanvasUI | undefined;\n private canvasPresentation: CanvasPresentation | undefined;\n private defaultCanvas: CanvasUI | undefined;\n private readonly ownedCanvas = new WeakSet<CanvasUI>();\n private readonly viewportBindings = new WeakMap<\n CanvasUI,\n { node: CanvasNode; dispose: () => void }\n >();\n get pointer(): ScenePointer {\n this.assertAlive();\n return this.channelFor(this.engine.scene);\n }\n get pointerDiagnostics() {\n return this.pointers.routing.diagnostics;\n }\n private channelFor(scene: Scene): ScenePointer {\n let channel = this.pointerChannels.get(scene);\n if (!channel) {\n channel = new ScenePointer(scene);\n this.pointerChannels.set(scene, channel);\n }\n return channel;\n }\n private readonly observer: ResizeObserver;\n private readonly frames: FrameDriver;\n private readonly options: GameOptions;\n private readonly resolution: LogicalResolution;\n private readonly aspect: Aspect;\n private readonly maxDelta: number;\n private readonly fixed: FixedStepRunner | undefined;\n private playback: ReplayPlayer | undefined;\n private playbackScene: Scene | undefined;\n private removeReplayOwner: (() => void) | undefined;\n private requestedViewport: Viewport | undefined;\n private projection: ViewTransform;\n private projectionDirty = true;\n private cameraX = NaN;\n private cameraY = NaN;\n private cameraZoom = NaN;\n private width = 800;\n private height = 450;\n private ratio = 1;\n private readonly scenes = new Map<SceneId, SceneRegistration>();\n private readonly retainedScenes = new Map<SceneId, SceneSession>();\n private readonly sceneRetention: SceneRetention;\n private activeRetention: SceneRetention = \"dispose\";\n private detachPresentation: (() => void) | undefined;\n private pendingScene: { id: SceneId; task: Promise<void> } | undefined;\n private readonly defaultUI: UINode[] = [];\n private ui: MountedUI | undefined;\n private prepared: PreparedScene | undefined;\n private startPromise: Promise<void> | undefined;\n private queue: Promise<void> = Promise.resolve();\n private frame: number | undefined;\n private previousTime: number | undefined;\n private dead = false;\n private ready = false;\n private rendererReady = false;\n private rendererSized = false;\n private staging: Scene | undefined;\n private readonly shutdown = new AbortController();\n private readonly errorBox: HTMLParagraphElement;\n constructor(options: GameOptions = {}) {\n this.options = options;\n this.sceneRetention = retentionPolicy(options.sceneRetention ?? \"dispose\");\n const { console: consoleEnabled = !options.onError, ...logging } =\n options.logging ?? {};\n this.logger = new Logger({\n ...logging,\n ...(consoleEnabled\n ? { sink: (entry) => console[entry.level](entry.message) }\n : {}),\n });\n this.engine = new Engine(\n options.seed === undefined ? {} : { seed: options.seed },\n );\n this.fixed = options.fixedStep\n ? new FixedStepRunner(this.engine, options.fixedStep)\n : undefined;\n this.camera = options.camera ?? new Camera();\n this.maxDelta = positive(options.maxDelta ?? 0.05, \"maxDelta\");\n this.resolution = {\n width: positive(options.resolution?.width ?? 800, \"resolution.width\"),\n height: positive(options.resolution?.height ?? 450, \"resolution.height\"),\n };\n this.aspect = options.aspect ?? Aspect.Fit;\n this.requestedViewport = options.viewport\n ? { ...options.viewport }\n : undefined;\n this.projection = createViewTransform({\n viewport: this.requestedViewport ?? {\n x: 0,\n y: 0,\n width: this.width,\n height: this.height,\n },\n resolution: this.resolution,\n aspect: this.aspect,\n camera: this.camera,\n });\n if (options.pixelRatio !== undefined)\n positive(options.pixelRatio, \"pixelRatio\");\n const themeName = options.theme ?? Theme.Dark;\n if (!Object.hasOwn(Themes, themeName))\n throw new EngineError(\"INVALID_THEME\", \"Unknown theme\");\n const theme = Themes[themeName];\n for (const [name, value] of Object.entries(options.tokens ?? {}))\n if (\n !Object.hasOwn(theme, name) ||\n typeof value !== \"string\" ||\n (name === \"font\"\n ? !validFontFamily(value)\n : !value.trim().length ||\n /[;{}<>\\r\\n\\0]|url\\s*\\(/i.test(value) ||\n !CSS.supports(\"color\", value))\n )\n throw new EngineError(\"INVALID_THEME_TOKEN\", `Invalid token: ${name}`);\n const tokens = { ...theme, ...options.tokens };\n this.defaultFont = tokens.font;\n this.assetStore = new AssetStore(\n browserAssetAdapter(this.imagePool, (data) => this.audio.decode(data)),\n this.logger,\n document.baseURI,\n options.assets,\n );\n this.assets = new AssetScope(this.assetStore, undefined, true);\n this.element = document.createElement(\"div\");\n this.element.className = \"simpludify\";\n this.element.tabIndex = 0;\n this.element.setAttribute(\n \"aria-label\",\n \"Game. Focus this area to use movement keys.\",\n );\n for (const [name, value] of Object.entries(tokens))\n this.element.style.setProperty(`--s-${name}`, value);\n this.errorBox = document.createElement(\"p\");\n this.errorBox.className = \"s-error\";\n this.errorBox.setAttribute(\"role\", \"alert\");\n this.errorBox.hidden = true;\n this.element.append(this.errorBox);\n (options.parent ?? document.body).append(this.element);\n this.audio = new GameAudio(this.element, this.assetStore, this.logger);\n try {\n this.renderer =\n options.renderer?.(this.element) ??\n new PixiRenderer(\n this.element,\n tokens.background,\n (error) => this.report(error, \"engine.renderer\"),\n { store: this.assetStore, images: this.imagePool },\n );\n } catch (error) {\n this.element.remove();\n this.engine.dispose();\n this.audio.dispose();\n this.assetStore.dispose();\n this.imagePool.dispose();\n throw error;\n }\n this.frames = options.frames ?? {\n request: (callback) => requestAnimationFrame(callback),\n cancel: (handle) => cancelAnimationFrame(handle),\n };\n this.captures = new InputCaptureManager(\n this.element,\n this.engine.input,\n () => this.engine.scene,\n () => this.pointers.release(),\n (error) => this.report(error, \"engine.input\"),\n );\n this.keyboard = new BrowserInput(this.element, this.engine.input);\n this.gamepads = new GamepadInput(this.engine.input, {\n observe: (pads) => this.captures.sample(pads),\n active: () =>\n !document.hidden &&\n document.hasFocus() &&\n this.element.contains(document.activeElement) &&\n !blocksGameKeyboard(document.activeElement),\n });\n this.pointers = new BrowserPointer(\n this.element,\n (event) => {\n const rect = this.element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return;\n const screen = screenPoint(\n ((event.clientX - rect.left) * this.width) / rect.width,\n ((event.clientY - rect.top) * this.height) / rect.height,\n );\n return { screen, world: this.screenToWorld(screen), view: this.view };\n },\n (error) => this.report(error, \"engine.input\"),\n () => this.updateProjection(),\n this.engine.input,\n );\n document.addEventListener(\n \"visibilitychange\",\n () => {\n this.previousTime = undefined;\n this.fixed?.reset();\n this.engine.input.clear();\n },\n { signal: this.shutdown.signal },\n );\n this.observer = new ResizeObserver(() => {\n try {\n this.resize();\n } catch (error) {\n this.report(error, \"engine.resize\", true);\n this.dispose();\n }\n });\n this.observer.observe(this.element);\n }\n /** Choose the Game default font for DOM and Canvas UI. */\n setFont(asset?: AssetHandle<\"font\">): void {\n this.assertAlive();\n if (asset && asset.kind !== \"font\")\n throw new EngineError(\"INVALID_VALUE\", \"A font asset is required\");\n const next = asset?.retain(this.assetStore);\n const old = this.fontUse;\n this.fontUse = next;\n const update = () => {\n this.element.style.setProperty(\n \"--s-font\",\n next?.value ?? this.defaultFont,\n );\n };\n next?.onChange(update);\n update();\n old?.release();\n }\n\n private assertAlive(): void {\n if (this.dead)\n throw new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\");\n }\n get tweens(): TweenScheduler {\n return this.engine.scene.tweens;\n }\n get presentationTweens(): TweenScheduler {\n return this.engine.scene.presentationTweens;\n }\n get paused(): boolean {\n return this.engine.paused;\n }\n pause(): void {\n this.assertAlive();\n this.pointers.release();\n this.engine.pause();\n this.previousTime = undefined;\n this.fixed?.reset();\n }\n resume(): void {\n this.assertAlive();\n this.pointers.release();\n this.engine.resume();\n this.previousTime = undefined;\n this.fixed?.reset();\n }\n /** Configure inside the initial Scene factory after game setup, before the first Engine step. */\n playReplay(\n data: unknown,\n options: {\n scene: Scene;\n controllers: ReplayControllers;\n expectedMetadata?: Readonly<Record<string, JsonValue>>;\n },\n ): ReplayPlayer {\n this.assertAlive();\n if (options.scene !== this.engine.scene && options.scene !== this.staging)\n throw new EngineError(\n \"REPLAY_STATE\",\n \"Replay Scene must be current or staged by this Game\",\n );\n if (this.playback)\n throw new EngineError(\"REPLAY_STATE\", \"Game already has a Replay player\");\n const player = new ReplayPlayer(this.engine, data, options);\n this.playback = player;\n this.playbackScene = options.scene;\n try {\n this.removeReplayOwner = options.scene.onDispose(() => this.stopReplay());\n } catch (error) {\n this.stopReplay();\n throw error;\n }\n return player;\n }\n stopReplay(): void {\n const player = this.playback,\n off = this.removeReplayOwner;\n this.playback = undefined;\n this.playbackScene = undefined;\n this.removeReplayOwner = undefined;\n off?.();\n player?.dispose();\n this.previousTime = undefined;\n this.fixed?.reset();\n }\n add<T extends Actor>(actor: T): T {\n this.assertAlive();\n return this.engine.scene.add(actor);\n }\n /** Scene-owned Actions for the current Scene. In a staged factory use context.actions. */\n actions<A extends ActionSet>(\n actions: A,\n bindings?: ActionBindings<A>,\n ): ActionController<A> {\n this.assertAlive();\n return new ActionController(actions, {\n scene: this.engine.scene,\n input: this.engine.input,\n ...(bindings === undefined ? {} : { bindings }),\n });\n }\n remove(actor: Actor | string): boolean {\n this.assertAlive();\n return this.engine.scene.remove(actor);\n }\n canvasUI(root: CanvasNode, options: CanvasUIOptions = {}): CanvasUI {\n this.assertAlive();\n if (this.startPromise || this.defaultCanvas)\n throw new EngineError(\n \"UI_ALREADY_STARTED\",\n \"Define one default Canvas UI before run\",\n );\n this.defaultCanvas = new CanvasUI(this.engine.scene, root, options);\n this.ownedCanvas.add(this.defaultCanvas);\n return this.defaultCanvas;\n }\n uiOverlay(...nodes: UINode[]): void {\n this.assertAlive();\n if (this.startPromise)\n throw new EngineError(\n \"UI_ALREADY_STARTED\",\n \"Define default UI before run\",\n );\n this.defaultUI.push(...nodes);\n }\n scene(id: SceneId, setup: SceneSetup, options: SceneOptions = {}): this {\n this.assertAlive();\n if (typeof id !== \"string\" || !id.length)\n throw new EngineError(\"INVALID_VALUE\", \"Scene id must not be empty\");\n if (typeof setup !== \"function\")\n throw new EngineError(\"INVALID_VALUE\", \"Scene setup must be a function\");\n if (this.scenes.has(id))\n throw new EngineError(\n \"DUPLICATE_SCENE\",\n \"Scene id is already registered\",\n { sceneId: id },\n );\n this.scenes.set(id, {\n setup,\n retention: retentionPolicy(options.retention ?? this.sceneRetention),\n });\n return this;\n }\n private wait<T>(promise: Promise<T>): Promise<T> {\n if (this.dead) {\n // A synchronous factory can dispose the Game before returning a Promise.\n void promise.catch(() => {});\n return Promise.reject(\n new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"),\n );\n }\n const signal = this.shutdown.signal;\n return new Promise<T>((resolve, reject) => {\n const abort = () => {\n signal.removeEventListener(\"abort\", abort);\n reject(new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"));\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n promise\n .then(resolve, reject)\n .finally(() => signal.removeEventListener(\"abort\", abort));\n });\n }\n run(initialScene?: SceneId): Promise<void> {\n if (this.dead)\n return Promise.reject(\n new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"),\n );\n if (this.startPromise) return this.startPromise;\n this.startPromise = (async () => {\n try {\n await this.wait(this.renderer.init());\n this.assertAlive();\n this.rendererReady = true;\n if (initialScene !== undefined) await this.navigate(initialScene);\n else\n await this.present(\n this.engine.scene,\n this.defaultUI,\n this.defaultCanvas,\n );\n this.assertAlive();\n this.defaultCanvas = undefined;\n this.defaultUI.length = 0;\n this.ready = true;\n this.resize();\n this.render();\n this.assertAlive();\n this.frame = this.frames.request(this.tick);\n } catch (error) {\n if (!this.dead)\n this.logger.report(error, {\n source: \"engine.startup\",\n message: \"Simpludify could not start\",\n fatal: true,\n standardOutput: false,\n });\n this.dispose();\n throw error;\n }\n })();\n return this.startPromise;\n }\n changeScene(id: SceneId): Promise<void> {\n if (this.dead)\n return Promise.reject(\n new EngineError(\"GAME_DISPOSED\", \"Game has been disposed\"),\n );\n if (!this.ready)\n return Promise.reject(\n new EngineError(\"GAME_NOT_READY\", \"Await run before navigating\"),\n );\n return this.navigate(id);\n }\n private navigate(id: SceneId): Promise<void> {\n const registration = this.scenes.get(id);\n if (!registration)\n return Promise.reject(\n new EngineError(\"SCENE_NOT_FOUND\", \"Unknown scene\", { sceneId: id }),\n );\n if (this.pendingScene?.id === id) return this.pendingScene.task;\n const task = this.queue\n .then(async () => {\n this.assertAlive();\n const beforeActivate = () => {\n if (this.pendingScene?.task === task) this.pendingScene = undefined;\n };\n const existing = this.retainedScenes.get(id);\n if (existing) {\n if (\n this.engine.scene === existing.scene &&\n existing.scene.state === SceneState.Active\n )\n return;\n try {\n await this.present(\n existing.scene,\n existing.nodes,\n existing.canvas,\n beforeActivate,\n registration.retention,\n );\n } catch (error) {\n this.reportPreparation(error);\n throw error;\n }\n return;\n }\n const scene = new Scene(id),\n nodes: UINode[] = [],\n controller = new AbortController();\n let canvas: CanvasUI | undefined;\n const pointer = this.channelFor(scene);\n const virtualFor = () => this.virtualFor(scene);\n this.staging = scene;\n scene.onDispose(() => controller.abort());\n try {\n const assets = this.assets.scope(scene);\n await this.wait(\n Promise.resolve(\n registration.setup({\n scene,\n assets,\n get tweens() {\n return scene.tweens;\n },\n get presentationTweens() {\n return scene.presentationTweens;\n },\n signal: controller.signal,\n add: (actor) => scene.add(actor),\n ui: (...items) => nodes.push(...items),\n pointer,\n get virtualInput() {\n return virtualFor();\n },\n canvasUI: (root, options) => {\n if (canvas)\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"A Scene has one Canvas UI root\",\n );\n canvas = new CanvasUI(scene, root, options);\n this.ownedCanvas.add(canvas);\n return canvas;\n },\n actions: (actions, bindings) =>\n new ActionController(actions, {\n scene,\n input: this.engine.input,\n ...(bindings === undefined ? {} : { bindings }),\n }),\n onUpdate: (callback) => scene.onUpdate(callback),\n onActivate: (callback) => scene.onActivate(callback),\n onDeactivate: (callback) => scene.onDeactivate(callback),\n onDispose: (callback) => scene.onDispose(callback),\n }),\n ),\n );\n this.assertAlive();\n if (registration.retention === \"retain\") {\n scene.onDispose(() => {\n if (this.retainedScenes.get(id)?.scene === scene)\n this.retainedScenes.delete(id);\n });\n }\n await this.present(\n scene,\n nodes,\n canvas,\n beforeActivate,\n registration.retention,\n );\n this.assertAlive();\n if (registration.retention === \"retain\" && !scene.disposed)\n this.retainedScenes.set(id, { scene, nodes, canvas });\n } catch (error) {\n this.reportPreparation(error);\n try {\n scene.dispose();\n } catch (cleanupError) {\n this.report(cleanupError);\n }\n throw error;\n } finally {\n if (this.staging === scene) this.staging = undefined;\n }\n })\n .finally(() => {\n if (this.pendingScene?.task === task) this.pendingScene = undefined;\n });\n this.pendingScene = { id, task };\n this.queue = task.catch(() => {});\n return task;\n }\n private reportPreparation(error: unknown): void {\n if (this.ready && !this.dead)\n this.logger.report(error, {\n source: \"engine.scene\",\n message: \"Simpludify could not prepare the requested scene\",\n fatal: false,\n standardOutput: false,\n });\n }\n private async present(\n scene: Scene,\n nodes: readonly UINode[],\n canvas?: CanvasUI,\n beforeActivate?: () => void,\n retention: SceneRetention = \"dispose\",\n ): Promise<void> {\n let prepared: PreparedScene | undefined,\n ui: MountedUI | undefined,\n activated = false,\n committed = false;\n let canvasPresentation: CanvasPresentation | undefined;\n let virtualPresentation: VirtualInputPresentation | undefined;\n const hooks: (() => void)[] = [];\n const detach = () => {\n for (const off of hooks.splice(0)) off();\n };\n try {\n const preparing = this.renderer.prepare(scene);\n void preparing.then(\n (value) => {\n if (this.dead || scene.disposed) {\n try {\n value.dispose();\n } catch (error) {\n this.report(error);\n }\n }\n },\n () => {},\n );\n prepared = await this.wait(preparing);\n this.assertAlive();\n ui = mountUI(nodes, this.report);\n hooks.push(scene.onDispose(ui.dispose));\n if (canvas) {\n canvas.setErrorHandler(this.report);\n const renderer = this.renderer as RendererPort & {\n prepareCanvasUI?: (\n ui: CanvasUI,\n routing: PointerRouting,\n ) => CanvasPresentation;\n };\n if (!renderer.prepareCanvasUI)\n throw new EngineError(\n \"RENDERER_CAPABILITY\",\n \"Renderer does not support Canvas UI\",\n );\n canvasPresentation = renderer.prepareCanvasUI(\n canvas,\n this.pointers.routing,\n );\n hooks.push(scene.onDispose(() => canvasPresentation?.dispose()));\n }\n virtualPresentation = this.prepareVirtual(scene);\n if (scene.state === SceneState.Preparing) scene.markReady();\n beforeActivate?.();\n this.errorBox.hidden = true;\n try {\n if (this.playback && this.playbackScene !== scene) this.stopReplay();\n this.engine.activate(scene, { previous: this.activeRetention });\n } catch (error) {\n if (this.engine.scene !== scene) throw error;\n activated = scene.disposed;\n if (scene.state !== SceneState.Active) throw error;\n this.report(error, \"engine.scene\");\n }\n activated = true;\n this.assertAlive();\n if (scene.disposed)\n throw new EngineError(\n \"SCENE_DISPOSED\",\n \"Scene was disposed during activation\",\n );\n const oldPrepared = this.prepared,\n oldUI = this.ui,\n oldCanvasUI = this.canvas,\n detachOld = this.detachPresentation,\n oldCanvas = this.canvasPresentation,\n oldVirtual = this.virtualPresentation;\n this.prepared = prepared;\n this.detachPresentation = detach;\n this.activeRetention = retention;\n this.ui = ui;\n this.canvas = canvas;\n this.canvasPresentation = canvasPresentation;\n this.virtualPresentation = virtualPresentation;\n committed = true;\n try {\n this.pointers.routing.setScene(this.channelFor(scene), canvas);\n this.element.append(ui.element);\n } finally {\n for (const cleanup of [\n () => detachOld?.(),\n () => {\n if (oldCanvasUI && !oldCanvasUI.disposed) {\n oldCanvasUI.focus();\n oldCanvasUI.stopMotion();\n }\n },\n () => oldPrepared?.dispose(),\n () => oldUI?.dispose(),\n () => oldCanvas?.dispose(),\n () => oldVirtual?.dispose(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n this.report(error);\n }\n }\n }\n this.assertAlive();\n this.previousTime = undefined;\n this.fixed?.reset();\n this.updateProjection();\n this.render();\n this.assertAlive();\n } catch (error) {\n if (!committed)\n for (const cleanup of [\n detach,\n () => prepared?.dispose(),\n () => ui?.dispose(),\n () => canvasPresentation?.dispose(),\n () => virtualPresentation?.dispose(),\n ]) {\n try {\n cleanup();\n } catch (cleanupError) {\n this.report(cleanupError);\n }\n }\n if (activated && !this.dead) {\n this.logger.report(error, {\n source: \"engine.presentation\",\n message: \"Simpludify could not present the active scene\",\n fatal: true,\n standardOutput: false,\n });\n this.dispose();\n }\n throw error;\n }\n }\n get viewport(): Viewport {\n this.updateProjection();\n return this.projection.viewport;\n }\n get view(): ViewTransform {\n this.updateProjection();\n return this.projection;\n }\n /** Bind the mounted UI's resolved region to the world viewport. UI units become CSS pixels.\n * One binding per UI; replacement/unbind restores the manual viewport. UI/node disposal unbinds.\n * A collapsed/hidden region clips all world rendering and pointer input. No extra frame/observer.\n */\n bindViewport(ui: CanvasUI, node: CanvasNode): () => void {\n this.assertAlive();\n if (\n !this.ownedCanvas.has(ui) ||\n ui.disposed ||\n node.disposed ||\n node.ui !== ui\n )\n throw new EngineError(\n \"UI_OWNERSHIP\",\n \"Viewport region must belong to this Game's Canvas UI\",\n );\n this.viewportBindings.get(ui)?.dispose();\n let removed = false;\n const off: (() => void)[] = [];\n const binding = {\n node,\n dispose: () => {\n if (removed) return;\n removed = true;\n if (this.viewportBindings.get(ui) === binding)\n this.viewportBindings.delete(ui);\n for (const unregister of off) unregister();\n this.projectionDirty = true;\n },\n };\n this.viewportBindings.set(ui, binding);\n off.push(ui.onDispose(binding.dispose), node.onDispose(binding.dispose));\n this.projectionDirty = true;\n return binding.dispose;\n }\n setViewport(viewport?: Viewport): void {\n this.assertAlive();\n const next = viewport ? { ...viewport } : undefined;\n createViewTransform({\n viewport: next ?? { x: 0, y: 0, width: this.width, height: this.height },\n resolution: this.resolution,\n aspect: this.aspect,\n camera: this.camera,\n });\n this.requestedViewport = next;\n this.projectionDirty = true;\n this.updateProjection();\n if (this.ready) this.render();\n }\n worldToScreen(point: WorldPoint): ScreenPoint {\n return worldToScreen(this.view, point);\n }\n screenToWorld(point: ScreenPoint): WorldPoint {\n return screenToWorld(this.view, point);\n }\n pointerToWorld(pointer: {\n readonly clientX: number;\n readonly clientY: number;\n }): WorldPoint {\n const rect = this.element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0)\n throw new EngineError(\n \"VIEWPORT_UNAVAILABLE\",\n \"Game has no visible bounds\",\n );\n return this.screenToWorld(\n screenPoint(\n ((pointer.clientX - rect.left) * this.width) / rect.width,\n ((pointer.clientY - rect.top) * this.height) / rect.height,\n ),\n );\n }\n async whenReady(): Promise<void> {\n if (!this.startPromise)\n throw new EngineError(\n \"GAME_NOT_READY\",\n \"Call run before waiting for resources\",\n );\n await this.startPromise;\n this.assertAlive();\n const prepared = this.prepared;\n this.render();\n await this.wait(prepared?.ready?.() ?? Promise.resolve());\n this.assertAlive();\n if (prepared !== this.prepared)\n throw new EngineError(\n \"GAME_DISPOSED\",\n \"Scene presentation changed while waiting for resources\",\n );\n this.render();\n }\n private updateProjection(): void {\n // Resolve UI before projection so drawing, getters and pointer conversion see one layout.\n this.canvasPresentation?.update(this.width, this.height);\n const ui = this.canvas;\n const region = ui ? this.viewportBindings.get(ui)?.node : undefined;\n let v = this.requestedViewport;\n let empty = false;\n if (ui && region) {\n const b = region.bounds,\n scale = ui.scale;\n const x = Math.max(0, Math.min(this.width, b.x * scale));\n const y = Math.max(0, Math.min(this.height, b.y * scale));\n const right = Math.max(x, Math.min(this.width, (b.x + b.width) * scale));\n const bottom = Math.max(\n y,\n Math.min(this.height, (b.y + b.height) * scale),\n );\n // Input transparency of the slot does not hide its world. Visibility and enable\n // state do; a dedicated slot may use pointerEvents: \"none\" for pass-through.\n let visible = region.ui === ui;\n for (let node: CanvasNode | undefined = region; node; node = node.parent)\n if (node.disposed || !node.visible || !node.enabled) visible = false;\n empty = !visible || right <= x || bottom <= y;\n v = {\n x,\n y,\n width: empty ? 0 : right - x,\n height: empty ? 0 : bottom - y,\n };\n }\n const viewport = v ?? {\n x: 0,\n y: 0,\n width: this.width,\n height: this.height,\n };\n this.virtualInputs.get(this.engine.scene)?.refresh(viewport);\n const previous = this.projection.viewport;\n const c = this.camera;\n if (\n !this.projectionDirty &&\n previous.x === viewport.x &&\n previous.y === viewport.y &&\n previous.width === viewport.width &&\n previous.height === viewport.height &&\n this.cameraX === c.x &&\n this.cameraY === c.y &&\n this.cameraZoom === c.zoom\n )\n return;\n this.projectionDirty = false;\n this.cameraX = c.x;\n this.cameraY = c.y;\n this.cameraZoom = c.zoom;\n this.projection = createViewTransform({\n viewport: empty ? { ...viewport, width: 1, height: 1 } : viewport,\n resolution: this.resolution,\n aspect: this.aspect,\n camera: c,\n });\n if (empty)\n this.projection = {\n ...this.projection,\n viewport,\n clip: { ...viewport, width: 0, height: 0 },\n };\n }\n private resize(): void {\n if (this.dead || !this.rendererReady) return;\n const width = this.element.clientWidth,\n height = this.element.clientHeight;\n if (width <= 0 || height <= 0) return;\n const ratio =\n this.options.pixelRatio ?? Math.min(window.devicePixelRatio || 1, 2);\n if (\n this.rendererSized &&\n this.width === width &&\n this.height === height &&\n this.ratio === ratio\n )\n return;\n this.rendererSized = true;\n if (this.width !== width || this.height !== height)\n this.projectionDirty = true;\n this.width = width;\n this.height = height;\n this.ratio = ratio;\n this.renderer.resize(width, height, this.ratio);\n this.updateProjection();\n if (this.ready) this.render();\n }\n private render(): void {\n this.updateProjection();\n this.virtualPresentation ??= this.prepareVirtual(this.engine.scene);\n this.virtualPresentation?.update();\n this.prepared?.render(this.projection);\n }\n private readonly tick = (time: number): void => {\n if (this.dead) return;\n try {\n if (document.hidden) {\n this.canvas?.stopMotion();\n this.previousTime = undefined;\n this.fixed?.reset();\n this.engine.input.clear();\n } else {\n const elapsed =\n this.previousTime === undefined\n ? 0\n : Math.max(0, (time - this.previousTime) / 1000);\n this.previousTime = time;\n if (this.virtualInputs.has(this.engine.scene)) this.updateProjection();\n if (this.playback)\n this.playback.advance(elapsed, this.options.fixedStep?.maxSteps ?? 8);\n else if (this.fixed) this.fixed.advance(elapsed);\n else this.engine.step(Math.min(this.maxDelta, elapsed));\n if (!this.dead && !this.engine.scene.disposed)\n this.engine.scene.advancePresentation(\n Math.min(this.maxDelta, elapsed),\n );\n if (this.engine.paused) this.canvas?.stopMotion();\n else this.canvas?.advance(elapsed);\n this.virtualInputs\n .get(this.engine.scene)\n ?.advance(Math.min(this.maxDelta, elapsed));\n if (\n this.ratio !==\n (this.options.pixelRatio ?? Math.min(window.devicePixelRatio || 1, 2))\n )\n this.resize();\n this.render();\n }\n if (!this.dead) this.frame = this.frames.request(this.tick);\n } catch (error) {\n this.report(error, \"engine.frame\", true);\n this.dispose();\n }\n };\n private readonly report = (\n error: unknown,\n source = \"engine.runtime\",\n fatal = false,\n ): void => {\n const message = fatal\n ? \"Simpludify stopped after a runtime error\"\n : \"Simpludify encountered a runtime error\";\n this.logger.report(error, { source, fatal, message });\n this.errorBox.textContent = message;\n this.errorBox.hidden = false;\n try {\n if (this.options.onError) this.options.onError(error);\n } catch {\n /* Observers must not prevent cleanup. */\n }\n };\n dispose(): void {\n if (this.dead) return;\n this.dead = true;\n this.shutdown.abort();\n if (this.frame !== undefined) this.frames.cancel(this.frame);\n for (const cleanup of [\n () => this.stopReplay(),\n () => this.staging?.dispose(),\n () => this.captures.dispose(),\n () => this.pointers.dispose(),\n () => this.gamepads.dispose(),\n () => this.keyboard.dispose(),\n () => this.canvasPresentation?.dispose(),\n () => this.virtualPresentation?.dispose(),\n () => this.canvas?.dispose(),\n () => this.observer.disconnect(),\n () => this.detachPresentation?.(),\n () => this.ui?.dispose(),\n () => this.prepared?.dispose(),\n () => this.renderer.dispose(),\n () => this.audio.dispose(),\n () => this.engine.dispose(),\n () => this.fontUse?.release(),\n () => this.assetStore.dispose(),\n () => this.imagePool.dispose(),\n () => this.element.remove(),\n ]) {\n try {\n cleanup();\n } catch (error) {\n this.report(error);\n }\n }\n this.ui = undefined;\n this.prepared = undefined;\n this.staging = undefined;\n this.canvas = undefined;\n this.canvasPresentation = undefined;\n this.virtualPresentation = undefined;\n this.defaultCanvas = undefined;\n this.fontUse = undefined;\n this.defaultUI.length = 0;\n this.scenes.clear();\n this.retainedScenes.clear();\n this.detachPresentation = undefined;\n this.pendingScene = undefined;\n }\n}\n\nfunction retentionPolicy(value: SceneRetention): SceneRetention {\n if (value !== \"dispose\" && value !== \"retain\")\n throw new EngineError(\"INVALID_VALUE\", \"Unknown scene retention policy\");\n return value;\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"],"mappings":"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"}