Библиотека aria-query предоставляет структурированный способ работы с ARIA-ролями, свойствами и состояниями в контексте HTML-документов. Основное назначение библиотеки — обеспечение корректной поддержки доступности (accessibility, a11y) при разработке интерфейсов на JavaScript, анализе и валидации разметки.
ARIA (Accessible Rich Internet Applications) позволяет добавлять семантическую информацию к элементам HTML, чтобы вспомогательные технологии, такие как экранные читалки, могли правильно интерпретировать содержимое. Основные категории ARIA:
button, navigation,
dialog).aria-checked, aria-expanded).aria-hidden,
aria-disabled).В библиотеке aria-query эти категории представлены отдельными объектами, которые можно использовать для проверки соответствия HTML-элементов поддерживаемым ARIA-атрибутам.
Rоли в aria-query определяются как объекты с набором допустимых свойств и состояний. Например:
import { roles } from 'aria-query';
const buttonRole = roles.get('button');
console.log(buttonRole);
Результат представляет собой объект с полями:
abstract — булевое значение, указывающее, что роль
абстрактная и не используется напрямую в HTML.baseConcepts — массив базовых HTML-элементов, с
которыми связана данная роль.requiredProps — обязательные свойства ARIA для
роли.supportedProps — свойства и состояния, которые можно
использовать с этой ролью.Это позволяет динамически проверять корректность применения ARIA-ролей к HTML-элементам.
Библиотека предоставляет объект properties, где перечислены все ARIA-свойства и состояния:
import { properties } from 'aria-query';
const ariaChecked = properties.get('aria-checked');
console.log(ariaChecked.type); // boolean, tri-state и т.д.
Каждое свойство содержит:
type — тип значения (boolean,
tristate, string и другие).values — допустимые значения для свойства.relatedConcepts — ссылки на HTML-атрибуты, которые
соответствуют данному ARIA-свойству.Это облегчает проверку соответствия HTML-атрибутов ARIA-спецификации и позволяет автоматически генерировать рекомендации по доступности.
Одна из ключевых функций aria-query — сопоставление стандартных HTML-атрибутов с ARIA-свойствами. Например:
input[type="checkbox"] автоматически соответствует роли
checkbox и поддерживает свойство
aria-checked.a[href] соответствует роли link.button соответствует роли button и
поддерживает свойства aria-pressed и
aria-disabled.С помощью методов библиотеки можно проверять, поддерживает ли элемент заданную роль или свойство:
import { roles, elementRoles } from 'aria-query';
const isButtonRole = elementRoles.get('button')?.has('button'); // true
Aria-query позволяет строить валидаторы, которые анализируют HTML-дерево и проверяют правильность использования ARIA:
Пример проверки:
import { roles, properties } from 'aria-query';
function validateAria(element) {
const role = element.getAttribute('role');
if (!roles.has(role)) {
console.warn(`Неподдерживаемая роль: ${role}`);
}
[...element.attributes].forEach(attr => {
if (properties.has(attr.name)) {
const prop = properties.get(attr.name);
if (!prop.values.includes(attr.value)) {
console.warn(`Недопустимое значение ${attr.value} для ${attr.name}`);
}
}
});
}
Использование aria-query полезно для:
Абстрактные роли не применяются напрямую к элементам, но служат базой
для наследования. Например, роль widget является
абстрактной, а конкретные элементы, такие как button или
checkbox, наследуют её свойства. В aria-query это отражено
через поле abstract и массив
superClassRoles.
Aria-query часто используется совместно с ESLint-плагинами для a11y
(eslint-plugin-jsx-a11y), что позволяет проверять
JSX-разметку на корректность ARIA-атрибутов в проектах на React. Также
библиотека удобна для генерации документации и схем в TypeScript, так
как все роли и свойства представлены в виде структурированных
объектов.