aria-query — это библиотека для работы с ARIA-атрибутами
и ролями в JavaScript. Она предоставляет возможность валидировать,
искать и сопоставлять роли, состояния и свойства ARIA, что особенно
важно при разработке доступных веб-приложений. В основе работы лежит
коллекция спецификаций ARIA из официального стандарта WAI-ARIA.
Ключевые понятия:
button, checkbox,
dialog.aria-checked, aria-disabled.aria-query позволяет работать с этими сущностями через
JavaScript-объекты и коллекции, что упрощает проверку совместимости
ролей и атрибутов.
Библиотека предоставляет несколько основных коллекций:
roles Объект roles содержит все
роли ARIA с их определениями. Каждая роль описана следующими
свойствами:
name: стандартное имя роли.abstract: булево значение, указывающее, что роль
абстрактная и не применяется напрямую к элементу.requiredProps: список ARIA-свойств, обязательных для
роли.superClass: массив родительских ролей, обеспечивающих
наследование поведения.props: все свойства, доступные для данной роли.Пример использования:
const { roles } = require('aria-query');
const buttonRole = roles.get('button');
console.log(buttonRole.requiredProps); // []
console.log(buttonRole.superClass); // [['command', 'widget']]
const { elementRoles } = require('aria-query');
const rolesForDiv = elementRoles.get('div');
console.log([...rolesForDiv]); // Set { 'generic', 'region', 'main', ... }
boolean, tristate,
string, idref и др.) и поддерживаемых
значений.const { aria } = require('aria-query');
console.log(aria.get('aria-disabled'));
// { type: 'boolean', values: [true, false] }
aria-query позволяет динамически проверять совместимость
элементов и ролей, а также наследование атрибутов:
const { roles } = require('aria-query');
console.log(roles.has('checkbox')); // true
console.log(roles.has('nonexistent')); // false
const checkboxRole = roles.get('checkbox');
console.log(checkboxRole.requiredProps); // ['aria-checked']
console.log(checkboxRole.props);
// Map { 'aria-checked' => { type: 'tristate', values: [true, false, 'mixed'] }, ... }
console.log(checkboxRole.superClass); // [['input', 'widget']]
Это позволяет строить сложные правила валидации и автогенерации доступных интерфейсов.
С помощью elementRoles можно определить, какие роли
поддерживаются конкретным HTML-элементом. Это важно для обеспечения
семантики и доступности.
const { elementRoles, roles } = require('aria-query');
for (const role of elementRoles.get('a')) {
const roleDef = roles.get(role);
console.log(role, roleDef.abstract);
}
Также можно фильтровать только конкретные совместимые роли, исключая абстрактные:
const compatibleRoles = [...elementRoles.get('div')].filter(
roleName => !roles.get(roleName).abstract
);
console.log(compatibleRoles); // ['button', 'region', 'main', ...]
aria-query предоставляет детальную информацию о
свойствах и состояниях, включая их типы и допустимые значения.
const { aria } = require('aria-query');
const attr = aria.get('aria-expanded');
console.log(attr.type); // 'boolean'
console.log(attr.values); // [true, false]
Можно также проверить, какие роли требуют конкретный ARIA-атрибут:
const { roles } = require('aria-query');
const rolesRequiringExpanded = [...roles].filter(([name, def]) =>
def.requiredProps.includes('aria-expanded')
);
console.log(rolesRequiringExpanded.map(([name]) => name)); // ['button', 'menuitem', ...]
aria-query чаще всего используется для:
Пример функции проверки:
function validateRole(elementTag, roleName, attributes) {
const { roles, elementRoles, aria } = require('aria-query');
if (!roles.has(roleName)) return false;
const role = roles.get(roleName);
if (!elementRoles.get(elementTag).has(roleName)) return false;
for (const reqProp of role.requiredProps) {
if (!(reqProp in attributes)) return false;
const attrType = aria.get(reqProp).type;
if (attrType === 'boolean' && typeof attributes[reqProp] !== 'boolean') return false;
}
return true;
}
console.log(validateRole('button', 'button', { 'aria-disabled': true })); // true
Эта функция демонстрирует практическое применение коллекций
roles, elementRoles и aria для
построения правил проверки доступности.
Для React, Vue или других фреймворков можно использовать
aria-query для генерации правильной роли и атрибутов на
кастомных элементах:
function createAccessibleButton(props) {
const { roles, aria } = require('aria-query');
const role = 'button';
const attributes = { 'aria-disabled': !!props.disabled };
// Валидация
const roleDef = roles.get(role);
roleDef.requiredProps.forEach(req => {
if (!(req in attributes)) attributes[req] = null;
});
return { role, ...attributes };
}
Это позволяет поддерживать корректную ARIA-семантику вне зависимости
от того, что рендерится: стандартный <button> или
кастомный <div> с функционалом кнопки.