import { Component } from '@eva/eva.js'; import { ComponentChanged } from '@eva/eva.js'; import EE from 'eventemitter3'; import type { GameObject } from '@eva/eva.js'; import { System } from '@eva/eva.js'; import { Transform } from '@eva/eva.js'; /** * 无障碍组件(A11y/Accessibility) * * A11y 组件为游戏对象提供无障碍支持,使屏幕阅读器能够识别和朗读游戏内容。 * 它在游戏画布上方创建透明的 DOM 元素,携带 ARIA 属性,让视障用户也能使用游戏。 * * 主要功能: * - 提供屏幕阅读器可识别的文本标签 * - 支持 ARIA 角色和属性 * - 自动同步游戏对象的位置和尺寸 * - 支持交互事件的无障碍访问 * * @example * ```typescript * // 为游戏对象提供朗读能力 * const button = new GameObject('button'); * button.addComponent(new A11y({ * hint: '开始游戏按钮', * role: 'button' * })); * * // 带交互事件的无障碍元素 * button.addComponent(new A11y({ * hint: '点击开始游戏', * event: eventComponent * })); * ``` */ export declare class A11y extends Component { /** 组件名称 */ static componentName: string; /** 是否可交互 */ interactive: boolean; /** 屏幕阅读器朗读的文本内容 */ hint: string; /** * 事件组件对象 * @deprecated 已弃用,将根据 Event 组件自动添加 */ event: Component; /** DOM 元素延迟加载时间(毫秒) */ delay: number; /** ARIA role 属性,定义元素的角色(如 button、link 等) */ role: string; /** * ARIA value 属性集合 * @deprecated 已弃用,请将属性直接写在 component 上 * @example * aria-valuemin = "0" */ props: object; /** * ARIA state 属性集合 * @deprecated 已弃用,请将属性直接写在 component 上 * @example * aria-hidden = "true" */ state: object; /** * 自定义 DOM 属性 * @deprecated 已弃用,请将属性直接写在 component 上 */ attr: object; /** 辅助 DOM 元素的唯一 ID,自动生成 */ a11yId: string; /** * 构造无障碍组件 * * @param param - 无障碍组件配置参数 * @param param.hint - 屏幕阅读器朗读文本 * @param param.interactive - 是否可交互,默认 false * @param param.role - ARIA 角色属性 * @param param.event - 关联的事件组件(已弃用) * @param param.delay - DOM 延迟加载时间(毫秒) * @param param.props - ARIA value 属性(已弃用) * @param param.state - ARIA state 属性(已弃用) * @param param.attr - 自定义属性(已弃用) * * @example * ```typescript * // 简单文本朗读 * new A11y({ hint: '这是一个图片' }) * * // 可交互按钮 * new A11y({ * hint: '开始游戏', * role: 'button', * interactive: true * }) * * // 带 ARIA 属性 * new A11y({ * hint: '进度条', * role: 'progressbar', * 'aria-valuemin': '0', * 'aria-valuemax': '100', * 'aria-valuenow': '50' * }) * ``` */ constructor(param: A11yParams); } export declare enum A11yActivate { ENABLE = 0, DISABLE = 1, CHECK = 2 } declare interface A11yParams { hint: string; event?: Component; delay?: number; role?: string; props?: object; state?: object; attr?: object; a11yId?: string; [propName: string]: string | object | number; } /** * 无障碍系统(A11y System) * * A11ySystem 管理游戏中所有无障碍组件,在游戏画布上方创建无障碍覆盖层。 * 它会自动将游戏对象的位置、尺寸同步到对应的 DOM 元素上, * 并处理与屏幕阅读器的交互。 * * 主要功能: * - 创建和管理无障碍 DOM 覆盖层 * - 同步游戏对象的变换到 DOM 元素 * - 处理无障碍元素的事件绑定 * - 支持调试模式(可视化无障碍区域) * - 自动检测或手动配置无障碍功能开关 * * @example * ```typescript * // 自动检测系统读屏功能 * game.addSystem(new A11ySystem()); * * // 开启调试模式 * game.addSystem(new A11ySystem({ debug: true })); * * // 强制启用无障碍功能 * game.addSystem(new A11ySystem({ * activate: A11yActivate.ENABLE, * zIndex: 10000 * })); * ``` */ export declare class A11ySystem extends System { /** 系统名称 */ static systemName: string; /** 无障碍覆盖层容器 */ div: HTMLDivElement; /** 是否开启调试模式(显示无障碍区域背景色) */ debug: boolean; /** 画布横向缩放比例 */ _ratioX: number; /** 画布纵向缩放比例 */ _ratioY: number; /** 当前事件触发的坐标位置 */ eventPosition: EventPosition; /** 是否启用无障碍功能 */ activate: boolean; /** DOM 元素延迟放置时间(毫秒) */ delay: number; /** 无障碍 DOM 元素缓存 */ cache: Map; /** 事件处理函数缓存 */ eventCache: Map void>; /** 无障碍覆盖层的 z-index 值 */ zIndex: number; /** * 构造无障碍系统 * * @param opt - 系统配置选项 * @param opt.debug - 是否开启调试模式,默认 false * @param opt.activate - 无障碍功能开关模式,默认 CHECK(自动检测) * @param opt.delay - DOM 元素延迟创建时间(毫秒),默认 100 * @param opt.zIndex - 覆盖层的 z-index,默认 10000 * @param opt.checkA11yOpen - 自定义检测无障碍功能是否开启的函数 * * @example * ```typescript * // 开启调试,无障碍区域会显示红色透明背景 * new A11ySystem({ debug: true }) * * // 禁用无障碍功能 * new A11ySystem({ activate: A11yActivate.DISABLE }) * * // 自定义检测逻辑 * new A11ySystem({ * checkA11yOpen: async () => { * return await isScreenReaderActive(); * } * }) * ``` */ constructor(opt?: SystemParam); get ratioX(): number; get ratioY(): number; init(opt?: SystemParam): Promise; setRatio(): boolean; getRenderRect(): { renderWidth: number; renderHeight: number; }; getCanvasBoundingClientRect(): { width: number; height: number; left: number; top: number; }; initDiv(): void; /** * 监听插件更新 */ update(): Promise; change(changed: ComponentChanged): void; remove(changed: ComponentChanged): void; /** * 监听组件被添加至游戏对象 * @param changed 改变的组件 */ add(changed: ComponentChanged): void; transformChange(changed: ComponentChanged): void; /** * 为无障碍组件设置监听事件 * @param element DOM 元素 * @param event 事件组件对象 * @param gameObject 游戏对象 */ setEvent(element: HTMLElement, event: EE, gameObject: GameObject, id: any): void; addEvent(gameObject: GameObject): void; removeEvent(changed: ComponentChanged): void; /** * 设置无障碍属性标签 * @param element DOM 元素 * @param hint 无障碍朗读文字 * @param interactive 是否可交互 */ setA11yAttr(element: HTMLElement, component: A11y): void; /** * 将无障碍元素设置到对应的位置 * @param element DOM 元素 * @param transform 位置属性 */ setPosition(element: HTMLElement, transform: Transform): void; onDestroy(): void; } /** * 点击事件位置 */ declare interface EventPosition { x: number; y: number; } declare interface SystemParam { debug?: boolean; activate?: A11yActivate; delay?: number; zIndex?: number; checkA11yOpen?: () => Promise; } export { }