Библиотека aria-query предназначена для работы с
ARIA-ролями и свойствами в контексте веб-разработки. Она предоставляет
структурированные данные о ролях, их свойствах и допустимых дочерних
элементах, что облегчает создание доступного интерфейса. В основе лежат
два ключевых объекта: roles и
elementRoles.
Каждая роль представлена как объект с такими ключами, как
name, abstract, requiredProps,
props, superClass,
childRoles.
Объект роли содержит следующие важные поля:
Пример:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.props);
console.log(buttonRole.requiredProps);
console.log(buttonRole.childRoles);
Это позволяет программно проверять соответствие элементов спецификации ARIA и предотвращать ошибки доступности.
elementRoles представляет собой Map,
где ключи — HTML-теги, а значения — массив ролей, которые можно на них
применять. Это критично для генерации и проверки доступного кода.
import { elementRoles } from 'aria-query';
const divRoles = elementRoles.get('div');
console.log(divRoles); // Set { 'region', 'group', ... }
Каждое значение внутри множества — объект роли из roles.
Это гарантирует, что роли соответствуют стандарту ARIA и помогают
создавать семантически корректные интерфейсы.
Библиотека позволяет проверять, допустима ли роль для конкретного элемента и поддерживает ли он заданные свойства.
import { roles, elementRoles } from 'aria-query';
function isRoleValidForElement(tagName, roleName) {
const rolesForTag = elementRoles.get(tagName);
return rolesForTag ? rolesForTag.has(roleName) : false;
}
console.log(isRoleValidForElement('div', 'button')); // false
console.log(isRoleValidForElement('button', 'button')); // true
Такой подход предотвращает неверную интерпретацию
ролей, когда, например, кнопка назначается div,
что нарушает спецификацию ARIA.
Роли в ARIA могут наследоваться друг от друга через поле
superClass. Это важно для генерации и проверки поведения
элементов:
Пример обхода наследования:
function getAllProps(roleName) {
const role = roles.get(roleName);
const inheritedProps = new Map();
if (role.superClass) {
role.superClass.forEach(parentRole => {
const parentProps = getAllProps(parentRole);
parentProps.forEach((value, key) => inheritedProps.set(key, value));
});
}
role.props.forEach((value, key) => inheritedProps.set(key, value));
return inheritedProps;
}
console.log(getAllProps('checkbox'));
Это позволяет корректно обрабатывать сложные случаи, когда роль имеет множество предков и комбинированные свойства.
Некоторые ARIA-элементы допускают динамическое изменение дочерних
ролей. aria-query предоставляет информацию о допустимых
дочерних элементах, что позволяет:
Пример проверки дочерних ролей:
function canContain(parentRoleName, childRoleName) {
const parentRole = roles.get(parentRoleName);
return parentRole.childRoles ? parentRole.childRoles.includes(childRoleName) : false;
}
console.log(canContain('list', 'listitem')); // true
console.log(canContain('list', 'button')); // false
Правильная работа с roles и elementRoles минимизирует ошибки интерпретации ARIA, предотвращает проблемы с доступностью и позволяет строить динамические интерфейсы с гарантированной семантикой.