ARIA-атрибуты обеспечивают доступность интерфейсов, созданных с использованием Haunted, без необходимости применения тяжелых фреймворков. Применение этих атрибутов особенно важно при создании веб-компонентов, где базовая семантика HTML может быть нарушена из-за собственных шаблонов, Shadow DOM и динамического рендера.
Haunted рендерит шаблоны через функции-привидения и web components, поэтому элементы зачастую не имеют изначально правильной семантики. Для восполнения этого пробела применяются:
В отличие от семантических HTML-тегов, ARIA-атрибуты обязаны постоянно соответствовать визуальному и интерактивному состоянию компонента.
Хуки в Haunted упрощают поддержание актуальности состояния ARIA.
Например, кнопка-переключатель может отражать своё состояние через
useState и обновлять aria-pressed при каждом
ререндере. С точки зрения доступности важно, что состояние компонента и
состояние атрибутов совпадают на каждом шаге, включая короткие
промежутки при анимациях.
import { component, html, useState } from 'haunted';
function ToggleButton() {
const [pressed, setPressed] = useState(false);
return html`
<button
role="button"
aria-pressed=${pressed}
@click=${() => setPressed(!pressed)}
>
${pressed ? 'Включено' : 'Выключено'}
</button>
`;
}
customElements.define('toggle-button', component(ToggleButton));
В данном компоненте отсутствуют лишние манипуляции DOM, но ARIA-состояние полностью соответствует визуальному.
Haunted нередко используется в комбинации с Shadow DOM. Экранные
дикторы получают доступ к теневому дереву, но некоторые связи требуют
явного указания. Примером служит комбинация aria-labelledby
и идентификаторов, находящихся внутри shadow-root: идентификатор обязан
быть доступен в дереве доступности, даже если скрыт от внешнего DOM. При
создании составных компонентов (например, select-подобных
виджетов) атрибуты aria-activedescendant обеспечивают
корректную навигацию по опциям.
Наличие Shadow DOM требует более внимательного выбора описательных
атрибутов: текст внутри шаблона должен быть доступен через технологии
чтения, а если он вынесен в слоты, связь между слотированным контентом и
элементами состояния описывается через aria-labelledby или
aria-describedby.
AR-системы предполагают использование специальных ролей для типичных шаблонов интерфейса:
aria-modal="true" при реализации собственных модальных окон
на HauntedАтрибуты ARIA обеспечивают корректное объявление компонентного поведения, компенсируя отсутствие нативных семантических тегов в кастомных элементах.
ARIA-атрибуты описывают состояние, но не заменяют обработку
клавиатурных событий. Haunted облегчает создание компактных
обработчиков, однако ответственность за навигацию и активацию остаётся
на компоненте. При роли button ожидается активация по
Enter и Space; при listbox —
управление стрелками и выбор по Enter; при
tablist — перемещение фокуса между вкладками стрелками.
После изменения состояния компонента должны обновиться
aria-selected, aria-expanded или
aria-activedescendant.
Недостаточная синхронизация между клавиатурой и ARIA создаёт для ассистивных технологий ложное представление о поведении интерфейса.
Haunted позволяет компоненту полностью перерисовываться при изменении состояния. Преимущество для доступности заключается в том, что обновление ARIA-атрибутов встроено в механизм рендера. При использовании других подходов ARIA-состояние приходится обновлять вручную через методы DOM. Возможность обновлять целый шаблон исключает рассинхронизацию между ARIA-состоянием и содержимым.
В сценариях с большим количеством компонентов (например, виртуальные списки) отрисовка и обновление ARIA-атрибутов должны быть оптимизированы. Чрезмерно частые ререндеры могут негативно влиять на работу скринридеров из-за бурного обновления доступности. Решение — мемоизация порций состояния и выборочное обновление атрибутов.
Использование ARIA неверно, если элемент уже обладает нужной
семантикой через HTML-тег. Например, кнопка с role="button"
излишня при использовании <button>. В кастомных
элементах Haunted подобные ошибки встречаются реже, поскольку кастомный
элемент сам по себе не предоставляет семантики.
Некорректные комбинации aria-hidden="true" с
интерактивными элементами приводят к недоступности интерфейса.
Аналогично, применение aria-expanded без управления
состоянием клавиатуры и фокуса нарушает ожидаемую модель
взаимодействия.
ARIA-атрибуты проверяются при помощи:
Компоненты, построенные на Haunted, требуют тестирования как в обычном DOM, так и в Shadow DOM, поскольку область видимости может влиять на доступность. Полное покрытие тестами помогает выявить проблемы с неправильными ролями, отсутствующими связями или невидимым текстом описания.
В масштабных UI на Haunted ARIA-атрибуты формируют согласованный слой доступности поверх кастомных компонентов. При сборке библиотеки компонентов роли и атрибуты описывают протокол поведения: каждый компонент хранит внутреннее состояние, которое отображается через ARIA и обновляется через хуки. Такой подход устраняет необходимость предлагать уникальную реализацию доступности для каждого приложения.
Комплексность ARIA растет с количеством вложенных взаимодействий. Haunted способствует упрощению, поскольку компоненты получают возможность абстрагировать все внутренние механики, предоставляя лишь согласованные слоты, состояния и атрибуты, при этом поддерживая доступность без излишних зависимостей.