Библиотека aria-query в JavaScript предназначена для
работы с ARIA-атрибутами и ролями, обеспечивая статический анализ и
валидацию доступности интерфейсов. Она предоставляет структурированные
данные о ARIA-ролях, состояниях и
свойствах, что позволяет создавать инструменты для
проверки доступности или генерации корректного ARIA-кода.
Основные экспорты библиотеки:
roles — объект, содержащий описание
всех ARIA-ролей.elementRoles — отображение
HTML-элементов на возможные ARIA-роли.roleValues — все допустимые значения
ролей и атрибутов.attributes — описание всех
ARIA-атрибутов и их допустимых значений.Библиотека не выполняет проверку DOM в реальном времени, а предоставляет статическую модель ARIA, что делает её идеальной для линтеров, тестов и генераторов кода.
Каждая роль в aria-query описывается объектом, который
включает:
abstract — логический флаг,
обозначающий, что роль абстрактная и не должна использоваться напрямую в
разметке.baseConcepts — массив объектов,
описывающих соответствие HTML-элементов и их стандартных семантик этой
роли.props — ARIA-свойства, которые можно
применять к этой роли.requiredProps — обязательные свойства
для корректного использования роли.superClass — список суперклассов роли
для построения иерархии ролей.Пример структуры роли button:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole);
/*
{
abstract: false,
baseConcepts: [{ name: 'button', attributes: [] }],
props: { 'aria-pressed': null },
requiredProps: [],
superClass: [['roletype', 'widget', 'command']]
}
*/
Ключевой момент: props и
requiredProps помогают линтерам выявлять ошибки, например
использование aria-pressed вне интерактивных элементов.
elementRoles — это карта соответствий элементов DOM и
ARIA-ролей. Она позволяет определить, какие роли могут быть назначены
конкретным элементам и какие значения считаются корректными.
import { elementRoles } from 'aria-query';
const divRoles = elementRoles.get('div');
console.log(divRoles);
/*
Set { 'button', 'checkbox', 'menuitem', ... }
*/
Особенности использования:
Set, что позволяет легко
проверять включение или исключение определённых ролей.elementRoles и roles даёт
полный контроль над семантикой элементов при динамическом создании
интерфейса.Библиотека предоставляет объект attributes, где для
каждого ARIA-атрибута указаны:
string, boolean,
tristate и др.).aria-live:
"off" | "polite" | "assertive").Пример проверки атрибута:
import { attributes } from 'aria-query';
const ariaLive = attributes.get('aria-live');
console.log(ariaLive);
/*
{
type: 'token',
values: ['off', 'polite', 'assertive'],
applicableRoles: ['alert', 'log', 'status']
}
*/
Важно: использование атрибута вне списка
applicableRoles считается ошибкой доступности.
Библиотека aria-query является ядром многих инструментов
проверки доступности, таких как eslint-plugin-jsx-a11y.
Она позволяет:
Пример простого валидатора роли для элемента:
import { elementRoles, roles } from 'aria-query';
function validateRole(elementName, roleName) {
const possibleRoles = elementRoles.get(elementName);
if (!possibleRoles || !possibleRoles.has(roleName)) {
return false;
}
const role = roles.get(roleName);
return !role.abstract;
}
console.log(validateRole('div', 'button')); // true
console.log(validateRole('span', 'menu')); // false
superClass роли задаёт иерархию, которая позволяет
понимать, какие свойства и состояния унаследованы.
Например, все виджеты (widget) поддерживают интерактивные
ARIA-свойства, а специализированные элементы, такие как
checkbox или radio, добавляют свои
собственные.
Использование суперклассов облегчает:
Библиотека предоставляет детальную модель ARIA, что делает её незаменимой для крупных проектов, где доступность и семантика интерфейса критически важны. Она служит мостом между стандартом WAI-ARIA и практическими инструментами разработки на JavaScript.