Библиотека aria-query предоставляет
мощные инструменты для работы с ARIA-атрибутами и ролями в DOM. Она
часто используется для валидации доступности компонентов, анализа
структуры интерфейса и создания инструментов, ориентированных на
доступность. Центральным элементом библиотеки является DOM
Map, который связывает роли, элементы и их атрибуты.
aria-queryБиблиотека предоставляет несколько ключевых коллекций:
elementRoles – карта HTML-элементов и
их возможных ARIA-ролей. Каждое имя элемента сопоставляется с набором
ролей.roleElements – обратная карта: для
каждой роли указаны допустимые HTML-элементы.roles – полный набор ARIA-ролей с
описанием их свойств и разрешённых состояний.attributes – описание ARIA-атрибутов и
их допустимых значений.Эти структуры реализованы через Map и
Set, что обеспечивает быстрый доступ и
проверку.
elementRoles и поиск
ролейimport { elementRoles } from 'aria-query';
const buttonRoles = elementRoles.get('button');
console.log(buttonRoles); // Set { 'button', 'menuitem', ... }
elementRoles позволяет определить, какие роли может
иметь конкретный HTML-элемент. Например, элемент
<div> может быть использован с ролью
button, если требуется кастомная кнопка.
Особенности:
<button>)
Set содержит только стандартную роль.<div>,
<span>) список ролей обширен.roleElements
и обратное соответствиеimport { roleElements } from 'aria-query';
const buttonElements = roleElements.get('button');
console.log(buttonElements); // Set { 'button', 'input', 'a', 'div', ... }
roleElements позволяет узнать, какие HTML-элементы могут
быть использованы для конкретной роли. Это удобно при динамическом
создании компонентов с соблюдением ARIA-стандартов.
Применение:
Коллекция roles содержит объекты с
описанием:
name – имя роли (button,
checkbox, dialog).superClass – список родительских
ролей.requiredProps – обязательные
ARIA-атрибуты.props – допустимые дополнительные
атрибуты.abstract – флаг, определяющий
абстрактные роли, которые не используются напрямую в DOM.Пример проверки обязательного атрибута:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.requiredProps); // Set { 'aria-pressed' } (если применимо)
Коллекция attributes описывает
ARIA-атрибуты, их типы и допустимые значения. Каждый атрибут представлен
объектом с полями:
type – тип данных
(boolean, tristate, token,
string).values – допустимые значения для
token-атрибутов.global – флаг, указывающий, что
атрибут может использоваться с любым элементом.Пример проверки:
import { attributes } from 'aria-query';
const ariaHidden = attributes.get('aria-hidden');
console.log(ariaHidden.type); // boolean
console.log(ariaHidden.global); // true
import { elementRoles } from 'aria-query';
function validateRole(element) {
const tagName = element.tagName.toLowerCase();
const role = element.getAttribute('role');
const validRoles = elementRoles.get(tagName);
return validRoles && validRoles.has(role);
}
Для кастомного <div> можно выбрать допустимую
роль:
const divRoles = elementRoles.get('div'); // Set { 'button', 'checkbox', ... }
element.setAttribute('role', [...divRoles][0]); // назначаем первую доступную роль
import { roles } from 'aria-query';
const checkboxProps = roles.get('checkbox').props;
console.log([...checkboxProps]); // список возможных ARIA-атрибутов
Все коллекции immutable и построены на
Map и Set, что обеспечивает:
O(1) для большинства операций).aria-query совместно с
eslint-plugin-jsx-a11y для React-проектов.elementRoles и roles.attributes при генерации интерфейсов.DOM Map библиотеки aria-query предоставляет точный,
структурированный и быстрый способ работы с ARIA-данными, позволяя
создавать доступные, стандартизированные компоненты и инструменты для
валидации интерфейсов.