pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 44.2 kB
Source Map (JSON)
{"version":3,"file":"AccessibilitySystem.mjs","sources":["../../src/accessibility/AccessibilitySystem.ts"],"sourcesContent":["import { 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 _pool: 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\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 * The DOM element that will sit over the PixiJS element. This is where the div overlays will go.\n * @readonly\n */\n get hookDiv()\n {\n return this._hookDiv;\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.width = `${DIV_TOUCH_SIZE}px`;\n this._div.style.height = `${DIV_TOUCH_SIZE}px`;\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.zIndex = DIV_TOUCH_ZINDEX.toString();\n this._div.style.pointerEvents = 'none';\n }\n\n // Bind event handlers and add listeners when activating\n if (this._activateOnTab)\n {\n this._onKeyDown = this._onKeyDown.bind(this);\n globalThis.addEventListener('keydown', this._onKeyDown, false);\n }\n\n if (this._deactivateOnMouseMove)\n {\n this._onMouseMove = this._onMouseMove.bind(this);\n globalThis.document.addEventListener('mousemove', this._onMouseMove, 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 canvas.parentNode.appendChild(this._div);\n observer.disconnect();\n\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 canvas.parentNode.appendChild(this._div);\n\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._onMouseMove, true);\n if (this._activateOnTab)\n {\n globalThis.addEventListener('keydown', this._onKeyDown, 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 && 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 this._pool.forEach((div) =>\n {\n if (div.parentNode)\n {\n div.parentNode.removeChild(div);\n }\n });\n\n // Remove parent div from DOM\n if (this._div && this._div.parentNode)\n {\n this._div.parentNode.removeChild(this._div);\n }\n\n this._pool = [];\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 else if (this._activateOnTab)\n {\n this._onKeyDown = this._onKeyDown.bind(this);\n globalThis.addEventListener('keydown', this._onKeyDown, false);\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 {\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 this._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 const { x, y, width: viewWidth, height: viewHeight } = this._renderer.screen;\n const div = this._div;\n\n div.style.left = `${x}px`;\n div.style.top = `${y}px`;\n div.style.width = `${viewWidth}px`;\n div.style.height = `${viewHeight}px`;\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 const sx = this._renderer.resolution;\n const sy = this._renderer.resolution;\n\n div.style.left = `${(wt.tx + (hitArea.x * wt.a)) * sx}px`;\n div.style.top = `${(wt.ty + (hitArea.y * wt.d)) * sy}px`;\n div.style.width = `${hitArea.width * wt.a * sx}px`;\n div.style.height = `${hitArea.height * wt.d * sy}px`;\n }\n else\n {\n this._capHitArea(hitArea);\n const sx = this._renderer.resolution;\n const sy = this._renderer.resolution;\n\n div.style.left = `${hitArea.x * sx}px`;\n div.style.top = `${hitArea.y * sy}px`;\n div.style.width = `${hitArea.width * sx}px`;\n div.style.height = `${hitArea.height * sy}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 let div = this._pool.pop();\n\n if (!div)\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 (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 if (container.interactive)\n {\n container._accessibleDiv.tabIndex = container.tabIndex;\n }\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._div = null;\n this._pool = null;\n this._children = null;\n this._renderer = null;\n\n if (this._activateOnTab)\n {\n globalThis.removeEventListener('keydown', this._onKeyDown);\n }\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"],"names":["type"],"mappings":"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"}