{"version":3,"file":"ResizePlugin.mjs","sources":["../../src/app/ResizePlugin.ts"],"sourcesContent":["import { ExtensionType } from '../extensions/Extensions';\n\nimport type { ExtensionMetadata } from '../extensions/Extensions';\nimport type { Renderer } from '../rendering/renderers/types';\n\ntype ResizeableRenderer = Pick<Renderer, 'resize'>;\n\n/**\n * Application options for the {@link ResizePlugin}.\n * These options control how your application handles window and element resizing.\n * @example\n * ```ts\n * // Auto-resize to window\n * await app.init({ resizeTo: window });\n *\n * // Auto-resize to container element\n * await app.init({ resizeTo: document.querySelector('#game') });\n * ```\n * @category app\n * @standard\n */\nexport interface ResizePluginOptions\n{\n    /**\n     * Element to automatically resize the renderer to.\n     * @example\n     * ```ts\n     * const app = new Application();\n     * await app.init({\n     *     resizeTo: window, // Resize to the entire window\n     *     // or\n     *     resizeTo: document.querySelector('#game-container'), // Resize to a specific element\n     *     // or\n     *     resizeTo: null, // Disable auto-resize\n     * });\n     * ```\n     * @default null\n     */\n    resizeTo?: Window | HTMLElement;\n}\n\n/**\n * Middleware for Application's resize functionality. This plugin handles automatic\n * and manual resizing of your PixiJS application.\n *\n * Adds the following features to {@link Application}:\n * - `resizeTo`: Set an element to automatically resize to\n * - `resize`: Manually trigger a resize\n * - `queueResize`: Queue a resize for the next animation frame\n * - `cancelResize`: Cancel a queued resize\n * @example\n * ```ts\n * import { Application, ResizePlugin } from 'pixi.js';\n *\n * // Create application\n * const app = new Application();\n *\n * // Example 1: Auto-resize to window\n * await app.init({ resizeTo: window });\n *\n * // Example 2: Auto-resize to specific element\n * const container = document.querySelector('#game-container');\n * await app.init({ resizeTo: container });\n *\n * // Example 3: Change resize target at runtime\n * app.resizeTo = window;                    // Enable auto-resize to window\n * app.resizeTo = null;                      // Disable auto-resize\n * ```\n * @category app\n * @standard\n */\nexport class ResizePlugin\n{\n    /** @ignore */\n    public static extension: ExtensionMetadata = ExtensionType.Application;\n    /** @internal */\n    public static resizeTo: Window | HTMLElement;\n    /** @internal */\n    public static resize: () => void;\n    /** @internal */\n    public static renderer: ResizeableRenderer;\n    /** @internal */\n    public static queueResize: () => void;\n    /** @internal */\n    public static render: () => void;\n    /** @internal */\n    private static _resizeId: number;\n    /** @internal */\n    private static _resizeTo: Window | HTMLElement;\n    /** @internal */\n    private static _cancelResize: () => void;\n\n    /**\n     * Initialize the plugin with scope of application instance\n     * @private\n     * @param {object} [options] - See application options\n     */\n    public static init(options: ResizePluginOptions): void\n    {\n        Object.defineProperty(this, 'resizeTo',\n            {\n                configurable: true,\n                set(dom: Window | HTMLElement)\n                {\n                    globalThis.removeEventListener('resize', this.queueResize);\n                    this._resizeTo = dom;\n                    if (dom)\n                    {\n                        globalThis.addEventListener('resize', this.queueResize);\n                        this.resize();\n                    }\n                },\n                get()\n                {\n                    return this._resizeTo;\n                },\n            });\n\n        this.queueResize = (): void =>\n        {\n            if (!this._resizeTo)\n            {\n                return;\n            }\n\n            this._cancelResize();\n\n            // // Throttle resize events per raf\n            this._resizeId = requestAnimationFrame(() => this.resize());\n        };\n\n        this._cancelResize = (): void =>\n        {\n            if (this._resizeId)\n            {\n                cancelAnimationFrame(this._resizeId);\n                this._resizeId = null;\n            }\n        };\n\n        this.resize = (): void =>\n        {\n            if (!this._resizeTo)\n            {\n                return;\n            }\n\n            // clear queue resize\n            this._cancelResize();\n\n            let width: number;\n            let height: number;\n\n            // Resize to the window\n            if (this._resizeTo === globalThis.window)\n            {\n                width = globalThis.innerWidth;\n                height = globalThis.innerHeight;\n            }\n            // Resize to other HTML entities\n            else\n            {\n                const { clientWidth, clientHeight } = this._resizeTo as HTMLElement;\n\n                width = clientWidth;\n                height = clientHeight;\n            }\n\n            this.renderer.resize(width, height);\n            this.render();\n        };\n\n        // On resize\n        this._resizeId = null;\n        this._resizeTo = null;\n        this.resizeTo = options.resizeTo || null;\n    }\n\n    /**\n     * Clean up the ticker, scoped to application\n     * @private\n     */\n    public static destroy(): void\n    {\n        globalThis.removeEventListener('resize', this.queueResize);\n        this._cancelResize();\n        this._cancelResize = null;\n        this.queueResize = null;\n        this.resizeTo = null;\n        this.resize = null;\n    }\n}\n"],"names":[],"mappings":";;;AAuEO,MAAM,YAAA,CACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBI,OAAc,KAAK,OAAA,EACnB;AACI,IAAA,MAAA,CAAO,cAAA;AAAA,MAAe,IAAA;AAAA,MAAM,UAAA;AAAA,MACxB;AAAA,QACI,YAAA,EAAc,IAAA;AAAA,QACd,IAAI,GAAA,EACJ;AACI,UAAA,UAAA,CAAW,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA;AACzD,UAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,UAAA,IAAI,GAAA,EACJ;AACI,YAAA,UAAA,CAAW,gBAAA,CAAiB,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA;AACtD,YAAA,IAAA,CAAK,MAAA,EAAO;AAAA,UAChB;AAAA,QACJ,CAAA;AAAA,QACA,GAAA,GACA;AACI,UAAA,OAAO,IAAA,CAAK,SAAA;AAAA,QAChB;AAAA;AACJ,KAAC;AAEL,IAAA,IAAA,CAAK,cAAc,MACnB;AACI,MAAA,IAAI,CAAC,KAAK,SAAA,EACV;AACI,QAAA;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,aAAA,EAAc;AAGnB,MAAA,IAAA,CAAK,SAAA,GAAY,qBAAA,CAAsB,MAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,IAC9D,CAAA;AAEA,IAAA,IAAA,CAAK,gBAAgB,MACrB;AACI,MAAA,IAAI,KAAK,SAAA,EACT;AACI,QAAA,oBAAA,CAAqB,KAAK,SAAS,CAAA;AACnC,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,MACrB;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAK,SAAS,MACd;AACI,MAAA,IAAI,CAAC,KAAK,SAAA,EACV;AACI,QAAA;AAAA,MACJ;AAGA,MAAA,IAAA,CAAK,aAAA,EAAc;AAEnB,MAAA,IAAI,KAAA;AACJ,MAAA,IAAI,MAAA;AAGJ,MAAA,IAAI,IAAA,CAAK,SAAA,KAAc,UAAA,CAAW,MAAA,EAClC;AACI,QAAA,KAAA,GAAQ,UAAA,CAAW,UAAA;AACnB,QAAA,MAAA,GAAS,UAAA,CAAW,WAAA;AAAA,MACxB,CAAA,MAGA;AACI,QAAA,MAAM,EAAE,WAAA,EAAa,YAAA,EAAa,GAAI,IAAA,CAAK,SAAA;AAE3C,QAAA,KAAA,GAAQ,WAAA;AACR,QAAA,MAAA,GAAS,YAAA;AAAA,MACb;AAEA,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AAClC,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IAChB,CAAA;AAGA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,IAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,OAAA,GACd;AACI,IAAA,UAAA,CAAW,mBAAA,CAAoB,QAAA,EAAU,IAAA,CAAK,WAAW,CAAA;AACzD,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,EAClB;AACJ;AAAA;AAxHa,YAAA,CAGK,YAA+B,aAAA,CAAc,WAAA;;;;"}