{"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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"}