@simpludify/web 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -3
- package/dist/canvas-visual.d.ts +4 -0
- package/dist/game.d.ts +2 -0
- package/dist/gamepad-bindings.d.ts +100 -0
- package/dist/gamepad-layout.d.ts +18 -0
- package/dist/gamepads.d.ts +79 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +485 -11
- package/dist/index.js.map +1 -1
- package/dist/renderer.d.ts +1 -0
- package/dist/style.css +13 -3
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["CoreCanvasButton"],"sources":["../src/canvas-node.ts","../src/ui-keyboard.ts","../src/input.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/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","/** 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 type { PointerInfo } from \"@simpludify/core\";\nimport {\n containsScreenPoint,\n PointerRouting,\n screenPoint,\n type ViewTransform,\n type WorldPoint,\n} from \"@simpludify/core\";\nimport { focusGameSurface } from \"./ui-keyboard\";\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 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 ) {\n this.routing = new PointerRouting((id) => {\n if (host.hasPointerCapture(id)) host.releasePointerCapture(id);\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 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 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 (this.routing.hasHover(e.pointerId))\n this.routing.leave(this.data(e));\n return;\n }\n this.flush();\n this.routing.move(this.data(e));\n }),\n options,\n );\n window.addEventListener(\n \"pointerup\",\n (e) =>\n this.guard(() => {\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) => this.guard(() => this.routing.cancel(e.pointerId, false)),\n options,\n );\n host.addEventListener(\n \"lostpointercapture\",\n (e) => this.guard(() => this.routing.cancel(e.pointerId)),\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 document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) this.release();\n },\n options,\n );\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.guard(() => this.routing.release());\n }\n dispose(): void {\n this.abort.abort();\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-family:${style.fontFamily};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 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 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 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 },\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 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 beforeResolutionChange(): void {\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: (HTMLButtonElement | HTMLSelectElement | HTMLInputElement)[] =\n [];\n const paint: {\n node?: CanvasNode;\n box: UIBounds;\n native?: CanvasNativeSelect | CanvasNativeText;\n clip?: UIBounds;\n }[] = [];\n let order = 0;\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 }\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 const b = node.bounds,\n s = node.style;\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 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;\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 display.visible = bars.length > 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 }\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 // 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.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 type { CanvasUI, PointerRouting } 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 { Application, Container, Graphics, Sprite, Texture } 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\";\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 get canvasDiagnostics() {\n let nodes = 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 buttons += d.buttons;\n syncs += d.syncs;\n textMetrics += d.textMetrics;\n }\n return {\n presentations: this.canvasPresentations.size,\n nodes,\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 });\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 return this.images.acquire(new URL(url, document.baseURI).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.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 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 type WorldPoint,\n worldToScreen,\n} from \"@simpludify/core\";\nimport type { CanvasPresentation } from \"./canvas-visual\";\nimport { BrowserInput } from \"./input\";\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\";\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 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 private readonly renderer: RendererPort;\n private readonly keyboard: BrowserInput;\n private readonly pointers: BrowserPointer;\n private readonly pointerChannels = new WeakMap<Scene, ScenePointer>();\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 theme = Themes[options.theme ?? Theme.Dark];\n if (!theme) throw new EngineError(\"INVALID_THEME\", \"Unknown theme\");\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.keyboard = new BrowserInput(this.element, this.engine.input);\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.canvasPresentation?.update(this.width, this.height),\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 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 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 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 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 this.prepared = prepared;\n this.ui = ui;\n this.canvas = canvas;\n this.canvasPresentation = canvasPresentation;\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 ]) {\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 ]) {\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 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.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.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 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.pointers.dispose(),\n () => this.keyboard.dispose(),\n () => this.canvasPresentation?.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.defaultCanvas = undefined;\n this.defaultUI.length = 0;\n this.scenes.clear();\n this.pendingScenes.clear();\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["CoreCanvasButton"],"sources":["../src/canvas-node.ts","../src/gamepad-bindings.ts","../src/gamepad-layout.ts","../src/gamepads.ts","../src/ui-keyboard.ts","../src/input.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/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 type ActionKind,\n type ActionSet,\n type ActionToken,\n EngineError,\n} from \"@simpludify/core\";\n\n/** Standard mapping physical positions, not product-specific printed labels. */\nexport const GamepadButton = Object.freeze({\n South: 0,\n East: 1,\n West: 2,\n North: 3,\n LeftShoulder: 4,\n RightShoulder: 5,\n LeftTrigger: 6,\n RightTrigger: 7,\n Select: 8,\n Start: 9,\n LeftStick: 10,\n RightStick: 11,\n DPadUp: 12,\n DPadDown: 13,\n DPadLeft: 14,\n DPadRight: 15,\n Home: 16,\n});\nexport type GamepadButton = (typeof GamepadButton)[keyof typeof GamepadButton];\nexport const GamepadAxis = Object.freeze({\n LeftX: 0,\n LeftY: 1,\n RightX: 2,\n RightY: 3,\n});\nexport type GamepadAxis = (typeof GamepadAxis)[keyof typeof GamepadAxis];\nexport interface GamepadButtonBinding {\n readonly buttons?: readonly (\n | number\n | { readonly button: number; readonly threshold?: number }\n )[];\n}\nexport interface GamepadAxisBinding {\n readonly axis?: number;\n readonly invert?: boolean;\n readonly negative?: readonly number[];\n readonly positive?: readonly number[];\n readonly deadZone?: number;\n}\nexport interface GamepadVectorBinding {\n readonly x?: GamepadAxisBinding;\n readonly y?: GamepadAxisBinding;\n}\nexport interface GamepadVector3Binding extends GamepadVectorBinding {\n readonly z?: GamepadAxisBinding;\n}\nexport type GamepadBinding<K extends ActionKind> = K extends \"button\"\n ? GamepadButtonBinding\n : K extends \"axis1d\"\n ? GamepadAxisBinding\n : K extends \"axis2d\"\n ? GamepadVectorBinding\n : GamepadVector3Binding;\nexport type GamepadBindings<A extends ActionSet> = {\n readonly [N in keyof A]?: GamepadBinding<A[N][\"kind\"]>;\n};\n\nconst axis = (index: number) => Object.freeze({ axis: index });\n/** Ready-to-use data; game Actions retain application-defined names. */\nexport const GamepadBindings = Object.freeze({\n LeftStick: Object.freeze({ x: axis(0), y: axis(1) }),\n RightStick: Object.freeze({ x: axis(2), y: axis(3) }),\n DPad: Object.freeze({\n x: Object.freeze({\n negative: Object.freeze([14]),\n positive: Object.freeze([15]),\n }),\n y: Object.freeze({\n negative: Object.freeze([12]),\n positive: Object.freeze([13]),\n }),\n }),\n Move: Object.freeze({\n x: Object.freeze({\n axis: 0,\n negative: Object.freeze([14]),\n positive: Object.freeze([15]),\n }),\n y: Object.freeze({\n axis: 1,\n negative: Object.freeze([12]),\n positive: Object.freeze([13]),\n }),\n }),\n});\n\ntype Binding =\n | GamepadButtonBinding\n | GamepadAxisBinding\n | GamepadVector3Binding;\nexport type CheckedGamepadBinding = readonly [ActionToken, Binding];\nconst fail = (): never => {\n throw new EngineError(\"INVALID_GAMEPAD_BINDING\", \"Invalid gamepad binding\");\n};\nexport function gamepadIndex(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < 0)\n return fail();\n return value;\n}\nexport function gamepadDeadZone(value: unknown): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value < 0 ||\n value >= 1\n )\n return fail();\n return value;\n}\nfunction record(\n value: unknown,\n keys: readonly string[],\n): Record<string, unknown> {\n if (\n !value ||\n typeof value !== \"object\" ||\n Array.isArray(value) ||\n Object.keys(value).some((k) => !keys.includes(k))\n )\n return fail();\n return Object.fromEntries(Object.entries(value));\n}\nfunction axisBinding(value: unknown): GamepadAxisBinding {\n const v = record(value, [\n \"axis\",\n \"invert\",\n \"negative\",\n \"positive\",\n \"deadZone\",\n ]);\n const indices = (value: unknown): readonly number[] => {\n if (value === undefined) return Object.freeze([]);\n if (!Array.isArray(value)) return fail();\n return Object.freeze([...new Set(value.map(gamepadIndex))]);\n };\n if (v.invert !== undefined && typeof v.invert !== \"boolean\") return fail();\n return Object.freeze({\n ...(v.axis === undefined ? {} : { axis: gamepadIndex(v.axis) }),\n invert: v.invert ?? false,\n negative: indices(v.negative),\n positive: indices(v.positive),\n ...(v.deadZone === undefined\n ? {}\n : { deadZone: gamepadDeadZone(v.deadZone) }),\n }) as GamepadAxisBinding;\n}\nexport function checkedGamepadBindings(\n actions: ActionSet,\n value: unknown,\n): readonly CheckedGamepadBinding[] {\n const v = record(value, Object.keys(actions));\n return Object.freeze(\n Object.entries(v).map(([name, binding]) => {\n if (!Object.hasOwn(actions, name)) return fail();\n const action = actions[name];\n if (!action) return fail();\n let result: Binding;\n if (action.kind === \"button\") {\n const b = record(binding, [\"buttons\"]);\n if (b.buttons !== undefined && !Array.isArray(b.buttons)) return fail();\n result = Object.freeze({\n buttons: Object.freeze(\n ((b.buttons ?? []) as unknown[]).map((item) => {\n if (typeof item === \"number\") return gamepadIndex(item);\n const b = record(item, [\"button\", \"threshold\"]),\n threshold = b.threshold ?? 0.5;\n if (\n typeof threshold !== \"number\" ||\n !Number.isFinite(threshold) ||\n threshold <= 0 ||\n threshold > 1\n )\n return fail();\n return Object.freeze({\n button: gamepadIndex(b.button),\n threshold,\n });\n }),\n ),\n });\n } else if (action.kind === \"axis1d\") result = axisBinding(binding);\n else {\n const keys = action.kind === \"axis2d\" ? [\"x\", \"y\"] : [\"x\", \"y\", \"z\"],\n b = record(binding, keys);\n result = Object.freeze(\n Object.fromEntries(keys.map((k) => [k, axisBinding(b[k] ?? {})])),\n );\n }\n return Object.freeze([action, result] as const);\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 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 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 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.bindings = checkedGamepadBindings(\n controller.actions,\n options.bindings,\n );\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 = checkedGamepadBindings(this.controller.actions, bindings);\n this.clear();\n this.bindings = checked;\n }\n clear(): void {\n this.source.clear();\n this.armed = false;\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 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 this.source.set(action as A[keyof A], value as never);\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 constructor(\n private readonly input: InputSystem,\n options: {\n readonly poll?: GamepadPoll;\n readonly active?: () => boolean;\n readonly events?: EventTarget;\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.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 const allowed = this.active();\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 type { PointerInfo } from \"@simpludify/core\";\nimport {\n containsScreenPoint,\n PointerRouting,\n screenPoint,\n type ViewTransform,\n type WorldPoint,\n} from \"@simpludify/core\";\nimport { focusGameSurface } from \"./ui-keyboard\";\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 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 ) {\n this.routing = new PointerRouting((id) => {\n if (host.hasPointerCapture(id)) host.releasePointerCapture(id);\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 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 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 (this.routing.hasHover(e.pointerId))\n this.routing.leave(this.data(e));\n return;\n }\n this.flush();\n this.routing.move(this.data(e));\n }),\n options,\n );\n window.addEventListener(\n \"pointerup\",\n (e) =>\n this.guard(() => {\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) => this.guard(() => this.routing.cancel(e.pointerId, false)),\n options,\n );\n host.addEventListener(\n \"lostpointercapture\",\n (e) => this.guard(() => this.routing.cancel(e.pointerId)),\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 document.addEventListener(\n \"visibilitychange\",\n () => {\n if (document.hidden) this.release();\n },\n options,\n );\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.guard(() => this.routing.release());\n }\n dispose(): void {\n this.abort.abort();\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 type { CanvasUI, PointerRouting } 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\";\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 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.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 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 type WorldPoint,\n worldToScreen,\n} from \"@simpludify/core\";\nimport type { CanvasPresentation } from \"./canvas-visual\";\nimport { GamepadInput } from \"./gamepads\";\nimport { BrowserInput } from \"./input\";\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\";\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 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 pointers: BrowserPointer;\n private readonly pointerChannels = new WeakMap<Scene, ScenePointer>();\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.keyboard = new BrowserInput(this.element, this.engine.input);\n this.gamepads = new GamepadInput(this.engine.input, {\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.canvasPresentation?.update(this.width, this.height),\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 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 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 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 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 this.prepared = prepared;\n this.ui = ui;\n this.canvas = canvas;\n this.canvasPresentation = canvasPresentation;\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 ]) {\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 ]) {\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 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.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.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 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.pointers.dispose(),\n () => this.gamepads.dispose(),\n () => this.keyboard.dispose(),\n () => this.canvasPresentation?.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.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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"}
|