Unstyled компоненты в Radix UI представляют собой минималистичные, функционально полные элементы интерфейса без встроенной стилизации. Основная цель таких компонентов — предоставить разработчику контроль над визуальной частью, оставляя при этом все сложные аспекты взаимодействия и управления состояниями «из коробки».
Ключевое отличие unstyled компонентов от обычных UI-библиотек заключается в том, что они не навязывают дизайн, а обеспечивают только структуру и поведение: управление фокусом, клавиатурной навигацией, анимациями открытия/закрытия, доступность для экранных читалок (a11y) и события жизненного цикла.
Unstyled компоненты строятся на атомарных строительных
блоках, каждый из которых выполняет конкретную функцию.
Например, компонент Dialog в Radix UI состоит из нескольких
элементов: DialogTrigger, DialogContent,
DialogOverlay и DialogClose.
Каждый из этих блоков можно стилизовать независимо, при этом логика открывания и закрывания диалога полностью сохранена.
Radix UI использует контролируемые и неконтролируемые состояния для управления поведением компонентов:
<Dialog open> без дополнительного управления
автоматически отслеживает открытие и закрытие.const [open, setOpen] = useState(false);
<Dialog open={open} onOpenCha nge={setOpen}>
<DialogTrigger>Открыть диалог</DialogTrigger>
<DialogContent>Содержимое диалога</DialogContent>
</Dialog>
Такой подход дает полный контроль над логикой без потери встроенной доступности.
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;
}
Unstyled компоненты Radix UI строго следуют стандартам ARIA и обеспечивают корректную работу с экранными читалками и клавиатурной навигацией:
Это позволяет использовать компонент в любом визуальном дизайне без риска потерять доступность.
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 компоненты Radix UI формируют фундамент современной UI-разработки, предоставляя инструменты для построения сложных интерфейсов без компромиссов по логике и доступности.