ARIA (Accessible Rich Internet Applications) — это набор атрибутов, которые позволяют улучшить доступность веб-приложений для пользователей с ограниченными возможностями. В MDX, сочетая Markdown и JSX, применение ARIA атрибутов становится особенно важным, так как компоненты часто рендерятся динамически, а традиционные HTML-элементы могут быть заменены на кастомные компоненты.
В MDX элементы JSX поддерживают стандартные ARIA атрибуты напрямую. Например, для кнопки с динамическим поведением:
<Button aria-label="Закрыть окно" aria-disabled={isDisabled} onCl ick={handleClose}>
×
</Button>
aria-label задаёт текстовую метку для элементов, у
которых нет визуального текста.aria-disabled сообщает вспомогательным технологиям, что
элемент неактивен, аналогично атрибуту disabled, но для
кастомных компонентов.Роли (role)
button, dialog,
menu, tab, progressbar.<div role="dialog" aria-modal="true">
<h2>Настройки</h2>
<p>Контент диалога</p>
</div>
Состояния (aria- + state)
aria-checked, aria-selected,
aria-expanded.<AccordionItem aria-expanded={isOpen}>
<AccordionHeader onCl ick={toggleAccordion}>Заголовок</AccordionHeader>
<AccordionPanel>{content}</AccordionPanel>
</AccordionItem>
Свойства (aria- + property)
aria-labelledby,
aria-describedby, aria-controls.<label id="username-label">Имя пользователя</label>
<input type="text" aria-labelledby="username-label" />
MDX позволяет использовать переменные и состояния React для управления атрибутами ARIA:
<Switch
aria-checked={isEnabled}
onCl ick={() => setIsEnabled(!isEnabled)}
>
Включить уведомления
</Switch>
aria-checked автоматически обновляется при изменении
состояния.<input type="checkbox"> не используется.Для сложных компонентов (модальные окна, вкладки, меню) критично управление фокусом:
<Modal role="dialog" aria-modal="true">
<CloseButton onCl ick={closeModal} aria-label="Закрыть модальное окно" />
<p>Контент модального окна</p>
</Modal>
aria-modal="true" информирует вспомогательные
технологии о блокировке фонового контента.Для списков и таблиц ARIA атрибуты обеспечивают навигацию:
<ul role="listbox" aria-label="Список стран">
{countries.map((country, index) => (
<li
key={country.code}
role="option"
aria-selected={selectedCountry === country.code}
>
{country.name}
</li>
))}
</ul>
role="listbox" и role="option" создают
структуру, понятную экранным читалкам.aria-selected позволяет обозначить текущий выбор.ARIA в MDX позволяет создавать интерактивные и доступные интерфейсы без потери семантики и поддерживает динамику компонентов, что делает MDX идеальным выбором для современных документаций и UI-библиотек.