Radix UI предоставляет низкоуровневые, полностью управляемые
компоненты для React, которые позволяют создавать сложные интерфейсы с
сохранением контроля над поведением и стилями. Одной из ключевых
концепций является ориентация группы элементов,
особенно актуальная для компонентов, таких как RadioGroup,
CheckboxGroup, ToggleGroup и других, где
несколько элементов объединяются для совместного управления
состоянием.
orientationorientation определяет направление, в
котором элементы группы располагаются визуально и логически для
навигации с клавиатуры.
Поддерживаемые значения:
horizontal — элементы располагаются в строку;vertical — элементы располагаются в колонку.Пример использования с RadioGroup:
import * as RadioGroup from '@radix-ui/react-radio-group';
<RadioGroup.Root orientation="horizontal" defaultValue="option1">
<RadioGroup.Item value="option1" id="r1">Option 1</RadioGroup.Item>
<RadioGroup.Item value="option2" id="r2">Option 2</RadioGroup.Item>
<RadioGroup.Item value="option3" id="r3">Option 3</RadioGroup.Item>
</RadioGroup.Root>
Radix UI автоматически обеспечивает логическую навигацию по группе в зависимости от ориентации:
ArrowLeft и
ArrowRight перемещают фокус между элементами;ArrowUp и ArrowDown
перемещают фокус между элементами.Это особенно важно для доступности интерфейса (a11y), так как клавиатурные пользователи получают предсказуемое поведение без дополнительного кода.
Для компонентов ToggleGroup можно задавать несколько
активных элементов одновременно (type="multiple") или
только один (type="single"):
import * as ToggleGroup from '@radix-ui/react-toggle-group';
<ToggleGroup.Root type="multiple" orientation="vertical">
<ToggleGroup.Item value="bold" aria-label="Bold">B</ToggleGroup.Item>
<ToggleGroup.Item value="italic" aria-label="Italic">I</ToggleGroup.Item>
<ToggleGroup.Item value="underline" aria-label="Underline">U</ToggleGroup.Item>
</ToggleGroup.Root>
type="multiple" пользователи могут включать
несколько опций одновременно.type="single" Radix обеспечивает эксклюзивный выбор
с автоматическим снятием фокуса с предыдущего элемента при выборе
нового.Radix UI применяет roving tabindex, что позволяет
поддерживать только один активный элемент с tabindex=0, а
остальные элементы получают tabindex=-1. Это предотвращает
случайное уход фокуса и делает навигацию логически последовательной.
<RadioGroup.Root orientation="vertical">
<RadioGroup.Item value="1" id="r1" tabIndex={0}>1</RadioGroup.Item>
<RadioGroup.Item value="2" id="r2" tabIndex={-1}>2</RadioGroup.Item>
<RadioGroup.Item value="3" id="r3" tabIndex={-1}>3</RadioGroup.Item>
</RadioGroup.Root>
Roving tabindex обновляется автоматически при использовании стрелок клавиатуры, что минимизирует ручное управление фокусом.
Radix UI не накладывает предопределённые стили, но предоставляет состояния элементов для применения кастомной стилизации:
data-state="checked" — для выбранного элемента;data-state="unchecked" — для невыбранного;data-disabled — для отключённых элементов;data-orientation="horizontal|vertical" — для
группы.CSS можно писать так:
[data-orientation="vertical"] > [data-state="checked"] {
background-color: #0053ba;
color: white;
}
[data-orientation="horizontal"] > [data-disabled] {
opacity: 0.5;
cursor: not-allowed;
}
Эти атрибуты позволяют создать полностью кастомный вид группы без вмешательства в внутреннюю логику Radix.
Все группы поддерживают событие onValueChange, которое
передаёт новое значение выбранного элемента или массив выбранных
значений:
<RadioGroup.Root
orientation="horizontal"
onValueCha nge={(value) => console.log('Выбрано:', value)}
>
<RadioGroup.Item value="1">1</RadioGroup.Item>
<RadioGroup.Item value="2">2</RadioGroup.Item>
</RadioGroup.Root>
Для ToggleGroup с type="multiple"
value будет массивом активных элементов.
Radix автоматически добавляет необходимые
ARIA-атрибуты, такие как
role="radiogroup", role="radio",
aria-checked, и корректно обновляет их при изменении
состояния. Это снимает значительную часть работы по обеспечению
доступности интерфейса.
Для современных интерфейсов можно менять ориентацию группы динамически в зависимости от ширины экрана:
const isMobile = window.innerWidth < 768;
<RadioGroup.Root orientation={isMobile ? "vertical" : "horizontal"}>
<RadioGroup.Item value="a">A</RadioGroup.Item>
<RadioGroup.Item value="b">B</RadioGroup.Item>
</RadioGroup.Root>
Такой подход позволяет строить гибкие, отзывчивые интерфейсы без сложного переписывания логики компонентов.
Эти принципы дают полный контроль над поведением и визуальным представлением групп элементов в Radix UI, сохраняя при этом стандарты доступности и предсказуемость пользовательского опыта.