Оконные роли

Библиотека aria-query предоставляет средства для работы с ARIA-ролями, свойствами и состояниями в веб-приложениях. Она реализована в виде набора карт (maps) и функций, которые позволяют получать подробную информацию о поддерживаемых ролях, их атрибутах, а также о допустимых элементах DOM, к которым эти роли могут быть применены. В основе лежат стандарты WAI-ARIA, что обеспечивает корректное взаимодействие с технологиями вспомогательного доступа.

Основные экспорты из aria-query:

  • roles — карта всех ARIA-ролей с их свойствами и метаданными.
  • elementRoles — карта соответствия HTML-элементов и ролей, которые они могут принимать.
  • roleValues — список всех допустимых значений атрибутов ARIA.
  • roleKeys — упрощённый список имён ролей.

Эти структуры данных являются неизменяемыми (Immutable Maps), что гарантирует безопасность при использовании в проектах с большим количеством компонентов.


Оконные роли (window roles)

Оконные роли описывают элементы пользовательского интерфейса, которые ведут себя как отдельные окна или панельные области, с возможностью фокусировки, навигации и взаимодействия через клавиатуру и вспомогательные технологии. В ARIA они представлены, прежде всего, следующими ролями:

  • window — базовая оконная роль. Обозначает независимое окно или диалог.
  • dialog — модальный или немодальный диалог, чаще всего используется для уведомлений, форм или подтверждений.
  • alertdialog — специализированный диалог для критических уведомлений, автоматически привлекает внимание пользователя.
  • document — роль для основного содержимого документа или значимого блока текста, который может содержать вложенные элементы.
  • application — область, которая имитирует полноценное приложение, часто используется для комплексных виджетов с богатым взаимодействием через клавиатуру.

Свойства и состояния оконных ролей

Каждая роль сопровождается ARIA-свойствами и состояниями, которые описывают доступность и поведение:

  • aria-labelledby — связывает окно с заголовком.
  • aria-label — альтернативная текстовая метка.
  • aria-hidden — скрывает окно от вспомогательных технологий.
  • aria-modal — указывает, что окно модальное и блокирует взаимодействие с другими частями интерфейса.
  • aria-expanded — состояние, информирующее о свёрнутом или развернутом состоянии панели или диалога.
  • aria-describedby — связывает окно с описанием или инструкцией.

Библиотека aria-query позволяет определить, какие свойства применимы к каждой роли, и какие значения допустимы. Например, для dialog допустимо использовать aria-modal="true" или false, а для alertdialog — только true.


Проверка и получение информации о ролях

Использование карт roles и elementRoles позволяет динамически проверять совместимость элементов и ролей.

import { roles, elementRoles } from 'aria-query';

// Проверка, поддерживает ли элемент роль dialog
const divRoles = elementRoles.get('div');
if (divRoles && divRoles.has('dialog')) {
  console.log('div может использоваться как dialog');
}

// Получение всех свойств роли window
const windowRole = roles.get('window');
console.log(windowRole.props); // { 'aria-label': undefined, 'aria-labelledby': undefined, ... }

roles.get('window') возвращает объект с метаданными:

  • abstract — булевое значение, указывающее, что роль абстрактная и не должна применяться напрямую.
  • superClass — массив родительских ролей, от которых наследуется функциональность.
  • props — доступные ARIA-свойства и состояния с типами и значениями по умолчанию.
  • requiredProps — свойства, которые обязательно должны присутствовать для корректного использования роли.

Связь с элементами DOM

Библиотека позволяет определить, какие HTML-элементы могут безопасно использовать ту или иную оконную роль. Например:

  • div, section и main — поддерживают роли window, dialog, application.
  • article — может получать роли document и application.
  • span — обычно не используется для оконных ролей, за исключением случаев, когда добавлены специальные атрибуты.
const divSupportedRoles = elementRoles.get('div');
console.log(divSupportedRoles); // Set { 'dialog', 'alertdialog', 'window', ... }

Наследование и абстрактные роли

Некоторые роли в ARIA являются абстрактными, их нельзя назначать элементу напрямую. Для оконных ролей это:

  • window — базовая роль, от которой наследуют dialog и alertdialog.
  • document — используется для наследования поведения текстового содержимого.

Использование наследования позволяет создавать новые кастомные виджеты, соблюдая стандарт ARIA, при этом библиотека aria-query упрощает получение всех наследуемых свойств и состояний:

const dialogRole = roles.get('dialog');
console.log(dialogRole.superClass); // [ 'window' ]

Практическое применение

  1. Валидация доступности — проверка соответствия ролей и свойств стандартам ARIA.
  2. Динамическое присвоение ролей — в библиотеках UI (React, Vue) можно назначать роли на основе контекста.
  3. Автоматическое создание интерфейсных компонентов — генерация диалогов, окон и панелей с корректной поддержкой вспомогательных технологий.
  4. Документирование интерфейса — получение полного списка свойств и их допустимых значений для каждой роли.

Рекомендации по работе с оконными ролями

  • Использовать dialog для модальных и немодальных окон с фокусируемым содержимым.
  • Применять alertdialog для критических уведомлений, требующих немедленного внимания.
  • Для комплексных приложений использовать application только там, где необходимо подавление стандартных клавиатурных взаимодействий.
  • Проверять совместимость ролей и элементов через elementRoles для предотвращения ошибок доступности.
  • Обязательно указывать заголовки (aria-labelledby или aria-label) для всех оконных ролей, чтобы они были понятны вспомогательным технологиям.

Глубокое понимание оконных ролей и возможностей библиотеки aria-query позволяет создавать интерфейсы, полностью соответствующие стандартам WAI-ARIA и обеспечивающие максимальную доступность для пользователей с ограниченными возможностями.