{"version":3,"file":"AccessibilitySystem.mjs","sources":["../../src/accessibility/AccessibilitySystem.ts"],"sourcesContent":["/* eslint-disable no-restricted-globals */\nimport { CanvasObserver } from '../dom/CanvasObserver';\nimport { FederatedEvent } from '../events/FederatedEvent';\nimport { ExtensionType } from '../extensions/Extensions';\nimport { isMobile } from '../utils/browser/isMobile';\nimport { removeItems } from '../utils/data/removeItems';\nimport { type AccessibleHTMLElement } from './accessibilityTarget';\n\nimport type { Rectangle } from '../maths/shapes/Rectangle';\nimport type { System } from '../rendering/renderers/shared/system/System';\nimport type { Renderer } from '../rendering/renderers/types';\nimport type { Container } from '../scene/container/Container';\nimport type { isMobileResult } from '../utils/browser/isMobile';\n\n/** @ignore */\nconst KEY_CODE_TAB = 9;\n\nconst DIV_TOUCH_SIZE = 100;\nconst DIV_TOUCH_POS_X = 0;\nconst DIV_TOUCH_POS_Y = 0;\nconst DIV_TOUCH_ZINDEX = 2;\n\nconst DIV_HOOK_SIZE = 1;\nconst DIV_HOOK_POS_X = -1000;\nconst DIV_HOOK_POS_Y = -1000;\nconst DIV_HOOK_ZINDEX = 2;\n\n/**\n * Initialisation options for the accessibility system when used with an Application.\n * @category accessibility\n * @advanced\n */\nexport interface AccessibilitySystemOptions\n{\n    /** Options for the accessibility system */\n    accessibilityOptions?: AccessibilityOptions;\n}\n\n/**\n * The options for the accessibility system.\n * @category accessibility\n * @advanced\n */\nexport interface AccessibilityOptions\n{\n    /** Whether to enable accessibility features on initialization instead of waiting for tab key */\n    enabledByDefault?: boolean;\n    /** Whether to visually show the accessibility divs for debugging */\n    debug?: boolean;\n    /** Whether to allow tab key press to activate accessibility features */\n    activateOnTab?: boolean;\n    /** Whether to deactivate accessibility when mouse moves */\n    deactivateOnMouseMove?: boolean;\n}\n\n/**\n * The Accessibility system provides screen reader and keyboard navigation support for PixiJS content.\n * It creates an accessible DOM layer over the canvas that can be controlled programmatically or through user interaction.\n *\n * By default, the system activates when users press the tab key. This behavior can be customized through options:\n * ```js\n * const app = new Application({\n *     accessibilityOptions: {\n *     // Enable immediately instead of waiting for tab\n *     enabledByDefault: true,\n *     // Disable tab key activation\n *     activateOnTab: false,\n *     // Show/hide accessibility divs\n *     debug: false,\n *     // Prevent accessibility from being deactivated when mouse moves\n *     deactivateOnMouseMove: false,\n * }\n * });\n * ```\n *\n * The system can also be controlled programmatically by accessing the `renderer.accessibility` property:\n * ```js\n * app.renderer.accessibility.setAccessibilityEnabled(true);\n * ```\n *\n * To make individual containers accessible:\n * ```js\n * container.accessible = true;\n * ```\n * There are several properties that can be set on a Container to control its accessibility which can\n * be found here: {@link AccessibleOptions}.\n * @category accessibility\n * @standard\n */\nexport class AccessibilitySystem implements System<AccessibilitySystemOptions>\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGLSystem,\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'accessibility',\n    } as const;\n\n    /**\n     * The default options used by the system.\n     * You can set these before initializing the {@link Application} to change the default behavior.\n     * @example\n     * ```js\n     * import { AccessibilitySystem } from 'pixi.js';\n     *\n     * AccessibilitySystem.defaultOptions.enabledByDefault = true;\n     *\n     * const app = new Application()\n     * app.init()\n     * ```\n     */\n    public static defaultOptions: AccessibilityOptions = {\n        /**\n         * Whether to enable accessibility features on initialization\n         * @default false\n         */\n        enabledByDefault: false,\n        /**\n         * Whether to visually show the accessibility divs for debugging\n         * @default false\n         */\n        debug: false,\n        /**\n         * Whether to activate accessibility when tab key is pressed\n         * @default true\n         */\n        activateOnTab: true,\n        /**\n         * Whether to deactivate accessibility when mouse moves\n         * @default true\n         */\n        deactivateOnMouseMove: true,\n    };\n\n    /** Whether accessibility divs are visible for debugging */\n    public debug = false;\n\n    /** Whether to activate on tab key press */\n    private _activateOnTab = true;\n\n    /** Whether to deactivate accessibility when mouse moves */\n    private _deactivateOnMouseMove = true;\n\n    /**\n     * The renderer this accessibility manager works for.\n     * @type {WebGLRenderer|WebGPURenderer}\n     */\n    private _renderer: Renderer;\n\n    /** Internal variable, see isActive getter. */\n    private _isActive = false;\n\n    /** Internal variable, see isMobileAccessibility getter. */\n    private _isMobileAccessibility = false;\n\n    /** Button element for handling touch hooks. */\n    private _hookDiv: HTMLElement | null;\n\n    /** This is the dom element that will sit over the PixiJS element. This is where the div overlays will go. */\n    private _div: HTMLElement | null = null;\n\n    /** A simple pool for storing divs. */\n    private _pools: Record<string, AccessibleHTMLElement[]> = {};\n\n    /** This is a tick used to check if an object is no longer being rendered. */\n    private _renderId = 0;\n\n    /** The array of currently active accessible items. */\n    private _children: Container[] = [];\n\n    /** Count to throttle div updates on android devices. */\n    private _androidUpdateCount = 0;\n\n    /**  The frequency to update the div elements. */\n    private readonly _androidUpdateFrequency = 500; // 2fps\n    private _canvasObserver: CanvasObserver;\n\n    // eslint-disable-next-line @typescript-eslint/prefer-readonly\n    private _isRunningTests: boolean = false;\n\n    /** Bound function references for proper event listener removal */\n    private _boundOnKeyDown: (e: KeyboardEvent) => void = this._onKeyDown.bind(this);\n    private _boundOnMouseMove: (e: MouseEvent) => void = this._onMouseMove.bind(this);\n\n    // eslint-disable-next-line jsdoc/require-param\n    /**\n     * @param {WebGLRenderer|WebGPURenderer} renderer - A reference to the current renderer\n     */\n    constructor(renderer: Renderer, private readonly _mobileInfo: isMobileResult = isMobile)\n    {\n        this._hookDiv = null;\n\n        if (_mobileInfo.tablet || _mobileInfo.phone)\n        {\n            this._createTouchHook();\n        }\n\n        this._renderer = renderer;\n    }\n\n    /**\n     * Value of `true` if accessibility is currently active and accessibility layers are showing.\n     * @type {boolean}\n     * @readonly\n     */\n    get isActive(): boolean\n    {\n        return this._isActive;\n    }\n\n    /**\n     * Value of `true` if accessibility is enabled for touch devices.\n     * @type {boolean}\n     * @readonly\n     */\n    get isMobileAccessibility(): boolean\n    {\n        return this._isMobileAccessibility;\n    }\n\n    /**\n     * Button element for handling touch hooks.\n     * @readonly\n     */\n    get hookDiv()\n    {\n        return this._hookDiv;\n    }\n\n    /**\n     * The DOM element that will sit over the PixiJS element. This is where the div overlays will go.\n     * @readonly\n     */\n    get div()\n    {\n        return this._div;\n    }\n\n    /**\n     * Creates the touch hooks.\n     * @private\n     */\n    private _createTouchHook(): void\n    {\n        const hookDiv = document.createElement('button');\n\n        hookDiv.style.width = `${DIV_HOOK_SIZE}px`;\n        hookDiv.style.height = `${DIV_HOOK_SIZE}px`;\n        hookDiv.style.position = 'absolute';\n        hookDiv.style.top = `${DIV_HOOK_POS_X}px`;\n        hookDiv.style.left = `${DIV_HOOK_POS_Y}px`;\n        hookDiv.style.zIndex = DIV_HOOK_ZINDEX.toString();\n        hookDiv.style.backgroundColor = '#FF0000';\n        hookDiv.title = 'select to enable accessibility for this content';\n\n        hookDiv.addEventListener('focus', () =>\n        {\n            this._isMobileAccessibility = true;\n            this._activate();\n            this._destroyTouchHook();\n        });\n\n        document.body.appendChild(hookDiv);\n        this._hookDiv = hookDiv;\n    }\n\n    /**\n     * Destroys the touch hooks.\n     * @private\n     */\n    private _destroyTouchHook(): void\n    {\n        if (!this._hookDiv)\n        {\n            return;\n        }\n        document.body.removeChild(this._hookDiv);\n        this._hookDiv = null;\n    }\n\n    /**\n     * Activating will cause the Accessibility layer to be shown.\n     * This is called when a user presses the tab key.\n     * @private\n     */\n    private _activate(): void\n    {\n        if (this._isActive)\n        {\n            return;\n        }\n\n        this._isActive = true;\n\n        // Create and add div if needed\n        if (!this._div)\n        {\n            this._div = document.createElement('div');\n            this._div.style.position = 'absolute';\n            this._div.style.top = `${DIV_TOUCH_POS_X}px`;\n            this._div.style.left = `${DIV_TOUCH_POS_Y}px`;\n            this._div.style.pointerEvents = 'none';\n            this._div.style.zIndex = DIV_TOUCH_ZINDEX.toString();\n\n            // Initialize the CanvasTransformSync to keep the DOM element in sync with the canvas\n            this._canvasObserver = new CanvasObserver({\n                domElement: this._div,\n                renderer: this._renderer,\n            });\n        }\n\n        // Add listeners using the stored bound references\n        if (this._activateOnTab)\n        {\n            globalThis.addEventListener('keydown', this._boundOnKeyDown, false);\n        }\n\n        if (this._deactivateOnMouseMove)\n        {\n            globalThis.document.addEventListener('mousemove', this._boundOnMouseMove, true);\n        }\n\n        // Check if canvas is in DOM\n        const canvas = this._renderer.view.canvas;\n\n        if (!canvas.parentNode)\n        {\n            const observer = new MutationObserver(() =>\n            {\n                if (canvas.parentNode)\n                {\n                    observer.disconnect();\n\n                    // Add to DOM\n                    this._canvasObserver.ensureAttached();\n                    // Only start the postrender runner after div is ready\n                    this._initAccessibilitySetup();\n                }\n            });\n\n            observer.observe(document.body, { childList: true, subtree: true });\n        }\n        else\n        {\n            // Add to DOM\n            this._canvasObserver.ensureAttached();\n            // Div is ready, initialize accessibility\n            this._initAccessibilitySetup();\n        }\n    }\n\n    // New method to handle initialization after div is ready\n    private _initAccessibilitySetup(): void\n    {\n        // Add the postrender runner to start processing accessible objects\n        this._renderer.runners.postrender.add(this);\n\n        // Force an initial update of accessible objects\n        if (this._renderer.lastObjectRendered)\n        {\n            this._updateAccessibleObjects(this._renderer.lastObjectRendered as Container);\n        }\n    }\n\n    /**\n     * Deactivates the accessibility system. Removes listeners and accessibility elements.\n     * @private\n     */\n    private _deactivate(): void\n    {\n        if (!this._isActive || this._isMobileAccessibility)\n        {\n            return;\n        }\n\n        this._isActive = false;\n\n        // Switch listeners\n        globalThis.document.removeEventListener('mousemove', this._boundOnMouseMove, true);\n        if (this._activateOnTab)\n        {\n            globalThis.addEventListener('keydown', this._boundOnKeyDown, false);\n        }\n\n        this._renderer.runners.postrender.remove(this);\n\n        // Remove all active accessibility elements\n        for (const child of this._children)\n        {\n            if (child._accessibleDiv?.parentNode)\n            {\n                child._accessibleDiv.parentNode.removeChild(child._accessibleDiv);\n                child._accessibleDiv = null;\n            }\n            child._accessibleActive = false;\n        }\n\n        // Clear the pool of divs\n        for (const accessibleType in this._pools)\n        {\n            const pool = this._pools[accessibleType];\n\n            pool.forEach((div) =>\n            {\n                if (div.parentNode)\n                {\n                    div.parentNode.removeChild(div);\n                }\n            });\n            delete this._pools[accessibleType];\n        }\n\n        // Remove parent div from DOM\n        if (this._div?.parentNode)\n        {\n            this._div.parentNode.removeChild(this._div);\n        }\n\n        this._pools = {};\n        this._children = [];\n    }\n\n    /**\n     * This recursive function will run through the scene graph and add any new accessible objects to the DOM layer.\n     * @private\n     * @param {Container} container - The Container to check.\n     */\n    private _updateAccessibleObjects(container: Container): void\n    {\n        if (!container.visible || !container.accessibleChildren)\n        {\n            return;\n        }\n\n        // Separate check for accessibility without requiring interactivity\n        if (container.accessible)\n        {\n            if (!container._accessibleActive)\n            {\n                this._addChild(container);\n            }\n\n            container._renderId = this._renderId;\n        }\n\n        const children = container.children;\n\n        if (children)\n        {\n            for (let i = 0; i < children.length; i++)\n            {\n                this._updateAccessibleObjects(children[i] as Container);\n            }\n        }\n    }\n\n    /**\n     * Runner init called, view is available at this point.\n     * @ignore\n     */\n    public init(options?: AccessibilitySystemOptions): void\n    {\n        // Ensure we have the accessibilityOptions object\n        const defaultOpts = AccessibilitySystem.defaultOptions;\n        const mergedOptions = {\n            accessibilityOptions: {\n                ...defaultOpts,\n                ...(options?.accessibilityOptions || {})\n            }\n        };\n\n        this.debug = mergedOptions.accessibilityOptions.debug;\n        this._activateOnTab = mergedOptions.accessibilityOptions.activateOnTab;\n        this._deactivateOnMouseMove = mergedOptions.accessibilityOptions.deactivateOnMouseMove;\n\n        if (mergedOptions.accessibilityOptions.enabledByDefault)\n        {\n            this._activate();\n        }\n\n        this._renderer.runners.postrender.remove(this);\n    }\n\n    /**\n     * Updates the accessibility layer during rendering.\n     * - Removes divs for containers no longer in the scene\n     * - Updates the position and dimensions of the root div\n     * - Updates positions of active accessibility divs\n     * Only fires while the accessibility system is active.\n     * @ignore\n     */\n    public postrender(): void\n    {\n        /* On Android default web browser, tab order seems to be calculated by position rather than tabIndex,\n        *  moving buttons can cause focus to flicker between two buttons making it hard/impossible to navigate,\n        *  so I am just running update every half a second, seems to fix it.\n        */\n        const now = performance.now();\n\n        if (this._mobileInfo.android.device && now < this._androidUpdateCount)\n        {\n            return;\n        }\n\n        this._androidUpdateCount = now + this._androidUpdateFrequency;\n\n        if ((!this._renderer.renderingToScreen || !this._renderer.view.canvas)\n            && !this._isRunningTests)\n        {\n            return;\n        }\n\n        // Track which containers are still active this frame\n        const activeIds = new Set<number>();\n\n        if (this._renderer.lastObjectRendered)\n        {\n            this._updateAccessibleObjects(this._renderer.lastObjectRendered as Container);\n\n            // Mark all updated containers as active\n            for (const child of this._children)\n            {\n                if (child._renderId === this._renderId)\n                {\n                    activeIds.add(this._children.indexOf(child));\n                }\n            }\n        }\n\n        // Remove any containers that weren't updated this frame\n        for (let i = this._children.length - 1; i >= 0; i--)\n        {\n            const child = this._children[i];\n\n            if (!activeIds.has(i))\n            {\n                // Container was removed, clean up its accessibility div\n                if (child._accessibleDiv && child._accessibleDiv.parentNode)\n                {\n                    child._accessibleDiv.parentNode.removeChild(child._accessibleDiv);\n\n                    const pool = this._getPool(child.accessibleType);\n\n                    pool.push(child._accessibleDiv);\n                    child._accessibleDiv = null;\n                }\n                child._accessibleActive = false;\n                removeItems(this._children, i, 1);\n            }\n        }\n\n        // Update root div dimensions if needed\n        if (this._renderer.renderingToScreen)\n        {\n            // Ensure the main DOM element is attached to the same parent as the canvas\n            this._canvasObserver.ensureAttached();\n        }\n\n        // Update positions of existing divs\n        for (let i = 0; i < this._children.length; i++)\n        {\n            const child = this._children[i];\n\n            if (!child._accessibleActive || !child._accessibleDiv)\n            {\n                continue;\n            }\n\n            // Only update position-related properties\n            const div = child._accessibleDiv;\n            const hitArea = (child.hitArea || child.getBounds().rectangle) as Rectangle;\n\n            if (child.hitArea)\n            {\n                const wt = child.worldTransform;\n\n                div.style.left = `${(wt.tx + (hitArea.x * wt.a))}px`;\n                div.style.top = `${(wt.ty + (hitArea.y * wt.d))}px`;\n                div.style.width = `${hitArea.width * wt.a}px`;\n                div.style.height = `${hitArea.height * wt.d}px`;\n            }\n            else\n            {\n                this._capHitArea(hitArea);\n                div.style.left = `${hitArea.x}px`;\n                div.style.top = `${hitArea.y}px`;\n                div.style.width = `${hitArea.width}px`;\n                div.style.height = `${hitArea.height}px`;\n            }\n        }\n\n        // increment the render id..\n        this._renderId++;\n    }\n\n    /**\n     * private function that will visually add the information to the\n     * accessibility div\n     * @param {HTMLElement} div -\n     */\n    private _updateDebugHTML(div: AccessibleHTMLElement): void\n    {\n        div.innerHTML = `type: ${div.type}</br> title : ${div.title}</br> tabIndex: ${div.tabIndex}`;\n    }\n\n    /**\n     * Adjust the hit area based on the bounds of a display object\n     * @param {Rectangle} hitArea - Bounds of the child\n     */\n    private _capHitArea(hitArea: Rectangle): void\n    {\n        if (hitArea.x < 0)\n        {\n            hitArea.width += hitArea.x;\n            hitArea.x = 0;\n        }\n\n        if (hitArea.y < 0)\n        {\n            hitArea.height += hitArea.y;\n            hitArea.y = 0;\n        }\n\n        const { width: viewWidth, height: viewHeight } = this._renderer;\n\n        if (hitArea.x + hitArea.width > viewWidth)\n        {\n            hitArea.width = viewWidth - hitArea.x;\n        }\n\n        if (hitArea.y + hitArea.height > viewHeight)\n        {\n            hitArea.height = viewHeight - hitArea.y;\n        }\n    }\n\n    /**\n     * Creates or reuses a div element for a Container and adds it to the accessibility layer.\n     * Sets up ARIA attributes, event listeners, and positioning based on the container's properties.\n     * @private\n     * @param {Container} container - The child to make accessible.\n     */\n    private _addChild<T extends Container>(container: T): void\n    {\n        const pool = this._getPool(container.accessibleType);\n\n        let div = pool.pop();\n\n        if (div)\n        {\n            /*\n             * Reset these properties so we don't have outdated metadata.\n             * It was possible to end up with:\n             * - the old tabIndex if container.interactive is false\n             * - the old aria-label if container.accessibleHint is not set\n             */\n            div.innerHTML = '';\n            div.removeAttribute('title');\n            div.removeAttribute('aria-label');\n            div.tabIndex = 0;\n        }\n        else\n        {\n            if (container.accessibleType === 'button')\n            {\n                div = document.createElement('button');\n            }\n            else\n            {\n                div = document.createElement(container.accessibleType);\n                div.style.cssText = `\n                        color: transparent;\n                        pointer-events: none;\n                        padding: 0;\n                        margin: 0;\n                        border: 0;\n                        outline: 0;\n                        background: transparent;\n                        box-sizing: border-box;\n                        user-select: none;\n                        -webkit-user-select: none;\n                        -moz-user-select: none;\n                        -ms-user-select: none;\n                    `;\n                if (container.accessibleText)\n                {\n                    div.innerText = container.accessibleText;\n                }\n            }\n            div.style.width = `${DIV_TOUCH_SIZE}px`;\n            div.style.height = `${DIV_TOUCH_SIZE}px`;\n            div.style.backgroundColor = this.debug ? 'rgba(255,255,255,0.5)' : 'transparent';\n            div.style.position = 'absolute';\n            div.style.zIndex = DIV_TOUCH_ZINDEX.toString();\n            div.style.borderStyle = 'none';\n\n            // ARIA attributes ensure that button title and hint updates are announced properly\n            if (navigator.userAgent.toLowerCase().includes('chrome'))\n            {\n                // Chrome doesn't need aria-live to work as intended; in fact it just gets more confused.\n                div.setAttribute('aria-live', 'off');\n            }\n            else\n            {\n                div.setAttribute('aria-live', 'polite');\n            }\n\n            if (navigator.userAgent.match(/rv:.*Gecko\\//))\n            {\n                // FireFox needs this to announce only the new button name\n                div.setAttribute('aria-relevant', 'additions');\n            }\n            else\n            {\n                // required by IE, other browsers don't much care\n                div.setAttribute('aria-relevant', 'text');\n            }\n\n            div.addEventListener('click', this._onClick.bind(this));\n            div.addEventListener('focus', this._onFocus.bind(this));\n            div.addEventListener('focusout', this._onFocusOut.bind(this));\n        }\n\n        // set pointer events\n        div.style.pointerEvents = container.accessiblePointerEvents;\n        // set the type, this defaults to button!\n        div.type = container.accessibleType;\n\n        if (container.accessibleTitle && container.accessibleTitle !== null)\n        {\n            div.title = container.accessibleTitle;\n        }\n        else if (!container.accessibleHint\n            || container.accessibleHint === null)\n        {\n            div.title = `container ${container.tabIndex}`;\n        }\n\n        if (container.accessibleHint\n            && container.accessibleHint !== null)\n        {\n            div.setAttribute('aria-label', container.accessibleHint);\n        }\n\n        if (container.interactive)\n        {\n            div.tabIndex = container.tabIndex;\n        }\n        else\n        {\n            // reset tabIndex back to 0 in case this div instance was pulled from the pool and already had a value\n            div.tabIndex = 0;\n        }\n\n        if (this.debug)\n        {\n            this._updateDebugHTML(div);\n        }\n\n        container._accessibleActive = true;\n        container._accessibleDiv = div;\n        div.container = container;\n\n        this._children.push(container);\n        this._div.appendChild(container._accessibleDiv);\n    }\n\n    /**\n     * Dispatch events with the EventSystem.\n     * @param e\n     * @param type\n     * @private\n     */\n    private _dispatchEvent(e: UIEvent, type: string[]): void\n    {\n        const { container: target } = e.target as AccessibleHTMLElement;\n        const boundary = this._renderer.events.rootBoundary;\n        const event: FederatedEvent = Object.assign(new FederatedEvent(boundary), { target });\n\n        boundary.rootTarget = this._renderer.lastObjectRendered as Container;\n        type.forEach((type) => boundary.dispatchEvent(event, type));\n    }\n\n    /**\n     * Maps the div button press to pixi's EventSystem (click)\n     * @private\n     * @param {MouseEvent} e - The click event.\n     */\n    private _onClick(e: MouseEvent): void\n    {\n        this._dispatchEvent(e, ['click', 'pointertap', 'tap']);\n    }\n\n    /**\n     * Maps the div focus events to pixi's EventSystem (mouseover)\n     * @private\n     * @param {FocusEvent} e - The focus event.\n     */\n    private _onFocus(e: FocusEvent): void\n    {\n        if (!(e.target as Element).getAttribute('aria-live'))\n        {\n            (e.target as Element).setAttribute('aria-live', 'assertive');\n        }\n\n        this._dispatchEvent(e, ['mouseover']);\n    }\n\n    /**\n     * Maps the div focus events to pixi's EventSystem (mouseout)\n     * @private\n     * @param {FocusEvent} e - The focusout event.\n     */\n    private _onFocusOut(e: FocusEvent): void\n    {\n        if (!(e.target as Element).getAttribute('aria-live'))\n        {\n            (e.target as Element).setAttribute('aria-live', 'polite');\n        }\n\n        this._dispatchEvent(e, ['mouseout']);\n    }\n\n    /**\n     * Is called when a key is pressed\n     * @private\n     * @param {KeyboardEvent} e - The keydown event.\n     */\n    private _onKeyDown(e: KeyboardEvent): void\n    {\n        if (e.keyCode !== KEY_CODE_TAB || !this._activateOnTab)\n        {\n            return;\n        }\n\n        this._activate();\n    }\n\n    /**\n     * Is called when the mouse moves across the renderer element\n     * @private\n     * @param {MouseEvent} e - The mouse event.\n     */\n    private _onMouseMove(e: MouseEvent): void\n    {\n        if (e.movementX === 0 && e.movementY === 0)\n        {\n            return;\n        }\n\n        this._deactivate();\n    }\n\n    /**\n     * Destroys the accessibility system. Removes all elements and listeners.\n     * > [!IMPORTANT] This is typically called automatically when the {@link Application} is destroyed.\n     * > A typically user should not need to call this method directly.\n     */\n    public destroy(): void\n    {\n        this._deactivate();\n        this._destroyTouchHook();\n\n        this._canvasObserver?.destroy();\n        this._canvasObserver = null;\n\n        this._div = null;\n        this._pools = null;\n        this._children = null;\n        this._renderer = null;\n        this._hookDiv = null;\n\n        // Remove listeners using the stored bound references\n        globalThis.removeEventListener('keydown', this._boundOnKeyDown);\n        this._boundOnKeyDown = null;\n        globalThis.document.removeEventListener('mousemove', this._boundOnMouseMove, true);\n        this._boundOnMouseMove = null;\n    }\n\n    /**\n     * Enables or disables the accessibility system.\n     * @param enabled - Whether to enable or disable accessibility.\n     * @example\n     * ```js\n     * app.renderer.accessibility.setAccessibilityEnabled(true); // Enable accessibility\n     * app.renderer.accessibility.setAccessibilityEnabled(false); // Disable accessibility\n     * ```\n     */\n    public setAccessibilityEnabled(enabled: boolean): void\n    {\n        if (enabled)\n        {\n            this._activate();\n        }\n        else\n        {\n            this._deactivate();\n        }\n    }\n\n    private _getPool(accessibleType: string): AccessibleHTMLElement[]\n    {\n        if (!this._pools[accessibleType])\n        {\n            this._pools[accessibleType] = [];\n        }\n\n        return this._pools[accessibleType];\n    }\n}\n"],"names":["type"],"mappings":"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"}