Библиотека Aria-query предназначена для сопоставления HTML-элементов с соответствующими ARIA-ролями. Она обеспечивает разработчикам возможность проверять корректность использования ARIA-атрибутов и ролей, а также строить динамические интерфейсы с соблюдением доступности (accessibility).
В основе работы лежат два ключевых понятия: элементы и роли. Библиотека предоставляет данные о том, какие HTML-теги могут иметь какие роли, какие роли являются валидными для конкретных элементов, а также какие ARIA-атрибуты поддерживаются для этих ролей.
В Aria-query данные организованы в виде Map-объектов:
Пример использования elementRoles:
import { elementRoles } from 'aria-query';
console.log(elementRoles.get('button'));
// Set { 'button' }
Здесь ключом является тег HTML (button), а значением —
Set ролей, допустимых для этого элемента. Для
<div> это может быть множество ролей, например
button, dialog, tabpanel и
другие, в зависимости от контекста.
Для динамических интерфейсов важно убедиться, что элемент имеет совместимую роль. С помощью Aria-query это делается так:
import { elementRoles } from 'aria-query';
function isRoleValidForElement(tagName, role) {
const roles = elementRoles.get(tagName);
return roles ? roles.has(role) : false;
}
console.log(isRoleValidForElement('div', 'button')); // true
console.log(isRoleValidForElement('span', 'textbox')); // false
Ключевой момент: не все HTML-элементы могут иметь любую ARIA-роль. Aria-query обеспечивает строгую проверку на уровне данных спецификации WAI-ARIA.
Каждая ARIA-роль поддерживает определённый набор атрибутов и
состояний. Эти данные находятся в объекте roles:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole);
/*
{
abstract: false,
requiredProps: new Set(),
superClass: [{ concept: ['widget'] }],
accessibleNameRequired: true,
props: new Map([...])
}
*/
Использование roles позволяет автоматически проверять
соответствие атрибутов и избегать ошибок при применении ARIA в коде.
Aria-query особенно полезна для генерации динамических форм и
виджетов. Пример: проверка, может ли <section> быть
region и требует ли он имени:
import { elementRoles, roles } from 'aria-query';
const tagName = 'section';
const role = 'region';
if (elementRoles.get(tagName)?.has(role)) {
const roleData = roles.get(role);
console.log(`Роль ${role} валидна для <${tagName}>`);
if (roleData.accessibleNameRequired) {
console.log('Необходимо задать доступное имя (aria-label или aria-labelledby)');
}
}
Таким образом, библиотека связывает семантику HTML с ARIA-ролями, гарантируя соответствие стандартам доступности.
abstract: true), они служат для организации
иерархий. Пример: widget, structure.abstract: false), например button,
checkbox, dialog.Для построения пользовательских компонентов важно различать эти типы ролей, чтобы не нарушать спецификацию WAI-ARIA.
Кроме Map-объектов, Aria-query предоставляет полезные методы:
getElementRoles(tagName) — возвращает все допустимые
роли для элемента.getRole(roleName) — возвращает объект с данными о роли,
включая свойства и атрибуты.getRoleKeys() — список всех ролей.Пример фильтрации элементов по роли:
import { elementRoles } from 'aria-query';
const elementsSupportingButton = [...elementRoles.entries()]
.filter(([tag, roles]) => roles.has('button'))
.map(([tag]) => tag);
console.log(elementsSupportingButton);
// ['button', 'div', 'input', ...]
Aria-query активно применяется в сочетании с инструментами тестирования доступности, такими как eslint-plugin-jsx-a11y. Она обеспечивает:
Пример интеграции с тестами:
import { elementRoles, roles } from 'aria-query';
import assert from 'assert';
const tagName = 'input';
const role = 'checkbox';
assert(elementRoles.get(tagName).has(role), `<${tagName}> не может быть ${role}`);
Это позволяет поддерживать консистентность семантики интерфейсов и предотвращает ошибки доступности на раннем этапе разработки.
Связь HTML-элементов и ARIA-ролей через Aria-query делает возможным динамическое сопоставление, валидацию и поддержку доступности интерфейсов без ручной проверки документации.
Хотите, я могу подготовить разбор примеров реального использования Aria-query в React-компонентах, где будут показаны динамические роли и проверка атрибутов?