Темизация в контексте Mithril не привязана к самому фреймворку: Mithril отвечает за представление и логику, а визуальная адаптация полностью лежит на CSS. Это даёт гибкость — можно использовать нативные CSS-переменные, препроцессоры или CSS-in-JS, не нарушая архитектуру приложения.
Ключевая идея современной темизации — использование CSS Custom Properties (переменных), которые динамически меняются без пересборки DOM и без пересчёта компонентов Mithril.
CSS-переменные объявляются в селекторах и доступны в рантайме:
:root {
--color-bg: #ffffff;
--color-text: #222222;
--color-primary: #3b82f6;
--border-radius: 6px;
}
Особенности:
Mithril не вмешивается в работу CSS-переменных, что делает их идеальным инструментом для темизации.
Компоненты Mithril используют обычные классы и inline-стили. Рекомендуемый подход — никогда не жёстко задавать цвета и размеры в компонентах, а опираться на переменные.
const Button = {
view: () =>
m("button.btn", "Кнопка")
}
.btn {
background-color: var(--color-primary);
color: var(--color-bg);
border-radius: var(--border-radius);
}
Таким образом:
Глобальная тема задаётся на :root или
html:
html[data-theme="dark"] {
--color-bg: #0f172a;
--color-text: #e5e7eb;
--color-primary: #60a5fa;
}
Переключение темы — это смена атрибута:
document.documentElement.setAttribute("data-theme", "dark")
Mithril при этом не требует m.redraw(), так как DOM не
меняется.
CSS-переменные можно переопределять на любом узле:
.card {
--color-bg: #f8fafc;
background-color: var(--color-bg);
}
const Card = {
view: () =>
m(".card",
m("p", "Контент карточки")
)
}
Это позволяет:
Состояние темы можно хранить в модели или глобальном сторе:
const Theme = {
current: "light",
set(name) {
this.current = name
document.documentElement.dataset.theme = name
}
}
Компоненты используют только вызов:
m("button", {
onclick: () => Theme.set("dark")
}, "Dark")
CSS реагирует автоматически. Mithril используется только как связка логики.
Изменение CSS-переменных:
viewЭто особенно важно для:
Пример изменения переменной напрямую:
document.documentElement.style.setProperty(
"--border-radius",
"12px"
)
При использовании SSR важно:
Подход:
data-theme<html data-theme="dark">
Это устраняет «мигание» темы при загрузке.
Частые параметры:
:root {
--font-size-base: 16px;
--spacing-base: 8px;
}
body {
font-size: var(--font-size-base);
}
Настройки хранятся в localStorage, а при старте
приложения применяются до монтирования Mithril:
const theme = localStorage.getItem("theme")
if (theme) {
document.documentElement.dataset.theme = theme
}
Иногда требуется вычисляемое значение:
m("div", {
style: {
"--progress": "70%"
}
})
.progress {
width: var(--progress);
}
Это позволяет:
CSS-переменные поддерживают transitions:
* {
transition:
background-color 0.3s,
color 0.3s;
}
При смене темы интерфейс плавно адаптируется без вмешательства Mithril.
Рекомендуемая структура:
/* base.css */
:root {
--color-bg: ...
}
/* theme-light.css */
html[data-theme="light"] {
...
}
/* theme-dark.css */
html[data-theme="dark"] {
...
}
Преимущества:
Жёсткие значения в компонентах
Использование классов вместо переменных
Перерисовка компонентов ради темы
Такой подход масштабируется от простых SPA до сложных интерфейсов без усложнения архитектуры.