{"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 app.ResizePlugin}.\n * @memberof app\n * @property {Window|HTMLElement} [resizeTo=window] - Element to automatically resize the renderer to.\n */\nexport interface ResizePluginOptions\n{\n    /**\n     * Element to automatically resize the renderer to.\n     * @memberof app.ApplicationOptions\n     */\n    resizeTo?: Window | HTMLElement;\n}\n\n/**\n * Middleware for Application's resize functionality.\n *\n * Adds the following methods to {@link app.Application}:\n * * {@link app.Application#resizeTo}\n * * {@link app.Application#resize}\n * * {@link app.Application#queueResize}\n * * {@link app.Application#cancelResize}\n * @example\n * import { extensions, ResizePlugin } from 'pixi.js';\n *\n * extensions.add(ResizePlugin);\n * @memberof app\n */\nexport class ResizePlugin\n{\n    /** @ignore */\n    public static extension: ExtensionMetadata = ExtensionType.Application;\n\n    public static resizeTo: Window | HTMLElement;\n    public static resize: () => void;\n    public static renderer: ResizeableRenderer;\n    public static queueResize: () => void;\n    public static render: () => void;\n    private static _resizeId: number;\n    private static _resizeTo: Window | HTMLElement;\n    private static _cancelResize: () => void;\n\n    /**\n     * Initialize the plugin with scope of application instance\n     * @static\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             * The HTML element or window to automatically resize the\n             * renderer's view element to match width and height.\n             * @member {Window|HTMLElement}\n             * @name resizeTo\n             * @memberof app.Application#\n             */\n            {\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        /**\n         * Resize is throttled, so it's safe to call this multiple times per frame and it'll\n         * only be called once.\n         * @memberof app.Application#\n         * @method queueResize\n         * @private\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        /**\n         * Cancel the resize queue.\n         * @memberof app.Application#\n         * @method cancelResize\n         * @private\n         */\n        this._cancelResize = (): void =>\n        {\n            if (this._resizeId)\n            {\n                cancelAnimationFrame(this._resizeId);\n                this._resizeId = null;\n            }\n        };\n\n        /**\n         * Execute an immediate resize on the renderer, this is not\n         * throttled and can be expensive to call many times in a row.\n         * Will resize only if `resizeTo` property is set.\n         * @memberof app.Application#\n         * @method resize\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     * @static\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":";;;AAmCO,MAAM,YACb,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBI,OAAc,KAAK,OACnB,EAAA;AACI,IAAO,MAAA,CAAA,cAAA;AAAA,MAAe,IAAA;AAAA,MAAM,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQxB;AAAA,QACI,IAAI,GACJ,EAAA;AACI,UAAW,UAAA,CAAA,mBAAA,CAAoB,QAAU,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AACzD,UAAA,IAAA,CAAK,SAAY,GAAA,GAAA,CAAA;AACjB,UAAA,IAAI,GACJ,EAAA;AACI,YAAW,UAAA,CAAA,gBAAA,CAAiB,QAAU,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AACtD,YAAA,IAAA,CAAK,MAAO,EAAA,CAAA;AAAA,WAChB;AAAA,SACJ;AAAA,QACA,GACA,GAAA;AACI,UAAA,OAAO,IAAK,CAAA,SAAA,CAAA;AAAA,SAChB;AAAA,OACJ;AAAA,KAAC,CAAA;AASL,IAAA,IAAA,CAAK,cAAc,MACnB;AACI,MAAI,IAAA,CAAC,KAAK,SACV,EAAA;AACI,QAAA,OAAA;AAAA,OACJ;AAEA,MAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAGnB,MAAA,IAAA,CAAK,SAAY,GAAA,qBAAA,CAAsB,MAAM,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,KAC9D,CAAA;AAQA,IAAA,IAAA,CAAK,gBAAgB,MACrB;AACI,MAAA,IAAI,KAAK,SACT,EAAA;AACI,QAAA,oBAAA,CAAqB,KAAK,SAAS,CAAA,CAAA;AACnC,QAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AAAA,OACrB;AAAA,KACJ,CAAA;AASA,IAAA,IAAA,CAAK,SAAS,MACd;AACI,MAAI,IAAA,CAAC,KAAK,SACV,EAAA;AACI,QAAA,OAAA;AAAA,OACJ;AAGA,MAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAEnB,MAAI,IAAA,KAAA,CAAA;AACJ,MAAI,IAAA,MAAA,CAAA;AAGJ,MAAI,IAAA,IAAA,CAAK,SAAc,KAAA,UAAA,CAAW,MAClC,EAAA;AACI,QAAA,KAAA,GAAQ,UAAW,CAAA,UAAA,CAAA;AACnB,QAAA,MAAA,GAAS,UAAW,CAAA,WAAA,CAAA;AAAA,OAIxB,MAAA;AACI,QAAA,MAAM,EAAE,WAAA,EAAa,YAAa,EAAA,GAAI,IAAK,CAAA,SAAA,CAAA;AAE3C,QAAQ,KAAA,GAAA,WAAA,CAAA;AACR,QAAS,MAAA,GAAA,YAAA,CAAA;AAAA,OACb;AAEA,MAAK,IAAA,CAAA,QAAA,CAAS,MAAO,CAAA,KAAA,EAAO,MAAM,CAAA,CAAA;AAClC,MAAA,IAAA,CAAK,MAAO,EAAA,CAAA;AAAA,KAChB,CAAA;AAGA,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AACjB,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AACjB,IAAK,IAAA,CAAA,QAAA,GAAW,QAAQ,QAAY,IAAA,IAAA,CAAA;AAAA,GACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,OACd,GAAA;AACI,IAAW,UAAA,CAAA,mBAAA,CAAoB,QAAU,EAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AACzD,IAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AACnB,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAA,CAAA;AACrB,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA,CAAA;AACnB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAChB,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AAAA,GAClB;AACJ,CAAA;AAAA;AA7Ia,YAAA,CAGK,YAA+B,aAAc,CAAA,WAAA;;;;"}