Carbon Components Svelte предоставляет гибкий механизм работы с темами через Svelte-специфичные компоненты и встроенные стили. В основе лежит концепция CSS-переменных, которые позволяют динамически менять визуальные параметры приложения без полной перезагрузки стилей.
Для начала необходимо импортировать глобальные стили Carbon и установить переменные темы. В Svelte это делается через основной файл стилей приложения:
import 'carbon-components-svelte/css/all.css';
CSS-переменные задаются на уровне корневого элемента
:root или контейнера приложения:
:root {
--cds-background: #ffffff;
--cds-text-01: #161616;
--cds-interactive-01: #0f62fe;
}
Эти переменные контролируют ключевые цвета интерфейса: фон, основной текст и интерактивные элементы.
Для управления темой в реальном времени используется Svelte store. Создается хранилище, которое хранит текущую тему, и подписка на него позволяет автоматически обновлять CSS-переменные:
import { writable } from 'svelte/store';
export const theme = writable({
background: '#ffffff',
text01: '#161616',
interactive01: '#0f62fe'
});
theme.subscribe(value => {
document.documentElement.style.setProperty('--cds-background', value.background);
document.documentElement.style.setProperty('--cds-text-01', value.text01);
document.documentElement.style.setProperty('--cds-interactive-01', value.interactive01);
});
Теперь изменение темы сводится к простому обновлению состояния:
theme.set({
background: '#161616',
text01: '#ffffff',
interactive01: '#ff7f50'
});
Большинство компонентов Carbon используют CSS-переменные для своих цветов и стилей. Благодаря этому, обновление переменных автоматически влияет на внешний вид кнопок, карточек, меню и других элементов без необходимости повторного рендеринга компонентов:
<script>
import { Button } from 'carbon-components-svelte';
</script>
<Button kind="primary">Primary Button</Button>
При изменении --cds-interactive-01 цвет кнопки изменится
в реальном времени.
Carbon Components Svelte поддерживает две основные темы: светлую и темную. Для переключения достаточно создать два объекта с переменными и подменять их через store:
const lightTheme = {
background: '#ffffff',
text01: '#161616',
interactive01: '#0f62fe'
};
const darkTheme = {
background: '#161616',
text01: '#ffffff',
interactive01: '#0f62fe'
};
// Переключение
theme.set(isDarkMode ? darkTheme : lightTheme);
Это позволяет реализовать «тумблер» для смены темы в интерфейсе пользователя.
Для более плавного визуального эффекта можно добавить CSS-переход для свойств, используемых в переменных:
:root {
transition: background 0.3s ease, color 0.3s ease;
}
Таким образом, фон, текст и интерактивные элементы будут менять цвет плавно при каждом обновлении темы.
Можно добавлять дополнительные переменные для кастомизации компонентов Carbon, например, для границ, теней и акцентов:
theme.set({
background: '#161616',
text01: '#ffffff',
interactive01: '#ff7f50',
border01: '#cccccc',
shadow01: '0 2px 4px rgba(0, 0, 0, 0.2)'
});
Поддержка дополнительных переменных позволяет создавать полностью уникальные визуальные стили приложения без изменения исходного кода компонентов.
Программное управление темой через CSS-переменные и Svelte store обеспечивает гибкость, минимизирует дублирование кода и позволяет легко масштабировать дизайн системы в реальном времени.