Button
Минимальный компонент кнопки. Работает на HTMLButtonElement или произвольной ноде с ролью button.
Когда использовать
- Если требуется предсказуемая кнопка без привязки к UI-фреймворкам и стилям.
- В проектах с жёсткими требованиями к доступности.
- В местах, где важно корректное управление клавиатурой,
disabledи обработкой событий. - Как базу для расширенных сценариев:
ToggleButton,MenuButton.
Семантика
Если элемент — <button>
Используется нативное поведение:
- корректные атрибуты
disabled - нативная активация Enter/Space
- встроенная доступность
Если элемент не <button>
Компонент применяет минимальный fallback:
role="button"tabindex="0"- эмуляция активации по Enter / Space
Важно: при использовании кастомного тега выводится console.warn с рекомендацией использовать <button>.
A11y Summary
- Полная поддержка нативной клавиатурной навигации.
- Enter и Space вызывают
click(Space предотвращает скролл). - Корректная работа состояний
disabledиaria-disabled. - Компонент не меняет DOM-структуру и не добавляет избыточных ARIA.
Поведение клавиатуры
- Enter → запускает
click - Space → предотвращает скролл и запускает
click - Tab / Shift+Tab → используется нативно (или через
tabindex="0"в fallback)
Приоритет конфигурации
Компонент следует предсказуемому порядку инициализации:
- Атрибуты DOM (
disabled,aria-*) - Data-API (
data-a11ync-type="basic" | "toggle" | "menu") - JS-опции конструктора
DOM всегда сильнее Data-API, Data-API сильнее JS-опций.
SSR и Hydration
Button корректно восстанавливает поведение после SSR-hydration:
- Существующие атрибуты и состояние не перезаписываются.
- Добавляется только функциональность и обработчики.
- Инициализация idempotent — повторный вызов
init()безопасен.
Ограничения
- Компонент не управляет состояниями
pressedилиexpanded(это задачиToggleButtonиMenuButton). - Компонент не добавляет визуальные стили.
- Не изменяет структуру DOM.
- Для нестандартных тегов доступность ограничена минимальным fallback.
- Не эмулирует сложные ARIA-паттерны.
Типы кнопок
Button
Базовая кнопка с нативной семантикой и единым модельным поведением.
Ключевые особенности:
- Используется, когда нужна простая активация действий без состояний.
- Автоматическая нормализация поведения для
div[role="button"]. - Keyboard Activation по Enter/Space.
- Поддержка disabled и aria-disabled.
- Без побочных эффектов — не вмешивается в стили, формы и фокусировку.
ToggleButton
Кнопка-переключатель со встроенной логикой состояния (aria-pressed). Подходит для «ON/OFF» сценариев: mute, избранное, фильтры, переключатели вида и т.п.
Ключевые особенности:
- Отслеживает состояние pressed.
- Синхронно обновляет aria-pressed.
- Не меняет DOM-структуру, только атрибуты.
- При disabled блокируется логика и события.
- Убирает разрыв между визуальным состоянием и а11y-атрибутами.
- Обеспечивает корректное взаимодействие с ассистивными технологиями.
- Делает поведение предсказуемым независимо от тега (
buttonилиdiv[role="button"]).
MenuButton
Кнопка, управляющая раскрытием внешнего меню. Не реализует само меню — только логику expanded и необходимые ARIA-связи.
Ключевые особенности:
- Управляет атрибутом aria-expanded.
- Не навязывает структуру меню (YAGNI).
- События работают консистентно для клавиатуры и мыши.
- Может использоваться с button или любым элементом с ролью.
Кнопки открытия dropdown, popover, меню действий. Контролы, где видимость контента меняется внешним кодом или UI-компонентом.
Инициализация
<button id="basic-btn">button</button>
import { useButton } from 'a11ync';
// Basic buttons
const el = document.querySelector('#basic-btn')
const button = new useButton(el, {
onPress: () => {
console.log('Pressed')
}