Принципы работы unstyled компонентов

Unstyled компоненты в Radix UI представляют собой минималистичные, функционально полные элементы интерфейса без встроенной стилизации. Основная цель таких компонентов — предоставить разработчику контроль над визуальной частью, оставляя при этом все сложные аспекты взаимодействия и управления состояниями «из коробки».

Ключевое отличие unstyled компонентов от обычных UI-библиотек заключается в том, что они не навязывают дизайн, а обеспечивают только структуру и поведение: управление фокусом, клавиатурной навигацией, анимациями открытия/закрытия, доступность для экранных читалок (a11y) и события жизненного цикла.


Архитектура и композиция

Unstyled компоненты строятся на атомарных строительных блоках, каждый из которых выполняет конкретную функцию. Например, компонент Dialog в Radix UI состоит из нескольких элементов: DialogTrigger, DialogContent, DialogOverlay и DialogClose.

  • DialogTrigger — элемент, инициирующий открытие диалога.
  • DialogContent — контейнер с содержимым диалога.
  • DialogOverlay — фон, затемняющий основное содержимое страницы.
  • DialogClose — кнопка для закрытия диалога.

Каждый из этих блоков можно стилизовать независимо, при этом логика открывания и закрывания диалога полностью сохранена.


Состояния и управление поведением

Radix UI использует контролируемые и неконтролируемые состояния для управления поведением компонентов:

  • Неконтролируемое состояние позволяет компоненту управлять самим собой через внутренний стейт. Например, <Dialog open> без дополнительного управления автоматически отслеживает открытие и закрытие.
  • Контролируемое состояние позволяет разработчику полностью управлять состоянием через пропсы и колбэки. Пример:
const [open, setOpen] = useState(false);

<Dialog open={open} onOpenCha nge={setOpen}>
  <DialogTrigger>Открыть диалог</DialogTrigger>
  <DialogContent>Содержимое диалога</DialogContent>
</Dialog>

Такой подход дает полный контроль над логикой без потери встроенной доступности.


Работа с рефами и forwarded refs

Unstyled компоненты в Radix UI поддерживают forwarded refs, что позволяет напрямую получать доступ к DOM-элементу для сложных сценариев интеграции с внешними библиотеками или кастомными эффектами.

const ref = useRef(null);

<DialogTrigger ref={ref}>Открыть</DialogTrigger>

Использование ref обеспечивает прямое управление фокусом и доступ к методам элемента без обхода внутренней логики компонента.


Анимации и состояния визуализации

Хотя Radix UI не предоставляет готовой стилизации, компоненты поддерживают события жизненного цикла, такие как onOpenChange и onEscapeKeyDown, которые позволяют интегрировать анимации при открытии и закрытии.

Пример использования с CSS-переходами:

.dialog-enter {
  opacity: 0;
  transform: scale(0.95);
}
.dialog-enter-active {
  opacity: 1;
  transform: scale(1);
  transition: all 200ms ease-in-out;
}
.dialog-exit {
  opacity: 1;
  transform: scale(1);
}
.dialog-exit-active {
  opacity: 0;
  transform: scale(0.95);
  transition: all 200ms ease-in-out;
}

Доступность (A11y)

Unstyled компоненты Radix UI строго следуют стандартам ARIA и обеспечивают корректную работу с экранными читалками и клавиатурной навигацией:

  • Фокусирование элементов при открытии модальных окон или выпадающих списков.
  • Управление клавишами: Escape для закрытия, Tab для навигации внутри компонентов, стрелки для выбора элементов в списках.
  • Семантические роли: Dialog, Listbox, Checkbox, RadioGroup и т.д., что обеспечивает правильную интерпретацию контента вспомогательными технологиями.

Это позволяет использовать компонент в любом визуальном дизайне без риска потерять доступность.


Комбинирование с CSS и сторонними библиотеками

Unstyled компоненты идеально подходят для интеграции с Tailwind CSS, Stitches, Emotion или любыми другими CSS-in-JS подходами.

Пример с Tailwind:

<DialogContent className="bg-white p-6 rounded-lg shadow-lg">
  <DialogTitle className="text-xl font-bold mb-4">Заголовок</DialogTitle>
  <DialogDescription className="text-gray-500">Описание диалога</DialogDescription>
</DialogContent>

При этом все состояния — открытие, закрытие, фокус — полностью управляются Radix UI, что позволяет сосредоточиться только на визуальной части.


Принципы построения интерфейсов с unstyled компонентами

  1. Разделение поведения и внешнего вида — логика компонента отделена от стилей.
  2. Композиция вместо наследования — сложные элементы строятся через объединение атомарных блоков.
  3. Контролируемость состояний — полный контроль над открытием, выбором, активностью элементов.
  4. Поддержка A11y по умолчанию — доступность встроена, не нужно добавлять роли вручную.
  5. Гибкость стилизации — можно использовать любые подходы CSS, включая динамические классы и CSS-in-JS.

Эти принципы позволяют создавать масштабируемые, кастомизируемые интерфейсы, которые легко поддерживать и расширять, сохраняя при этом высокое качество пользовательского опыта и соответствие стандартам доступности.


Unstyled компоненты Radix UI формируют фундамент современной UI-разработки, предоставляя инструменты для построения сложных интерфейсов без компромиссов по логике и доступности.