@duyquangnvx/pixi-game-engine 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/dist/index.cjs +6 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/engine.ts","../src/ui/alert/alert-manager.ts","../src/ui/modal/base-modal.ts","../src/core/signal.ts","../src/assets/asset-manager.ts","../src/utils/logger.ts","../src/input/gamepad.ts","../src/input/keyboard.ts","../src/input/pointer.ts","../src/input/input-manager.ts","../src/ui/modal/modal-manager.ts","../src/particles/particle-manager.ts","../src/scenes/scene-manager.ts","../src/sound/sound-manager.ts","../src/spine/spine-manager.ts","../src/ui/toast/toast-manager.ts","../src/ui/toast/toast-theme.ts","../src/ui/toast/toast-presets.ts","../src/tween/tween-manager.ts","../src/ui/ui-manager.ts","../src/scenes/scene.ts","../src/animations/presets.ts","../src/animations/count-animator.ts","../src/animations/text-count-renderer.ts"],"sourcesContent":["// Core\nexport { Engine, Signal } from './core';\nexport type { EngineConfig, ScaleMode, SignalBinding } from './core';\n\n// Scenes\nexport { Scene, SceneManager } from './scenes';\n\n// Input\nexport { InputManager, KeyboardManager, PointerManager, GamepadManager } from './input';\n\n// Assets\nexport { AssetManager } from './assets';\nexport type { AssetBundle, AssetEntry, AssetManifest } from './assets';\n\n// Sound\nexport { SoundManager } from './sound';\n\n// Particles\nexport { ParticleManager } from './particles';\n\n// Tween\nexport { TweenManager } from './tween';\n\n// Spine\nexport { SpineManager } from './spine';\n\n// UI\nexport {\n UIManager,\n BaseModal,\n ModalManager,\n AlertManager,\n ToastManager,\n createTheme,\n TOAST_PRESETS,\n getPreset,\n getDefaultColors,\n} from './ui';\nexport type {\n BaseModalConfig,\n CloseButtonPosition,\n ModalAnimation,\n ModalButtonConfig,\n AlertButton,\n AlertConfig,\n AlertType,\n ToastColorSet,\n ToastConfig,\n ToastManagerConfig,\n ToastTheme,\n ToastThemePreset,\n ToastType,\n} from './ui';\n\n// Animations\nexport { CountAnimator, TextCountRenderer, COUNT_PRESETS, getCountPreset } from './animations';\nexport type { CountAnimatorConfig, CountPreset, ICountRenderer } from './animations';\n\n// Utils\nexport { Logger, LoggerClass } from './utils';\nexport type { LogLevel } from './utils';\n\n// Re-export PIXI for convenience\nexport * as PIXI from 'pixi.js';\nexport type { ISkeletonData } from 'pixi-spine';\nexport { Spine } from 'pixi-spine';\n","import * as PIXI from 'pixi.js';\r\nimport { AlertManager } from '../ui/alert/alert-manager';\r\nimport { AssetManager } from '../assets/asset-manager';\r\nimport { InputManager } from '../input/input-manager';\r\nimport { ModalManager } from '../ui/modal/modal-manager';\r\nimport { ParticleManager } from '../particles/particle-manager';\r\nimport { SceneManager } from '../scenes/scene-manager';\r\nimport { Signal } from './signal';\r\nimport { SoundManager } from '../sound/sound-manager';\r\nimport { SpineManager } from '../spine/spine-manager';\r\nimport { ToastManager } from '../ui/toast/toast-manager';\r\nimport { TweenManager } from '../tween/tween-manager';\r\nimport { UIManager } from '../ui/ui-manager';\r\nimport { Logger } from '../utils';\r\n\r\nexport type ScaleMode = 'none' | 'letterbox' | 'fill';\r\n\r\nexport interface EngineConfig {\r\n width: number;\r\n height: number;\r\n backgroundColor?: number;\r\n antialias?: boolean;\r\n resolution?: number;\r\n autoDensity?: boolean;\r\n /** Scale mode for responsive resizing. Default: 'letterbox' */\r\n scaleMode?: ScaleMode;\r\n /** Auto-resize on window resize. Default: true */\r\n autoResize?: boolean;\r\n}\r\n\r\nexport class Engine {\r\n private constructor() {}\r\n\r\n private static _app: PIXI.Application;\r\n private static _scenes: SceneManager;\r\n private static _input: InputManager;\r\n private static _assets: AssetManager;\r\n private static _sound: SoundManager;\r\n private static _particles: ParticleManager;\r\n private static _tween: TweenManager;\r\n private static _ui: UIManager;\r\n private static _spine: SpineManager;\r\n private static _toast: ToastManager;\r\n private static _alert: AlertManager;\r\n private static _modal: ModalManager;\r\n\r\n /** Signal emitted when engine is paused */\r\n public static readonly onPause = new Signal<void>();\r\n /** Signal emitted when engine is resumed */\r\n public static readonly onResume = new Signal<void>();\r\n /** Signal emitted when engine is resized */\r\n public static readonly onResize = new Signal<{ width: number; height: number; scale: number }>();\r\n /** Signal emitted when engine is updated */\r\n public static readonly onUpdate = new Signal<number>();\r\n /** Signal emitted at the end of init() after all managers are constructed */\r\n public static readonly onReady = new Signal<void>();\r\n /** Signal emitted at the start of destroy() before any teardown */\r\n public static readonly onDestroy = new Signal<void>();\r\n /** Signal emitted when browser tab visibility changes (true = visible, false = hidden) */\r\n public static readonly onVisibilityChange = new Signal<boolean>();\r\n /** Signal emitted when browser window gains/loses focus (true = focused, false = blurred) */\r\n public static readonly onFocusChange = new Signal<boolean>();\r\n\r\n /** Design resolution width (original config width) */\r\n private static _designWidth: number;\r\n /** Design resolution height (original config height) */\r\n private static _designHeight: number;\r\n /** Current scale mode */\r\n private static _scaleMode: ScaleMode;\r\n /** Current scale factor */\r\n private static _scale = 1;\r\n\r\n private static _isRunning = false;\r\n private static _resizeHandler: () => void;\r\n private static _visibilityHandler: () => void;\r\n private static _focusHandler: () => void;\r\n private static _blurHandler: () => void;\r\n private static _initialized = false;\r\n\r\n /** Logger instance for consistent logging across the engine */\r\n public static readonly logger = Logger;\r\n\r\n public static get scenes(): SceneManager { return Engine._scenes; }\r\n public static get input(): InputManager { return Engine._input; }\r\n public static get assets(): AssetManager { return Engine._assets; }\r\n public static get sound(): SoundManager { return Engine._sound; }\r\n public static get particles(): ParticleManager { return Engine._particles; }\r\n public static get tween(): TweenManager { return Engine._tween; }\r\n public static get ui(): UIManager { return Engine._ui; }\r\n public static get spine(): SpineManager { return Engine._spine; }\r\n public static get toast(): ToastManager { return Engine._toast; }\r\n public static get alert(): AlertManager { return Engine._alert; }\r\n public static get modal(): ModalManager { return Engine._modal; }\r\n\r\n public static get app(): PIXI.Application { return Engine._app; }\r\n\r\n public static get view(): PIXI.ICanvas {\r\n return Engine._app.view;\r\n }\r\n\r\n public static get stage(): PIXI.Container {\r\n return Engine._app.stage;\r\n }\r\n\r\n /** Returns design resolution dimensions (use for positioning game elements) */\r\n public static get screen(): PIXI.Rectangle {\r\n return new PIXI.Rectangle(0, 0, Engine._designWidth, Engine._designHeight);\r\n }\r\n\r\n /** Returns actual renderer/viewport dimensions */\r\n public static get viewport(): PIXI.Rectangle {\r\n return Engine._app.screen;\r\n }\r\n\r\n public static get isRunning(): boolean {\r\n return Engine._isRunning;\r\n }\r\n\r\n /** Design resolution width (original config width) */\r\n public static get designWidth(): number {\r\n return Engine._designWidth;\r\n }\r\n\r\n /** Design resolution height (original config height) */\r\n public static get designHeight(): number {\r\n return Engine._designHeight;\r\n }\r\n\r\n /** Current scale mode */\r\n public static get scaleMode(): ScaleMode {\r\n return Engine._scaleMode;\r\n }\r\n\r\n public static set scaleMode(value: ScaleMode) {\r\n Engine._scaleMode = value;\r\n }\r\n\r\n /** Get current scale factor */\r\n public static get scale(): number {\r\n return Engine._scale;\r\n }\r\n\r\n /** Initialize the Engine. Throws if already initialized. */\r\n public static init(config: EngineConfig): void {\r\n if (Engine._initialized) {\r\n throw new Error('Engine already initialized. Call destroy() first to reinitialize.');\r\n }\r\n Engine._initialized = true;\r\n\r\n // Store design resolution and scale mode\r\n Engine._designWidth = config.width;\r\n Engine._designHeight = config.height;\r\n Engine._scaleMode = config.scaleMode ?? 'letterbox';\r\n\r\n // Create PIXI Application\r\n Engine._app = new PIXI.Application({\r\n width: config.width,\r\n height: config.height,\r\n backgroundColor: config.backgroundColor ?? 0x000000,\r\n antialias: config.antialias ?? true,\r\n resolution: config.resolution ?? window.devicePixelRatio,\r\n autoDensity: config.autoDensity ?? true,\r\n });\r\n\r\n // Enable z-index sorting on stage for overlays (modals, alerts, toasts)\r\n Engine._app.stage.sortableChildren = true;\r\n\r\n // Initialize managers\r\n Engine._scenes = new SceneManager();\r\n Engine._input = new InputManager();\r\n Engine._assets = new AssetManager();\r\n Engine._sound = new SoundManager();\r\n Engine._particles = new ParticleManager();\r\n Engine._tween = new TweenManager();\r\n Engine._ui = new UIManager();\r\n Engine._spine = new SpineManager();\r\n Engine._toast = new ToastManager(Engine._app.stage);\r\n Engine._alert = new AlertManager(Engine._app.stage);\r\n Engine._modal = new ModalManager(Engine._app.stage);\r\n\r\n // Setup auto-resize listener (initial resize must be called by app after adding canvas to DOM)\r\n Engine._resizeHandler = () => Engine.resizeToWindow();\r\n if (config.autoResize !== false) {\r\n window.addEventListener('resize', Engine._resizeHandler);\r\n }\r\n\r\n // Start game loop\r\n Engine._app.ticker.add(Engine.update);\r\n Engine._isRunning = true;\r\n\r\n // Register browser visibility/focus listeners\r\n Engine._visibilityHandler = () => {\r\n Engine.onVisibilityChange.emit(!document.hidden);\r\n };\r\n Engine._focusHandler = () => Engine.onFocusChange.emit(true);\r\n Engine._blurHandler = () => Engine.onFocusChange.emit(false);\r\n\r\n document.addEventListener('visibilitychange', Engine._visibilityHandler);\r\n window.addEventListener('focus', Engine._focusHandler);\r\n window.addEventListener('blur', Engine._blurHandler);\r\n\r\n Engine.onReady.emit();\r\n }\r\n\r\n private static update(delta: number): void {\r\n Engine.onUpdate.emit(delta);\r\n\r\n // Update input (polls gamepads)\r\n Engine._input.update();\r\n\r\n // Update current scene\r\n Engine._scenes.update(delta);\r\n\r\n // Update particles\r\n Engine._particles.update(delta);\r\n\r\n // Clear per-frame input states\r\n Engine._input.postUpdate();\r\n }\r\n\r\n public static pause(): void {\r\n Engine._app.ticker.stop();\r\n Engine._isRunning = false;\r\n Engine.onPause.emit();\r\n }\r\n\r\n public static resume(): void {\r\n Engine._app.ticker.start();\r\n Engine._isRunning = true;\r\n Engine.onResume.emit();\r\n }\r\n\r\n /**\r\n * Get bounds in stage coordinates that cover the full viewport (including letterbox areas).\r\n * Use this for fullscreen overlays, backdrops, modals that need to cover the entire screen.\r\n */\r\n public static getFullscreenBounds(): { x: number; y: number; width: number; height: number } {\r\n const scale = Engine._scale || 1;\r\n const stagePos = Engine._app.stage.position;\r\n const resolution = Engine._app.renderer.resolution || 1;\r\n\r\n // Get renderer dimensions in CSS pixels\r\n const rendererWidth = Engine._app.renderer.width / resolution;\r\n const rendererHeight = Engine._app.renderer.height / resolution;\r\n\r\n // Convert to stage coordinates (inverse transform)\r\n return {\r\n x: -stagePos.x / scale,\r\n y: -stagePos.y / scale,\r\n width: rendererWidth / scale,\r\n height: rendererHeight / scale,\r\n };\r\n }\r\n\r\n /**\r\n * Resize to fit window while maintaining aspect ratio based on scaleMode\r\n */\r\n public static resizeToWindow(): void {\r\n const parent = (Engine._app.view as HTMLCanvasElement).parentElement;\r\n const windowWidth = parent?.clientWidth ?? window.innerWidth;\r\n const windowHeight = parent?.clientHeight ?? window.innerHeight;\r\n Engine.resize(windowWidth, windowHeight);\r\n }\r\n\r\n /**\r\n * Resize engine to fit target dimensions while maintaining aspect ratio\r\n */\r\n public static resize(targetWidth: number, targetHeight: number): void {\r\n if (Engine._scaleMode === 'none') {\r\n // No scaling - just resize renderer\r\n Engine._app.renderer.resize(targetWidth, targetHeight);\r\n Engine._scale = 1;\r\n Engine._app.stage.scale.set(1);\r\n Engine._app.stage.position.set(0, 0);\r\n Engine.onResize.emit({ width: targetWidth, height: targetHeight, scale: 1 });\r\n return;\r\n }\r\n\r\n const designRatio = Engine._designWidth / Engine._designHeight;\r\n const targetRatio = targetWidth / targetHeight;\r\n\r\n let scale: number;\r\n\r\n if (Engine._scaleMode === 'letterbox') {\r\n // ShowAll/Letterbox: scale uniformly to fit entirely within target, may have bars\r\n scale = targetRatio > designRatio\r\n ? targetHeight / Engine._designHeight\r\n : targetWidth / Engine._designWidth;\r\n } else {\r\n // Fill: scale to cover entire target, may crop edges\r\n scale = targetRatio > designRatio\r\n ? targetWidth / Engine._designWidth\r\n : targetHeight / Engine._designHeight;\r\n }\r\n\r\n Engine._scale = scale;\r\n\r\n // Resize renderer to target dimensions\r\n Engine._app.renderer.resize(targetWidth, targetHeight);\r\n\r\n // Scale and center the stage\r\n Engine._app.stage.scale.set(scale);\r\n Engine._app.stage.position.set(\r\n (targetWidth - Engine._designWidth * scale) / 2,\r\n (targetHeight - Engine._designHeight * scale) / 2\r\n );\r\n\r\n Engine.onResize.emit({ width: targetWidth, height: targetHeight, scale });\r\n }\r\n\r\n public static destroy(): void {\r\n if (!Engine._initialized) return;\r\n\r\n Engine.onDestroy.emit();\r\n\r\n // Remove browser event listeners\r\n document.removeEventListener('visibilitychange', Engine._visibilityHandler);\r\n window.removeEventListener('focus', Engine._focusHandler);\r\n window.removeEventListener('blur', Engine._blurHandler);\r\n\r\n window.removeEventListener('resize', Engine._resizeHandler);\r\n Engine._app.ticker.remove(Engine.update);\r\n Engine._input.destroy();\r\n Engine._scenes.destroy();\r\n Engine._sound.destroy();\r\n Engine._particles.destroy();\r\n Engine._tween.destroy();\r\n Engine._toast.destroy();\r\n Engine._alert.destroy();\r\n Engine._modal.destroy();\r\n Engine.onPause.clear();\r\n Engine.onResume.clear();\r\n Engine.onResize.clear();\r\n Engine.onReady.clear();\r\n Engine.onDestroy.clear();\r\n Engine.onVisibilityChange.clear();\r\n Engine.onFocusChange.clear();\r\n Engine._app.destroy(true, { children: true, texture: true });\r\n Engine._isRunning = false;\r\n Engine._initialized = false;\r\n }\r\n}\r\n","import * as PIXI from 'pixi.js';\nimport gsap from 'gsap';\nimport { BaseModal, type BaseModalConfig } from '../modal/base-modal';\n\nexport type AlertType = 'info' | 'success' | 'warning' | 'error' | 'confirm';\n\nexport interface AlertButton {\n text: string;\n value: unknown;\n primary?: boolean;\n}\n\nexport interface AlertConfig {\n title?: string;\n message: string;\n type?: AlertType;\n buttons?: AlertButton[];\n}\n\nconst ALERT_COLORS: Record<AlertType, { accent: number; icon: string }> = {\n info: { accent: 0x3b82f6, icon: 'ℹ' },\n success: { accent: 0x22c55e, icon: '✓' },\n warning: { accent: 0xf59e0b, icon: '⚠' },\n error: { accent: 0xef4444, icon: '✕' },\n confirm: { accent: 0x8b5cf6, icon: '?' },\n};\n\nconst MODAL_BG = 0x1a1a2e;\nconst TEXT_COLOR = 0xffffff;\nconst TEXT_SECONDARY = 0xaaaaaa;\nconst BUTTON_DEFAULT = 0x444466;\nconst BUTTON_HOVER = 0x555577;\n\ninterface AlertData {\n config: AlertConfig;\n resolve: (value: unknown) => void;\n}\n\n/** Alert modal that builds content in onShow */\nclass AlertModal extends BaseModal<AlertData> {\n constructor() {\n const modalConfig: BaseModalConfig = {\n width: 360,\n height: 200,\n backdrop: true,\n backdropAlpha: 0.6,\n closeOnBackdrop: false,\n closeButton: false,\n centered: true,\n animation: 'scale',\n animationDuration: 0.3,\n backgroundColor: MODAL_BG,\n borderColor: 0x333355,\n borderWidth: 2,\n borderRadius: 12,\n };\n super(modalConfig);\n }\n\n protected override onShow(data: AlertData): void {\n const { config } = data;\n const type = config.type ?? 'info';\n const colors = ALERT_COLORS[type];\n const buttons = config.buttons ?? [{ text: 'OK', value: undefined, primary: true }];\n const modalWidth = this.config.width;\n\n // Clear previous content\n this.contentContainer.removeChildren();\n\n let yPos = 24;\n\n // Icon\n const icon = new PIXI.Text(colors.icon, {\n fontFamily: 'Arial',\n fontSize: 32,\n fill: colors.accent,\n });\n icon.anchor.set(0.5);\n icon.x = modalWidth / 2;\n icon.y = yPos + 20;\n this.contentContainer.addChild(icon);\n yPos += 50;\n\n // Title\n if (config.title) {\n const title = new PIXI.Text(config.title, {\n fontFamily: 'Arial',\n fontSize: 20,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n });\n title.anchor.set(0.5, 0);\n title.x = modalWidth / 2;\n title.y = yPos;\n this.contentContainer.addChild(title);\n yPos += title.height + 12;\n }\n\n // Message\n const message = new PIXI.Text(config.message, {\n fontFamily: 'Arial',\n fontSize: 16,\n fill: TEXT_SECONDARY,\n wordWrap: true,\n wordWrapWidth: modalWidth - 48,\n align: 'center',\n });\n message.anchor.set(0.5, 0);\n message.x = modalWidth / 2;\n message.y = yPos;\n this.contentContainer.addChild(message);\n yPos += message.height + 24;\n\n // Buttons\n const buttonHeight = 40;\n const buttonSpacing = 12;\n const buttonAreaWidth = modalWidth - 48;\n const buttonWidth =\n buttons.length > 1\n ? (buttonAreaWidth - buttonSpacing * (buttons.length - 1)) / buttons.length\n : buttonAreaWidth;\n\n let buttonX = 24;\n for (const btn of buttons) {\n const buttonContainer = this.createAlertButton(\n btn.text,\n buttonWidth,\n buttonHeight,\n btn.primary ? colors.accent : BUTTON_DEFAULT,\n () => this.closeWithValue(btn.value)\n );\n buttonContainer.x = buttonX;\n buttonContainer.y = yPos;\n this.contentContainer.addChild(buttonContainer);\n buttonX += buttonWidth + buttonSpacing;\n }\n yPos += buttonHeight + 24;\n\n // Redraw background with accent and new height\n this.redrawBackgroundWithAccent(yPos, colors.accent);\n }\n\n private redrawBackgroundWithAccent(height: number, accentColor: number): void {\n const { width, backgroundColor, borderColor, borderWidth, borderRadius } = this.config;\n this.config.height = height;\n\n this.background.clear();\n if (borderWidth > 0) {\n this.background.lineStyle(borderWidth, borderColor);\n }\n this.background.beginFill(backgroundColor);\n this.background.drawRoundedRect(0, 0, width, height, borderRadius);\n this.background.endFill();\n\n // Accent bar at top\n this.background.beginFill(accentColor);\n this.background.drawRoundedRect(0, 0, width, 16, borderRadius);\n this.background.endFill();\n this.background.beginFill(backgroundColor);\n this.background.drawRect(0, 4, width, 12);\n this.background.endFill();\n\n // Re-center\n this.modalContainer.x = (this.screenWidth - width) / 2;\n this.modalContainer.y = (this.screenHeight - height) / 2;\n }\n\n private createAlertButton(\n text: string,\n width: number,\n height: number,\n color: number,\n onClick: () => void\n ): PIXI.Container {\n const container = new PIXI.Container();\n const bg = new PIXI.Graphics();\n bg.beginFill(color);\n bg.drawRoundedRect(0, 0, width, height, 6);\n bg.endFill();\n\n const label = new PIXI.Text(text, {\n fontFamily: 'Arial',\n fontSize: 14,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n });\n label.anchor.set(0.5);\n label.x = width / 2;\n label.y = height / 2;\n\n container.addChild(bg, label);\n container.eventMode = 'static';\n container.cursor = 'pointer';\n\n container.on('pointerover', () => {\n gsap.to(bg, { pixi: { tint: BUTTON_HOVER }, duration: 0.15 });\n });\n container.on('pointerout', () => {\n gsap.to(bg, { pixi: { tint: 0xffffff }, duration: 0.15 });\n });\n container.on('pointerdown', onClick);\n\n return container;\n }\n\n private closeWithValue(value: unknown): void {\n const resolve = this.data?.resolve;\n this.hide().then(() => resolve?.(value));\n }\n\n public forceResolve(value: unknown): void {\n this.data?.resolve?.(value);\n }\n}\n\nexport class AlertManager {\n private layer: PIXI.Container;\n private modal: AlertModal;\n private queue: Array<{ config: AlertConfig; resolve: (value: unknown) => void }> = [];\n private isShowing = false;\n\n constructor(stage: PIXI.Container) {\n this.layer = new PIXI.Container();\n this.layer.sortableChildren = true;\n this.layer.zIndex = 10000;\n stage.addChild(this.layer);\n\n // Single reusable modal instance\n this.modal = new AlertModal();\n this.layer.addChild(this.modal);\n }\n\n public info(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'info' }) as Promise<void>;\n }\n\n public success(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'success' }) as Promise<void>;\n }\n\n public warning(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'warning' }) as Promise<void>;\n }\n\n public error(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'error' }) as Promise<void>;\n }\n\n public confirm(message: string, title?: string): Promise<boolean> {\n return this.showAlert({\n message,\n title: title ?? 'Confirm',\n type: 'confirm',\n buttons: [\n { text: 'Cancel', value: false },\n { text: 'OK', value: true, primary: true },\n ],\n }) as Promise<boolean>;\n }\n\n public custom<T>(config: AlertConfig): Promise<T> {\n return this.showAlert(config) as Promise<T>;\n }\n\n private showAlert(config: AlertConfig): Promise<unknown> {\n return new Promise((resolve) => {\n if (this.isShowing) {\n this.queue.push({ config, resolve });\n return;\n }\n this.displayAlert(config, resolve);\n });\n }\n\n private displayAlert(config: AlertConfig, resolve: (value: unknown) => void): void {\n this.isShowing = true;\n\n const wrappedResolve = (value: unknown) => {\n this.isShowing = false;\n resolve(value);\n\n // Process queue\n if (this.queue.length > 0) {\n const next = this.queue.shift()!;\n this.displayAlert(next.config, next.resolve);\n }\n };\n\n this.modal.show({ config, resolve: wrappedResolve });\n }\n\n public destroy(): void {\n if (this.isShowing) {\n this.modal.forceResolve(undefined);\n }\n this.queue = [];\n this.layer.destroy();\n }\n}\n","import * as PIXI from 'pixi.js';\nimport gsap from 'gsap';\nimport { Engine } from '../../core/engine';\nimport { Signal } from '../../core/signal';\n\nexport type ModalAnimation = 'fade' | 'scale' | 'slide' | 'none';\nexport type CloseButtonPosition = 'top-right' | 'top-left';\n\nexport interface BaseModalConfig {\n /** Modal width in pixels */\n width?: number;\n /** Modal height in pixels */\n height?: number;\n /** Show backdrop behind modal */\n backdrop?: boolean;\n /** Backdrop opacity (0-1) */\n backdropAlpha?: number;\n /** Close modal when clicking backdrop */\n closeOnBackdrop?: boolean;\n /** Show close button */\n closeButton?: boolean;\n /** Close button position */\n closeButtonPosition?: CloseButtonPosition;\n /** Enable dragging the modal */\n draggable?: boolean;\n /** Center modal on screen */\n centered?: boolean;\n /** Animation type */\n animation?: ModalAnimation;\n /** Animation duration in seconds */\n animationDuration?: number;\n /** Background color */\n backgroundColor?: number;\n /** Border color */\n borderColor?: number;\n /** Border width */\n borderWidth?: number;\n /** Border radius */\n borderRadius?: number;\n}\n\nexport interface ModalButtonConfig {\n text: string;\n width?: number;\n height?: number;\n backgroundColor?: number;\n hoverColor?: number;\n textColor?: number;\n fontSize?: number;\n borderRadius?: number;\n onClick?: () => void;\n}\n\nconst DEFAULT_CONFIG: Required<BaseModalConfig> = {\n width: 400,\n height: 300,\n backdrop: true,\n backdropAlpha: 0.6,\n closeOnBackdrop: true,\n closeButton: true,\n closeButtonPosition: 'top-right',\n draggable: false,\n centered: true,\n animation: 'scale',\n animationDuration: 0.3,\n backgroundColor: 0x1a1a2e,\n borderColor: 0x333355,\n borderWidth: 2,\n borderRadius: 12,\n};\n\nconst CLOSE_BTN_SIZE = 28;\nconst CLOSE_BTN_MARGIN = 8;\nconst TEXT_COLOR = 0xffffff;\n\n/**\n * Base modal class providing backdrop, close button, animations, and dragging.\n * Extend this class and build your content in onShow or constructor.\n * Uses Engine static class for screen dimensions - no need to pass them.\n */\nexport class BaseModal<TData = void> extends PIXI.Container {\n protected backdrop!: PIXI.Graphics;\n protected modalContainer!: PIXI.Container;\n protected background!: PIXI.Graphics;\n protected closeBtn: PIXI.Container | null = null;\n protected contentContainer!: PIXI.Container;\n protected config: Required<BaseModalConfig>;\n protected data!: TData;\n\n private isDragging = false;\n private dragOffset = { x: 0, y: 0 };\n private _isVisible = false;\n private resizeBinding: { detach: () => void } | null = null;\n\n /** Signal emitted when modal finishes hiding */\n public readonly didHide = new Signal<void>();\n /** Signal emitted when modal is shown (with data) */\n public readonly didShow = new Signal<TData>();\n\n /** Get screen width from Engine */\n protected get screenWidth(): number {\n return Engine.screen.width;\n }\n\n /** Get screen height from Engine */\n protected get screenHeight(): number {\n return Engine.screen.height;\n }\n\n constructor(config?: BaseModalConfig) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.setup();\n\n // Auto-resize when game resizes\n this.resizeBinding = Engine.onResize.add(() => {\n this.drawBackdrop();\n if (this.config.centered) {\n this.centerModal();\n }\n });\n }\n\n private setup(): void {\n // Create backdrop\n this.backdrop = new PIXI.Graphics();\n this.drawBackdrop();\n this.backdrop.eventMode = 'static';\n if (this.config.closeOnBackdrop) {\n this.backdrop.on('pointerdown', () => this.hide());\n }\n this.addChild(this.backdrop);\n\n // Create modal container (for dragging and positioning)\n this.modalContainer = new PIXI.Container();\n this.addChild(this.modalContainer);\n\n // Create background\n this.background = new PIXI.Graphics();\n this.drawBackground();\n this.background.eventMode = 'static'; // Block clicks through\n this.modalContainer.addChild(this.background);\n\n // Create content container for subclass to use\n this.contentContainer = new PIXI.Container();\n this.modalContainer.addChild(this.contentContainer);\n\n // Create close button\n if (this.config.closeButton) {\n this.createCloseButton();\n }\n\n // Setup draggable\n if (this.config.draggable) {\n this.setupDraggable();\n }\n\n // Center modal\n if (this.config.centered) {\n this.centerModal();\n }\n\n // Start hidden\n this.visible = false;\n this.alpha = 0;\n }\n\n /** Show the modal with animation */\n public async show(data?: TData): Promise<void> {\n if (this._isVisible) return;\n\n if (data !== undefined) {\n this.data = data;\n }\n\n this._isVisible = true;\n this.visible = true;\n this.onShow(this.data);\n await this.animateIn();\n this.didShow.emit(this.data);\n }\n\n /** Hide the modal with animation */\n public async hide(): Promise<void> {\n if (!this._isVisible) return;\n this._isVisible = false;\n await this.animateOut();\n this.visible = false;\n this.onHide();\n this.didHide.emit();\n }\n\n /** Called when modal is shown. Override to build content. */\n protected onShow(_data: TData): void {}\n\n /** Called when modal is hidden. Override to cleanup. */\n protected onHide(): void {}\n\n /** Check if modal is currently visible */\n public get isModalVisible(): boolean {\n return this._isVisible;\n }\n\n /** Redraw background with new dimensions */\n protected redrawBackground(width?: number, height?: number): void {\n if (width !== undefined) this.config.width = width;\n if (height !== undefined) this.config.height = height;\n this.drawBackground();\n if (this.config.centered) {\n this.centerModal();\n }\n // Reposition close button\n if (this.closeBtn) {\n if (this.config.closeButtonPosition === 'top-right') {\n this.closeBtn.x = this.config.width - CLOSE_BTN_SIZE - CLOSE_BTN_MARGIN;\n }\n }\n }\n\n /** Utility: Create a styled title text */\n protected createTitle(text: string, style?: Partial<PIXI.ITextStyle>): PIXI.Text {\n return new PIXI.Text(text, {\n fontFamily: 'Arial',\n fontSize: 24,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n ...style,\n });\n }\n\n /** Utility: Create a styled button */\n protected createButton(btnConfig: ModalButtonConfig): PIXI.Container {\n const {\n text,\n width = 120,\n height = 40,\n backgroundColor = 0x444466,\n hoverColor = 0x555577,\n textColor = TEXT_COLOR,\n fontSize = 14,\n borderRadius = 6,\n onClick,\n } = btnConfig;\n\n const container = new PIXI.Container();\n const bg = new PIXI.Graphics();\n bg.beginFill(backgroundColor);\n bg.drawRoundedRect(0, 0, width, height, borderRadius);\n bg.endFill();\n\n const label = new PIXI.Text(text, {\n fontFamily: 'Arial',\n fontSize,\n fontWeight: 'bold',\n fill: textColor,\n });\n label.anchor.set(0.5);\n label.x = width / 2;\n label.y = height / 2;\n\n container.addChild(bg, label);\n container.eventMode = 'static';\n container.cursor = 'pointer';\n\n container.on('pointerover', () => {\n gsap.to(bg, { pixi: { tint: hoverColor }, duration: 0.15 });\n });\n container.on('pointerout', () => {\n gsap.to(bg, { pixi: { tint: 0xffffff }, duration: 0.15 });\n });\n if (onClick) {\n container.on('pointerdown', onClick);\n }\n\n return container;\n }\n\n private drawBackdrop(): void {\n this.backdrop.clear();\n if (this.config.backdrop) {\n // Use fullscreen bounds to cover entire viewport including letterbox areas\n const bounds = Engine.getFullscreenBounds();\n this.backdrop.beginFill(0x000000, this.config.backdropAlpha);\n this.backdrop.drawRect(bounds.x, bounds.y, bounds.width, bounds.height);\n this.backdrop.endFill();\n }\n }\n\n private drawBackground(): void {\n const { width, height, backgroundColor, borderColor, borderWidth, borderRadius } =\n this.config;\n\n this.background.clear();\n if (borderWidth > 0) {\n this.background.lineStyle(borderWidth, borderColor);\n }\n this.background.beginFill(backgroundColor);\n this.background.drawRoundedRect(0, 0, width, height, borderRadius);\n this.background.endFill();\n }\n\n private createCloseButton(): void {\n this.closeBtn = new PIXI.Container();\n\n const bg = new PIXI.Graphics();\n bg.beginFill(0xef4444);\n bg.drawRoundedRect(0, 0, CLOSE_BTN_SIZE, CLOSE_BTN_SIZE, 6);\n bg.endFill();\n\n const xText = new PIXI.Text('✕', {\n fontFamily: 'Arial',\n fontSize: 16,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n });\n xText.anchor.set(0.5);\n xText.x = CLOSE_BTN_SIZE / 2;\n xText.y = CLOSE_BTN_SIZE / 2;\n\n this.closeBtn.addChild(bg, xText);\n\n if (this.config.closeButtonPosition === 'top-right') {\n this.closeBtn.x = this.config.width - CLOSE_BTN_SIZE - CLOSE_BTN_MARGIN;\n this.closeBtn.y = CLOSE_BTN_MARGIN;\n } else {\n this.closeBtn.x = CLOSE_BTN_MARGIN;\n this.closeBtn.y = CLOSE_BTN_MARGIN;\n }\n\n this.closeBtn.eventMode = 'static';\n this.closeBtn.cursor = 'pointer';\n\n this.closeBtn.on('pointerover', () => {\n gsap.to(bg, { pixi: { tint: 0xff6666 }, duration: 0.15 });\n });\n this.closeBtn.on('pointerout', () => {\n gsap.to(bg, { pixi: { tint: 0xffffff }, duration: 0.15 });\n });\n this.closeBtn.on('pointerdown', () => this.hide());\n\n this.modalContainer.addChild(this.closeBtn);\n }\n\n private setupDraggable(): void {\n this.background.cursor = 'move';\n\n this.background.on('pointerdown', (e: PIXI.FederatedPointerEvent) => {\n this.isDragging = true;\n this.dragOffset.x = e.global.x - this.modalContainer.x;\n this.dragOffset.y = e.global.y - this.modalContainer.y;\n });\n\n this.background.on('globalpointermove', (e: PIXI.FederatedPointerEvent) => {\n if (!this.isDragging) return;\n let newX = e.global.x - this.dragOffset.x;\n let newY = e.global.y - this.dragOffset.y;\n newX = Math.max(0, Math.min(newX, this.screenWidth - this.config.width));\n newY = Math.max(0, Math.min(newY, this.screenHeight - this.config.height));\n this.modalContainer.x = newX;\n this.modalContainer.y = newY;\n });\n\n this.background.on('pointerup', () => (this.isDragging = false));\n this.background.on('pointerupoutside', () => (this.isDragging = false));\n }\n\n private centerModal(): void {\n this.modalContainer.x = (this.screenWidth - this.config.width) / 2;\n this.modalContainer.y = (this.screenHeight - this.config.height) / 2;\n }\n\n private async animateIn(): Promise<void> {\n const { animation, animationDuration } = this.config;\n\n if (animation === 'none') {\n this.alpha = 1;\n this.modalContainer.scale.set(1);\n return;\n }\n\n this.backdrop.alpha = 0;\n gsap.to(this.backdrop, { alpha: 1, duration: animationDuration * 0.7 });\n\n return new Promise((resolve) => {\n if (animation === 'fade') {\n this.modalContainer.alpha = 0;\n this.modalContainer.scale.set(1);\n this.alpha = 1;\n gsap.to(this.modalContainer, {\n alpha: 1,\n duration: animationDuration,\n ease: 'power2.out',\n onComplete: resolve,\n });\n } else if (animation === 'scale') {\n this.modalContainer.alpha = 0;\n this.modalContainer.scale.set(0.9);\n this.alpha = 1;\n gsap.to(this.modalContainer, {\n alpha: 1,\n pixi: { scale: 1 },\n duration: animationDuration,\n ease: 'back.out(1.5)',\n onComplete: resolve,\n });\n } else if (animation === 'slide') {\n const startY = this.modalContainer.y - 50;\n this.modalContainer.alpha = 0;\n this.modalContainer.y = startY;\n this.modalContainer.scale.set(1);\n this.alpha = 1;\n const targetY = (this.screenHeight - this.config.height) / 2;\n gsap.to(this.modalContainer, {\n alpha: 1,\n y: targetY,\n duration: animationDuration,\n ease: 'power2.out',\n onComplete: resolve,\n });\n } else {\n this.alpha = 1;\n resolve();\n }\n });\n }\n\n private async animateOut(): Promise<void> {\n const { animation, animationDuration } = this.config;\n\n if (animation === 'none') {\n this.alpha = 0;\n return;\n }\n\n gsap.to(this.backdrop, { alpha: 0, duration: animationDuration * 0.7 });\n\n return new Promise((resolve) => {\n if (animation === 'fade') {\n gsap.to(this.modalContainer, {\n alpha: 0,\n duration: animationDuration * 0.7,\n ease: 'power2.in',\n onComplete: resolve,\n });\n } else if (animation === 'scale') {\n gsap.to(this.modalContainer, {\n alpha: 0,\n pixi: { scale: 0.9 },\n duration: animationDuration * 0.7,\n ease: 'power2.in',\n onComplete: resolve,\n });\n } else if (animation === 'slide') {\n gsap.to(this.modalContainer, {\n alpha: 0,\n y: this.modalContainer.y - 50,\n duration: animationDuration * 0.7,\n ease: 'power2.in',\n onComplete: resolve,\n });\n } else {\n this.alpha = 0;\n resolve();\n }\n });\n }\n\n public destroy(options?: PIXI.IDestroyOptions | boolean): void {\n this.resizeBinding?.detach();\n this.resizeBinding = null;\n gsap.killTweensOf(this.backdrop);\n gsap.killTweensOf(this.modalContainer);\n this.didHide.clear();\n this.didShow.clear();\n super.destroy(options);\n }\n}\n","type Listener<T> = (value: T) => void;\n\n/**\n * Represents a binding to a signal that can be detached.\n */\nexport interface SignalBinding {\n /** Detach this binding from the signal. Returns true if was attached. */\n detach(): boolean;\n /** Alias for detach(). Useful for dispose patterns. */\n dispose(): void;\n}\n\ninterface BindingEntry<T> {\n fn: Listener<T>;\n thisArg: unknown;\n once: boolean;\n}\n\n/**\n * Lightweight typed signal for pub/sub pattern.\n *\n * @example\n * ```ts\n * const signal = new Signal<number>();\n *\n * // Basic usage\n * const binding = signal.add((value) => console.log(value));\n * signal.emit(42);\n * binding.detach();\n *\n * // With thisArg for class methods\n * signal.add(this.onValueChange, this);\n *\n * // One-time listener\n * signal.once((value) => console.log('First emit only:', value));\n * ```\n */\nexport class Signal<T = void> {\n private bindings: Set<BindingEntry<T>> = new Set();\n\n /**\n * Add listener. Returns a SignalBinding to detach later.\n * @param listener The callback function\n * @param thisArg Optional `this` context for the listener\n */\n add(listener: Listener<T>, thisArg?: unknown): SignalBinding {\n const entry: BindingEntry<T> = { fn: listener, thisArg, once: false };\n this.bindings.add(entry);\n return this.createBinding(entry);\n }\n\n /**\n * Add one-time listener that auto-detaches after first emit.\n * @param listener The callback function\n * @param thisArg Optional `this` context for the listener\n */\n once(listener: Listener<T>, thisArg?: unknown): SignalBinding {\n const entry: BindingEntry<T> = { fn: listener, thisArg, once: true };\n this.bindings.add(entry);\n return this.createBinding(entry);\n }\n\n /**\n * Remove a specific listener function.\n * Note: If same function added multiple times with different thisArg,\n * this removes the first match.\n */\n remove(listener: Listener<T>): void {\n for (const entry of this.bindings) {\n if (entry.fn === listener) {\n this.bindings.delete(entry);\n return;\n }\n }\n }\n\n /** Emit value to all listeners */\n emit(value: T): void {\n for (const entry of this.bindings) {\n if (entry.once) {\n this.bindings.delete(entry);\n }\n entry.fn.call(entry.thisArg, value);\n }\n }\n\n /** Remove all listeners */\n clear(): void {\n this.bindings.clear();\n }\n\n /** Check if has any listeners */\n get hasListeners(): boolean {\n return this.bindings.size > 0;\n }\n\n private createBinding(entry: BindingEntry<T>): SignalBinding {\n return {\n detach: () => this.bindings.delete(entry),\n dispose: () => {\n this.bindings.delete(entry);\n },\n };\n }\n}\n","import * as PIXI from 'pixi.js';\nimport { Logger } from '../utils/logger';\nimport type { AssetManifest, ProgressCallback } from './types';\n\nexport class AssetManager {\n private initialized = false;\n\n /** Initialize assets with a manifest */\n public async init(options: { manifest: string | AssetManifest }): Promise<void> {\n if (this.initialized) {\n Logger.warn('AssetManager', 'Already initialized');\n return;\n }\n\n await PIXI.Assets.init(options);\n this.initialized = true;\n }\n\n /** Load a bundle by name with optional progress callback */\n public async loadBundle(name: string, onProgress?: ProgressCallback): Promise<void> {\n await PIXI.Assets.loadBundle(name, onProgress);\n }\n\n /** Load multiple bundles */\n public async loadBundles(names: string[], onProgress?: ProgressCallback): Promise<void> {\n await PIXI.Assets.loadBundle(names, onProgress);\n }\n\n /** Background load a bundle (non-blocking) */\n public backgroundLoadBundle(name: string): void {\n PIXI.Assets.backgroundLoadBundle(name);\n }\n\n /** Load a single asset by alias */\n public async load<T>(alias: string): Promise<T> {\n return (await PIXI.Assets.load(alias)) as T;\n }\n\n /** Get a loaded asset by alias */\n public get<T>(alias: string): T {\n return PIXI.Assets.get(alias) as T;\n }\n\n /** Check if an asset is loaded */\n public has(alias: string): boolean {\n return PIXI.Assets.cache.has(alias);\n }\n\n /** Unload an asset */\n public async unload(alias: string): Promise<void> {\n await PIXI.Assets.unload(alias);\n }\n\n /** Unload a bundle */\n public async unloadBundle(name: string): Promise<void> {\n await PIXI.Assets.unloadBundle(name);\n }\n\n /** Add an asset to the resolver */\n public add(alias: string, src: string): void {\n PIXI.Assets.add({ alias, src });\n }\n\n /** Get the underlying PIXI.Assets instance */\n public get assets(): typeof PIXI.Assets {\n return PIXI.Assets;\n }\n}\n","/**\n * Logger - Static logging utility with levels and namespaces\n *\n * Usage:\n * Logger.info('GameManager', 'Started');\n * Logger.warn('API', 'Timeout', { retry: 2 });\n * Logger.setLevel('warn'); // Only warn and error\n * Logger.disable(); // Disable all\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst LEVEL_STYLES: Record<Exclude<LogLevel, 'none'>, string> = {\n debug: 'color: #888',\n info: 'color: #4a9eff',\n warn: 'color: #ffa500',\n error: 'color: #ff4444; font-weight: bold',\n};\n\nexport class LoggerClass {\n private level: LogLevel = 'debug';\n private enabled = true;\n\n /** Set minimum log level */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Get current log level */\n getLevel(): LogLevel {\n return this.level;\n }\n\n /** Enable logging */\n enable(): void {\n this.enabled = true;\n }\n\n /** Disable all logging */\n disable(): void {\n this.enabled = false;\n }\n\n /** Check if logging is enabled */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Debug level log */\n debug(namespace: string, message: string, ...args: unknown[]): void {\n this.log('debug', namespace, message, args);\n }\n\n /** Info level log */\n info(namespace: string, message: string, ...args: unknown[]): void {\n this.log('info', namespace, message, args);\n }\n\n /** Warning level log */\n warn(namespace: string, message: string, ...args: unknown[]): void {\n this.log('warn', namespace, message, args);\n }\n\n /** Error level log */\n error(namespace: string, message: string, ...args: unknown[]): void {\n this.log('error', namespace, message, args);\n }\n\n private log(level: Exclude<LogLevel, 'none'>, namespace: string, message: string, args: unknown[]): void {\n if (!this.enabled) return;\n if (LEVEL_PRIORITY[level] < LEVEL_PRIORITY[this.level]) return;\n\n const prefix = `[${namespace}]`;\n const style = LEVEL_STYLES[level];\n\n if (args.length > 0) {\n console[level](`%c${prefix} ${message}`, style, ...args);\n } else {\n console[level](`%c${prefix} ${message}`, style);\n }\n }\n}\n\n/** Global logger instance */\nexport const Logger = new LoggerClass();\n","import { Logger } from '../utils/logger';\n\nexport interface GamepadState {\n connected: boolean;\n buttons: boolean[];\n axes: number[];\n}\n\nexport class GamepadManager {\n private gamepads: Map<number, Gamepad> = new Map();\n private prevButtons: Map<number, boolean[]> = new Map();\n\n constructor() {\n this.onGamepadConnected = this.onGamepadConnected.bind(this);\n this.onGamepadDisconnected = this.onGamepadDisconnected.bind(this);\n\n window.addEventListener('gamepadconnected', this.onGamepadConnected);\n window.addEventListener('gamepaddisconnected', this.onGamepadDisconnected);\n }\n\n private onGamepadConnected(event: GamepadEvent): void {\n this.gamepads.set(event.gamepad.index, event.gamepad);\n Logger.info('Gamepad', `Connected: ${event.gamepad.id}`);\n }\n\n private onGamepadDisconnected(event: GamepadEvent): void {\n this.gamepads.delete(event.gamepad.index);\n this.prevButtons.delete(event.gamepad.index);\n Logger.info('Gamepad', `Disconnected: ${event.gamepad.id}`);\n }\n\n /** Update gamepad state (call once per frame) */\n public update(): void {\n // Get fresh gamepad state\n const gamepads = navigator.getGamepads();\n for (const gamepad of gamepads) {\n if (gamepad) {\n this.gamepads.set(gamepad.index, gamepad);\n }\n }\n }\n\n /** Get gamepad by index (0-3) */\n public get(index: number): Gamepad | null {\n return this.gamepads.get(index) ?? null;\n }\n\n /** Check if a gamepad is connected */\n public isConnected(index: number): boolean {\n return this.gamepads.has(index);\n }\n\n /** Check if a button is pressed on gamepad */\n public isButtonDown(index: number, button: number): boolean {\n const gamepad = this.gamepads.get(index);\n if (!gamepad || button >= gamepad.buttons.length) return false;\n return gamepad.buttons[button].pressed;\n }\n\n /** Get axis value (-1 to 1) */\n public getAxis(index: number, axis: number): number {\n const gamepad = this.gamepads.get(index);\n if (!gamepad || axis >= gamepad.axes.length) return 0;\n return gamepad.axes[axis];\n }\n\n /** Get left stick as normalized vector */\n public getLeftStick(index: number): { x: number; y: number } {\n return {\n x: this.getAxis(index, 0),\n y: this.getAxis(index, 1),\n };\n }\n\n /** Get right stick as normalized vector */\n public getRightStick(index: number): { x: number; y: number } {\n return {\n x: this.getAxis(index, 2),\n y: this.getAxis(index, 3),\n };\n }\n\n /** Get number of connected gamepads */\n public get count(): number {\n return this.gamepads.size;\n }\n\n /** Clean up event listeners */\n public destroy(): void {\n window.removeEventListener('gamepadconnected', this.onGamepadConnected);\n window.removeEventListener('gamepaddisconnected', this.onGamepadDisconnected);\n this.gamepads.clear();\n this.prevButtons.clear();\n }\n}\n","export class KeyboardManager {\n private keysDown: Set<string> = new Set();\n private keysPressed: Set<string> = new Set();\n private keysReleased: Set<string> = new Set();\n\n constructor() {\n this.onKeyDown = this.onKeyDown.bind(this);\n this.onKeyUp = this.onKeyUp.bind(this);\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (!this.keysDown.has(event.code)) {\n this.keysPressed.add(event.code);\n }\n this.keysDown.add(event.code);\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keysDown.delete(event.code);\n this.keysReleased.add(event.code);\n }\n\n /** Update keyboard state (call once per frame) */\n public update(): void {\n this.keysPressed.clear();\n this.keysReleased.clear();\n }\n\n /** Check if a key is currently held down */\n public isDown(key: string): boolean {\n return this.keysDown.has(key);\n }\n\n /** Check if a key was just pressed this frame */\n public justPressed(key: string): boolean {\n return this.keysPressed.has(key);\n }\n\n /** Check if a key was just released this frame */\n public justReleased(key: string): boolean {\n return this.keysReleased.has(key);\n }\n\n /** Check if any of the given keys are down */\n public anyDown(keys: string[]): boolean {\n return keys.some((key) => this.keysDown.has(key));\n }\n\n /** Get all currently pressed keys */\n public getDownKeys(): string[] {\n return Array.from(this.keysDown);\n }\n\n /** Clean up event listeners */\n public destroy(): void {\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n this.keysDown.clear();\n this.keysPressed.clear();\n this.keysReleased.clear();\n }\n}\n","import { Engine } from '../core/engine';\n\nexport interface PointerState {\n x: number;\n y: number;\n isDown: boolean;\n button: number;\n}\n\nexport class PointerManager {\n private _x = 0;\n private _y = 0;\n private _isDown = false;\n private _justPressed = false;\n private _justReleased = false;\n private _button = 0;\n\n constructor() {\n this.onPointerMove = this.onPointerMove.bind(this);\n this.onPointerDown = this.onPointerDown.bind(this);\n this.onPointerUp = this.onPointerUp.bind(this);\n\n const view = Engine.view as HTMLCanvasElement;\n view.addEventListener('pointermove', this.onPointerMove);\n view.addEventListener('pointerdown', this.onPointerDown);\n view.addEventListener('pointerup', this.onPointerUp);\n view.addEventListener('pointerleave', this.onPointerUp);\n }\n\n private getCanvasCoords(event: PointerEvent): { x: number; y: number } {\n const view = Engine.view as HTMLCanvasElement;\n const rect = view.getBoundingClientRect();\n const scaleX = Engine.screen.width / rect.width;\n const scaleY = Engine.screen.height / rect.height;\n\n return {\n x: (event.clientX - rect.left) * scaleX,\n y: (event.clientY - rect.top) * scaleY,\n };\n }\n\n private onPointerMove(event: PointerEvent): void {\n const coords = this.getCanvasCoords(event);\n this._x = coords.x;\n this._y = coords.y;\n }\n\n private onPointerDown(event: PointerEvent): void {\n const coords = this.getCanvasCoords(event);\n this._x = coords.x;\n this._y = coords.y;\n this._isDown = true;\n this._justPressed = true;\n this._button = event.button;\n }\n\n private onPointerUp(_event: PointerEvent): void {\n this._isDown = false;\n this._justReleased = true;\n }\n\n /** Update pointer state (call once per frame) */\n public update(): void {\n this._justPressed = false;\n this._justReleased = false;\n }\n\n /** Pointer X position in game coordinates */\n public get x(): number {\n return this._x;\n }\n\n /** Pointer Y position in game coordinates */\n public get y(): number {\n return this._y;\n }\n\n /** Check if pointer is currently down */\n public get isDown(): boolean {\n return this._isDown;\n }\n\n /** Check if pointer was just pressed this frame */\n public get justPressed(): boolean {\n return this._justPressed;\n }\n\n /** Check if pointer was just released this frame */\n public get justReleased(): boolean {\n return this._justReleased;\n }\n\n /** Get current mouse button (0=left, 1=middle, 2=right) */\n public get button(): number {\n return this._button;\n }\n\n /** Get pointer position as object */\n public get position(): { x: number; y: number } {\n return { x: this._x, y: this._y };\n }\n\n /** Clean up event listeners */\n public destroy(): void {\n const view = Engine.view as HTMLCanvasElement;\n view.removeEventListener('pointermove', this.onPointerMove);\n view.removeEventListener('pointerdown', this.onPointerDown);\n view.removeEventListener('pointerup', this.onPointerUp);\n view.removeEventListener('pointerleave', this.onPointerUp);\n }\n}\n","import { GamepadManager } from './gamepad';\nimport { KeyboardManager } from './keyboard';\nimport { PointerManager } from './pointer';\n\nexport class InputManager {\n public readonly keyboard: KeyboardManager;\n public readonly pointer: PointerManager;\n public readonly gamepad: GamepadManager;\n\n constructor() {\n this.keyboard = new KeyboardManager();\n this.pointer = new PointerManager();\n this.gamepad = new GamepadManager();\n }\n\n /** Update all input managers (call once per frame at start) */\n public update(): void {\n this.gamepad.update();\n // Note: keyboard and pointer update at end of frame\n }\n\n /** Post-update to clear per-frame states */\n public postUpdate(): void {\n this.keyboard.update();\n this.pointer.update();\n }\n\n /** Clean up all input managers */\n public destroy(): void {\n this.keyboard.destroy();\n this.pointer.destroy();\n this.gamepad.destroy();\n }\n}\n","import * as PIXI from 'pixi.js';\nimport type { BaseModal } from './base-modal';\n\nconst BASE_Z_INDEX = 10000;\nconst Z_INDEX_INCREMENT = 100;\n\nexport class ModalManager {\n private stack: BaseModal[] = [];\n private layer: PIXI.Container;\n private escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(stage: PIXI.Container) {\n // Create modal layer on top of everything\n this.layer = new PIXI.Container();\n this.layer.sortableChildren = true;\n this.layer.zIndex = BASE_Z_INDEX;\n stage.addChild(this.layer);\n\n // Setup ESC key handler\n this.setupEscapeHandler();\n }\n\n /** Show a modal (adds to stack) */\n public show<T extends BaseModal>(modal: T): T {\n // Add to stack\n this.stack.push(modal);\n\n // Set z-index based on stack position\n modal.zIndex = this.stack.length * Z_INDEX_INCREMENT;\n\n // Add to layer\n this.layer.addChild(modal);\n\n // Show with animation\n modal.show();\n\n // Track when modal hides itself\n modal.didHide.add(() => this.removeFromStack(modal));\n\n return modal;\n }\n\n /** Hide a specific modal */\n public hide(modal: BaseModal): void {\n if (!this.stack.includes(modal)) return;\n modal.hide();\n }\n\n /** Hide the top modal */\n public hideTop(): void {\n const top = this.stack[this.stack.length - 1];\n if (top) {\n top.hide();\n }\n }\n\n /** Hide all modals */\n public async hideAll(): Promise<void> {\n const modals = [...this.stack];\n await Promise.all(modals.map((modal) => modal.hide()));\n }\n\n /** Get current modal stack (read-only) */\n public getStack(): readonly BaseModal[] {\n return this.stack;\n }\n\n /** Check if any modal is open */\n public get isOpen(): boolean {\n return this.stack.length > 0;\n }\n\n /** Get the topmost modal */\n public getTop(): BaseModal | undefined {\n return this.stack[this.stack.length - 1];\n }\n\n private removeFromStack(modal: BaseModal): void {\n const index = this.stack.indexOf(modal);\n if (index !== -1) {\n this.stack.splice(index, 1);\n this.layer.removeChild(modal);\n }\n }\n\n private setupEscapeHandler(): void {\n this.escapeHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen) {\n e.preventDefault();\n this.hideTop();\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('keydown', this.escapeHandler);\n }\n }\n\n public destroy(): void {\n // Remove escape handler\n if (this.escapeHandler && typeof window !== 'undefined') {\n window.removeEventListener('keydown', this.escapeHandler);\n this.escapeHandler = null;\n }\n\n // Hide all modals\n for (const modal of this.stack) {\n modal.destroy();\n }\n this.stack = [];\n\n // Remove layer\n this.layer.destroy();\n }\n}\n","import { Emitter, type EmitterConfigV3 } from '@pixi/particle-emitter';\nimport * as PIXI from 'pixi.js';\n\nexport interface ParticleConfig extends Partial<EmitterConfigV3> {\n textures: string[];\n}\n\nexport class ParticleManager {\n private emitters: Set<Emitter> = new Set();\n\n /** Create a particle emitter */\n public create(container: PIXI.Container, config: ParticleConfig): Emitter {\n // Convert texture aliases to PIXI textures\n const textures = config.textures.map((alias) => PIXI.Assets.get<PIXI.Texture>(alias));\n\n const emitterConfig: EmitterConfigV3 = {\n lifetime: config.lifetime ?? { min: 0.5, max: 1 },\n frequency: config.frequency ?? 0.01,\n emitterLifetime: config.emitterLifetime ?? -1,\n maxParticles: config.maxParticles ?? 100,\n addAtBack: config.addAtBack ?? false,\n pos: config.pos ?? { x: 0, y: 0 },\n behaviors: config.behaviors ?? [\n {\n type: 'alpha',\n config: {\n alpha: {\n list: [\n { time: 0, value: 1 },\n { time: 1, value: 0 },\n ],\n },\n },\n },\n {\n type: 'scale',\n config: {\n scale: {\n list: [\n { time: 0, value: 1 },\n { time: 1, value: 0.5 },\n ],\n },\n },\n },\n {\n type: 'moveSpeed',\n config: {\n speed: {\n list: [\n { time: 0, value: 200 },\n { time: 1, value: 100 },\n ],\n },\n },\n },\n {\n type: 'rotationStatic',\n config: { min: 0, max: 360 },\n },\n {\n type: 'spawnShape',\n config: { type: 'torus', data: { x: 0, y: 0, radius: 10 } },\n },\n {\n type: 'textureSingle',\n config: { texture: textures[0] },\n },\n ],\n };\n\n const emitter = new Emitter(container, emitterConfig);\n this.emitters.add(emitter);\n\n return emitter;\n }\n\n /** Update all emitters */\n public update(delta: number): void {\n const dt = delta / 60; // Convert to seconds\n for (const emitter of this.emitters) {\n emitter.update(dt);\n }\n }\n\n /** Remove an emitter */\n public remove(emitter: Emitter): void {\n emitter.destroy();\n this.emitters.delete(emitter);\n }\n\n /** Remove all emitters */\n public removeAll(): void {\n for (const emitter of this.emitters) {\n emitter.destroy();\n }\n this.emitters.clear();\n }\n\n /** Get number of active emitters */\n public get count(): number {\n return this.emitters.size;\n }\n\n /** Clean up */\n public destroy(): void {\n this.removeAll();\n }\n}\n","import { Engine } from '../core/engine';\nimport type { Scene } from './scene';\n\ntype SceneClass = new () => Scene;\n\nexport class SceneManager {\n private scenes: Map<string, SceneClass> = new Map();\n private currentScene: Scene | null = null;\n private currentSceneName: string | null = null;\n\n constructor() {}\n\n /** Register a scene class with a name */\n public add(name: string, SceneClass: SceneClass): void {\n this.scenes.set(name, SceneClass);\n }\n\n /** Remove a scene registration */\n public remove(name: string): void {\n this.scenes.delete(name);\n }\n\n /** Start a scene by name */\n public async start(name: string): Promise<void> {\n const SceneClass = this.scenes.get(name);\n if (!SceneClass) {\n throw new Error(`Scene \"${name}\" not found`);\n }\n\n // Exit current scene\n if (this.currentScene) {\n this.currentScene.onExit();\n Engine.stage.removeChild(this.currentScene);\n this.currentScene.destroy({ children: true });\n }\n\n // Create and enter new scene\n const scene = new SceneClass();\n this.currentScene = scene;\n this.currentSceneName = name;\n\n Engine.stage.addChild(scene);\n await scene.onEnter();\n }\n\n /** Get current scene name */\n public get current(): string | null {\n return this.currentSceneName;\n }\n\n /** Get current scene instance */\n public get currentInstance(): Scene | null {\n return this.currentScene;\n }\n\n /** Update current scene */\n public update(delta: number): void {\n if (this.currentScene) {\n this.currentScene.onUpdate(delta);\n }\n }\n\n /** Check if a scene is registered */\n public has(name: string): boolean {\n return this.scenes.has(name);\n }\n\n /** Destroy scene manager */\n public destroy(): void {\n if (this.currentScene) {\n this.currentScene.onExit();\n this.currentScene.destroy({ children: true });\n this.currentScene = null;\n }\n this.scenes.clear();\n }\n}\n","import { type Sound, sound } from '@pixi/sound';\nimport { Logger } from '../utils/logger';\n\nexport interface SoundOptions {\n volume?: number;\n loop?: boolean;\n speed?: number;\n}\n\nexport class SoundManager {\n private volumes = {\n master: 1,\n music: 1,\n sfx: 1,\n };\n\n private currentMusic: Sound | null = null;\n private currentMusicAlias: string | null = null;\n\n public playSfx(alias: string, options: SoundOptions = {}): void {\n this.play(alias, options);\n }\n\n /** Play a sound effect */\n public play(alias: string, options: SoundOptions = {}): void {\n const snd = sound.find(alias);\n if (!snd) {\n Logger.warn('SoundManager', `Sound \"${alias}\" not found`);\n return;\n }\n\n snd.play({\n volume: (options.volume ?? 1) * this.volumes.master * this.volumes.sfx,\n loop: options.loop ?? false,\n speed: options.speed ?? 1,\n });\n }\n\n /** Play background music (only one at a time) */\n public playMusic(alias: string, options: SoundOptions = {}): void {\n // Stop current music if different\n if (this.currentMusicAlias !== alias) {\n this.stopMusic();\n }\n\n const snd = sound.find(alias);\n if (!snd) {\n Logger.warn('SoundManager', `Music \"${alias}\" not found`);\n return;\n }\n\n this.currentMusic = snd;\n this.currentMusicAlias = alias;\n\n snd.play({\n volume: (options.volume ?? 1) * this.volumes.master * this.volumes.music,\n loop: options.loop ?? true,\n speed: options.speed ?? 1,\n });\n }\n\n /** Stop the current music */\n public stopMusic(): void {\n if (this.currentMusic) {\n this.currentMusic.stop();\n this.currentMusic = null;\n this.currentMusicAlias = null;\n }\n }\n\n /** Stop a specific sound */\n public stop(alias: string): void {\n const snd = sound.find(alias);\n if (snd) {\n snd.stop();\n }\n }\n\n /** Stop all sounds */\n public stopAll(): void {\n sound.stopAll();\n this.currentMusic = null;\n this.currentMusicAlias = null;\n }\n\n /** Pause all sounds */\n public pauseAll(): void {\n sound.pauseAll();\n }\n\n /** Resume all sounds */\n public resumeAll(): void {\n sound.resumeAll();\n }\n\n /** Set volume for a channel */\n public setVolume(channel: 'master' | 'music' | 'sfx', value: number): void {\n this.volumes[channel] = Math.max(0, Math.min(1, value));\n this.updateMusicVolume();\n }\n\n /** Get volume for a channel */\n public getVolume(channel: 'master' | 'music' | 'sfx'): number {\n return this.volumes[channel];\n }\n\n private updateMusicVolume(): void {\n if (this.currentMusic) {\n this.currentMusic.volume = this.volumes.master * this.volumes.music;\n }\n }\n\n /** Mute all sounds */\n public mute(): void {\n sound.muteAll();\n }\n\n /** Unmute all sounds */\n public unmute(): void {\n sound.unmuteAll();\n }\n\n /** Toggle mute */\n public toggleMute(): boolean {\n sound.toggleMuteAll();\n return sound.context.muted;\n }\n\n /** Check if muted */\n public get isMuted(): boolean {\n return sound.context.muted;\n }\n\n /** Clean up */\n public destroy(): void {\n this.stopAll();\n }\n}\n","import * as PIXI from 'pixi.js';\n// Import pixi-spine to register its asset loaders with PIXI.Assets\n// Main bundle includes Spine 3.7, 3.8, and 4.0 runtimes\nimport 'pixi-spine';\nimport { type ISkeletonData, Spine } from 'pixi-spine';\n\nexport class SpineManager {\n /** Create a Spine animation from loaded skeleton data */\n public create(alias: string): Spine {\n const resource = PIXI.Assets.get(alias);\n if (!resource) {\n throw new Error(`Spine skeleton \"${alias}\" not found. Make sure it's loaded.`);\n }\n\n // pixi-spine loader returns { spineData: ISkeletonData } wrapper\n const skeletonData = (resource as any).spineData || resource;\n return new Spine(skeletonData);\n }\n\n /** Create a Spine animation from skeleton data directly */\n public fromData(skeletonData: ISkeletonData): Spine {\n return new Spine(skeletonData);\n }\n\n /** Play an animation on a Spine instance */\n public play(\n spine: Spine,\n animationName: string,\n loop: boolean = true,\n trackIndex: number = 0\n ): void {\n spine.state.setAnimation(trackIndex, animationName, loop);\n }\n\n /** Add an animation to the queue */\n public queue(\n spine: Spine,\n animationName: string,\n loop: boolean = false,\n delay: number = 0,\n trackIndex: number = 0\n ): void {\n spine.state.addAnimation(trackIndex, animationName, loop, delay);\n }\n\n /** Set animation mix duration */\n public setMix(\n spine: Spine,\n fromAnimation: string,\n toAnimation: string,\n duration: number\n ): void {\n spine.stateData.setMix(fromAnimation, toAnimation, duration);\n }\n\n /** Get available animation names */\n public getAnimations(spine: Spine): string[] {\n return spine.skeleton.data.animations.map((a) => a.name);\n }\n\n /** Get available skin names */\n public getSkins(spine: Spine): string[] {\n return spine.skeleton.data.skins.map((s) => s.name);\n }\n\n /** Set skin by name */\n public setSkin(spine: Spine, skinName: string): void {\n spine.skeleton.setSkinByName(skinName);\n spine.skeleton.setSlotsToSetupPose();\n }\n\n /** Pause spine animation */\n public pause(spine: Spine): void {\n spine.state.timeScale = 0;\n }\n\n /** Resume spine animation */\n public resume(spine: Spine): void {\n spine.state.timeScale = 1;\n }\n\n /** Set animation speed */\n public setSpeed(spine: Spine, speed: number): void {\n spine.state.timeScale = speed;\n }\n}\n","import * as PIXI from 'pixi.js';\nimport gsap from 'gsap';\nimport { Engine } from '../../core/engine';\nimport type { ToastColorSet, ToastTheme, ToastThemePreset } from './toast-theme';\nimport { TOAST_PRESETS, getDefaultColors } from './toast-presets';\n\nexport type ToastType = 'info' | 'success' | 'warning' | 'error';\n\nexport interface ToastConfig {\n /** Toast message */\n message: string;\n /** Toast type for styling */\n type?: ToastType;\n /** Duration in ms before auto-dismiss (0 = no auto-dismiss) */\n duration?: number;\n /** Position on screen */\n position?: 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\nexport interface ToastManagerConfig {\n /** Theme preset name or custom theme object */\n theme?: ToastThemePreset | ToastTheme;\n}\n\ninterface ToastItem {\n container: PIXI.Container;\n config: Required<ToastConfig>;\n timer?: ReturnType<typeof setTimeout>;\n /** Stored dimensions for repositioning */\n width: number;\n height: number;\n /** Glow graphics for pulse animation */\n glowGraphics?: PIXI.Graphics;\n}\n\n\n/** SVG-style icon paths for each toast type (drawn with PIXI.Graphics) */\nconst TOAST_ICONS: Record<ToastType, (g: PIXI.Graphics, size: number, color: number) => void> = {\n info: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n const r = size * 0.4;\n // Circle\n g.lineStyle(2, color, 1);\n g.drawCircle(cx, cy, r);\n // Dot\n g.beginFill(color);\n g.drawCircle(cx, cy - r * 0.35, 2);\n g.endFill();\n // Line\n g.lineStyle(2.5, color, 1);\n g.moveTo(cx, cy - r * 0.05);\n g.lineTo(cx, cy + r * 0.5);\n },\n success: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n // Checkmark\n g.lineStyle(3, color, 1);\n g.moveTo(cx - size * 0.25, cy);\n g.lineTo(cx - size * 0.05, cy + size * 0.2);\n g.lineTo(cx + size * 0.3, cy - size * 0.2);\n },\n warning: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n const h = size * 0.75;\n const w = size * 0.8;\n // Triangle\n g.lineStyle(2, color, 1);\n g.moveTo(cx, cy - h * 0.45);\n g.lineTo(cx + w / 2, cy + h * 0.35);\n g.lineTo(cx - w / 2, cy + h * 0.35);\n g.closePath();\n // Exclamation mark\n g.lineStyle(2.5, color, 1);\n g.moveTo(cx, cy - h * 0.15);\n g.lineTo(cx, cy + h * 0.1);\n g.beginFill(color);\n g.drawCircle(cx, cy + h * 0.22, 2);\n g.endFill();\n },\n error: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n const r = size * 0.3;\n // X mark\n g.lineStyle(3, color, 1);\n g.moveTo(cx - r, cy - r);\n g.lineTo(cx + r, cy + r);\n g.moveTo(cx + r, cy - r);\n g.lineTo(cx - r, cy + r);\n },\n};\n\nconst DEFAULT_DURATION = 3000;\nconst TOAST_PADDING_X = 16;\nconst TOAST_PADDING_Y = 12;\nconst TOAST_MARGIN = 16;\nconst TOAST_MIN_HEIGHT = 52;\nconst MAX_WIDTH = 420;\nconst ICON_SIZE = 28;\nconst ICON_MARGIN = 12;\n\nexport class ToastManager {\n private layer: PIXI.Container;\n private toasts: ToastItem[] = [];\n private currentColors: Record<ToastType, ToastColorSet>;\n private currentThemeName: string;\n private resizeBinding: { detach: () => void } | null = null;\n\n /** Get screen width from Engine */\n private get screenWidth(): number {\n return Engine.screen.width;\n }\n\n /** Get screen height from Engine */\n private get screenHeight(): number {\n return Engine.screen.height;\n }\n\n constructor(stage: PIXI.Container, config?: ToastManagerConfig) {\n // Initialize theme\n if (config?.theme) {\n if (typeof config.theme === 'string') {\n const preset = TOAST_PRESETS[config.theme];\n this.currentColors = preset.colors;\n this.currentThemeName = preset.name;\n } else {\n this.currentColors = config.theme.colors;\n this.currentThemeName = config.theme.name;\n }\n } else {\n this.currentColors = getDefaultColors();\n this.currentThemeName = 'default';\n }\n\n // Create toast layer on top of everything\n this.layer = new PIXI.Container();\n this.layer.sortableChildren = true;\n this.layer.zIndex = 9999;\n stage.addChild(this.layer);\n\n // Auto-resize when game resizes\n this.resizeBinding = Engine.onResize.add(() => {\n this.repositionToasts();\n });\n }\n\n /**\n * Set the toast theme\n * @param theme - Theme preset name or custom theme object\n */\n public setTheme(theme: ToastThemePreset | ToastTheme): void {\n if (typeof theme === 'string') {\n const preset = TOAST_PRESETS[theme];\n this.currentColors = preset.colors;\n this.currentThemeName = preset.name;\n } else {\n this.currentColors = theme.colors;\n this.currentThemeName = theme.name;\n }\n }\n\n /**\n * Get the current theme name\n */\n public getThemeName(): string {\n return this.currentThemeName;\n }\n\n /** Show a toast notification */\n public show(message: string, options?: Partial<Omit<ToastConfig, 'message'>>): void {\n const config: Required<ToastConfig> = {\n message,\n type: options?.type ?? 'info',\n duration: options?.duration ?? DEFAULT_DURATION,\n position: options?.position ?? 'top',\n };\n\n const toast = this.createToast(config);\n this.toasts.push(toast);\n this.layer.addChild(toast.container);\n\n // Position first (sets target position), then animate\n this.repositionToasts();\n this.animateIn(toast);\n\n // Auto-dismiss\n if (config.duration > 0) {\n toast.timer = setTimeout(() => this.dismiss(toast), config.duration);\n }\n }\n\n /** Show info toast */\n public info(message: string, duration?: number): void {\n this.show(message, { type: 'info', duration });\n }\n\n /** Show success toast */\n public success(message: string, duration?: number): void {\n this.show(message, { type: 'success', duration });\n }\n\n /** Show warning toast */\n public warning(message: string, duration?: number): void {\n this.show(message, { type: 'warning', duration });\n }\n\n /** Show error toast */\n public error(message: string, duration?: number): void {\n this.show(message, { type: 'error', duration });\n }\n\n /** Dismiss all toasts */\n public dismissAll(): void {\n for (const toast of [...this.toasts]) {\n this.dismiss(toast);\n }\n }\n\n private createToast(config: Required<ToastConfig>): ToastItem {\n const container = new PIXI.Container();\n const colors = this.currentColors[config.type];\n const borderRadius = 8;\n\n // Calculate text area width (accounting for icon)\n const textAreaWidth = MAX_WIDTH - TOAST_PADDING_X * 2 - ICON_SIZE - ICON_MARGIN;\n\n // Create text with gaming typography\n const text = new PIXI.Text(config.message, {\n fontFamily: 'Trebuchet MS, Arial Black, sans-serif',\n fontSize: 18,\n fontWeight: '700',\n fill: colors.text,\n stroke: colors.stroke,\n strokeThickness: 2,\n dropShadow: true,\n dropShadowColor: 0x000000,\n dropShadowBlur: 3,\n dropShadowDistance: 1,\n dropShadowAngle: Math.PI / 3,\n wordWrap: true,\n wordWrapWidth: textAreaWidth,\n letterSpacing: 0.5,\n });\n\n // Calculate dimensions\n const contentWidth = ICON_SIZE + ICON_MARGIN + text.width;\n const width = Math.min(contentWidth + TOAST_PADDING_X * 2, MAX_WIDTH);\n const height = Math.max(text.height + TOAST_PADDING_Y * 2, TOAST_MIN_HEIGHT);\n\n // Create outer glow layer (pulsing effect)\n const glowGraphics = new PIXI.Graphics();\n this.drawOuterGlow(glowGraphics, width, height, borderRadius, colors);\n glowGraphics.alpha = 0.6;\n\n // Create main background\n const bg = new PIXI.Graphics();\n this.drawToastBackground(bg, width, height, borderRadius, colors);\n\n // Create icon container with background\n const iconContainer = new PIXI.Container();\n const iconBg = new PIXI.Graphics();\n iconBg.beginFill(colors.iconBg, 0.3);\n iconBg.drawRoundedRect(0, 0, ICON_SIZE, ICON_SIZE, 6);\n iconBg.endFill();\n\n const icon = new PIXI.Graphics();\n TOAST_ICONS[config.type](icon, ICON_SIZE, colors.borderHighlight);\n\n iconContainer.addChild(iconBg, icon);\n iconContainer.x = TOAST_PADDING_X;\n iconContainer.y = (height - ICON_SIZE) / 2;\n\n // Position text after icon\n text.x = TOAST_PADDING_X + ICON_SIZE + ICON_MARGIN;\n text.y = (height - text.height) / 2;\n\n // Add shine/highlight effect overlay\n const shine = new PIXI.Graphics();\n shine.beginFill(0xffffff, 0.08);\n shine.drawRoundedRect(2, 2, width - 4, height * 0.45, borderRadius - 1);\n shine.endFill();\n\n container.addChild(glowGraphics, bg, shine, iconContainer, text);\n\n // Set pivot for scale animation from center\n container.pivot.set(width / 2, height / 2);\n\n // Make interactive for dismiss on click\n container.eventMode = 'static';\n container.cursor = 'pointer';\n\n return { container, config, width, height, glowGraphics };\n }\n\n /** Draw outer neon glow effect */\n private drawOuterGlow(\n g: PIXI.Graphics,\n width: number,\n height: number,\n borderRadius: number,\n colors: ToastColorSet\n ): void {\n // Multiple glow layers for depth\n const glowLayers = [\n { offset: 6, alpha: 0.15, color: colors.glowOuter },\n { offset: 4, alpha: 0.25, color: colors.glow },\n { offset: 2, alpha: 0.35, color: colors.glow },\n ];\n\n for (const layer of glowLayers) {\n g.beginFill(layer.color, layer.alpha);\n g.drawRoundedRect(\n -layer.offset,\n -layer.offset,\n width + layer.offset * 2,\n height + layer.offset * 2,\n borderRadius + layer.offset\n );\n g.endFill();\n }\n }\n\n /** Draw toast background with gradient effect and border */\n private drawToastBackground(\n g: PIXI.Graphics,\n width: number,\n height: number,\n borderRadius: number,\n colors: ToastColorSet\n ): void {\n // Drop shadow\n g.beginFill(0x000000, 0.4);\n g.drawRoundedRect(2, 3, width, height, borderRadius);\n g.endFill();\n\n // Main background (dark)\n g.beginFill(colors.bg, 0.95);\n g.drawRoundedRect(0, 0, width, height, borderRadius);\n g.endFill();\n\n // Gradient overlay (lighter at top)\n g.beginFill(colors.bgGradient, 0.5);\n g.drawRoundedRect(0, 0, width, height * 0.5, borderRadius);\n g.endFill();\n\n // Inner border highlight (top edge glow)\n g.lineStyle(1, colors.borderHighlight, 0.4);\n g.drawRoundedRect(1, 1, width - 2, height - 2, borderRadius - 1);\n\n // Main border with glow color\n g.lineStyle(2, colors.border, 0.8);\n g.drawRoundedRect(0, 0, width, height, borderRadius);\n g.lineStyle(0);\n\n // Corner accents (gaming style)\n const cornerSize = 8;\n const cornerOffset = 4;\n g.lineStyle(2, colors.borderHighlight, 0.6);\n\n // Top-left corner\n g.moveTo(cornerOffset, cornerOffset + cornerSize);\n g.lineTo(cornerOffset, cornerOffset);\n g.lineTo(cornerOffset + cornerSize, cornerOffset);\n\n // Top-right corner\n g.moveTo(width - cornerOffset - cornerSize, cornerOffset);\n g.lineTo(width - cornerOffset, cornerOffset);\n g.lineTo(width - cornerOffset, cornerOffset + cornerSize);\n\n // Bottom-left corner\n g.moveTo(cornerOffset, height - cornerOffset - cornerSize);\n g.lineTo(cornerOffset, height - cornerOffset);\n g.lineTo(cornerOffset + cornerSize, height - cornerOffset);\n\n // Bottom-right corner\n g.moveTo(width - cornerOffset - cornerSize, height - cornerOffset);\n g.lineTo(width - cornerOffset, height - cornerOffset);\n g.lineTo(width - cornerOffset, height - cornerOffset - cornerSize);\n\n g.lineStyle(0);\n }\n\n private animateIn(toast: ToastItem): void {\n const { container, config, glowGraphics } = toast;\n\n // Start with scale and alpha at 0 for animation\n const isTop = config.position.includes('top');\n container.alpha = 0;\n container.scale.set(0.85);\n\n // Store target Y (set by repositionToasts) and offset for animation\n const targetY = container.y;\n container.y = targetY + (isTop ? -50 : 50);\n\n // Animate in with gaming-style entrance (200-300ms per UX guidelines)\n gsap.to(container, {\n alpha: 1,\n y: targetY,\n duration: 0.28,\n ease: 'back.out(1.4)',\n });\n\n gsap.to(container.scale, {\n x: 1,\n y: 1,\n duration: 0.22,\n ease: 'back.out(1.8)',\n });\n\n // Subtle glow pulse animation for attention\n if (glowGraphics) {\n gsap.to(glowGraphics, {\n alpha: 0.9,\n duration: 0.6,\n ease: 'power1.inOut',\n yoyo: true,\n repeat: 2,\n onComplete: () => {\n // Settle to subtle pulse\n gsap.to(glowGraphics, {\n alpha: 0.5,\n duration: 1.2,\n ease: 'sine.inOut',\n yoyo: true,\n repeat: -1,\n });\n },\n });\n }\n\n // Click to dismiss\n container.on('pointerdown', () => this.dismiss(toast));\n }\n\n private dismiss(toast: ToastItem): void {\n const index = this.toasts.indexOf(toast);\n if (index === -1) return;\n\n // Clear timer\n if (toast.timer) {\n clearTimeout(toast.timer);\n }\n\n // Kill any ongoing glow animations\n if (toast.glowGraphics) {\n gsap.killTweensOf(toast.glowGraphics);\n }\n\n // Remove from array\n this.toasts.splice(index, 1);\n\n // Quick flash before dismiss (gaming feedback)\n if (toast.glowGraphics) {\n gsap.to(toast.glowGraphics, {\n alpha: 1,\n duration: 0.08,\n ease: 'power2.out',\n });\n }\n\n // Animate out with scale and slide (150-200ms per UX guidelines)\n gsap.to(toast.container, {\n alpha: 0,\n y: toast.container.y - 25,\n duration: 0.18,\n ease: 'power2.in',\n });\n\n gsap.to(toast.container.scale, {\n x: 0.92,\n y: 0.92,\n duration: 0.18,\n ease: 'power2.in',\n onComplete: () => {\n toast.container.destroy();\n this.repositionToasts();\n },\n });\n }\n\n private repositionToasts(): void {\n // Group by position\n const groups = new Map<string, ToastItem[]>();\n\n for (const toast of this.toasts) {\n const pos = toast.config.position;\n if (!groups.has(pos)) groups.set(pos, []);\n groups.get(pos)!.push(toast);\n }\n\n // Position each group\n for (const [position, items] of groups) {\n let offsetY = TOAST_MARGIN;\n\n for (const toast of items) {\n const { container, width, height } = toast;\n // Pivot is at center, so position is at center point\n const halfW = width / 2;\n const halfH = height / 2;\n\n // X position (center-based due to pivot)\n if (position.includes('left')) {\n container.x = TOAST_MARGIN + halfW;\n } else if (position.includes('right')) {\n container.x = this.screenWidth - halfW - TOAST_MARGIN;\n } else {\n container.x = this.screenWidth / 2;\n }\n\n // Y position (center-based due to pivot)\n if (position.includes('bottom')) {\n container.y = this.screenHeight - halfH - offsetY;\n } else {\n container.y = offsetY + halfH;\n }\n\n offsetY += height + TOAST_MARGIN;\n }\n }\n }\n\n public destroy(): void {\n this.resizeBinding?.detach();\n this.resizeBinding = null;\n this.dismissAll();\n this.layer.destroy();\n }\n}\n","import type { ToastType } from './toast-manager';\n\n/**\n * Color set for a single toast type\n * Used to define the visual appearance of info/success/warning/error toasts\n */\nexport interface ToastColorSet {\n /** Main background color (dark) */\n bg: number;\n /** Gradient overlay color (lighter, for top half) */\n bgGradient: number;\n /** Primary glow color */\n glow: number;\n /** Outer glow color (darker) */\n glowOuter: number;\n /** Border color */\n border: number;\n /** Border highlight color (brighter) */\n borderHighlight: number;\n /** Text color */\n text: number;\n /** Text stroke color */\n stroke: number;\n /** Icon background color */\n iconBg: number;\n}\n\n/**\n * Complete toast theme with colors for all toast types\n */\nexport interface ToastTheme {\n /** Theme name for identification */\n name: string;\n /** Color sets for each toast type */\n colors: Record<ToastType, ToastColorSet>;\n}\n\n/**\n * Built-in theme preset names\n */\nexport type ToastThemePreset = 'default' | 'asian' | 'egyptian' | 'underwater' | 'neon' | 'luxury';\n\n/**\n * Helper function to create a complete theme with type safety\n * @param name - Theme name\n * @param colors - Color sets for each toast type\n * @returns Complete ToastTheme object\n */\nexport function createTheme(name: string, colors: Record<ToastType, ToastColorSet>): ToastTheme {\n return { name, colors };\n}\n","import type { ToastColorSet, ToastTheme, ToastThemePreset } from './toast-theme';\nimport { createTheme } from './toast-theme';\nimport type { ToastType } from './toast-manager';\n\n/**\n * Default theme - Generic casino style\n * Info: Cyan, Success: Gold, Warning: Orange, Error: Red\n */\nconst defaultTheme: ToastTheme = createTheme('default', {\n info: {\n bg: 0x0a1628,\n bgGradient: 0x102040,\n glow: 0x00d4ff,\n glowOuter: 0x0088aa,\n border: 0x00d4ff,\n borderHighlight: 0x80efff,\n text: 0xffffff,\n stroke: 0x001020,\n iconBg: 0x00b8e6,\n },\n success: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xffd700,\n glowOuter: 0xb8860b,\n border: 0xffd700,\n borderHighlight: 0xffec80,\n text: 0xffffff,\n stroke: 0x1a1000,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x1a1008,\n bgGradient: 0x2a1810,\n glow: 0xff8c00,\n glowOuter: 0xcc6600,\n border: 0xff8c00,\n borderHighlight: 0xffb366,\n text: 0xffffff,\n stroke: 0x1a0800,\n iconBg: 0xe67a00,\n },\n error: {\n bg: 0x1a0808,\n bgGradient: 0x2a1010,\n glow: 0xff3333,\n glowOuter: 0xaa2222,\n border: 0xff3333,\n borderHighlight: 0xff8080,\n text: 0xffffff,\n stroke: 0x100000,\n iconBg: 0xe62e2e,\n },\n});\n\n/**\n * Asian theme - Lucky/Chinese New Year style\n * Info: Red, Success: Gold, Warning: Orange, Error: Deep Red\n */\nconst asianTheme: ToastTheme = createTheme('asian', {\n info: {\n bg: 0x1a0808,\n bgGradient: 0x2a1010,\n glow: 0xff2222,\n glowOuter: 0xaa1111,\n border: 0xff2222,\n borderHighlight: 0xff6666,\n text: 0xffffff,\n stroke: 0x100000,\n iconBg: 0xcc1a1a,\n },\n success: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xffd700,\n glowOuter: 0xb8860b,\n border: 0xffd700,\n borderHighlight: 0xffec80,\n text: 0xffffff,\n stroke: 0x1a1000,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x1a1208,\n bgGradient: 0x2a1c10,\n glow: 0xffa500,\n glowOuter: 0xcc8400,\n border: 0xffa500,\n borderHighlight: 0xffc966,\n text: 0xffffff,\n stroke: 0x1a0c00,\n iconBg: 0xe69500,\n },\n error: {\n bg: 0x200808,\n bgGradient: 0x301010,\n glow: 0x8b0000,\n glowOuter: 0x5c0000,\n border: 0x8b0000,\n borderHighlight: 0xb33333,\n text: 0xffffff,\n stroke: 0x0a0000,\n iconBg: 0x7a0000,\n },\n});\n\n/**\n * Egyptian theme - Ancient/Pharaoh style\n * Info: Turquoise, Success: Gold, Warning: Amber, Error: Scarlet\n */\nconst egyptianTheme: ToastTheme = createTheme('egyptian', {\n info: {\n bg: 0x081a1a,\n bgGradient: 0x102a2a,\n glow: 0x40e0d0,\n glowOuter: 0x30a8a0,\n border: 0x40e0d0,\n borderHighlight: 0x80f0e8,\n text: 0xffffff,\n stroke: 0x001010,\n iconBg: 0x38c8c0,\n },\n success: {\n bg: 0x1a1808,\n bgGradient: 0x2a2410,\n glow: 0xffd700,\n glowOuter: 0xdaa520,\n border: 0xffd700,\n borderHighlight: 0xffe44d,\n text: 0xffffff,\n stroke: 0x1a1400,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x1a1408,\n bgGradient: 0x2a2010,\n glow: 0xffbf00,\n glowOuter: 0xcc9900,\n border: 0xffbf00,\n borderHighlight: 0xffd94d,\n text: 0xffffff,\n stroke: 0x1a1000,\n iconBg: 0xe6ac00,\n },\n error: {\n bg: 0x1a0a08,\n bgGradient: 0x2a1210,\n glow: 0xff2400,\n glowOuter: 0xcc1c00,\n border: 0xff2400,\n borderHighlight: 0xff6b4d,\n text: 0xffffff,\n stroke: 0x100400,\n iconBg: 0xe62000,\n },\n});\n\n/**\n * Underwater theme - Ocean/Aquatic style\n * Info: Cyan, Success: Sea Green, Warning: Yellow, Error: Coral\n */\nconst underwaterTheme: ToastTheme = createTheme('underwater', {\n info: {\n bg: 0x081828,\n bgGradient: 0x102438,\n glow: 0x00ced1,\n glowOuter: 0x008b8b,\n border: 0x00ced1,\n borderHighlight: 0x66e8ea,\n text: 0xffffff,\n stroke: 0x001018,\n iconBg: 0x00b8bb,\n },\n success: {\n bg: 0x081a10,\n bgGradient: 0x102a18,\n glow: 0x20b2aa,\n glowOuter: 0x178a84,\n border: 0x20b2aa,\n borderHighlight: 0x66d4ce,\n text: 0xffffff,\n stroke: 0x001008,\n iconBg: 0x1c9e97,\n },\n warning: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xf0e68c,\n glowOuter: 0xc0b870,\n border: 0xf0e68c,\n borderHighlight: 0xf8f0b8,\n text: 0x1a1a08,\n stroke: 0x808060,\n iconBg: 0xd8cf7e,\n },\n error: {\n bg: 0x1a1010,\n bgGradient: 0x2a1818,\n glow: 0xff7f50,\n glowOuter: 0xcc6640,\n border: 0xff7f50,\n borderHighlight: 0xffb299,\n text: 0xffffff,\n stroke: 0x100808,\n iconBg: 0xe67248,\n },\n});\n\n/**\n * Neon theme - Cyberpunk/Modern style\n * Info: Pink, Success: Lime, Warning: Yellow, Error: Magenta\n */\nconst neonTheme: ToastTheme = createTheme('neon', {\n info: {\n bg: 0x180820,\n bgGradient: 0x241030,\n glow: 0xff1493,\n glowOuter: 0xcc1077,\n border: 0xff1493,\n borderHighlight: 0xff66b8,\n text: 0xffffff,\n stroke: 0x100018,\n iconBg: 0xe61284,\n },\n success: {\n bg: 0x081a08,\n bgGradient: 0x102a10,\n glow: 0x32cd32,\n glowOuter: 0x28a428,\n border: 0x32cd32,\n borderHighlight: 0x7de87d,\n text: 0xffffff,\n stroke: 0x001000,\n iconBg: 0x2db82d,\n },\n warning: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xffff00,\n glowOuter: 0xcccc00,\n border: 0xffff00,\n borderHighlight: 0xffff66,\n text: 0x1a1a08,\n stroke: 0x808000,\n iconBg: 0xe6e600,\n },\n error: {\n bg: 0x200820,\n bgGradient: 0x301030,\n glow: 0xff00ff,\n glowOuter: 0xcc00cc,\n border: 0xff00ff,\n borderHighlight: 0xff66ff,\n text: 0xffffff,\n stroke: 0x100010,\n iconBg: 0xe600e6,\n },\n});\n\n/**\n * Luxury theme - VIP/High-roller style\n * Info: Silver, Success: Gold, Warning: Bronze, Error: Ruby\n */\nconst luxuryTheme: ToastTheme = createTheme('luxury', {\n info: {\n bg: 0x101418,\n bgGradient: 0x181c22,\n glow: 0xc0c0c0,\n glowOuter: 0x909090,\n border: 0xc0c0c0,\n borderHighlight: 0xe0e0e0,\n text: 0xffffff,\n stroke: 0x080a0c,\n iconBg: 0xaaaaaa,\n },\n success: {\n bg: 0x1a1808,\n bgGradient: 0x2a2410,\n glow: 0xffd700,\n glowOuter: 0xdaa520,\n border: 0xffd700,\n borderHighlight: 0xffe44d,\n text: 0xffffff,\n stroke: 0x1a1400,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x181208,\n bgGradient: 0x241c10,\n glow: 0xcd7f32,\n glowOuter: 0xa46628,\n border: 0xcd7f32,\n borderHighlight: 0xe0a866,\n text: 0xffffff,\n stroke: 0x100c04,\n iconBg: 0xb8722d,\n },\n error: {\n bg: 0x1a0810,\n bgGradient: 0x2a1018,\n glow: 0xe0115f,\n glowOuter: 0xb30d4c,\n border: 0xe0115f,\n borderHighlight: 0xec5a8f,\n text: 0xffffff,\n stroke: 0x100008,\n iconBg: 0xc90f55,\n },\n});\n\n/**\n * Map of all built-in theme presets\n */\nexport const TOAST_PRESETS: Record<ToastThemePreset, ToastTheme> = {\n default: defaultTheme,\n asian: asianTheme,\n egyptian: egyptianTheme,\n underwater: underwaterTheme,\n neon: neonTheme,\n luxury: luxuryTheme,\n};\n\n/**\n * Get a preset theme by name\n * @param name - Preset name\n * @returns The theme object\n */\nexport function getPreset(name: ToastThemePreset): ToastTheme {\n return TOAST_PRESETS[name];\n}\n\n/**\n * Get the default theme colors for backwards compatibility\n * @returns Colors record for all toast types\n */\nexport function getDefaultColors(): Record<ToastType, ToastColorSet> {\n return defaultTheme.colors;\n}\n","import gsap from 'gsap';\nimport { PixiPlugin } from 'gsap/PixiPlugin';\nimport * as PIXI from 'pixi.js';\n\n// Register PixiPlugin\ngsap.registerPlugin(PixiPlugin);\nPixiPlugin.registerPIXI(PIXI);\n\nexport interface TweenConfig {\n duration?: number;\n delay?: number;\n ease?: string;\n repeat?: number;\n yoyo?: boolean;\n onComplete?: () => void;\n onUpdate?: () => void;\n [key: string]: unknown;\n}\n\nexport class TweenManager {\n private tweens: Set<gsap.core.Tween> = new Set();\n\n /** Animate target to new values */\n public to(target: object, config: TweenConfig): gsap.core.Tween {\n const tween = gsap.to(target, {\n duration: config.duration ?? 0.5,\n delay: config.delay ?? 0,\n ease: config.ease ?? 'power2.out',\n repeat: config.repeat ?? 0,\n yoyo: config.yoyo ?? false,\n onUpdate: config.onUpdate,\n onComplete: () => {\n this.tweens.delete(tween);\n config.onComplete?.();\n },\n ...this.extractProps(config),\n });\n\n this.tweens.add(tween);\n return tween;\n }\n\n /** Animate target from values */\n public from(target: object, config: TweenConfig): gsap.core.Tween {\n const tween = gsap.from(target, {\n duration: config.duration ?? 0.5,\n delay: config.delay ?? 0,\n ease: config.ease ?? 'power2.out',\n repeat: config.repeat ?? 0,\n yoyo: config.yoyo ?? false,\n onUpdate: config.onUpdate,\n onComplete: () => {\n this.tweens.delete(tween);\n config.onComplete?.();\n },\n ...this.extractProps(config),\n });\n\n this.tweens.add(tween);\n return tween;\n }\n\n /** Animate from one set of values to another */\n public fromTo(target: object, fromConfig: TweenConfig, toConfig: TweenConfig): gsap.core.Tween {\n const tween = gsap.fromTo(target, this.extractProps(fromConfig), {\n duration: toConfig.duration ?? 0.5,\n delay: toConfig.delay ?? 0,\n ease: toConfig.ease ?? 'power2.out',\n repeat: toConfig.repeat ?? 0,\n yoyo: toConfig.yoyo ?? false,\n onUpdate: toConfig.onUpdate,\n onComplete: () => {\n this.tweens.delete(tween);\n toConfig.onComplete?.();\n },\n ...this.extractProps(toConfig),\n });\n\n this.tweens.add(tween);\n return tween;\n }\n\n /** Create a timeline */\n public timeline(config?: gsap.TimelineVars): gsap.core.Timeline {\n return gsap.timeline(config);\n }\n\n /** Kill a specific tween */\n public kill(tween: gsap.core.Tween): void {\n tween.kill();\n this.tweens.delete(tween);\n }\n\n /** Kill all tweens for a target */\n public killTweensOf(target: object): void {\n gsap.killTweensOf(target);\n }\n\n /** Kill all managed tweens */\n public killAll(): void {\n for (const tween of this.tweens) {\n tween.kill();\n }\n this.tweens.clear();\n }\n\n private extractProps(config: TweenConfig): Record<string, unknown> {\n const reserved = ['duration', 'delay', 'ease', 'repeat', 'yoyo', 'onComplete', 'onUpdate'];\n return Object.fromEntries(\n Object.entries(config).filter(([key]) => !reserved.includes(key))\n );\n }\n\n /** Get number of active tweens */\n public get count(): number {\n return this.tweens.size;\n }\n\n /** Clean up */\n public destroy(): void {\n this.killAll();\n }\n}\n","import { type ButtonOptions, FancyButton } from '@pixi/ui';\nimport * as PIXI from 'pixi.js';\n\nexport interface ButtonConfig {\n text?: string;\n textStyle?: Partial<PIXI.TextStyle>;\n defaultView?: PIXI.Container | string;\n hoverView?: PIXI.Container | string;\n pressedView?: PIXI.Container | string;\n disabledView?: PIXI.Container | string;\n padding?: number;\n scale?: number;\n anchor?: number;\n onClick?: () => void;\n}\n\nexport interface TextConfig {\n text: string;\n style?: Partial<PIXI.TextStyle>;\n x?: number;\n y?: number;\n anchor?: number | { x: number; y: number };\n}\n\nexport class UIManager {\n /** Create a fancy button */\n public button(config: ButtonConfig): FancyButton {\n const buttonOptions: ButtonOptions = {\n text: new PIXI.Text(config.text ?? '', {\n fontFamily: 'Arial',\n fontSize: 24,\n fill: 0xffffff,\n ...config.textStyle,\n }),\n padding: config.padding ?? 10,\n scale: config.scale ?? 1,\n anchor: config.anchor ?? 0.5,\n };\n\n // Add views if provided\n if (config.defaultView) {\n buttonOptions.defaultView = this.resolveView(config.defaultView);\n }\n if (config.hoverView) {\n buttonOptions.hoverView = this.resolveView(config.hoverView);\n }\n if (config.pressedView) {\n buttonOptions.pressedView = this.resolveView(config.pressedView);\n }\n if (config.disabledView) {\n buttonOptions.disabledView = this.resolveView(config.disabledView);\n }\n\n const button = new FancyButton(buttonOptions);\n\n if (config.onClick) {\n button.onPress.connect(config.onClick);\n }\n\n return button;\n }\n\n /** Create a text element */\n public text(config: TextConfig): PIXI.Text {\n const text = new PIXI.Text(config.text, {\n fontFamily: 'Arial',\n fontSize: 24,\n fill: 0xffffff,\n ...config.style,\n });\n\n if (config.x !== undefined) text.x = config.x;\n if (config.y !== undefined) text.y = config.y;\n\n if (config.anchor !== undefined) {\n if (typeof config.anchor === 'number') {\n text.anchor.set(config.anchor);\n } else {\n text.anchor.set(config.anchor.x, config.anchor.y);\n }\n }\n\n return text;\n }\n\n /** Create a simple rectangle */\n public rect(\n width: number,\n height: number,\n color: number = 0xffffff,\n radius: number = 0\n ): PIXI.Graphics {\n const graphics = new PIXI.Graphics();\n graphics.beginFill(color);\n if (radius > 0) {\n graphics.drawRoundedRect(0, 0, width, height, radius);\n } else {\n graphics.drawRect(0, 0, width, height);\n }\n graphics.endFill();\n return graphics;\n }\n\n /** Create a progress bar */\n public progressBar(\n width: number,\n height: number,\n bgColor: number = 0x333333,\n fillColor: number = 0x00ff00\n ): { container: PIXI.Container; setProgress: (value: number) => void } {\n const container = new PIXI.Container();\n const bg = this.rect(width, height, bgColor, 4);\n const fill = this.rect(width - 4, height - 4, fillColor, 2);\n fill.x = 2;\n fill.y = 2;\n fill.scale.x = 0;\n\n container.addChild(bg, fill);\n\n return {\n container,\n setProgress: (value: number) => {\n fill.scale.x = Math.max(0, Math.min(1, value));\n },\n };\n }\n\n private resolveView(view: PIXI.Container | string): PIXI.Container {\n if (typeof view === 'string') {\n // Assume it's a texture alias\n const texture = PIXI.Assets.get<PIXI.Texture>(view);\n if (texture) {\n return new PIXI.Sprite(texture);\n }\n // Fallback to simple rectangle\n return this.rect(100, 40, 0x444444, 8);\n }\n return view;\n }\n}\n","import * as PIXI from 'pixi.js';\nimport { Engine } from '../core/engine';\n\nexport abstract class Scene extends PIXI.Container {\n /** Get engine class for static access */\n protected get engine(): typeof Engine {\n return Engine;\n }\n\n /** Called when scene becomes active */\n public abstract onEnter(): void | Promise<void>;\n\n /** Called every frame while scene is active */\n public abstract onUpdate(delta: number): void;\n\n /** Called when scene is about to be replaced */\n public abstract onExit(): void;\n\n /** Called when scene is paused (another scene pushed on top) */\n public onPause(): void {\n // Override if needed\n }\n\n /** Called when scene is resumed (top scene popped) */\n public onResume(): void {\n // Override if needed\n }\n}\n","/**\r\n * Count Animation Presets\r\n *\r\n * Standardized animation timings for consistent feel across the game.\r\n */\r\nimport type { CountPreset } from './count-renderer';\r\n\r\n/**\r\n * Standard animation presets for count animations\r\n */\r\nexport const COUNT_PRESETS: Record<string, CountPreset> = {\r\n\t/** Quick updates (300ms) - UI feedback, small changes */\r\n\tfast: {\r\n\t\tduration: 300,\r\n\t\teasing: 'power2.out',\r\n\t},\r\n\r\n\t/** Normal updates (500ms) - Balance changes, bet adjustments */\r\n\tnormal: {\r\n\t\tduration: 500,\r\n\t\teasing: 'power2.out',\r\n\t},\r\n\r\n\t/** Win displays (1000ms) - Standard win count-up */\r\n\twin: {\r\n\t\tduration: 1000,\r\n\t\teasing: 'slow(0.5, 0.8, false)',\r\n\t},\r\n\r\n\t/** Big win celebrations (2000ms) - Dramatic count-up */\r\n\tbigWin: {\r\n\t\tduration: 2000,\r\n\t\teasing: 'slow(0.3, 0.9, false)',\r\n\t},\r\n\r\n\t/** Epic win presentations (4000ms) - Maximum drama */\r\n\tepicWin: {\r\n\t\tduration: 4000,\r\n\t\teasing: 'slow(0.2, 0.95, false)',\r\n\t},\r\n\r\n\t/** Instant - No animation, immediate update */\r\n\tinstant: {\r\n\t\tduration: 0,\r\n\t\teasing: 'none',\r\n\t},\r\n};\r\n\r\n/**\r\n * Get a preset by name, with fallback to 'normal'\r\n */\r\nexport function getCountPreset(name: string): CountPreset {\r\n\treturn COUNT_PRESETS[name] ?? COUNT_PRESETS.normal;\r\n}\r\n","/**\r\n * Count Animator\r\n *\r\n * Core animation controller for count up/down animations.\r\n * Uses GSAP for consistent timing and easing across the game.\r\n */\r\nimport type { TweenManager } from '../tween/tween-manager';\r\nimport type { CountAnimatorConfig, ICountRenderer } from './count-renderer';\r\nimport { getCountPreset } from './presets';\r\n\r\n/**\r\n * Unified count animation controller\r\n *\r\n * @example\r\n * ```typescript\r\n * const renderer = new TextCountRenderer(text);\r\n * const animator = new CountAnimator(renderer, tweenManager);\r\n *\r\n * // Animate to value\r\n * await animator.animateTo(1000, { preset: 'win' });\r\n *\r\n * // Animate from/to\r\n * await animator.animateFromTo(0, 500, { duration: 1000 });\r\n *\r\n * // Instant set\r\n * animator.setValue(100);\r\n * ```\r\n */\r\nexport class CountAnimator {\r\n\tprivate renderer: ICountRenderer;\r\n\tprivate tween: TweenManager;\r\n\tprivate currentValue = 0;\r\n\tprivate targetValue = 0;\r\n\tprivate activeTween: gsap.core.Tween | null = null;\r\n\tprivate defaultFormatter: (value: number) => string;\r\n\r\n\tconstructor(\r\n\t\trenderer: ICountRenderer,\r\n\t\ttweenManager: TweenManager,\r\n\t\tdefaultFormatter: (value: number) => string = (v) => Math.floor(v).toString()\r\n\t) {\r\n\t\tthis.renderer = renderer;\r\n\t\tthis.tween = tweenManager;\r\n\t\tthis.defaultFormatter = defaultFormatter;\r\n\t\tthis.renderer.setValue(this.defaultFormatter(0));\r\n\t}\r\n\r\n\t/**\r\n\t * Animate from current value to target\r\n\t */\r\n\tpublic animateTo(target: number, config?: CountAnimatorConfig): Promise<void> {\r\n\t\treturn this.animateFromTo(this.currentValue, target, config);\r\n\t}\r\n\r\n\t/**\r\n\t * Animate from one value to another\r\n\t */\r\n\tpublic animateFromTo(from: number, to: number, config?: CountAnimatorConfig): Promise<void> {\r\n\t\tthis.stop();\r\n\r\n\t\tconst preset = getCountPreset(config?.preset ?? 'normal');\r\n\t\tconst duration = config?.duration ?? preset.duration;\r\n\t\tconst easing = config?.easing ?? preset.easing;\r\n\t\tconst formatter = config?.formatter ?? this.defaultFormatter;\r\n\r\n\t\t// Instant update if duration is 0\r\n\t\tif (duration === 0) {\r\n\t\t\tthis.currentValue = to;\r\n\t\t\tthis.targetValue = to;\r\n\t\t\tthis.renderer.setValue(formatter(to));\r\n\t\t\tconfig?.onComplete?.();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\r\n\t\tthis.currentValue = from;\r\n\t\tthis.targetValue = to;\r\n\t\tconst range = to - from;\r\n\r\n\t\treturn new Promise<void>((resolve) => {\r\n\t\t\tconst animTarget = { value: from };\r\n\r\n\t\t\tthis.activeTween = this.tween.to(animTarget, {\r\n\t\t\t\tvalue: to,\r\n\t\t\t\tduration: duration / 1000,\r\n\t\t\t\tease: easing,\r\n\t\t\t\tonUpdate: () => {\r\n\t\t\t\t\tthis.currentValue = animTarget.value;\r\n\t\t\t\t\tthis.renderer.setValue(formatter(this.currentValue));\r\n\r\n\t\t\t\t\t// Calculate progress and fire callback\r\n\t\t\t\t\tif (config?.onProgress && range !== 0) {\r\n\t\t\t\t\t\tconst progress = (this.currentValue - from) / range;\r\n\t\t\t\t\t\tconfig.onProgress(progress, this.currentValue);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tonComplete: () => {\r\n\t\t\t\t\tthis.activeTween = null;\r\n\t\t\t\t\tthis.currentValue = to;\r\n\t\t\t\t\tthis.renderer.setValue(formatter(to));\r\n\t\t\t\t\tconfig?.onComplete?.();\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Set value instantly (no animation)\r\n\t */\r\n\tpublic setValue(value: number, formatter?: (value: number) => string): void {\r\n\t\tthis.stop();\r\n\t\tthis.currentValue = value;\r\n\t\tthis.targetValue = value;\r\n\t\tthis.renderer.setValue((formatter ?? this.defaultFormatter)(value));\r\n\t}\r\n\r\n\t/**\r\n\t * Skip animation and show target value immediately\r\n\t */\r\n\tpublic skip(): void {\r\n\t\tif (this.activeTween) {\r\n\t\t\tconst target = this.targetValue;\r\n\t\t\tthis.stop();\r\n\t\t\tthis.currentValue = target;\r\n\t\t\tthis.renderer.setValue(this.defaultFormatter(target));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Stop animation at current value\r\n\t */\r\n\tpublic stop(): void {\r\n\t\tif (this.activeTween) {\r\n\t\t\tthis.tween.kill(this.activeTween);\r\n\t\t\tthis.activeTween = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Reset to zero\r\n\t */\r\n\tpublic reset(): void {\r\n\t\tthis.stop();\r\n\t\tthis.currentValue = 0;\r\n\t\tthis.targetValue = 0;\r\n\t\tthis.renderer.setValue(this.defaultFormatter(0));\r\n\t}\r\n\r\n\t/**\r\n\t * Get current displayed value\r\n\t */\r\n\tpublic get value(): number {\r\n\t\treturn this.currentValue;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the target value (may differ during animation)\r\n\t */\r\n\tpublic get target(): number {\r\n\t\treturn this.targetValue;\r\n\t}\r\n\r\n\t/**\r\n\t * Check if animation is running\r\n\t */\r\n\tpublic get isAnimating(): boolean {\r\n\t\treturn this.activeTween !== null;\r\n\t}\r\n\r\n\t/**\r\n\t * Update the default formatter\r\n\t */\r\n\tpublic setFormatter(formatter: (value: number) => string): void {\r\n\t\tthis.defaultFormatter = formatter;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the underlying renderer\r\n\t */\r\n\tpublic getRenderer(): ICountRenderer {\r\n\t\treturn this.renderer;\r\n\t}\r\n}\r\n","/**\r\n * Text Count Renderer\r\n *\r\n * ICountRenderer implementation for PIXI.Text objects.\r\n */\r\nimport type * as PIXI from 'pixi.js';\r\nimport type { ICountRenderer } from './count-renderer';\r\n\r\n/**\r\n * Renders count animation values to a PIXI.Text object\r\n */\r\nexport class TextCountRenderer implements ICountRenderer {\r\n\tprivate text: PIXI.Text;\r\n\r\n\tconstructor(text: PIXI.Text) {\r\n\t\tthis.text = text;\r\n\t}\r\n\r\n\t/**\r\n\t * Update the displayed text value\r\n\t */\r\n\tpublic setValue(value: string): void {\r\n\t\tthis.text.text = value;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the PIXI.Text container for positioning\r\n\t */\r\n\tpublic getDisplayObject(): PIXI.Container {\r\n\t\treturn this.text;\r\n\t}\r\n\r\n\t/**\r\n\t * Set text fill color\r\n\t */\r\n\tpublic setColor(color: number): void {\r\n\t\tthis.text.style.fill = color;\r\n\t}\r\n\r\n\t/**\r\n\t * Set scale\r\n\t */\r\n\tpublic setScale(scaleX: number, scaleY?: number): void {\r\n\t\tthis.text.scale.set(scaleX, scaleY ?? scaleX);\r\n\t}\r\n\r\n\t/**\r\n\t * Get the underlying PIXI.Text\r\n\t */\r\n\tpublic getText(): PIXI.Text {\r\n\t\treturn this.text;\r\n\t}\r\n}\r\n"],"mappings":"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","names":["PIXI","PIXI","PIXI","import_gsap","gsap","TEXT_COLOR","gsap","PIXI","PIXI","PIXI","PIXI","import_pixi_spine","PIXI","import_gsap","gsap","import_gsap","PIXI","gsap","PIXI","PIXI","PIXI","import_pixi_spine"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core/engine.ts","../src/ui/alert/alert-manager.ts","../src/ui/modal/base-modal.ts","../src/core/signal.ts","../src/assets/asset-manager.ts","../src/utils/logger.ts","../src/input/gamepad.ts","../src/input/keyboard.ts","../src/input/pointer.ts","../src/input/input-manager.ts","../src/ui/modal/modal-manager.ts","../src/particles/particle-manager.ts","../src/scenes/scene-manager.ts","../src/sound/sound-manager.ts","../src/spine/spine-manager.ts","../src/ui/toast/toast-manager.ts","../src/ui/toast/toast-theme.ts","../src/ui/toast/toast-presets.ts","../src/tween/tween-manager.ts","../src/ui/ui-manager.ts","../src/scenes/scene.ts","../src/animations/presets.ts","../src/animations/count-animator.ts","../src/animations/text-count-renderer.ts"],"sourcesContent":["// Core\nexport { Engine, Signal } from './core';\nexport type { EngineConfig, ScaleMode, SignalBinding } from './core';\n\n// Scenes\nexport { Scene, SceneManager } from './scenes';\n\n// Input\nexport { InputManager, KeyboardManager, PointerManager, GamepadManager } from './input';\n\n// Assets\nexport { AssetManager } from './assets';\nexport type { AssetBundle, AssetEntry, AssetManifest } from './assets';\n\n// Sound\nexport { SoundManager } from './sound';\n\n// Particles\nexport { ParticleManager } from './particles';\n\n// Tween\nexport { TweenManager } from './tween';\n\n// Spine\nexport { SpineManager } from './spine';\n\n// UI\nexport {\n UIManager,\n BaseModal,\n ModalManager,\n AlertManager,\n ToastManager,\n createTheme,\n TOAST_PRESETS,\n getPreset,\n getDefaultColors,\n} from './ui';\nexport type {\n BaseModalConfig,\n CloseButtonPosition,\n ModalAnimation,\n ModalButtonConfig,\n AlertButton,\n AlertConfig,\n AlertType,\n ToastColorSet,\n ToastConfig,\n ToastManagerConfig,\n ToastTheme,\n ToastThemePreset,\n ToastType,\n} from './ui';\n\n// Animations\nexport { CountAnimator, TextCountRenderer, COUNT_PRESETS, getCountPreset } from './animations';\nexport type { CountAnimatorConfig, CountPreset, ICountRenderer } from './animations';\n\n// Utils\nexport { Logger, LoggerClass } from './utils';\nexport type { LogLevel } from './utils';\n\n// Re-export PIXI for convenience\nexport * as PIXI from 'pixi.js';\nexport type { ISkeletonData } from 'pixi-spine';\nexport { Spine } from 'pixi-spine';\n","import * as PIXI from 'pixi.js';\r\nimport { AlertManager } from '../ui/alert/alert-manager';\r\nimport { AssetManager } from '../assets/asset-manager';\r\nimport { InputManager } from '../input/input-manager';\r\nimport { ModalManager } from '../ui/modal/modal-manager';\r\nimport { ParticleManager } from '../particles/particle-manager';\r\nimport { SceneManager } from '../scenes/scene-manager';\r\nimport { Signal } from './signal';\r\nimport { SoundManager } from '../sound/sound-manager';\r\nimport { SpineManager } from '../spine/spine-manager';\r\nimport { ToastManager } from '../ui/toast/toast-manager';\r\nimport { TweenManager } from '../tween/tween-manager';\r\nimport { UIManager } from '../ui/ui-manager';\r\nimport { Logger } from '../utils';\r\n\r\nexport type ScaleMode = 'none' | 'letterbox' | 'fill';\r\n\r\nexport interface EngineConfig {\r\n width: number;\r\n height: number;\r\n backgroundColor?: number;\r\n antialias?: boolean;\r\n resolution?: number;\r\n autoDensity?: boolean;\r\n /** Scale mode for responsive resizing. Default: 'letterbox' */\r\n scaleMode?: ScaleMode;\r\n /** Auto-resize on window resize. Default: true */\r\n autoResize?: boolean;\r\n}\r\n\r\nexport class Engine {\r\n private constructor() {}\r\n\r\n private static _app: PIXI.Application;\r\n private static _scenes: SceneManager;\r\n private static _input: InputManager;\r\n private static _assets: AssetManager;\r\n private static _sound: SoundManager;\r\n private static _particles: ParticleManager;\r\n private static _tween: TweenManager;\r\n private static _ui: UIManager;\r\n private static _spine: SpineManager;\r\n private static _toast: ToastManager;\r\n private static _alert: AlertManager;\r\n private static _modal: ModalManager;\r\n\r\n /** Signal emitted when engine is paused */\r\n public static readonly onPause = new Signal<void>();\r\n /** Signal emitted when engine is resumed */\r\n public static readonly onResume = new Signal<void>();\r\n /** Signal emitted when engine is resized */\r\n public static readonly onResize = new Signal<{ width: number; height: number; scale: number }>();\r\n /** Signal emitted when engine is updated */\r\n public static readonly onUpdate = new Signal<number>();\r\n /** Signal emitted at the end of init() after all managers are constructed */\r\n public static readonly onReady = new Signal<void>();\r\n /** Signal emitted at the start of destroy() before any teardown */\r\n public static readonly onDestroy = new Signal<void>();\r\n /** Signal emitted when browser tab visibility changes (true = visible, false = hidden) */\r\n public static readonly onVisibilityChange = new Signal<boolean>();\r\n /** Signal emitted when browser window gains/loses focus (true = focused, false = blurred) */\r\n public static readonly onFocusChange = new Signal<boolean>();\r\n /** Signal emitted when scene changes (payload: { from: previous scene name or null, to: new scene name }) */\r\n public static readonly onSceneChange = new Signal<{ from: string | null; to: string }>();\r\n\r\n /** Design resolution width (original config width) */\r\n private static _designWidth: number;\r\n /** Design resolution height (original config height) */\r\n private static _designHeight: number;\r\n /** Current scale mode */\r\n private static _scaleMode: ScaleMode;\r\n /** Current scale factor */\r\n private static _scale = 1;\r\n\r\n private static _isRunning = false;\r\n private static _resizeHandler: () => void;\r\n private static _visibilityHandler: () => void;\r\n private static _focusHandler: () => void;\r\n private static _blurHandler: () => void;\r\n private static _initialized = false;\r\n\r\n /** Logger instance for consistent logging across the engine */\r\n public static readonly logger = Logger;\r\n\r\n public static get scenes(): SceneManager { return Engine._scenes; }\r\n public static get input(): InputManager { return Engine._input; }\r\n public static get assets(): AssetManager { return Engine._assets; }\r\n public static get sound(): SoundManager { return Engine._sound; }\r\n public static get particles(): ParticleManager { return Engine._particles; }\r\n public static get tween(): TweenManager { return Engine._tween; }\r\n public static get ui(): UIManager { return Engine._ui; }\r\n public static get spine(): SpineManager { return Engine._spine; }\r\n public static get toast(): ToastManager { return Engine._toast; }\r\n public static get alert(): AlertManager { return Engine._alert; }\r\n public static get modal(): ModalManager { return Engine._modal; }\r\n\r\n public static get app(): PIXI.Application { return Engine._app; }\r\n\r\n public static get view(): PIXI.ICanvas {\r\n return Engine._app.view;\r\n }\r\n\r\n public static get stage(): PIXI.Container {\r\n return Engine._app.stage;\r\n }\r\n\r\n /** Returns design resolution dimensions (use for positioning game elements) */\r\n public static get screen(): PIXI.Rectangle {\r\n return new PIXI.Rectangle(0, 0, Engine._designWidth, Engine._designHeight);\r\n }\r\n\r\n /** Returns actual renderer/viewport dimensions */\r\n public static get viewport(): PIXI.Rectangle {\r\n return Engine._app.screen;\r\n }\r\n\r\n public static get isRunning(): boolean {\r\n return Engine._isRunning;\r\n }\r\n\r\n /** Design resolution width (original config width) */\r\n public static get designWidth(): number {\r\n return Engine._designWidth;\r\n }\r\n\r\n /** Design resolution height (original config height) */\r\n public static get designHeight(): number {\r\n return Engine._designHeight;\r\n }\r\n\r\n /** Current scale mode */\r\n public static get scaleMode(): ScaleMode {\r\n return Engine._scaleMode;\r\n }\r\n\r\n public static set scaleMode(value: ScaleMode) {\r\n Engine._scaleMode = value;\r\n }\r\n\r\n /** Get current scale factor */\r\n public static get scale(): number {\r\n return Engine._scale;\r\n }\r\n\r\n /** Initialize the Engine. Throws if already initialized. */\r\n public static init(config: EngineConfig): void {\r\n if (Engine._initialized) {\r\n throw new Error('Engine already initialized. Call destroy() first to reinitialize.');\r\n }\r\n Engine._initialized = true;\r\n\r\n // Store design resolution and scale mode\r\n Engine._designWidth = config.width;\r\n Engine._designHeight = config.height;\r\n Engine._scaleMode = config.scaleMode ?? 'letterbox';\r\n\r\n // Create PIXI Application\r\n Engine._app = new PIXI.Application({\r\n width: config.width,\r\n height: config.height,\r\n backgroundColor: config.backgroundColor ?? 0x000000,\r\n antialias: config.antialias ?? true,\r\n resolution: config.resolution ?? window.devicePixelRatio,\r\n autoDensity: config.autoDensity ?? true,\r\n });\r\n\r\n // Enable z-index sorting on stage for overlays (modals, alerts, toasts)\r\n Engine._app.stage.sortableChildren = true;\r\n\r\n // Initialize managers\r\n Engine._scenes = new SceneManager();\r\n Engine._input = new InputManager();\r\n Engine._assets = new AssetManager();\r\n Engine._sound = new SoundManager();\r\n Engine._particles = new ParticleManager();\r\n Engine._tween = new TweenManager();\r\n Engine._ui = new UIManager();\r\n Engine._spine = new SpineManager();\r\n Engine._toast = new ToastManager(Engine._app.stage);\r\n Engine._alert = new AlertManager(Engine._app.stage);\r\n Engine._modal = new ModalManager(Engine._app.stage);\r\n\r\n // Setup auto-resize listener (initial resize must be called by app after adding canvas to DOM)\r\n Engine._resizeHandler = () => Engine.resizeToWindow();\r\n if (config.autoResize !== false) {\r\n window.addEventListener('resize', Engine._resizeHandler);\r\n }\r\n\r\n // Start game loop\r\n Engine._app.ticker.add(Engine.update);\r\n Engine._isRunning = true;\r\n\r\n // Register browser visibility/focus listeners\r\n Engine._visibilityHandler = () => {\r\n Engine.onVisibilityChange.emit(!document.hidden);\r\n };\r\n Engine._focusHandler = () => Engine.onFocusChange.emit(true);\r\n Engine._blurHandler = () => Engine.onFocusChange.emit(false);\r\n\r\n document.addEventListener('visibilitychange', Engine._visibilityHandler);\r\n window.addEventListener('focus', Engine._focusHandler);\r\n window.addEventListener('blur', Engine._blurHandler);\r\n\r\n Engine.onReady.emit();\r\n }\r\n\r\n private static update(delta: number): void {\r\n Engine.onUpdate.emit(delta);\r\n\r\n // Update input (polls gamepads)\r\n Engine._input.update();\r\n\r\n // Update current scene\r\n Engine._scenes.update(delta);\r\n\r\n // Update particles\r\n Engine._particles.update(delta);\r\n\r\n // Clear per-frame input states\r\n Engine._input.postUpdate();\r\n }\r\n\r\n public static pause(): void {\r\n Engine._app.ticker.stop();\r\n Engine._isRunning = false;\r\n Engine.onPause.emit();\r\n }\r\n\r\n public static resume(): void {\r\n Engine._app.ticker.start();\r\n Engine._isRunning = true;\r\n Engine.onResume.emit();\r\n }\r\n\r\n /**\r\n * Get bounds in stage coordinates that cover the full viewport (including letterbox areas).\r\n * Use this for fullscreen overlays, backdrops, modals that need to cover the entire screen.\r\n */\r\n public static getFullscreenBounds(): { x: number; y: number; width: number; height: number } {\r\n const scale = Engine._scale || 1;\r\n const stagePos = Engine._app.stage.position;\r\n const resolution = Engine._app.renderer.resolution || 1;\r\n\r\n // Get renderer dimensions in CSS pixels\r\n const rendererWidth = Engine._app.renderer.width / resolution;\r\n const rendererHeight = Engine._app.renderer.height / resolution;\r\n\r\n // Convert to stage coordinates (inverse transform)\r\n return {\r\n x: -stagePos.x / scale,\r\n y: -stagePos.y / scale,\r\n width: rendererWidth / scale,\r\n height: rendererHeight / scale,\r\n };\r\n }\r\n\r\n /**\r\n * Resize to fit window while maintaining aspect ratio based on scaleMode\r\n */\r\n public static resizeToWindow(): void {\r\n const parent = (Engine._app.view as HTMLCanvasElement).parentElement;\r\n const windowWidth = parent?.clientWidth ?? window.innerWidth;\r\n const windowHeight = parent?.clientHeight ?? window.innerHeight;\r\n Engine.resize(windowWidth, windowHeight);\r\n }\r\n\r\n /**\r\n * Resize engine to fit target dimensions while maintaining aspect ratio\r\n */\r\n public static resize(targetWidth: number, targetHeight: number): void {\r\n if (Engine._scaleMode === 'none') {\r\n // No scaling - just resize renderer\r\n Engine._app.renderer.resize(targetWidth, targetHeight);\r\n Engine._scale = 1;\r\n Engine._app.stage.scale.set(1);\r\n Engine._app.stage.position.set(0, 0);\r\n Engine.onResize.emit({ width: targetWidth, height: targetHeight, scale: 1 });\r\n return;\r\n }\r\n\r\n const designRatio = Engine._designWidth / Engine._designHeight;\r\n const targetRatio = targetWidth / targetHeight;\r\n\r\n let scale: number;\r\n\r\n if (Engine._scaleMode === 'letterbox') {\r\n // ShowAll/Letterbox: scale uniformly to fit entirely within target, may have bars\r\n scale = targetRatio > designRatio\r\n ? targetHeight / Engine._designHeight\r\n : targetWidth / Engine._designWidth;\r\n } else {\r\n // Fill: scale to cover entire target, may crop edges\r\n scale = targetRatio > designRatio\r\n ? targetWidth / Engine._designWidth\r\n : targetHeight / Engine._designHeight;\r\n }\r\n\r\n Engine._scale = scale;\r\n\r\n // Resize renderer to target dimensions\r\n Engine._app.renderer.resize(targetWidth, targetHeight);\r\n\r\n // Scale and center the stage\r\n Engine._app.stage.scale.set(scale);\r\n Engine._app.stage.position.set(\r\n (targetWidth - Engine._designWidth * scale) / 2,\r\n (targetHeight - Engine._designHeight * scale) / 2\r\n );\r\n\r\n Engine.onResize.emit({ width: targetWidth, height: targetHeight, scale });\r\n }\r\n\r\n public static destroy(): void {\r\n if (!Engine._initialized) return;\r\n\r\n Engine.onDestroy.emit();\r\n\r\n // Remove browser event listeners\r\n document.removeEventListener('visibilitychange', Engine._visibilityHandler);\r\n window.removeEventListener('focus', Engine._focusHandler);\r\n window.removeEventListener('blur', Engine._blurHandler);\r\n\r\n window.removeEventListener('resize', Engine._resizeHandler);\r\n Engine._app.ticker.remove(Engine.update);\r\n Engine._input.destroy();\r\n Engine._scenes.destroy();\r\n Engine._sound.destroy();\r\n Engine._particles.destroy();\r\n Engine._tween.destroy();\r\n Engine._toast.destroy();\r\n Engine._alert.destroy();\r\n Engine._modal.destroy();\r\n Engine.onPause.clear();\r\n Engine.onResume.clear();\r\n Engine.onResize.clear();\r\n Engine.onReady.clear();\r\n Engine.onDestroy.clear();\r\n Engine.onVisibilityChange.clear();\r\n Engine.onFocusChange.clear();\r\n Engine.onSceneChange.clear();\r\n Engine._app.destroy(true, { children: true, texture: true });\r\n\r\n // Reset PIXI.Assets singleton so it can be re-initialized\r\n // (important for React StrictMode double-mount or hot reload)\r\n PIXI.Assets.reset();\r\n\r\n Engine._isRunning = false;\r\n Engine._initialized = false;\r\n }\r\n}\r\n","import * as PIXI from 'pixi.js';\nimport gsap from 'gsap';\nimport { BaseModal, type BaseModalConfig } from '../modal/base-modal';\n\nexport type AlertType = 'info' | 'success' | 'warning' | 'error' | 'confirm';\n\nexport interface AlertButton {\n text: string;\n value: unknown;\n primary?: boolean;\n}\n\nexport interface AlertConfig {\n title?: string;\n message: string;\n type?: AlertType;\n buttons?: AlertButton[];\n}\n\nconst ALERT_COLORS: Record<AlertType, { accent: number; icon: string }> = {\n info: { accent: 0x3b82f6, icon: 'ℹ' },\n success: { accent: 0x22c55e, icon: '✓' },\n warning: { accent: 0xf59e0b, icon: '⚠' },\n error: { accent: 0xef4444, icon: '✕' },\n confirm: { accent: 0x8b5cf6, icon: '?' },\n};\n\nconst MODAL_BG = 0x1a1a2e;\nconst TEXT_COLOR = 0xffffff;\nconst TEXT_SECONDARY = 0xaaaaaa;\nconst BUTTON_DEFAULT = 0x444466;\nconst BUTTON_HOVER = 0x555577;\n\ninterface AlertData {\n config: AlertConfig;\n resolve: (value: unknown) => void;\n}\n\n/** Alert modal that builds content in onShow */\nclass AlertModal extends BaseModal<AlertData> {\n constructor() {\n const modalConfig: BaseModalConfig = {\n width: 360,\n height: 200,\n backdrop: true,\n backdropAlpha: 0.6,\n closeOnBackdrop: false,\n closeButton: false,\n centered: true,\n animation: 'scale',\n animationDuration: 0.3,\n backgroundColor: MODAL_BG,\n borderColor: 0x333355,\n borderWidth: 2,\n borderRadius: 12,\n };\n super(modalConfig);\n }\n\n protected override onShow(data: AlertData): void {\n const { config } = data;\n const type = config.type ?? 'info';\n const colors = ALERT_COLORS[type];\n const buttons = config.buttons ?? [{ text: 'OK', value: undefined, primary: true }];\n const modalWidth = this.config.width;\n\n // Clear previous content\n this.contentContainer.removeChildren();\n\n let yPos = 24;\n\n // Icon\n const icon = new PIXI.Text(colors.icon, {\n fontFamily: 'Arial',\n fontSize: 32,\n fill: colors.accent,\n });\n icon.anchor.set(0.5);\n icon.x = modalWidth / 2;\n icon.y = yPos + 20;\n this.contentContainer.addChild(icon);\n yPos += 50;\n\n // Title\n if (config.title) {\n const title = new PIXI.Text(config.title, {\n fontFamily: 'Arial',\n fontSize: 20,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n });\n title.anchor.set(0.5, 0);\n title.x = modalWidth / 2;\n title.y = yPos;\n this.contentContainer.addChild(title);\n yPos += title.height + 12;\n }\n\n // Message\n const message = new PIXI.Text(config.message, {\n fontFamily: 'Arial',\n fontSize: 16,\n fill: TEXT_SECONDARY,\n wordWrap: true,\n wordWrapWidth: modalWidth - 48,\n align: 'center',\n });\n message.anchor.set(0.5, 0);\n message.x = modalWidth / 2;\n message.y = yPos;\n this.contentContainer.addChild(message);\n yPos += message.height + 24;\n\n // Buttons\n const buttonHeight = 40;\n const buttonSpacing = 12;\n const buttonAreaWidth = modalWidth - 48;\n const buttonWidth =\n buttons.length > 1\n ? (buttonAreaWidth - buttonSpacing * (buttons.length - 1)) / buttons.length\n : buttonAreaWidth;\n\n let buttonX = 24;\n for (const btn of buttons) {\n const buttonContainer = this.createAlertButton(\n btn.text,\n buttonWidth,\n buttonHeight,\n btn.primary ? colors.accent : BUTTON_DEFAULT,\n () => this.closeWithValue(btn.value)\n );\n buttonContainer.x = buttonX;\n buttonContainer.y = yPos;\n this.contentContainer.addChild(buttonContainer);\n buttonX += buttonWidth + buttonSpacing;\n }\n yPos += buttonHeight + 24;\n\n // Redraw background with accent and new height\n this.redrawBackgroundWithAccent(yPos, colors.accent);\n }\n\n private redrawBackgroundWithAccent(height: number, accentColor: number): void {\n const { width, backgroundColor, borderColor, borderWidth, borderRadius } = this.config;\n this.config.height = height;\n\n this.background.clear();\n if (borderWidth > 0) {\n this.background.lineStyle(borderWidth, borderColor);\n }\n this.background.beginFill(backgroundColor);\n this.background.drawRoundedRect(0, 0, width, height, borderRadius);\n this.background.endFill();\n\n // Accent bar at top\n this.background.beginFill(accentColor);\n this.background.drawRoundedRect(0, 0, width, 16, borderRadius);\n this.background.endFill();\n this.background.beginFill(backgroundColor);\n this.background.drawRect(0, 4, width, 12);\n this.background.endFill();\n\n // Re-center\n this.modalContainer.x = (this.screenWidth - width) / 2;\n this.modalContainer.y = (this.screenHeight - height) / 2;\n }\n\n private createAlertButton(\n text: string,\n width: number,\n height: number,\n color: number,\n onClick: () => void\n ): PIXI.Container {\n const container = new PIXI.Container();\n const bg = new PIXI.Graphics();\n bg.beginFill(color);\n bg.drawRoundedRect(0, 0, width, height, 6);\n bg.endFill();\n\n const label = new PIXI.Text(text, {\n fontFamily: 'Arial',\n fontSize: 14,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n });\n label.anchor.set(0.5);\n label.x = width / 2;\n label.y = height / 2;\n\n container.addChild(bg, label);\n container.eventMode = 'static';\n container.cursor = 'pointer';\n\n container.on('pointerover', () => {\n gsap.to(bg, { pixi: { tint: BUTTON_HOVER }, duration: 0.15 });\n });\n container.on('pointerout', () => {\n gsap.to(bg, { pixi: { tint: 0xffffff }, duration: 0.15 });\n });\n container.on('pointerdown', onClick);\n\n return container;\n }\n\n private closeWithValue(value: unknown): void {\n const resolve = this.data?.resolve;\n this.hide().then(() => resolve?.(value));\n }\n\n public forceResolve(value: unknown): void {\n this.data?.resolve?.(value);\n }\n}\n\nexport class AlertManager {\n private layer: PIXI.Container;\n private modal: AlertModal;\n private queue: Array<{ config: AlertConfig; resolve: (value: unknown) => void }> = [];\n private isShowing = false;\n\n constructor(stage: PIXI.Container) {\n this.layer = new PIXI.Container();\n this.layer.sortableChildren = true;\n this.layer.zIndex = 10000;\n stage.addChild(this.layer);\n\n // Single reusable modal instance\n this.modal = new AlertModal();\n this.layer.addChild(this.modal);\n }\n\n public info(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'info' }) as Promise<void>;\n }\n\n public success(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'success' }) as Promise<void>;\n }\n\n public warning(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'warning' }) as Promise<void>;\n }\n\n public error(message: string, title?: string): Promise<void> {\n return this.showAlert({ message, title, type: 'error' }) as Promise<void>;\n }\n\n public confirm(message: string, title?: string): Promise<boolean> {\n return this.showAlert({\n message,\n title: title ?? 'Confirm',\n type: 'confirm',\n buttons: [\n { text: 'Cancel', value: false },\n { text: 'OK', value: true, primary: true },\n ],\n }) as Promise<boolean>;\n }\n\n public custom<T>(config: AlertConfig): Promise<T> {\n return this.showAlert(config) as Promise<T>;\n }\n\n private showAlert(config: AlertConfig): Promise<unknown> {\n return new Promise((resolve) => {\n if (this.isShowing) {\n this.queue.push({ config, resolve });\n return;\n }\n this.displayAlert(config, resolve);\n });\n }\n\n private displayAlert(config: AlertConfig, resolve: (value: unknown) => void): void {\n this.isShowing = true;\n\n const wrappedResolve = (value: unknown) => {\n this.isShowing = false;\n resolve(value);\n\n // Process queue\n if (this.queue.length > 0) {\n const next = this.queue.shift()!;\n this.displayAlert(next.config, next.resolve);\n }\n };\n\n this.modal.show({ config, resolve: wrappedResolve });\n }\n\n public destroy(): void {\n if (this.isShowing) {\n this.modal.forceResolve(undefined);\n }\n this.queue = [];\n this.layer.destroy();\n }\n}\n","import * as PIXI from 'pixi.js';\nimport gsap from 'gsap';\nimport { Engine } from '../../core/engine';\nimport { Signal } from '../../core/signal';\n\nexport type ModalAnimation = 'fade' | 'scale' | 'slide' | 'none';\nexport type CloseButtonPosition = 'top-right' | 'top-left';\n\nexport interface BaseModalConfig {\n /** Modal width in pixels */\n width?: number;\n /** Modal height in pixels */\n height?: number;\n /** Show backdrop behind modal */\n backdrop?: boolean;\n /** Backdrop opacity (0-1) */\n backdropAlpha?: number;\n /** Close modal when clicking backdrop */\n closeOnBackdrop?: boolean;\n /** Show close button */\n closeButton?: boolean;\n /** Close button position */\n closeButtonPosition?: CloseButtonPosition;\n /** Enable dragging the modal */\n draggable?: boolean;\n /** Center modal on screen */\n centered?: boolean;\n /** Animation type */\n animation?: ModalAnimation;\n /** Animation duration in seconds */\n animationDuration?: number;\n /** Background color */\n backgroundColor?: number;\n /** Border color */\n borderColor?: number;\n /** Border width */\n borderWidth?: number;\n /** Border radius */\n borderRadius?: number;\n}\n\nexport interface ModalButtonConfig {\n text: string;\n width?: number;\n height?: number;\n backgroundColor?: number;\n hoverColor?: number;\n textColor?: number;\n fontSize?: number;\n borderRadius?: number;\n onClick?: () => void;\n}\n\nconst DEFAULT_CONFIG: Required<BaseModalConfig> = {\n width: 400,\n height: 300,\n backdrop: true,\n backdropAlpha: 0.6,\n closeOnBackdrop: true,\n closeButton: true,\n closeButtonPosition: 'top-right',\n draggable: false,\n centered: true,\n animation: 'scale',\n animationDuration: 0.3,\n backgroundColor: 0x1a1a2e,\n borderColor: 0x333355,\n borderWidth: 2,\n borderRadius: 12,\n};\n\nconst CLOSE_BTN_SIZE = 28;\nconst CLOSE_BTN_MARGIN = 8;\nconst TEXT_COLOR = 0xffffff;\n\n/**\n * Base modal class providing backdrop, close button, animations, and dragging.\n * Extend this class and build your content in onShow or constructor.\n * Uses Engine static class for screen dimensions - no need to pass them.\n */\nexport class BaseModal<TData = void> extends PIXI.Container {\n protected backdrop!: PIXI.Graphics;\n protected modalContainer!: PIXI.Container;\n protected background!: PIXI.Graphics;\n protected closeBtn: PIXI.Container | null = null;\n protected contentContainer!: PIXI.Container;\n protected config: Required<BaseModalConfig>;\n protected data!: TData;\n\n private isDragging = false;\n private dragOffset = { x: 0, y: 0 };\n private _isVisible = false;\n private resizeBinding: { detach: () => void } | null = null;\n\n /** Signal emitted when modal finishes hiding */\n public readonly didHide = new Signal<void>();\n /** Signal emitted when modal is shown (with data) */\n public readonly didShow = new Signal<TData>();\n\n /** Get screen width from Engine */\n protected get screenWidth(): number {\n return Engine.screen.width;\n }\n\n /** Get screen height from Engine */\n protected get screenHeight(): number {\n return Engine.screen.height;\n }\n\n constructor(config?: BaseModalConfig) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.setup();\n\n // Auto-resize when game resizes\n this.resizeBinding = Engine.onResize.add(() => {\n this.drawBackdrop();\n if (this.config.centered) {\n this.centerModal();\n }\n });\n }\n\n private setup(): void {\n // Create backdrop\n this.backdrop = new PIXI.Graphics();\n this.drawBackdrop();\n this.backdrop.eventMode = 'static';\n if (this.config.closeOnBackdrop) {\n this.backdrop.on('pointerdown', () => this.hide());\n }\n this.addChild(this.backdrop);\n\n // Create modal container (for dragging and positioning)\n this.modalContainer = new PIXI.Container();\n this.addChild(this.modalContainer);\n\n // Create background\n this.background = new PIXI.Graphics();\n this.drawBackground();\n this.background.eventMode = 'static'; // Block clicks through\n this.modalContainer.addChild(this.background);\n\n // Create content container for subclass to use\n this.contentContainer = new PIXI.Container();\n this.modalContainer.addChild(this.contentContainer);\n\n // Create close button\n if (this.config.closeButton) {\n this.createCloseButton();\n }\n\n // Setup draggable\n if (this.config.draggable) {\n this.setupDraggable();\n }\n\n // Center modal\n if (this.config.centered) {\n this.centerModal();\n }\n\n // Start hidden\n this.visible = false;\n this.alpha = 0;\n }\n\n /** Show the modal with animation */\n public async show(data?: TData): Promise<void> {\n if (this._isVisible) return;\n\n if (data !== undefined) {\n this.data = data;\n }\n\n this._isVisible = true;\n this.visible = true;\n this.onShow(this.data);\n await this.animateIn();\n this.didShow.emit(this.data);\n }\n\n /** Hide the modal with animation */\n public async hide(): Promise<void> {\n if (!this._isVisible) return;\n this._isVisible = false;\n await this.animateOut();\n this.visible = false;\n this.onHide();\n this.didHide.emit();\n }\n\n /** Called when modal is shown. Override to build content. */\n protected onShow(_data: TData): void {}\n\n /** Called when modal is hidden. Override to cleanup. */\n protected onHide(): void {}\n\n /** Check if modal is currently visible */\n public get isModalVisible(): boolean {\n return this._isVisible;\n }\n\n /** Redraw background with new dimensions */\n protected redrawBackground(width?: number, height?: number): void {\n if (width !== undefined) this.config.width = width;\n if (height !== undefined) this.config.height = height;\n this.drawBackground();\n if (this.config.centered) {\n this.centerModal();\n }\n // Reposition close button\n if (this.closeBtn) {\n if (this.config.closeButtonPosition === 'top-right') {\n this.closeBtn.x = this.config.width - CLOSE_BTN_SIZE - CLOSE_BTN_MARGIN;\n }\n }\n }\n\n /** Utility: Create a styled title text */\n protected createTitle(text: string, style?: Partial<PIXI.ITextStyle>): PIXI.Text {\n return new PIXI.Text(text, {\n fontFamily: 'Arial',\n fontSize: 24,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n ...style,\n });\n }\n\n /** Utility: Create a styled button */\n protected createButton(btnConfig: ModalButtonConfig): PIXI.Container {\n const {\n text,\n width = 120,\n height = 40,\n backgroundColor = 0x444466,\n hoverColor = 0x555577,\n textColor = TEXT_COLOR,\n fontSize = 14,\n borderRadius = 6,\n onClick,\n } = btnConfig;\n\n const container = new PIXI.Container();\n const bg = new PIXI.Graphics();\n bg.beginFill(backgroundColor);\n bg.drawRoundedRect(0, 0, width, height, borderRadius);\n bg.endFill();\n\n const label = new PIXI.Text(text, {\n fontFamily: 'Arial',\n fontSize,\n fontWeight: 'bold',\n fill: textColor,\n });\n label.anchor.set(0.5);\n label.x = width / 2;\n label.y = height / 2;\n\n container.addChild(bg, label);\n container.eventMode = 'static';\n container.cursor = 'pointer';\n\n container.on('pointerover', () => {\n gsap.to(bg, { pixi: { tint: hoverColor }, duration: 0.15 });\n });\n container.on('pointerout', () => {\n gsap.to(bg, { pixi: { tint: 0xffffff }, duration: 0.15 });\n });\n if (onClick) {\n container.on('pointerdown', onClick);\n }\n\n return container;\n }\n\n private drawBackdrop(): void {\n this.backdrop.clear();\n if (this.config.backdrop) {\n // Use fullscreen bounds to cover entire viewport including letterbox areas\n const bounds = Engine.getFullscreenBounds();\n this.backdrop.beginFill(0x000000, this.config.backdropAlpha);\n this.backdrop.drawRect(bounds.x, bounds.y, bounds.width, bounds.height);\n this.backdrop.endFill();\n }\n }\n\n private drawBackground(): void {\n const { width, height, backgroundColor, borderColor, borderWidth, borderRadius } =\n this.config;\n\n this.background.clear();\n if (borderWidth > 0) {\n this.background.lineStyle(borderWidth, borderColor);\n }\n this.background.beginFill(backgroundColor);\n this.background.drawRoundedRect(0, 0, width, height, borderRadius);\n this.background.endFill();\n }\n\n private createCloseButton(): void {\n this.closeBtn = new PIXI.Container();\n\n const bg = new PIXI.Graphics();\n bg.beginFill(0xef4444);\n bg.drawRoundedRect(0, 0, CLOSE_BTN_SIZE, CLOSE_BTN_SIZE, 6);\n bg.endFill();\n\n const xText = new PIXI.Text('✕', {\n fontFamily: 'Arial',\n fontSize: 16,\n fontWeight: 'bold',\n fill: TEXT_COLOR,\n });\n xText.anchor.set(0.5);\n xText.x = CLOSE_BTN_SIZE / 2;\n xText.y = CLOSE_BTN_SIZE / 2;\n\n this.closeBtn.addChild(bg, xText);\n\n if (this.config.closeButtonPosition === 'top-right') {\n this.closeBtn.x = this.config.width - CLOSE_BTN_SIZE - CLOSE_BTN_MARGIN;\n this.closeBtn.y = CLOSE_BTN_MARGIN;\n } else {\n this.closeBtn.x = CLOSE_BTN_MARGIN;\n this.closeBtn.y = CLOSE_BTN_MARGIN;\n }\n\n this.closeBtn.eventMode = 'static';\n this.closeBtn.cursor = 'pointer';\n\n this.closeBtn.on('pointerover', () => {\n gsap.to(bg, { pixi: { tint: 0xff6666 }, duration: 0.15 });\n });\n this.closeBtn.on('pointerout', () => {\n gsap.to(bg, { pixi: { tint: 0xffffff }, duration: 0.15 });\n });\n this.closeBtn.on('pointerdown', () => this.hide());\n\n this.modalContainer.addChild(this.closeBtn);\n }\n\n private setupDraggable(): void {\n this.background.cursor = 'move';\n\n this.background.on('pointerdown', (e: PIXI.FederatedPointerEvent) => {\n this.isDragging = true;\n this.dragOffset.x = e.global.x - this.modalContainer.x;\n this.dragOffset.y = e.global.y - this.modalContainer.y;\n });\n\n this.background.on('globalpointermove', (e: PIXI.FederatedPointerEvent) => {\n if (!this.isDragging) return;\n let newX = e.global.x - this.dragOffset.x;\n let newY = e.global.y - this.dragOffset.y;\n newX = Math.max(0, Math.min(newX, this.screenWidth - this.config.width));\n newY = Math.max(0, Math.min(newY, this.screenHeight - this.config.height));\n this.modalContainer.x = newX;\n this.modalContainer.y = newY;\n });\n\n this.background.on('pointerup', () => (this.isDragging = false));\n this.background.on('pointerupoutside', () => (this.isDragging = false));\n }\n\n private centerModal(): void {\n this.modalContainer.x = (this.screenWidth - this.config.width) / 2;\n this.modalContainer.y = (this.screenHeight - this.config.height) / 2;\n }\n\n private async animateIn(): Promise<void> {\n const { animation, animationDuration } = this.config;\n\n if (animation === 'none') {\n this.alpha = 1;\n this.modalContainer.scale.set(1);\n return;\n }\n\n this.backdrop.alpha = 0;\n gsap.to(this.backdrop, { alpha: 1, duration: animationDuration * 0.7 });\n\n return new Promise((resolve) => {\n if (animation === 'fade') {\n this.modalContainer.alpha = 0;\n this.modalContainer.scale.set(1);\n this.alpha = 1;\n gsap.to(this.modalContainer, {\n alpha: 1,\n duration: animationDuration,\n ease: 'power2.out',\n onComplete: resolve,\n });\n } else if (animation === 'scale') {\n this.modalContainer.alpha = 0;\n this.modalContainer.scale.set(0.9);\n this.alpha = 1;\n gsap.to(this.modalContainer, {\n alpha: 1,\n pixi: { scale: 1 },\n duration: animationDuration,\n ease: 'back.out(1.5)',\n onComplete: resolve,\n });\n } else if (animation === 'slide') {\n const startY = this.modalContainer.y - 50;\n this.modalContainer.alpha = 0;\n this.modalContainer.y = startY;\n this.modalContainer.scale.set(1);\n this.alpha = 1;\n const targetY = (this.screenHeight - this.config.height) / 2;\n gsap.to(this.modalContainer, {\n alpha: 1,\n y: targetY,\n duration: animationDuration,\n ease: 'power2.out',\n onComplete: resolve,\n });\n } else {\n this.alpha = 1;\n resolve();\n }\n });\n }\n\n private async animateOut(): Promise<void> {\n const { animation, animationDuration } = this.config;\n\n if (animation === 'none') {\n this.alpha = 0;\n return;\n }\n\n gsap.to(this.backdrop, { alpha: 0, duration: animationDuration * 0.7 });\n\n return new Promise((resolve) => {\n if (animation === 'fade') {\n gsap.to(this.modalContainer, {\n alpha: 0,\n duration: animationDuration * 0.7,\n ease: 'power2.in',\n onComplete: resolve,\n });\n } else if (animation === 'scale') {\n gsap.to(this.modalContainer, {\n alpha: 0,\n pixi: { scale: 0.9 },\n duration: animationDuration * 0.7,\n ease: 'power2.in',\n onComplete: resolve,\n });\n } else if (animation === 'slide') {\n gsap.to(this.modalContainer, {\n alpha: 0,\n y: this.modalContainer.y - 50,\n duration: animationDuration * 0.7,\n ease: 'power2.in',\n onComplete: resolve,\n });\n } else {\n this.alpha = 0;\n resolve();\n }\n });\n }\n\n public destroy(options?: PIXI.IDestroyOptions | boolean): void {\n this.resizeBinding?.detach();\n this.resizeBinding = null;\n gsap.killTweensOf(this.backdrop);\n gsap.killTweensOf(this.modalContainer);\n this.didHide.clear();\n this.didShow.clear();\n super.destroy(options);\n }\n}\n","type Listener<T> = (value: T) => void;\n\n/**\n * Represents a binding to a signal that can be detached.\n */\nexport interface SignalBinding {\n /** Detach this binding from the signal. Returns true if was attached. */\n detach(): boolean;\n /** Alias for detach(). Useful for dispose patterns. */\n dispose(): void;\n}\n\ninterface BindingEntry<T> {\n fn: Listener<T>;\n thisArg: unknown;\n once: boolean;\n}\n\n/**\n * Lightweight typed signal for pub/sub pattern.\n *\n * @example\n * ```ts\n * const signal = new Signal<number>();\n *\n * // Basic usage\n * const binding = signal.add((value) => console.log(value));\n * signal.emit(42);\n * binding.detach();\n *\n * // With thisArg for class methods\n * signal.add(this.onValueChange, this);\n *\n * // One-time listener\n * signal.once((value) => console.log('First emit only:', value));\n * ```\n */\nexport class Signal<T = void> {\n private bindings: Set<BindingEntry<T>> = new Set();\n\n /**\n * Add listener. Returns a SignalBinding to detach later.\n * @param listener The callback function\n * @param thisArg Optional `this` context for the listener\n */\n add(listener: Listener<T>, thisArg?: unknown): SignalBinding {\n const entry: BindingEntry<T> = { fn: listener, thisArg, once: false };\n this.bindings.add(entry);\n return this.createBinding(entry);\n }\n\n /**\n * Add one-time listener that auto-detaches after first emit.\n * @param listener The callback function\n * @param thisArg Optional `this` context for the listener\n */\n once(listener: Listener<T>, thisArg?: unknown): SignalBinding {\n const entry: BindingEntry<T> = { fn: listener, thisArg, once: true };\n this.bindings.add(entry);\n return this.createBinding(entry);\n }\n\n /**\n * Remove a specific listener function.\n * Note: If same function added multiple times with different thisArg,\n * this removes the first match.\n */\n remove(listener: Listener<T>): void {\n for (const entry of this.bindings) {\n if (entry.fn === listener) {\n this.bindings.delete(entry);\n return;\n }\n }\n }\n\n /** Emit value to all listeners */\n emit(value: T): void {\n for (const entry of this.bindings) {\n if (entry.once) {\n this.bindings.delete(entry);\n }\n entry.fn.call(entry.thisArg, value);\n }\n }\n\n /** Remove all listeners */\n clear(): void {\n this.bindings.clear();\n }\n\n /** Check if has any listeners */\n get hasListeners(): boolean {\n return this.bindings.size > 0;\n }\n\n private createBinding(entry: BindingEntry<T>): SignalBinding {\n return {\n detach: () => this.bindings.delete(entry),\n dispose: () => {\n this.bindings.delete(entry);\n },\n };\n }\n}\n","import * as PIXI from 'pixi.js';\nimport { Logger } from '../utils/logger';\nimport type { AssetManifest, ProgressCallback } from './types';\n\nexport class AssetManager {\n private initialized = false;\n\n /** Initialize assets with a manifest */\n public async init(options: { manifest: string | AssetManifest }): Promise<void> {\n if (this.initialized) {\n Logger.warn('AssetManager', 'Already initialized');\n return;\n }\n\n await PIXI.Assets.init(options);\n this.initialized = true;\n }\n\n /** Load a bundle by name with optional progress callback */\n public async loadBundle(name: string, onProgress?: ProgressCallback): Promise<void> {\n await PIXI.Assets.loadBundle(name, onProgress);\n }\n\n /** Load multiple bundles */\n public async loadBundles(names: string[], onProgress?: ProgressCallback): Promise<void> {\n await PIXI.Assets.loadBundle(names, onProgress);\n }\n\n /** Background load a bundle (non-blocking) */\n public backgroundLoadBundle(name: string): void {\n PIXI.Assets.backgroundLoadBundle(name);\n }\n\n /** Load a single asset by alias */\n public async load<T>(alias: string): Promise<T> {\n return (await PIXI.Assets.load(alias)) as T;\n }\n\n /** Get a loaded asset by alias */\n public get<T>(alias: string): T {\n return PIXI.Assets.get(alias) as T;\n }\n\n /** Check if an asset is loaded */\n public has(alias: string): boolean {\n return PIXI.Assets.cache.has(alias);\n }\n\n /** Unload an asset */\n public async unload(alias: string): Promise<void> {\n await PIXI.Assets.unload(alias);\n }\n\n /** Unload a bundle */\n public async unloadBundle(name: string): Promise<void> {\n await PIXI.Assets.unloadBundle(name);\n }\n\n /** Add an asset to the resolver */\n public add(alias: string, src: string): void {\n PIXI.Assets.add({ alias, src });\n }\n\n /** Get the underlying PIXI.Assets instance */\n public get assets(): typeof PIXI.Assets {\n return PIXI.Assets;\n }\n}\n","/**\n * Logger - Static logging utility with levels and namespaces\n *\n * Usage:\n * Logger.info('GameManager', 'Started');\n * Logger.warn('API', 'Timeout', { retry: 2 });\n * Logger.setLevel('warn'); // Only warn and error\n * Logger.disable(); // Disable all\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\nconst LEVEL_STYLES: Record<Exclude<LogLevel, 'none'>, string> = {\n debug: 'color: #888',\n info: 'color: #4a9eff',\n warn: 'color: #ffa500',\n error: 'color: #ff4444; font-weight: bold',\n};\n\nexport class LoggerClass {\n private level: LogLevel = 'debug';\n private enabled = true;\n\n /** Set minimum log level */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /** Get current log level */\n getLevel(): LogLevel {\n return this.level;\n }\n\n /** Enable logging */\n enable(): void {\n this.enabled = true;\n }\n\n /** Disable all logging */\n disable(): void {\n this.enabled = false;\n }\n\n /** Check if logging is enabled */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /** Debug level log */\n debug(namespace: string, message: string, ...args: unknown[]): void {\n this.log('debug', namespace, message, args);\n }\n\n /** Info level log */\n info(namespace: string, message: string, ...args: unknown[]): void {\n this.log('info', namespace, message, args);\n }\n\n /** Warning level log */\n warn(namespace: string, message: string, ...args: unknown[]): void {\n this.log('warn', namespace, message, args);\n }\n\n /** Error level log */\n error(namespace: string, message: string, ...args: unknown[]): void {\n this.log('error', namespace, message, args);\n }\n\n private log(level: Exclude<LogLevel, 'none'>, namespace: string, message: string, args: unknown[]): void {\n if (!this.enabled) return;\n if (LEVEL_PRIORITY[level] < LEVEL_PRIORITY[this.level]) return;\n\n const prefix = `[${namespace}]`;\n const style = LEVEL_STYLES[level];\n\n if (args.length > 0) {\n console[level](`%c${prefix} ${message}`, style, ...args);\n } else {\n console[level](`%c${prefix} ${message}`, style);\n }\n }\n}\n\n/** Global logger instance */\nexport const Logger = new LoggerClass();\n","import { Logger } from '../utils/logger';\n\nexport interface GamepadState {\n connected: boolean;\n buttons: boolean[];\n axes: number[];\n}\n\nexport class GamepadManager {\n private gamepads: Map<number, Gamepad> = new Map();\n private prevButtons: Map<number, boolean[]> = new Map();\n\n constructor() {\n this.onGamepadConnected = this.onGamepadConnected.bind(this);\n this.onGamepadDisconnected = this.onGamepadDisconnected.bind(this);\n\n window.addEventListener('gamepadconnected', this.onGamepadConnected);\n window.addEventListener('gamepaddisconnected', this.onGamepadDisconnected);\n }\n\n private onGamepadConnected(event: GamepadEvent): void {\n this.gamepads.set(event.gamepad.index, event.gamepad);\n Logger.info('Gamepad', `Connected: ${event.gamepad.id}`);\n }\n\n private onGamepadDisconnected(event: GamepadEvent): void {\n this.gamepads.delete(event.gamepad.index);\n this.prevButtons.delete(event.gamepad.index);\n Logger.info('Gamepad', `Disconnected: ${event.gamepad.id}`);\n }\n\n /** Update gamepad state (call once per frame) */\n public update(): void {\n // Get fresh gamepad state\n const gamepads = navigator.getGamepads();\n for (const gamepad of gamepads) {\n if (gamepad) {\n this.gamepads.set(gamepad.index, gamepad);\n }\n }\n }\n\n /** Get gamepad by index (0-3) */\n public get(index: number): Gamepad | null {\n return this.gamepads.get(index) ?? null;\n }\n\n /** Check if a gamepad is connected */\n public isConnected(index: number): boolean {\n return this.gamepads.has(index);\n }\n\n /** Check if a button is pressed on gamepad */\n public isButtonDown(index: number, button: number): boolean {\n const gamepad = this.gamepads.get(index);\n if (!gamepad || button >= gamepad.buttons.length) return false;\n return gamepad.buttons[button].pressed;\n }\n\n /** Get axis value (-1 to 1) */\n public getAxis(index: number, axis: number): number {\n const gamepad = this.gamepads.get(index);\n if (!gamepad || axis >= gamepad.axes.length) return 0;\n return gamepad.axes[axis];\n }\n\n /** Get left stick as normalized vector */\n public getLeftStick(index: number): { x: number; y: number } {\n return {\n x: this.getAxis(index, 0),\n y: this.getAxis(index, 1),\n };\n }\n\n /** Get right stick as normalized vector */\n public getRightStick(index: number): { x: number; y: number } {\n return {\n x: this.getAxis(index, 2),\n y: this.getAxis(index, 3),\n };\n }\n\n /** Get number of connected gamepads */\n public get count(): number {\n return this.gamepads.size;\n }\n\n /** Clean up event listeners */\n public destroy(): void {\n window.removeEventListener('gamepadconnected', this.onGamepadConnected);\n window.removeEventListener('gamepaddisconnected', this.onGamepadDisconnected);\n this.gamepads.clear();\n this.prevButtons.clear();\n }\n}\n","export class KeyboardManager {\n private keysDown: Set<string> = new Set();\n private keysPressed: Set<string> = new Set();\n private keysReleased: Set<string> = new Set();\n\n constructor() {\n this.onKeyDown = this.onKeyDown.bind(this);\n this.onKeyUp = this.onKeyUp.bind(this);\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n if (!this.keysDown.has(event.code)) {\n this.keysPressed.add(event.code);\n }\n this.keysDown.add(event.code);\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keysDown.delete(event.code);\n this.keysReleased.add(event.code);\n }\n\n /** Update keyboard state (call once per frame) */\n public update(): void {\n this.keysPressed.clear();\n this.keysReleased.clear();\n }\n\n /** Check if a key is currently held down */\n public isDown(key: string): boolean {\n return this.keysDown.has(key);\n }\n\n /** Check if a key was just pressed this frame */\n public justPressed(key: string): boolean {\n return this.keysPressed.has(key);\n }\n\n /** Check if a key was just released this frame */\n public justReleased(key: string): boolean {\n return this.keysReleased.has(key);\n }\n\n /** Check if any of the given keys are down */\n public anyDown(keys: string[]): boolean {\n return keys.some((key) => this.keysDown.has(key));\n }\n\n /** Get all currently pressed keys */\n public getDownKeys(): string[] {\n return Array.from(this.keysDown);\n }\n\n /** Clean up event listeners */\n public destroy(): void {\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n this.keysDown.clear();\n this.keysPressed.clear();\n this.keysReleased.clear();\n }\n}\n","import { Engine } from '../core/engine';\n\nexport interface PointerState {\n x: number;\n y: number;\n isDown: boolean;\n button: number;\n}\n\nexport class PointerManager {\n private _x = 0;\n private _y = 0;\n private _isDown = false;\n private _justPressed = false;\n private _justReleased = false;\n private _button = 0;\n\n constructor() {\n this.onPointerMove = this.onPointerMove.bind(this);\n this.onPointerDown = this.onPointerDown.bind(this);\n this.onPointerUp = this.onPointerUp.bind(this);\n\n const view = Engine.view as HTMLCanvasElement;\n view.addEventListener('pointermove', this.onPointerMove);\n view.addEventListener('pointerdown', this.onPointerDown);\n view.addEventListener('pointerup', this.onPointerUp);\n view.addEventListener('pointerleave', this.onPointerUp);\n }\n\n private getCanvasCoords(event: PointerEvent): { x: number; y: number } {\n const view = Engine.view as HTMLCanvasElement;\n const rect = view.getBoundingClientRect();\n const scaleX = Engine.screen.width / rect.width;\n const scaleY = Engine.screen.height / rect.height;\n\n return {\n x: (event.clientX - rect.left) * scaleX,\n y: (event.clientY - rect.top) * scaleY,\n };\n }\n\n private onPointerMove(event: PointerEvent): void {\n const coords = this.getCanvasCoords(event);\n this._x = coords.x;\n this._y = coords.y;\n }\n\n private onPointerDown(event: PointerEvent): void {\n const coords = this.getCanvasCoords(event);\n this._x = coords.x;\n this._y = coords.y;\n this._isDown = true;\n this._justPressed = true;\n this._button = event.button;\n }\n\n private onPointerUp(_event: PointerEvent): void {\n this._isDown = false;\n this._justReleased = true;\n }\n\n /** Update pointer state (call once per frame) */\n public update(): void {\n this._justPressed = false;\n this._justReleased = false;\n }\n\n /** Pointer X position in game coordinates */\n public get x(): number {\n return this._x;\n }\n\n /** Pointer Y position in game coordinates */\n public get y(): number {\n return this._y;\n }\n\n /** Check if pointer is currently down */\n public get isDown(): boolean {\n return this._isDown;\n }\n\n /** Check if pointer was just pressed this frame */\n public get justPressed(): boolean {\n return this._justPressed;\n }\n\n /** Check if pointer was just released this frame */\n public get justReleased(): boolean {\n return this._justReleased;\n }\n\n /** Get current mouse button (0=left, 1=middle, 2=right) */\n public get button(): number {\n return this._button;\n }\n\n /** Get pointer position as object */\n public get position(): { x: number; y: number } {\n return { x: this._x, y: this._y };\n }\n\n /** Clean up event listeners */\n public destroy(): void {\n const view = Engine.view as HTMLCanvasElement;\n view.removeEventListener('pointermove', this.onPointerMove);\n view.removeEventListener('pointerdown', this.onPointerDown);\n view.removeEventListener('pointerup', this.onPointerUp);\n view.removeEventListener('pointerleave', this.onPointerUp);\n }\n}\n","import { GamepadManager } from './gamepad';\nimport { KeyboardManager } from './keyboard';\nimport { PointerManager } from './pointer';\n\nexport class InputManager {\n public readonly keyboard: KeyboardManager;\n public readonly pointer: PointerManager;\n public readonly gamepad: GamepadManager;\n\n constructor() {\n this.keyboard = new KeyboardManager();\n this.pointer = new PointerManager();\n this.gamepad = new GamepadManager();\n }\n\n /** Update all input managers (call once per frame at start) */\n public update(): void {\n this.gamepad.update();\n // Note: keyboard and pointer update at end of frame\n }\n\n /** Post-update to clear per-frame states */\n public postUpdate(): void {\n this.keyboard.update();\n this.pointer.update();\n }\n\n /** Clean up all input managers */\n public destroy(): void {\n this.keyboard.destroy();\n this.pointer.destroy();\n this.gamepad.destroy();\n }\n}\n","import * as PIXI from 'pixi.js';\nimport type { BaseModal } from './base-modal';\n\nconst BASE_Z_INDEX = 10000;\nconst Z_INDEX_INCREMENT = 100;\n\nexport class ModalManager {\n private stack: BaseModal[] = [];\n private layer: PIXI.Container;\n private escapeHandler: ((e: KeyboardEvent) => void) | null = null;\n\n constructor(stage: PIXI.Container) {\n // Create modal layer on top of everything\n this.layer = new PIXI.Container();\n this.layer.sortableChildren = true;\n this.layer.zIndex = BASE_Z_INDEX;\n stage.addChild(this.layer);\n\n // Setup ESC key handler\n this.setupEscapeHandler();\n }\n\n /** Show a modal (adds to stack) */\n public show<T extends BaseModal>(modal: T): T {\n // Add to stack\n this.stack.push(modal);\n\n // Set z-index based on stack position\n modal.zIndex = this.stack.length * Z_INDEX_INCREMENT;\n\n // Add to layer\n this.layer.addChild(modal);\n\n // Show with animation\n modal.show();\n\n // Track when modal hides itself\n modal.didHide.add(() => this.removeFromStack(modal));\n\n return modal;\n }\n\n /** Hide a specific modal */\n public hide(modal: BaseModal): void {\n if (!this.stack.includes(modal)) return;\n modal.hide();\n }\n\n /** Hide the top modal */\n public hideTop(): void {\n const top = this.stack[this.stack.length - 1];\n if (top) {\n top.hide();\n }\n }\n\n /** Hide all modals */\n public async hideAll(): Promise<void> {\n const modals = [...this.stack];\n await Promise.all(modals.map((modal) => modal.hide()));\n }\n\n /** Get current modal stack (read-only) */\n public getStack(): readonly BaseModal[] {\n return this.stack;\n }\n\n /** Check if any modal is open */\n public get isOpen(): boolean {\n return this.stack.length > 0;\n }\n\n /** Get the topmost modal */\n public getTop(): BaseModal | undefined {\n return this.stack[this.stack.length - 1];\n }\n\n private removeFromStack(modal: BaseModal): void {\n const index = this.stack.indexOf(modal);\n if (index !== -1) {\n this.stack.splice(index, 1);\n this.layer.removeChild(modal);\n }\n }\n\n private setupEscapeHandler(): void {\n this.escapeHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && this.isOpen) {\n e.preventDefault();\n this.hideTop();\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('keydown', this.escapeHandler);\n }\n }\n\n public destroy(): void {\n // Remove escape handler\n if (this.escapeHandler && typeof window !== 'undefined') {\n window.removeEventListener('keydown', this.escapeHandler);\n this.escapeHandler = null;\n }\n\n // Hide all modals\n for (const modal of this.stack) {\n modal.destroy();\n }\n this.stack = [];\n\n // Remove layer\n this.layer.destroy();\n }\n}\n","import { Emitter, type EmitterConfigV3 } from '@pixi/particle-emitter';\nimport * as PIXI from 'pixi.js';\n\nexport interface ParticleConfig extends Partial<EmitterConfigV3> {\n textures: string[];\n}\n\nexport class ParticleManager {\n private emitters: Set<Emitter> = new Set();\n\n /** Create a particle emitter */\n public create(container: PIXI.Container, config: ParticleConfig): Emitter {\n // Convert texture aliases to PIXI textures\n const textures = config.textures.map((alias) => PIXI.Assets.get<PIXI.Texture>(alias));\n\n const emitterConfig: EmitterConfigV3 = {\n lifetime: config.lifetime ?? { min: 0.5, max: 1 },\n frequency: config.frequency ?? 0.01,\n emitterLifetime: config.emitterLifetime ?? -1,\n maxParticles: config.maxParticles ?? 100,\n addAtBack: config.addAtBack ?? false,\n pos: config.pos ?? { x: 0, y: 0 },\n behaviors: config.behaviors ?? [\n {\n type: 'alpha',\n config: {\n alpha: {\n list: [\n { time: 0, value: 1 },\n { time: 1, value: 0 },\n ],\n },\n },\n },\n {\n type: 'scale',\n config: {\n scale: {\n list: [\n { time: 0, value: 1 },\n { time: 1, value: 0.5 },\n ],\n },\n },\n },\n {\n type: 'moveSpeed',\n config: {\n speed: {\n list: [\n { time: 0, value: 200 },\n { time: 1, value: 100 },\n ],\n },\n },\n },\n {\n type: 'rotationStatic',\n config: { min: 0, max: 360 },\n },\n {\n type: 'spawnShape',\n config: { type: 'torus', data: { x: 0, y: 0, radius: 10 } },\n },\n {\n type: 'textureSingle',\n config: { texture: textures[0] },\n },\n ],\n };\n\n const emitter = new Emitter(container, emitterConfig);\n this.emitters.add(emitter);\n\n return emitter;\n }\n\n /** Update all emitters */\n public update(delta: number): void {\n const dt = delta / 60; // Convert to seconds\n for (const emitter of this.emitters) {\n emitter.update(dt);\n }\n }\n\n /** Remove an emitter */\n public remove(emitter: Emitter): void {\n emitter.destroy();\n this.emitters.delete(emitter);\n }\n\n /** Remove all emitters */\n public removeAll(): void {\n for (const emitter of this.emitters) {\n emitter.destroy();\n }\n this.emitters.clear();\n }\n\n /** Get number of active emitters */\n public get count(): number {\n return this.emitters.size;\n }\n\n /** Clean up */\n public destroy(): void {\n this.removeAll();\n }\n}\n","import { Engine } from '../core/engine';\nimport type { Scene } from './scene';\n\ntype SceneClass = new () => Scene;\n\nexport class SceneManager {\n private scenes: Map<string, SceneClass> = new Map();\n private currentScene: Scene | null = null;\n private currentSceneName: string | null = null;\n\n constructor() {}\n\n /** Register a scene class with a name */\n public add(name: string, SceneClass: SceneClass): void {\n this.scenes.set(name, SceneClass);\n }\n\n /** Remove a scene registration */\n public remove(name: string): void {\n this.scenes.delete(name);\n }\n\n /** Start a scene by name */\n public async start(name: string): Promise<void> {\n const SceneClass = this.scenes.get(name);\n if (!SceneClass) {\n throw new Error(`Scene \"${name}\" not found`);\n }\n\n const previousName = this.currentSceneName;\n\n // Exit current scene\n if (this.currentScene) {\n this.currentScene.onExit();\n Engine.stage.removeChild(this.currentScene);\n this.currentScene.destroy({ children: true });\n }\n\n // Create and enter new scene\n const scene = new SceneClass();\n this.currentScene = scene;\n this.currentSceneName = name;\n\n Engine.stage.addChild(scene);\n await scene.onEnter();\n\n Engine.onSceneChange.emit({ from: previousName, to: name });\n }\n\n /** Get current scene name */\n public get current(): string | null {\n return this.currentSceneName;\n }\n\n /** Get current scene instance */\n public get currentInstance(): Scene | null {\n return this.currentScene;\n }\n\n /** Update current scene */\n public update(delta: number): void {\n if (this.currentScene) {\n this.currentScene.onUpdate(delta);\n }\n }\n\n /** Check if a scene is registered */\n public has(name: string): boolean {\n return this.scenes.has(name);\n }\n\n /** Destroy scene manager */\n public destroy(): void {\n if (this.currentScene) {\n this.currentScene.onExit();\n this.currentScene.destroy({ children: true });\n this.currentScene = null;\n }\n this.scenes.clear();\n }\n}\n","import { type Sound, sound } from '@pixi/sound';\nimport { Logger } from '../utils/logger';\n\nexport interface SoundOptions {\n volume?: number;\n loop?: boolean;\n speed?: number;\n}\n\nexport class SoundManager {\n private volumes = {\n master: 1,\n music: 1,\n sfx: 1,\n };\n\n private currentMusic: Sound | null = null;\n private currentMusicAlias: string | null = null;\n\n public playSfx(alias: string, options: SoundOptions = {}): void {\n this.play(alias, options);\n }\n\n /** Play a sound effect */\n public play(alias: string, options: SoundOptions = {}): void {\n const snd = sound.find(alias);\n if (!snd) {\n Logger.warn('SoundManager', `Sound \"${alias}\" not found`);\n return;\n }\n\n snd.play({\n volume: (options.volume ?? 1) * this.volumes.master * this.volumes.sfx,\n loop: options.loop ?? false,\n speed: options.speed ?? 1,\n });\n }\n\n /** Play background music (only one at a time) */\n public playMusic(alias: string, options: SoundOptions = {}): void {\n // Stop current music if different\n if (this.currentMusicAlias !== alias) {\n this.stopMusic();\n }\n\n const snd = sound.find(alias);\n if (!snd) {\n Logger.warn('SoundManager', `Music \"${alias}\" not found`);\n return;\n }\n\n this.currentMusic = snd;\n this.currentMusicAlias = alias;\n\n snd.play({\n volume: (options.volume ?? 1) * this.volumes.master * this.volumes.music,\n loop: options.loop ?? true,\n speed: options.speed ?? 1,\n });\n }\n\n /** Stop the current music */\n public stopMusic(): void {\n if (this.currentMusic) {\n this.currentMusic.stop();\n this.currentMusic = null;\n this.currentMusicAlias = null;\n }\n }\n\n /** Stop a specific sound */\n public stop(alias: string): void {\n const snd = sound.find(alias);\n if (snd) {\n snd.stop();\n }\n }\n\n /** Stop all sounds */\n public stopAll(): void {\n sound.stopAll();\n this.currentMusic = null;\n this.currentMusicAlias = null;\n }\n\n /** Pause all sounds */\n public pauseAll(): void {\n sound.pauseAll();\n }\n\n /** Resume all sounds */\n public resumeAll(): void {\n sound.resumeAll();\n }\n\n /** Set volume for a channel */\n public setVolume(channel: 'master' | 'music' | 'sfx', value: number): void {\n this.volumes[channel] = Math.max(0, Math.min(1, value));\n this.updateMusicVolume();\n }\n\n /** Get volume for a channel */\n public getVolume(channel: 'master' | 'music' | 'sfx'): number {\n return this.volumes[channel];\n }\n\n private updateMusicVolume(): void {\n if (this.currentMusic) {\n this.currentMusic.volume = this.volumes.master * this.volumes.music;\n }\n }\n\n /** Mute all sounds */\n public mute(): void {\n sound.muteAll();\n }\n\n /** Unmute all sounds */\n public unmute(): void {\n sound.unmuteAll();\n }\n\n /** Toggle mute */\n public toggleMute(): boolean {\n sound.toggleMuteAll();\n return sound.context.muted;\n }\n\n /** Check if muted */\n public get isMuted(): boolean {\n return sound.context.muted;\n }\n\n /** Clean up */\n public destroy(): void {\n this.stopAll();\n }\n}\n","import * as PIXI from 'pixi.js';\n// Import pixi-spine to register its asset loaders with PIXI.Assets\n// Main bundle includes Spine 3.7, 3.8, and 4.0 runtimes\nimport 'pixi-spine';\nimport { type ISkeletonData, Spine } from 'pixi-spine';\n\nexport class SpineManager {\n /** Create a Spine animation from loaded skeleton data */\n public create(alias: string): Spine {\n const resource = PIXI.Assets.get(alias);\n if (!resource) {\n throw new Error(`Spine skeleton \"${alias}\" not found. Make sure it's loaded.`);\n }\n\n // pixi-spine loader returns { spineData: ISkeletonData } wrapper\n const skeletonData = (resource as any).spineData || resource;\n return new Spine(skeletonData);\n }\n\n /** Create a Spine animation from skeleton data directly */\n public fromData(skeletonData: ISkeletonData): Spine {\n return new Spine(skeletonData);\n }\n\n /** Play an animation on a Spine instance */\n public play(\n spine: Spine,\n animationName: string,\n loop: boolean = true,\n trackIndex: number = 0\n ): void {\n spine.state.setAnimation(trackIndex, animationName, loop);\n }\n\n /** Add an animation to the queue */\n public queue(\n spine: Spine,\n animationName: string,\n loop: boolean = false,\n delay: number = 0,\n trackIndex: number = 0\n ): void {\n spine.state.addAnimation(trackIndex, animationName, loop, delay);\n }\n\n /** Set animation mix duration */\n public setMix(\n spine: Spine,\n fromAnimation: string,\n toAnimation: string,\n duration: number\n ): void {\n spine.stateData.setMix(fromAnimation, toAnimation, duration);\n }\n\n /** Get available animation names */\n public getAnimations(spine: Spine): string[] {\n return spine.skeleton.data.animations.map((a) => a.name);\n }\n\n /** Get available skin names */\n public getSkins(spine: Spine): string[] {\n return spine.skeleton.data.skins.map((s) => s.name);\n }\n\n /** Set skin by name */\n public setSkin(spine: Spine, skinName: string): void {\n spine.skeleton.setSkinByName(skinName);\n spine.skeleton.setSlotsToSetupPose();\n }\n\n /** Pause spine animation */\n public pause(spine: Spine): void {\n spine.state.timeScale = 0;\n }\n\n /** Resume spine animation */\n public resume(spine: Spine): void {\n spine.state.timeScale = 1;\n }\n\n /** Set animation speed */\n public setSpeed(spine: Spine, speed: number): void {\n spine.state.timeScale = speed;\n }\n}\n","import * as PIXI from 'pixi.js';\nimport gsap from 'gsap';\nimport { Engine } from '../../core/engine';\nimport type { ToastColorSet, ToastTheme, ToastThemePreset } from './toast-theme';\nimport { TOAST_PRESETS, getDefaultColors } from './toast-presets';\n\nexport type ToastType = 'info' | 'success' | 'warning' | 'error';\n\nexport interface ToastConfig {\n /** Toast message */\n message: string;\n /** Toast type for styling */\n type?: ToastType;\n /** Duration in ms before auto-dismiss (0 = no auto-dismiss) */\n duration?: number;\n /** Position on screen */\n position?: 'top' | 'bottom' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\n}\n\nexport interface ToastManagerConfig {\n /** Theme preset name or custom theme object */\n theme?: ToastThemePreset | ToastTheme;\n}\n\ninterface ToastItem {\n container: PIXI.Container;\n config: Required<ToastConfig>;\n timer?: ReturnType<typeof setTimeout>;\n /** Stored dimensions for repositioning */\n width: number;\n height: number;\n /** Glow graphics for pulse animation */\n glowGraphics?: PIXI.Graphics;\n}\n\n\n/** SVG-style icon paths for each toast type (drawn with PIXI.Graphics) */\nconst TOAST_ICONS: Record<ToastType, (g: PIXI.Graphics, size: number, color: number) => void> = {\n info: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n const r = size * 0.4;\n // Circle\n g.lineStyle(2, color, 1);\n g.drawCircle(cx, cy, r);\n // Dot\n g.beginFill(color);\n g.drawCircle(cx, cy - r * 0.35, 2);\n g.endFill();\n // Line\n g.lineStyle(2.5, color, 1);\n g.moveTo(cx, cy - r * 0.05);\n g.lineTo(cx, cy + r * 0.5);\n },\n success: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n // Checkmark\n g.lineStyle(3, color, 1);\n g.moveTo(cx - size * 0.25, cy);\n g.lineTo(cx - size * 0.05, cy + size * 0.2);\n g.lineTo(cx + size * 0.3, cy - size * 0.2);\n },\n warning: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n const h = size * 0.75;\n const w = size * 0.8;\n // Triangle\n g.lineStyle(2, color, 1);\n g.moveTo(cx, cy - h * 0.45);\n g.lineTo(cx + w / 2, cy + h * 0.35);\n g.lineTo(cx - w / 2, cy + h * 0.35);\n g.closePath();\n // Exclamation mark\n g.lineStyle(2.5, color, 1);\n g.moveTo(cx, cy - h * 0.15);\n g.lineTo(cx, cy + h * 0.1);\n g.beginFill(color);\n g.drawCircle(cx, cy + h * 0.22, 2);\n g.endFill();\n },\n error: (g, size, color) => {\n const cx = size / 2;\n const cy = size / 2;\n const r = size * 0.3;\n // X mark\n g.lineStyle(3, color, 1);\n g.moveTo(cx - r, cy - r);\n g.lineTo(cx + r, cy + r);\n g.moveTo(cx + r, cy - r);\n g.lineTo(cx - r, cy + r);\n },\n};\n\nconst DEFAULT_DURATION = 3000;\nconst TOAST_PADDING_X = 16;\nconst TOAST_PADDING_Y = 12;\nconst TOAST_MARGIN = 16;\nconst TOAST_MIN_HEIGHT = 52;\nconst MAX_WIDTH = 420;\nconst ICON_SIZE = 28;\nconst ICON_MARGIN = 12;\n\nexport class ToastManager {\n private layer: PIXI.Container;\n private toasts: ToastItem[] = [];\n private currentColors: Record<ToastType, ToastColorSet>;\n private currentThemeName: string;\n private resizeBinding: { detach: () => void } | null = null;\n\n /** Get screen width from Engine */\n private get screenWidth(): number {\n return Engine.screen.width;\n }\n\n /** Get screen height from Engine */\n private get screenHeight(): number {\n return Engine.screen.height;\n }\n\n constructor(stage: PIXI.Container, config?: ToastManagerConfig) {\n // Initialize theme\n if (config?.theme) {\n if (typeof config.theme === 'string') {\n const preset = TOAST_PRESETS[config.theme];\n this.currentColors = preset.colors;\n this.currentThemeName = preset.name;\n } else {\n this.currentColors = config.theme.colors;\n this.currentThemeName = config.theme.name;\n }\n } else {\n this.currentColors = getDefaultColors();\n this.currentThemeName = 'default';\n }\n\n // Create toast layer on top of everything\n this.layer = new PIXI.Container();\n this.layer.sortableChildren = true;\n this.layer.zIndex = 9999;\n stage.addChild(this.layer);\n\n // Auto-resize when game resizes\n this.resizeBinding = Engine.onResize.add(() => {\n this.repositionToasts();\n });\n }\n\n /**\n * Set the toast theme\n * @param theme - Theme preset name or custom theme object\n */\n public setTheme(theme: ToastThemePreset | ToastTheme): void {\n if (typeof theme === 'string') {\n const preset = TOAST_PRESETS[theme];\n this.currentColors = preset.colors;\n this.currentThemeName = preset.name;\n } else {\n this.currentColors = theme.colors;\n this.currentThemeName = theme.name;\n }\n }\n\n /**\n * Get the current theme name\n */\n public getThemeName(): string {\n return this.currentThemeName;\n }\n\n /** Show a toast notification */\n public show(message: string, options?: Partial<Omit<ToastConfig, 'message'>>): void {\n const config: Required<ToastConfig> = {\n message,\n type: options?.type ?? 'info',\n duration: options?.duration ?? DEFAULT_DURATION,\n position: options?.position ?? 'top',\n };\n\n const toast = this.createToast(config);\n this.toasts.push(toast);\n this.layer.addChild(toast.container);\n\n // Position first (sets target position), then animate\n this.repositionToasts();\n this.animateIn(toast);\n\n // Auto-dismiss\n if (config.duration > 0) {\n toast.timer = setTimeout(() => this.dismiss(toast), config.duration);\n }\n }\n\n /** Show info toast */\n public info(message: string, duration?: number): void {\n this.show(message, { type: 'info', duration });\n }\n\n /** Show success toast */\n public success(message: string, duration?: number): void {\n this.show(message, { type: 'success', duration });\n }\n\n /** Show warning toast */\n public warning(message: string, duration?: number): void {\n this.show(message, { type: 'warning', duration });\n }\n\n /** Show error toast */\n public error(message: string, duration?: number): void {\n this.show(message, { type: 'error', duration });\n }\n\n /** Dismiss all toasts */\n public dismissAll(): void {\n for (const toast of [...this.toasts]) {\n this.dismiss(toast);\n }\n }\n\n private createToast(config: Required<ToastConfig>): ToastItem {\n const container = new PIXI.Container();\n const colors = this.currentColors[config.type];\n const borderRadius = 8;\n\n // Calculate text area width (accounting for icon)\n const textAreaWidth = MAX_WIDTH - TOAST_PADDING_X * 2 - ICON_SIZE - ICON_MARGIN;\n\n // Create text with gaming typography\n const text = new PIXI.Text(config.message, {\n fontFamily: 'Trebuchet MS, Arial Black, sans-serif',\n fontSize: 18,\n fontWeight: '700',\n fill: colors.text,\n stroke: colors.stroke,\n strokeThickness: 2,\n dropShadow: true,\n dropShadowColor: 0x000000,\n dropShadowBlur: 3,\n dropShadowDistance: 1,\n dropShadowAngle: Math.PI / 3,\n wordWrap: true,\n wordWrapWidth: textAreaWidth,\n letterSpacing: 0.5,\n });\n\n // Calculate dimensions\n const contentWidth = ICON_SIZE + ICON_MARGIN + text.width;\n const width = Math.min(contentWidth + TOAST_PADDING_X * 2, MAX_WIDTH);\n const height = Math.max(text.height + TOAST_PADDING_Y * 2, TOAST_MIN_HEIGHT);\n\n // Create outer glow layer (pulsing effect)\n const glowGraphics = new PIXI.Graphics();\n this.drawOuterGlow(glowGraphics, width, height, borderRadius, colors);\n glowGraphics.alpha = 0.6;\n\n // Create main background\n const bg = new PIXI.Graphics();\n this.drawToastBackground(bg, width, height, borderRadius, colors);\n\n // Create icon container with background\n const iconContainer = new PIXI.Container();\n const iconBg = new PIXI.Graphics();\n iconBg.beginFill(colors.iconBg, 0.3);\n iconBg.drawRoundedRect(0, 0, ICON_SIZE, ICON_SIZE, 6);\n iconBg.endFill();\n\n const icon = new PIXI.Graphics();\n TOAST_ICONS[config.type](icon, ICON_SIZE, colors.borderHighlight);\n\n iconContainer.addChild(iconBg, icon);\n iconContainer.x = TOAST_PADDING_X;\n iconContainer.y = (height - ICON_SIZE) / 2;\n\n // Position text after icon\n text.x = TOAST_PADDING_X + ICON_SIZE + ICON_MARGIN;\n text.y = (height - text.height) / 2;\n\n // Add shine/highlight effect overlay\n const shine = new PIXI.Graphics();\n shine.beginFill(0xffffff, 0.08);\n shine.drawRoundedRect(2, 2, width - 4, height * 0.45, borderRadius - 1);\n shine.endFill();\n\n container.addChild(glowGraphics, bg, shine, iconContainer, text);\n\n // Set pivot for scale animation from center\n container.pivot.set(width / 2, height / 2);\n\n // Make interactive for dismiss on click\n container.eventMode = 'static';\n container.cursor = 'pointer';\n\n return { container, config, width, height, glowGraphics };\n }\n\n /** Draw outer neon glow effect */\n private drawOuterGlow(\n g: PIXI.Graphics,\n width: number,\n height: number,\n borderRadius: number,\n colors: ToastColorSet\n ): void {\n // Multiple glow layers for depth\n const glowLayers = [\n { offset: 6, alpha: 0.15, color: colors.glowOuter },\n { offset: 4, alpha: 0.25, color: colors.glow },\n { offset: 2, alpha: 0.35, color: colors.glow },\n ];\n\n for (const layer of glowLayers) {\n g.beginFill(layer.color, layer.alpha);\n g.drawRoundedRect(\n -layer.offset,\n -layer.offset,\n width + layer.offset * 2,\n height + layer.offset * 2,\n borderRadius + layer.offset\n );\n g.endFill();\n }\n }\n\n /** Draw toast background with gradient effect and border */\n private drawToastBackground(\n g: PIXI.Graphics,\n width: number,\n height: number,\n borderRadius: number,\n colors: ToastColorSet\n ): void {\n // Drop shadow\n g.beginFill(0x000000, 0.4);\n g.drawRoundedRect(2, 3, width, height, borderRadius);\n g.endFill();\n\n // Main background (dark)\n g.beginFill(colors.bg, 0.95);\n g.drawRoundedRect(0, 0, width, height, borderRadius);\n g.endFill();\n\n // Gradient overlay (lighter at top)\n g.beginFill(colors.bgGradient, 0.5);\n g.drawRoundedRect(0, 0, width, height * 0.5, borderRadius);\n g.endFill();\n\n // Inner border highlight (top edge glow)\n g.lineStyle(1, colors.borderHighlight, 0.4);\n g.drawRoundedRect(1, 1, width - 2, height - 2, borderRadius - 1);\n\n // Main border with glow color\n g.lineStyle(2, colors.border, 0.8);\n g.drawRoundedRect(0, 0, width, height, borderRadius);\n g.lineStyle(0);\n\n // Corner accents (gaming style)\n const cornerSize = 8;\n const cornerOffset = 4;\n g.lineStyle(2, colors.borderHighlight, 0.6);\n\n // Top-left corner\n g.moveTo(cornerOffset, cornerOffset + cornerSize);\n g.lineTo(cornerOffset, cornerOffset);\n g.lineTo(cornerOffset + cornerSize, cornerOffset);\n\n // Top-right corner\n g.moveTo(width - cornerOffset - cornerSize, cornerOffset);\n g.lineTo(width - cornerOffset, cornerOffset);\n g.lineTo(width - cornerOffset, cornerOffset + cornerSize);\n\n // Bottom-left corner\n g.moveTo(cornerOffset, height - cornerOffset - cornerSize);\n g.lineTo(cornerOffset, height - cornerOffset);\n g.lineTo(cornerOffset + cornerSize, height - cornerOffset);\n\n // Bottom-right corner\n g.moveTo(width - cornerOffset - cornerSize, height - cornerOffset);\n g.lineTo(width - cornerOffset, height - cornerOffset);\n g.lineTo(width - cornerOffset, height - cornerOffset - cornerSize);\n\n g.lineStyle(0);\n }\n\n private animateIn(toast: ToastItem): void {\n const { container, config, glowGraphics } = toast;\n\n // Start with scale and alpha at 0 for animation\n const isTop = config.position.includes('top');\n container.alpha = 0;\n container.scale.set(0.85);\n\n // Store target Y (set by repositionToasts) and offset for animation\n const targetY = container.y;\n container.y = targetY + (isTop ? -50 : 50);\n\n // Animate in with gaming-style entrance (200-300ms per UX guidelines)\n gsap.to(container, {\n alpha: 1,\n y: targetY,\n duration: 0.28,\n ease: 'back.out(1.4)',\n });\n\n gsap.to(container.scale, {\n x: 1,\n y: 1,\n duration: 0.22,\n ease: 'back.out(1.8)',\n });\n\n // Subtle glow pulse animation for attention\n if (glowGraphics) {\n gsap.to(glowGraphics, {\n alpha: 0.9,\n duration: 0.6,\n ease: 'power1.inOut',\n yoyo: true,\n repeat: 2,\n onComplete: () => {\n // Settle to subtle pulse\n gsap.to(glowGraphics, {\n alpha: 0.5,\n duration: 1.2,\n ease: 'sine.inOut',\n yoyo: true,\n repeat: -1,\n });\n },\n });\n }\n\n // Click to dismiss\n container.on('pointerdown', () => this.dismiss(toast));\n }\n\n private dismiss(toast: ToastItem): void {\n const index = this.toasts.indexOf(toast);\n if (index === -1) return;\n\n // Clear timer\n if (toast.timer) {\n clearTimeout(toast.timer);\n }\n\n // Kill any ongoing glow animations\n if (toast.glowGraphics) {\n gsap.killTweensOf(toast.glowGraphics);\n }\n\n // Remove from array\n this.toasts.splice(index, 1);\n\n // Quick flash before dismiss (gaming feedback)\n if (toast.glowGraphics) {\n gsap.to(toast.glowGraphics, {\n alpha: 1,\n duration: 0.08,\n ease: 'power2.out',\n });\n }\n\n // Animate out with scale and slide (150-200ms per UX guidelines)\n gsap.to(toast.container, {\n alpha: 0,\n y: toast.container.y - 25,\n duration: 0.18,\n ease: 'power2.in',\n });\n\n gsap.to(toast.container.scale, {\n x: 0.92,\n y: 0.92,\n duration: 0.18,\n ease: 'power2.in',\n onComplete: () => {\n toast.container.destroy();\n this.repositionToasts();\n },\n });\n }\n\n private repositionToasts(): void {\n // Group by position\n const groups = new Map<string, ToastItem[]>();\n\n for (const toast of this.toasts) {\n const pos = toast.config.position;\n if (!groups.has(pos)) groups.set(pos, []);\n groups.get(pos)!.push(toast);\n }\n\n // Position each group\n for (const [position, items] of groups) {\n let offsetY = TOAST_MARGIN;\n\n for (const toast of items) {\n const { container, width, height } = toast;\n // Pivot is at center, so position is at center point\n const halfW = width / 2;\n const halfH = height / 2;\n\n // X position (center-based due to pivot)\n if (position.includes('left')) {\n container.x = TOAST_MARGIN + halfW;\n } else if (position.includes('right')) {\n container.x = this.screenWidth - halfW - TOAST_MARGIN;\n } else {\n container.x = this.screenWidth / 2;\n }\n\n // Y position (center-based due to pivot)\n if (position.includes('bottom')) {\n container.y = this.screenHeight - halfH - offsetY;\n } else {\n container.y = offsetY + halfH;\n }\n\n offsetY += height + TOAST_MARGIN;\n }\n }\n }\n\n public destroy(): void {\n this.resizeBinding?.detach();\n this.resizeBinding = null;\n this.dismissAll();\n this.layer.destroy();\n }\n}\n","import type { ToastType } from './toast-manager';\n\n/**\n * Color set for a single toast type\n * Used to define the visual appearance of info/success/warning/error toasts\n */\nexport interface ToastColorSet {\n /** Main background color (dark) */\n bg: number;\n /** Gradient overlay color (lighter, for top half) */\n bgGradient: number;\n /** Primary glow color */\n glow: number;\n /** Outer glow color (darker) */\n glowOuter: number;\n /** Border color */\n border: number;\n /** Border highlight color (brighter) */\n borderHighlight: number;\n /** Text color */\n text: number;\n /** Text stroke color */\n stroke: number;\n /** Icon background color */\n iconBg: number;\n}\n\n/**\n * Complete toast theme with colors for all toast types\n */\nexport interface ToastTheme {\n /** Theme name for identification */\n name: string;\n /** Color sets for each toast type */\n colors: Record<ToastType, ToastColorSet>;\n}\n\n/**\n * Built-in theme preset names\n */\nexport type ToastThemePreset = 'default' | 'asian' | 'egyptian' | 'underwater' | 'neon' | 'luxury';\n\n/**\n * Helper function to create a complete theme with type safety\n * @param name - Theme name\n * @param colors - Color sets for each toast type\n * @returns Complete ToastTheme object\n */\nexport function createTheme(name: string, colors: Record<ToastType, ToastColorSet>): ToastTheme {\n return { name, colors };\n}\n","import type { ToastColorSet, ToastTheme, ToastThemePreset } from './toast-theme';\nimport { createTheme } from './toast-theme';\nimport type { ToastType } from './toast-manager';\n\n/**\n * Default theme - Generic casino style\n * Info: Cyan, Success: Gold, Warning: Orange, Error: Red\n */\nconst defaultTheme: ToastTheme = createTheme('default', {\n info: {\n bg: 0x0a1628,\n bgGradient: 0x102040,\n glow: 0x00d4ff,\n glowOuter: 0x0088aa,\n border: 0x00d4ff,\n borderHighlight: 0x80efff,\n text: 0xffffff,\n stroke: 0x001020,\n iconBg: 0x00b8e6,\n },\n success: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xffd700,\n glowOuter: 0xb8860b,\n border: 0xffd700,\n borderHighlight: 0xffec80,\n text: 0xffffff,\n stroke: 0x1a1000,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x1a1008,\n bgGradient: 0x2a1810,\n glow: 0xff8c00,\n glowOuter: 0xcc6600,\n border: 0xff8c00,\n borderHighlight: 0xffb366,\n text: 0xffffff,\n stroke: 0x1a0800,\n iconBg: 0xe67a00,\n },\n error: {\n bg: 0x1a0808,\n bgGradient: 0x2a1010,\n glow: 0xff3333,\n glowOuter: 0xaa2222,\n border: 0xff3333,\n borderHighlight: 0xff8080,\n text: 0xffffff,\n stroke: 0x100000,\n iconBg: 0xe62e2e,\n },\n});\n\n/**\n * Asian theme - Lucky/Chinese New Year style\n * Info: Red, Success: Gold, Warning: Orange, Error: Deep Red\n */\nconst asianTheme: ToastTheme = createTheme('asian', {\n info: {\n bg: 0x1a0808,\n bgGradient: 0x2a1010,\n glow: 0xff2222,\n glowOuter: 0xaa1111,\n border: 0xff2222,\n borderHighlight: 0xff6666,\n text: 0xffffff,\n stroke: 0x100000,\n iconBg: 0xcc1a1a,\n },\n success: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xffd700,\n glowOuter: 0xb8860b,\n border: 0xffd700,\n borderHighlight: 0xffec80,\n text: 0xffffff,\n stroke: 0x1a1000,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x1a1208,\n bgGradient: 0x2a1c10,\n glow: 0xffa500,\n glowOuter: 0xcc8400,\n border: 0xffa500,\n borderHighlight: 0xffc966,\n text: 0xffffff,\n stroke: 0x1a0c00,\n iconBg: 0xe69500,\n },\n error: {\n bg: 0x200808,\n bgGradient: 0x301010,\n glow: 0x8b0000,\n glowOuter: 0x5c0000,\n border: 0x8b0000,\n borderHighlight: 0xb33333,\n text: 0xffffff,\n stroke: 0x0a0000,\n iconBg: 0x7a0000,\n },\n});\n\n/**\n * Egyptian theme - Ancient/Pharaoh style\n * Info: Turquoise, Success: Gold, Warning: Amber, Error: Scarlet\n */\nconst egyptianTheme: ToastTheme = createTheme('egyptian', {\n info: {\n bg: 0x081a1a,\n bgGradient: 0x102a2a,\n glow: 0x40e0d0,\n glowOuter: 0x30a8a0,\n border: 0x40e0d0,\n borderHighlight: 0x80f0e8,\n text: 0xffffff,\n stroke: 0x001010,\n iconBg: 0x38c8c0,\n },\n success: {\n bg: 0x1a1808,\n bgGradient: 0x2a2410,\n glow: 0xffd700,\n glowOuter: 0xdaa520,\n border: 0xffd700,\n borderHighlight: 0xffe44d,\n text: 0xffffff,\n stroke: 0x1a1400,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x1a1408,\n bgGradient: 0x2a2010,\n glow: 0xffbf00,\n glowOuter: 0xcc9900,\n border: 0xffbf00,\n borderHighlight: 0xffd94d,\n text: 0xffffff,\n stroke: 0x1a1000,\n iconBg: 0xe6ac00,\n },\n error: {\n bg: 0x1a0a08,\n bgGradient: 0x2a1210,\n glow: 0xff2400,\n glowOuter: 0xcc1c00,\n border: 0xff2400,\n borderHighlight: 0xff6b4d,\n text: 0xffffff,\n stroke: 0x100400,\n iconBg: 0xe62000,\n },\n});\n\n/**\n * Underwater theme - Ocean/Aquatic style\n * Info: Cyan, Success: Sea Green, Warning: Yellow, Error: Coral\n */\nconst underwaterTheme: ToastTheme = createTheme('underwater', {\n info: {\n bg: 0x081828,\n bgGradient: 0x102438,\n glow: 0x00ced1,\n glowOuter: 0x008b8b,\n border: 0x00ced1,\n borderHighlight: 0x66e8ea,\n text: 0xffffff,\n stroke: 0x001018,\n iconBg: 0x00b8bb,\n },\n success: {\n bg: 0x081a10,\n bgGradient: 0x102a18,\n glow: 0x20b2aa,\n glowOuter: 0x178a84,\n border: 0x20b2aa,\n borderHighlight: 0x66d4ce,\n text: 0xffffff,\n stroke: 0x001008,\n iconBg: 0x1c9e97,\n },\n warning: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xf0e68c,\n glowOuter: 0xc0b870,\n border: 0xf0e68c,\n borderHighlight: 0xf8f0b8,\n text: 0x1a1a08,\n stroke: 0x808060,\n iconBg: 0xd8cf7e,\n },\n error: {\n bg: 0x1a1010,\n bgGradient: 0x2a1818,\n glow: 0xff7f50,\n glowOuter: 0xcc6640,\n border: 0xff7f50,\n borderHighlight: 0xffb299,\n text: 0xffffff,\n stroke: 0x100808,\n iconBg: 0xe67248,\n },\n});\n\n/**\n * Neon theme - Cyberpunk/Modern style\n * Info: Pink, Success: Lime, Warning: Yellow, Error: Magenta\n */\nconst neonTheme: ToastTheme = createTheme('neon', {\n info: {\n bg: 0x180820,\n bgGradient: 0x241030,\n glow: 0xff1493,\n glowOuter: 0xcc1077,\n border: 0xff1493,\n borderHighlight: 0xff66b8,\n text: 0xffffff,\n stroke: 0x100018,\n iconBg: 0xe61284,\n },\n success: {\n bg: 0x081a08,\n bgGradient: 0x102a10,\n glow: 0x32cd32,\n glowOuter: 0x28a428,\n border: 0x32cd32,\n borderHighlight: 0x7de87d,\n text: 0xffffff,\n stroke: 0x001000,\n iconBg: 0x2db82d,\n },\n warning: {\n bg: 0x1a1a08,\n bgGradient: 0x2a2a10,\n glow: 0xffff00,\n glowOuter: 0xcccc00,\n border: 0xffff00,\n borderHighlight: 0xffff66,\n text: 0x1a1a08,\n stroke: 0x808000,\n iconBg: 0xe6e600,\n },\n error: {\n bg: 0x200820,\n bgGradient: 0x301030,\n glow: 0xff00ff,\n glowOuter: 0xcc00cc,\n border: 0xff00ff,\n borderHighlight: 0xff66ff,\n text: 0xffffff,\n stroke: 0x100010,\n iconBg: 0xe600e6,\n },\n});\n\n/**\n * Luxury theme - VIP/High-roller style\n * Info: Silver, Success: Gold, Warning: Bronze, Error: Ruby\n */\nconst luxuryTheme: ToastTheme = createTheme('luxury', {\n info: {\n bg: 0x101418,\n bgGradient: 0x181c22,\n glow: 0xc0c0c0,\n glowOuter: 0x909090,\n border: 0xc0c0c0,\n borderHighlight: 0xe0e0e0,\n text: 0xffffff,\n stroke: 0x080a0c,\n iconBg: 0xaaaaaa,\n },\n success: {\n bg: 0x1a1808,\n bgGradient: 0x2a2410,\n glow: 0xffd700,\n glowOuter: 0xdaa520,\n border: 0xffd700,\n borderHighlight: 0xffe44d,\n text: 0xffffff,\n stroke: 0x1a1400,\n iconBg: 0xe6c200,\n },\n warning: {\n bg: 0x181208,\n bgGradient: 0x241c10,\n glow: 0xcd7f32,\n glowOuter: 0xa46628,\n border: 0xcd7f32,\n borderHighlight: 0xe0a866,\n text: 0xffffff,\n stroke: 0x100c04,\n iconBg: 0xb8722d,\n },\n error: {\n bg: 0x1a0810,\n bgGradient: 0x2a1018,\n glow: 0xe0115f,\n glowOuter: 0xb30d4c,\n border: 0xe0115f,\n borderHighlight: 0xec5a8f,\n text: 0xffffff,\n stroke: 0x100008,\n iconBg: 0xc90f55,\n },\n});\n\n/**\n * Map of all built-in theme presets\n */\nexport const TOAST_PRESETS: Record<ToastThemePreset, ToastTheme> = {\n default: defaultTheme,\n asian: asianTheme,\n egyptian: egyptianTheme,\n underwater: underwaterTheme,\n neon: neonTheme,\n luxury: luxuryTheme,\n};\n\n/**\n * Get a preset theme by name\n * @param name - Preset name\n * @returns The theme object\n */\nexport function getPreset(name: ToastThemePreset): ToastTheme {\n return TOAST_PRESETS[name];\n}\n\n/**\n * Get the default theme colors for backwards compatibility\n * @returns Colors record for all toast types\n */\nexport function getDefaultColors(): Record<ToastType, ToastColorSet> {\n return defaultTheme.colors;\n}\n","import gsap from 'gsap';\nimport { PixiPlugin } from 'gsap/PixiPlugin';\nimport * as PIXI from 'pixi.js';\n\n// Register PixiPlugin\ngsap.registerPlugin(PixiPlugin);\nPixiPlugin.registerPIXI(PIXI);\n\nexport interface TweenConfig {\n duration?: number;\n delay?: number;\n ease?: string;\n repeat?: number;\n yoyo?: boolean;\n onComplete?: () => void;\n onUpdate?: () => void;\n [key: string]: unknown;\n}\n\nexport class TweenManager {\n private tweens: Set<gsap.core.Tween> = new Set();\n\n /** Animate target to new values */\n public to(target: object, config: TweenConfig): gsap.core.Tween {\n const tween = gsap.to(target, {\n duration: config.duration ?? 0.5,\n delay: config.delay ?? 0,\n ease: config.ease ?? 'power2.out',\n repeat: config.repeat ?? 0,\n yoyo: config.yoyo ?? false,\n onUpdate: config.onUpdate,\n onComplete: () => {\n this.tweens.delete(tween);\n config.onComplete?.();\n },\n ...this.extractProps(config),\n });\n\n this.tweens.add(tween);\n return tween;\n }\n\n /** Animate target from values */\n public from(target: object, config: TweenConfig): gsap.core.Tween {\n const tween = gsap.from(target, {\n duration: config.duration ?? 0.5,\n delay: config.delay ?? 0,\n ease: config.ease ?? 'power2.out',\n repeat: config.repeat ?? 0,\n yoyo: config.yoyo ?? false,\n onUpdate: config.onUpdate,\n onComplete: () => {\n this.tweens.delete(tween);\n config.onComplete?.();\n },\n ...this.extractProps(config),\n });\n\n this.tweens.add(tween);\n return tween;\n }\n\n /** Animate from one set of values to another */\n public fromTo(target: object, fromConfig: TweenConfig, toConfig: TweenConfig): gsap.core.Tween {\n const tween = gsap.fromTo(target, this.extractProps(fromConfig), {\n duration: toConfig.duration ?? 0.5,\n delay: toConfig.delay ?? 0,\n ease: toConfig.ease ?? 'power2.out',\n repeat: toConfig.repeat ?? 0,\n yoyo: toConfig.yoyo ?? false,\n onUpdate: toConfig.onUpdate,\n onComplete: () => {\n this.tweens.delete(tween);\n toConfig.onComplete?.();\n },\n ...this.extractProps(toConfig),\n });\n\n this.tweens.add(tween);\n return tween;\n }\n\n /** Create a timeline */\n public timeline(config?: gsap.TimelineVars): gsap.core.Timeline {\n return gsap.timeline(config);\n }\n\n /** Kill a specific tween */\n public kill(tween: gsap.core.Tween): void {\n tween.kill();\n this.tweens.delete(tween);\n }\n\n /** Kill all tweens for a target */\n public killTweensOf(target: object): void {\n gsap.killTweensOf(target);\n }\n\n /** Kill all managed tweens */\n public killAll(): void {\n for (const tween of this.tweens) {\n tween.kill();\n }\n this.tweens.clear();\n }\n\n private extractProps(config: TweenConfig): Record<string, unknown> {\n const reserved = ['duration', 'delay', 'ease', 'repeat', 'yoyo', 'onComplete', 'onUpdate'];\n return Object.fromEntries(\n Object.entries(config).filter(([key]) => !reserved.includes(key))\n );\n }\n\n /** Get number of active tweens */\n public get count(): number {\n return this.tweens.size;\n }\n\n /** Clean up */\n public destroy(): void {\n this.killAll();\n }\n}\n","import { type ButtonOptions, FancyButton } from '@pixi/ui';\nimport * as PIXI from 'pixi.js';\n\nexport interface ButtonConfig {\n text?: string;\n textStyle?: Partial<PIXI.TextStyle>;\n defaultView?: PIXI.Container | string;\n hoverView?: PIXI.Container | string;\n pressedView?: PIXI.Container | string;\n disabledView?: PIXI.Container | string;\n padding?: number;\n scale?: number;\n anchor?: number;\n onClick?: () => void;\n}\n\nexport interface TextConfig {\n text: string;\n style?: Partial<PIXI.TextStyle>;\n x?: number;\n y?: number;\n anchor?: number | { x: number; y: number };\n}\n\nexport class UIManager {\n /** Create a fancy button */\n public button(config: ButtonConfig): FancyButton {\n const buttonOptions: ButtonOptions = {\n text: new PIXI.Text(config.text ?? '', {\n fontFamily: 'Arial',\n fontSize: 24,\n fill: 0xffffff,\n ...config.textStyle,\n }),\n padding: config.padding ?? 10,\n scale: config.scale ?? 1,\n anchor: config.anchor ?? 0.5,\n };\n\n // Add views if provided\n if (config.defaultView) {\n buttonOptions.defaultView = this.resolveView(config.defaultView);\n }\n if (config.hoverView) {\n buttonOptions.hoverView = this.resolveView(config.hoverView);\n }\n if (config.pressedView) {\n buttonOptions.pressedView = this.resolveView(config.pressedView);\n }\n if (config.disabledView) {\n buttonOptions.disabledView = this.resolveView(config.disabledView);\n }\n\n const button = new FancyButton(buttonOptions);\n\n if (config.onClick) {\n button.onPress.connect(config.onClick);\n }\n\n return button;\n }\n\n /** Create a text element */\n public text(config: TextConfig): PIXI.Text {\n const text = new PIXI.Text(config.text, {\n fontFamily: 'Arial',\n fontSize: 24,\n fill: 0xffffff,\n ...config.style,\n });\n\n if (config.x !== undefined) text.x = config.x;\n if (config.y !== undefined) text.y = config.y;\n\n if (config.anchor !== undefined) {\n if (typeof config.anchor === 'number') {\n text.anchor.set(config.anchor);\n } else {\n text.anchor.set(config.anchor.x, config.anchor.y);\n }\n }\n\n return text;\n }\n\n /** Create a simple rectangle */\n public rect(\n width: number,\n height: number,\n color: number = 0xffffff,\n radius: number = 0\n ): PIXI.Graphics {\n const graphics = new PIXI.Graphics();\n graphics.beginFill(color);\n if (radius > 0) {\n graphics.drawRoundedRect(0, 0, width, height, radius);\n } else {\n graphics.drawRect(0, 0, width, height);\n }\n graphics.endFill();\n return graphics;\n }\n\n /** Create a progress bar */\n public progressBar(\n width: number,\n height: number,\n bgColor: number = 0x333333,\n fillColor: number = 0x00ff00\n ): { container: PIXI.Container; setProgress: (value: number) => void } {\n const container = new PIXI.Container();\n const bg = this.rect(width, height, bgColor, 4);\n const fill = this.rect(width - 4, height - 4, fillColor, 2);\n fill.x = 2;\n fill.y = 2;\n fill.scale.x = 0;\n\n container.addChild(bg, fill);\n\n return {\n container,\n setProgress: (value: number) => {\n fill.scale.x = Math.max(0, Math.min(1, value));\n },\n };\n }\n\n private resolveView(view: PIXI.Container | string): PIXI.Container {\n if (typeof view === 'string') {\n // Assume it's a texture alias\n const texture = PIXI.Assets.get<PIXI.Texture>(view);\n if (texture) {\n return new PIXI.Sprite(texture);\n }\n // Fallback to simple rectangle\n return this.rect(100, 40, 0x444444, 8);\n }\n return view;\n }\n}\n","import * as PIXI from 'pixi.js';\nimport { Engine } from '../core/engine';\n\nexport abstract class Scene extends PIXI.Container {\n /** Get engine class for static access */\n protected get engine(): typeof Engine {\n return Engine;\n }\n\n /** Called when scene becomes active */\n public abstract onEnter(): void | Promise<void>;\n\n /** Called every frame while scene is active */\n public abstract onUpdate(delta: number): void;\n\n /** Called when scene is about to be replaced */\n public abstract onExit(): void;\n\n /** Called when scene is paused (another scene pushed on top) */\n public onPause(): void {\n // Override if needed\n }\n\n /** Called when scene is resumed (top scene popped) */\n public onResume(): void {\n // Override if needed\n }\n}\n","/**\r\n * Count Animation Presets\r\n *\r\n * Standardized animation timings for consistent feel across the game.\r\n */\r\nimport type { CountPreset } from './count-renderer';\r\n\r\n/**\r\n * Standard animation presets for count animations\r\n */\r\nexport const COUNT_PRESETS: Record<string, CountPreset> = {\r\n\t/** Quick updates (300ms) - UI feedback, small changes */\r\n\tfast: {\r\n\t\tduration: 300,\r\n\t\teasing: 'power2.out',\r\n\t},\r\n\r\n\t/** Normal updates (500ms) - Balance changes, bet adjustments */\r\n\tnormal: {\r\n\t\tduration: 500,\r\n\t\teasing: 'power2.out',\r\n\t},\r\n\r\n\t/** Win displays (1000ms) - Standard win count-up */\r\n\twin: {\r\n\t\tduration: 1000,\r\n\t\teasing: 'slow(0.5, 0.8, false)',\r\n\t},\r\n\r\n\t/** Big win celebrations (2000ms) - Dramatic count-up */\r\n\tbigWin: {\r\n\t\tduration: 2000,\r\n\t\teasing: 'slow(0.3, 0.9, false)',\r\n\t},\r\n\r\n\t/** Epic win presentations (4000ms) - Maximum drama */\r\n\tepicWin: {\r\n\t\tduration: 4000,\r\n\t\teasing: 'slow(0.2, 0.95, false)',\r\n\t},\r\n\r\n\t/** Instant - No animation, immediate update */\r\n\tinstant: {\r\n\t\tduration: 0,\r\n\t\teasing: 'none',\r\n\t},\r\n};\r\n\r\n/**\r\n * Get a preset by name, with fallback to 'normal'\r\n */\r\nexport function getCountPreset(name: string): CountPreset {\r\n\treturn COUNT_PRESETS[name] ?? COUNT_PRESETS.normal;\r\n}\r\n","/**\r\n * Count Animator\r\n *\r\n * Core animation controller for count up/down animations.\r\n * Uses GSAP for consistent timing and easing across the game.\r\n */\r\nimport type { TweenManager } from '../tween/tween-manager';\r\nimport type { CountAnimatorConfig, ICountRenderer } from './count-renderer';\r\nimport { getCountPreset } from './presets';\r\n\r\n/**\r\n * Unified count animation controller\r\n *\r\n * @example\r\n * ```typescript\r\n * const renderer = new TextCountRenderer(text);\r\n * const animator = new CountAnimator(renderer, tweenManager);\r\n *\r\n * // Animate to value\r\n * await animator.animateTo(1000, { preset: 'win' });\r\n *\r\n * // Animate from/to\r\n * await animator.animateFromTo(0, 500, { duration: 1000 });\r\n *\r\n * // Instant set\r\n * animator.setValue(100);\r\n * ```\r\n */\r\nexport class CountAnimator {\r\n\tprivate renderer: ICountRenderer;\r\n\tprivate tween: TweenManager;\r\n\tprivate currentValue = 0;\r\n\tprivate targetValue = 0;\r\n\tprivate activeTween: gsap.core.Tween | null = null;\r\n\tprivate defaultFormatter: (value: number) => string;\r\n\r\n\tconstructor(\r\n\t\trenderer: ICountRenderer,\r\n\t\ttweenManager: TweenManager,\r\n\t\tdefaultFormatter: (value: number) => string = (v) => Math.floor(v).toString()\r\n\t) {\r\n\t\tthis.renderer = renderer;\r\n\t\tthis.tween = tweenManager;\r\n\t\tthis.defaultFormatter = defaultFormatter;\r\n\t\tthis.renderer.setValue(this.defaultFormatter(0));\r\n\t}\r\n\r\n\t/**\r\n\t * Animate from current value to target\r\n\t */\r\n\tpublic animateTo(target: number, config?: CountAnimatorConfig): Promise<void> {\r\n\t\treturn this.animateFromTo(this.currentValue, target, config);\r\n\t}\r\n\r\n\t/**\r\n\t * Animate from one value to another\r\n\t */\r\n\tpublic animateFromTo(from: number, to: number, config?: CountAnimatorConfig): Promise<void> {\r\n\t\tthis.stop();\r\n\r\n\t\tconst preset = getCountPreset(config?.preset ?? 'normal');\r\n\t\tconst duration = config?.duration ?? preset.duration;\r\n\t\tconst easing = config?.easing ?? preset.easing;\r\n\t\tconst formatter = config?.formatter ?? this.defaultFormatter;\r\n\r\n\t\t// Instant update if duration is 0\r\n\t\tif (duration === 0) {\r\n\t\t\tthis.currentValue = to;\r\n\t\t\tthis.targetValue = to;\r\n\t\t\tthis.renderer.setValue(formatter(to));\r\n\t\t\tconfig?.onComplete?.();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\r\n\t\tthis.currentValue = from;\r\n\t\tthis.targetValue = to;\r\n\t\tconst range = to - from;\r\n\r\n\t\treturn new Promise<void>((resolve) => {\r\n\t\t\tconst animTarget = { value: from };\r\n\r\n\t\t\tthis.activeTween = this.tween.to(animTarget, {\r\n\t\t\t\tvalue: to,\r\n\t\t\t\tduration: duration / 1000,\r\n\t\t\t\tease: easing,\r\n\t\t\t\tonUpdate: () => {\r\n\t\t\t\t\tthis.currentValue = animTarget.value;\r\n\t\t\t\t\tthis.renderer.setValue(formatter(this.currentValue));\r\n\r\n\t\t\t\t\t// Calculate progress and fire callback\r\n\t\t\t\t\tif (config?.onProgress && range !== 0) {\r\n\t\t\t\t\t\tconst progress = (this.currentValue - from) / range;\r\n\t\t\t\t\t\tconfig.onProgress(progress, this.currentValue);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tonComplete: () => {\r\n\t\t\t\t\tthis.activeTween = null;\r\n\t\t\t\t\tthis.currentValue = to;\r\n\t\t\t\t\tthis.renderer.setValue(formatter(to));\r\n\t\t\t\t\tconfig?.onComplete?.();\r\n\t\t\t\t\tresolve();\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Set value instantly (no animation)\r\n\t */\r\n\tpublic setValue(value: number, formatter?: (value: number) => string): void {\r\n\t\tthis.stop();\r\n\t\tthis.currentValue = value;\r\n\t\tthis.targetValue = value;\r\n\t\tthis.renderer.setValue((formatter ?? this.defaultFormatter)(value));\r\n\t}\r\n\r\n\t/**\r\n\t * Skip animation and show target value immediately\r\n\t */\r\n\tpublic skip(): void {\r\n\t\tif (this.activeTween) {\r\n\t\t\tconst target = this.targetValue;\r\n\t\t\tthis.stop();\r\n\t\t\tthis.currentValue = target;\r\n\t\t\tthis.renderer.setValue(this.defaultFormatter(target));\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Stop animation at current value\r\n\t */\r\n\tpublic stop(): void {\r\n\t\tif (this.activeTween) {\r\n\t\t\tthis.tween.kill(this.activeTween);\r\n\t\t\tthis.activeTween = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Reset to zero\r\n\t */\r\n\tpublic reset(): void {\r\n\t\tthis.stop();\r\n\t\tthis.currentValue = 0;\r\n\t\tthis.targetValue = 0;\r\n\t\tthis.renderer.setValue(this.defaultFormatter(0));\r\n\t}\r\n\r\n\t/**\r\n\t * Get current displayed value\r\n\t */\r\n\tpublic get value(): number {\r\n\t\treturn this.currentValue;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the target value (may differ during animation)\r\n\t */\r\n\tpublic get target(): number {\r\n\t\treturn this.targetValue;\r\n\t}\r\n\r\n\t/**\r\n\t * Check if animation is running\r\n\t */\r\n\tpublic get isAnimating(): boolean {\r\n\t\treturn this.activeTween !== null;\r\n\t}\r\n\r\n\t/**\r\n\t * Update the default formatter\r\n\t */\r\n\tpublic setFormatter(formatter: (value: number) => string): void {\r\n\t\tthis.defaultFormatter = formatter;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the underlying renderer\r\n\t */\r\n\tpublic getRenderer(): ICountRenderer {\r\n\t\treturn this.renderer;\r\n\t}\r\n}\r\n","/**\r\n * Text Count Renderer\r\n *\r\n * ICountRenderer implementation for PIXI.Text objects.\r\n */\r\nimport type * as PIXI from 'pixi.js';\r\nimport type { ICountRenderer } from './count-renderer';\r\n\r\n/**\r\n * Renders count animation values to a PIXI.Text object\r\n */\r\nexport class TextCountRenderer implements ICountRenderer {\r\n\tprivate text: PIXI.Text;\r\n\r\n\tconstructor(text: PIXI.Text) {\r\n\t\tthis.text = text;\r\n\t}\r\n\r\n\t/**\r\n\t * Update the displayed text value\r\n\t */\r\n\tpublic setValue(value: string): void {\r\n\t\tthis.text.text = value;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the PIXI.Text container for positioning\r\n\t */\r\n\tpublic getDisplayObject(): PIXI.Container {\r\n\t\treturn this.text;\r\n\t}\r\n\r\n\t/**\r\n\t * Set text fill color\r\n\t */\r\n\tpublic setColor(color: number): void {\r\n\t\tthis.text.style.fill = color;\r\n\t}\r\n\r\n\t/**\r\n\t * Set scale\r\n\t */\r\n\tpublic setScale(scaleX: number, scaleY?: number): void {\r\n\t\tthis.text.scale.set(scaleX, scaleY ?? scaleX);\r\n\t}\r\n\r\n\t/**\r\n\t * Get the underlying PIXI.Text\r\n\t */\r\n\tpublic getText(): PIXI.Text {\r\n\t\treturn this.text;\r\n\t}\r\n}\r\n"],"mappings":"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","names":["PIXI","PIXI","PIXI","import_gsap","gsap","TEXT_COLOR","gsap","PIXI","PIXI","PIXI","PIXI","import_pixi_spine","PIXI","import_gsap","gsap","import_gsap","PIXI","gsap","PIXI","PIXI","PIXI","import_pixi_spine"]}
|