Radix UI предоставляет набор компонентов с высокой степенью настраиваемости, где CSS-переменные (CSS Variables) играют ключевую роль в управлении стилями. Каждый компонент Radix UI использует переменные для цветов, размеров, отступов и состояний интерактивных элементов, что позволяет централизованно управлять визуальной частью интерфейса.
CSS-переменные объявляются с префиксом -- внутри
селектора :root или любого другого элемента:
:root {
--button-bg: #1a73e8;
--button-color: #ffffff;
--button-padding: 12px 24px;
}
Переменные можно использовать через функцию var():
button {
background-color: var(--button-bg);
color: var(--button-color);
padding: var(--button-padding);
}
В Radix UI переменные часто встроены в компонент через
data-state и другие атрибуты состояния, что позволяет
динамически изменять внешний вид без прямого вмешательства в CSS.
Radix UI предоставляет Primitive-компоненты, у которых
каждый визуальный аспект связан с CSS-переменной.
Например, для компонента Slider:
:root {
--slider-track-height: 4px;
--slider-thumb-size: 16px;
--slider-thumb-color: #ff5722;
}
Компонент автоматически использует эти переменные:
<Slider defaultValue={50} max={100} />
Изменяя переменные, можно глобально менять стиль всех слайдеров на странице:
:root {
--slider-thumb-color: #4caf50; /* изменится цвет всех ползунков */
}
Radix UI активно использует состояния компонентов,
которые можно контролировать через переменные. Например, кнопки с
состоянием pressed:
:root {
--button-bg: #1a73e8;
--button-bg-pressed: #1558b0;
}
button[data-state="pressed"] {
background-color: var(--button-bg-pressed);
}
Атрибуты data-state, data-disabled и другие
позволяют отдельно задавать стили для активных, наведения и
заблокированных состояний, сохраняя структуру CSS чистой и
читаемой.
CSS-переменные в Radix UI поддерживают динамическую смену тем. Создаются переменные для светлой и темной темы:
:root {
--bg-color: #ffffff;
--text-color: #000000;
}
[data-theme="dark"] {
--bg-color: #121212;
--text-color: #ffffff;
}
Компоненты автоматически подтягивают переменные:
<Box css={{ backgroundColor: 'var(--bg-color)', color: 'var(--text-color)' }}>
Пример текста
</Box>
При смене атрибута data-theme все компоненты
адаптируются без дополнительного JS-кода.
CSS-переменные могут быть локальными для компонента или глобальными. Локальные переменные определяются на уровне родительского элемента, что позволяет создавать изолированные стили:
.card {
--card-bg: #f0f0f0;
--card-padding: 20px;
}
.card button {
background-color: var(--card-bg);
padding: var(--card-padding);
}
Это удобно для переиспользуемых компонентов, где нужно сохранить базовую тему глобальной, но локально менять конкретные параметры.
Radix UI совместим с CSS-переменными для анимаций. Например, для плавного изменения цвета при наведении:
:root {
--button-bg: #1a73e8;
--button-bg-hover: #1558b0;
}
button {
background-color: var(--button-bg);
transition: background-color 0.2s ease;
}
button:hover {
background-color: var(--button-bg-hover);
}
Использование переменных позволяет объединять тему, состояния и анимацию без дублирования кода.
--button-,
--slider-), для удобства и предотвращения конфликтов.data-state и data-theme для динамического
изменения переменных.В Radix UI можно использовать CSS-in-JS решения,
например stitches или vanilla-extract, которые
поддерживают переменные:
const Button = styled('button', {
backgroundColor: 'var(--button-bg)',
color: 'var(--button-color)',
padding: 'var(--button-padding)',
'&:hover': {
backgroundColor: 'var(--button-bg-hover)',
},
});
Такой подход позволяет объединять динамику переменных и программное создание стилей, сохраняя типизацию и предсказуемость.
Каждый Radix Primitive предоставляет набор встроенных переменных, например:
--radix-popover-content-transform-origin--radix-tooltip-arrow-size--radix-switch-thumb-backgroundЭти переменные можно переопределять глобально или локально, обеспечивая гибкую настройку без изменения исходного компонента.
Radix UI и CSS Variables вместе создают мощный инструмент для масштабируемых, настраиваемых интерфейсов, где визуальные параметры компонентов централизованно управляются, поддерживаются динамические состояния и темы, а структура кода остаётся чистой и предсказуемой.