Библиотека Aria-query предназначена для работы с атрибутами ARIA и семантическими ролями в DOM. Она предоставляет программный доступ к таблицам ролей и свойств ARIA, что позволяет создавать динамические интерфейсы с корректной поддержкой доступности. Основным элементом библиотеки являются таблицы ролей и множества свойств, которые можно использовать для проверки соответствия элементов HTML их назначению.
Для использования библиотеки необходимо импортировать ключевые объекты:
import { roles, elementRoles, aria } from 'aria-query';
roles — коллекция всех ARIA-ролей с их свойствами и
отношениями.elementRoles — карта HTML-элементов на роли, которые
они могут выполнять.aria — набор ARIA-атрибутов с типами и допустимыми
значениями.Каждая роль в roles представлена объектом с набором
свойств:
{
name: 'button',
superclass: ['command', 'widget'],
requiredProps: [],
supportedProps: ['aria-pressed', 'aria-expanded']
}
Ключевые моменты:
name — имя роли.superclass — список родительских ролей, определяющих
иерархию наследования.requiredProps — свойства, обязательные для корректного
использования роли.supportedProps — свойства, которые роль может
поддерживать.Свойство superclass определяет, от каких базовых ролей наследуется конкретная роль. Это важно для проверки совместимости атрибутов и построения сложных интерфейсов. Например:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole.superclass); // ['command', 'widget']
command — общее поведение интерактивного элемента.widget — элемент управления пользовательским
интерфейсом.Иерархия позволяет автоматически проверять, какие атрибуты поддерживает роль через наследование:
function getAllSupportedProps(roleName) {
const role = roles.get(roleName);
let props = new Set(role.supportedProps);
role.superclass.forEach(parent => {
const parentRole = roles.get(parent);
parentRole.supportedProps.forEach(p => props.add(p));
});
return Array.from(props);
}
console.log(getAllSupportedProps('button'));
// ['aria-pressed', 'aria-expanded', ... свойства родительских ролей]
Таким образом, можно динамически получать полный набор допустимых свойств для любой роли.
elementRolesКоллекция elementRoles связывает HTML-элементы с ролями,
которые они могут выполнять. Структура:
{
'button': new Set(['button']),
'a': new Set(['link', 'button'])
}
Использование:
import { elementRoles } from 'aria-query';
const rolesForAnchor = elementRoles.get('a');
console.log(rolesForAnchor); // Set { 'link', 'button' }
Это позволяет проверять соответствие элемента его семантической роли в реальном DOM.
Библиотека предоставляет карту aria для валидации
атрибутов:
import { aria } from 'aria-query';
console.log(aria.get('aria-pressed'));
/*
{
type: 'tristate',
values: [true, false, 'mixed']
}
*/
Можно создавать функции для проверки корректности:
function isValidAriaProp(roleName, propName) {
const role = roles.get(roleName);
return role.supportedProps.includes(propName) ||
role.superclass.some(parent => roles.get(parent).supportedProps.includes(propName));
}
console.log(isValidAriaProp('button', 'aria-pressed')); // true
console.log(isValidAriaProp('link', 'aria-pressed')); // false
Сочетание elementRoles, roles и
aria позволяет динамически создавать элементы и
валидировать их ARIA:
function createAccessibleButton() {
const button = document.createElement('button');
const roleName = Array.from(elementRoles.get('button'))[0];
if (isValidAriaProp(roleName, 'aria-pressed')) {
button.setAttribute('aria-pressed', 'false');
}
return button;
}
document.body.appendChild(createAccessibleButton());
Такой подход гарантирует, что элементы будут корректно поддерживать доступность без ручного перебора всех возможных атрибутов.
Библиотека позволяет расширять роли или проверять кастомные компоненты:
roles.set('custom-button', {
name: 'custom-button',
superclass: ['button'],
requiredProps: ['aria-label'],
supportedProps: ['aria-pressed', 'aria-expanded']
});
const customRole = roles.get('custom-button');
console.log(getAllSupportedProps(customRole.name));
// ['aria-pressed', 'aria-expanded']
Наследование через superclass автоматически учитывает
свойства родительской роли, что упрощает интеграцию кастомных
компонентов.
Aria-query активно используется в библиотеке eslint-plugin-jsx-a11y и других инструментах для проверки доступности React и HTML. Проверка ролей и атрибутов позволяет выявлять нарушения семантики и ошибки использования ARIA до деплоя.
superclass задает иерархическую связь ролей и позволяет
унаследовать свойства.elementRoles и aria
обеспечивает автоматическую проверку соответствия HTML-элементов их
семантической роли.