Radix UI — это библиотека низкоуровневых компонентов для React, созданная с фокусом на доступность (accessibility, a11y) и полную поддержку клавиатурной навигации. Компоненты Radix UI предоставляют все необходимые ARIA-атрибуты и обработчики событий, что позволяет создавать интерфейсы, соответствующие стандартам WCAG 2.1, без необходимости ручного внедрения всех тонкостей.
ARIA-атрибуты и роли Все интерактивные
компоненты автоматически добавляют корректные
ARIA-атрибуты. Например, для диалоговых окон
<Dialog> используются role="dialog",
aria-modal="true", а для списков
<Listbox> — role="listbox" и
aria-activedescendant для указания текущего выбранного
элемента.
Семантические элементы Radix UI стремится к
использованию нативных семантических HTML-элементов
там, где это возможно (<button>,
<input>), что обеспечивает встроенную поддержку
клавиатуры и взаимодействия с экранными читалками.
Фокус и управление фокусом Компоненты автоматически управляют фокусом. Например:
<Dialog> фокус перемещается на
первый интерактивный элемент.<Tabs> управляет фокусом между вкладками через
стрелки клавиатуры.Radix UI реализует унифицированные паттерны клавиатурного управления, соответствующие ожиданиям пользователей с клавиатурой:
Навигация стрелками
<Tabs>) поддерживают
ArrowLeft и ArrowRight для переключения между
вкладками.<Menu>) используют
ArrowUp и ArrowDown для перемещения между
элементами.Выбор элементов
Enter или Space активирует
выбранный элемент (<MenuItem>,
<ListboxItem>).Закрытие и отмена действий
Escape автоматически закрывает модальные окна,
контекстные меню и панели.Фокусные области (Focus Traps)
focusin и
keydown.Пример Tabs с клавиатурной поддержкой:
import * as Tabs from '@radix-ui/react-tabs';
<Tabs.Root defaultValue="tab1">
<Tabs.List>
<Tabs.Trigger value="tab1">Первая вкладка</Tabs.Trigger>
<Tabs.Trigger value="tab2">Вторая вкладка</Tabs.Trigger>
<Tabs.Trigger value="tab3">Третья вкладка</Tabs.Trigger>
</Tabs.List>
<Tabs.Content value="tab1">Контент первой вкладки</Tabs.Content>
<Tabs.Content value="tab2">Контент второй вкладки</Tabs.Content>
<Tabs.Content value="tab3">Контент третьей вкладки</Tabs.Content>
</Tabs.Root>
ArrowLeft/ArrowRight переключают
вкладки.Enter или Space активируют текущую
вкладку.tablist,
tab и tabpanel.Пример диалога с focus trap:
import * as Dialog from '@radix-ui/react-dialog';
<Dialog.Root>
<Dialog.Trigger>Открыть диалог</Dialog.Trigger>
<Dialog.Overlay />
<Dialog.Content>
<Dialog.Title>Заголовок диалога</Dialog.Title>
<Dialog.Description>Описание диалога</Dialog.Description>
<button>Действие</button>
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Root>
Escape закрывает диалог.useFocusRing или useId, чтобы
сохранить совместимость с a11y.Radix UI сочетает низкоуровневую гибкость с готовыми к использованию паттернами доступности и клавиатурной навигации, что позволяет строить сложные интерфейсы без потери совместимости с assistive technology.