Система тем в Nivo задаёт единый слой визуального оформления, который применяется ко всем графическим компонентам: осям, сетке, подписям, тултипам, легендам и самим геометрическим примитивам. Основная идея заключается в отделении визуального стиля от логики построения графиков, что позволяет централизованно управлять внешним видом всех диаграмм в приложении.
Тема в Nivo представляет собой объект конфигурации, который передаётся на верхнем уровне и наследуется всеми вложенными компонентами визуализации. Это обеспечивает согласованность интерфейса даже при использовании различных типов графиков: линейных, столбчатых, круговых и сложных комбинированных.
Тема в Nivo описывается JavaScript-объектом, содержащим набор визуальных параметров:
Базовый шаблон:
const theme = {
background: "#ffffff",
text: {
fontSize: 11,
fill: "#333333",
outlineWidth: 0,
outlineColor: "transparent"
},
axis: {
domain: {
line: {
stroke: "#777777",
strokeWidth: 1
}
},
ticks: {
line: {
stroke: "#777777",
strokeWidth: 1
},
text: {
fontSize: 10,
fill: "#333333"
}
}
},
grid: {
line: {
stroke: "#dddddd",
strokeWidth: 1
}
},
tooltip: {
container: {
background: "#ffffff",
color: "#333333",
fontSize: 12
}
}
};
Каждый блок темы соответствует определённой части графика и влияет только на свою область ответственности.
Тема передаётся в компонент визуализации как глобальный параметр. Все внутренние элементы используют значения из темы, если не переопределены локально.
<ResponsiveLine
data={data}
theme={theme}
/>
При отсутствии пользовательской темы используется встроенная базовая конфигурация Nivo.
Типографический блок text управляет всеми текстовыми
элементами графиков. Он включает параметры:
text: {
fontSize: 12,
fill: "#222222",
outlineWidth: 0,
outlineColor: "transparent"
}
Изменение этих параметров влияет сразу на:
Типографика в теме играет роль базового слоя, от которого наследуются остальные текстовые элементы.
Раздел axis управляет внешним видом координатных осей,
включая линии домена, деления и подписи.
axis: {
domain: {
line: {
stroke: "#888888",
strokeWidth: 1
}
},
ticks: {
line: {
stroke: "#888888",
strokeWidth: 1
},
text: {
fontSize: 10,
fill: "#555555"
}
}
}
Компоненты осей делятся на две группы:
Разделение позволяет независимо управлять визуальным весом каждой части, формируя иерархию восприятия данных.
Сетка выполняет функцию визуального ориентира и не должна конкурировать с основными данными.
grid: {
line: {
stroke: "#e1e1e1",
strokeWidth: 1
}
}
Часто сетка делается максимально нейтральной, чтобы не перегружать график. В темных интерфейсах используется приглушённая контрастность, в светлых — светло-серые линии.
Хотя основная палитра часто задаётся на уровне компонентов, тема может влиять на общую цветовую концепцию.
Типовая стратегия включает:
const theme = {
background: "#0f172a",
text: {
fill: "#e5e7eb"
},
grid: {
line: {
stroke: "#1f2937"
}
}
};
Цвета в теме не заменяют палитры данных, но задают визуальный контекст, в котором данные воспринимаются.
Тултип является динамическим элементом интерфейса, и его оформление критично для читаемости данных.
tooltip: {
container: {
background: "#ffffff",
color: "#111111",
fontSize: 12,
borderRadius: 4,
boxShadow: "0 3px 6px rgba(0,0,0,0.1)"
}
}
Тултип должен быть визуально отделён от графика, но при этом соответствовать общей теме приложения.
Легенды управляются через стили текста и маркеров:
legends: {
text: {
fontSize: 11,
fill: "#444444"
}
}
Хотя легенды часто настраиваются на уровне компонента, базовая типографика и цветовые значения могут наследоваться из темы.
Тема может быть расширена для покрытия дополнительных визуальных аспектов:
const extendedTheme = {
...theme,
crosshair: {
line: {
stroke: "#999999",
strokeWidth: 1,
strokeOpacity: 0.5
}
}
};
Расширение темы позволяет централизованно управлять интерактивными состояниями без дублирования настроек в каждом графике.
Одним из ключевых применений системы тем является поддержка светлой и тёмной схемы оформления.
Светлая тема:
const lightTheme = {
background: "#ffffff",
text: { fill: "#111111" },
grid: { line: { stroke: "#e5e5e5" } }
};
Тёмная тема:
const darkTheme = {
background: "#111827",
text: { fill: "#e5e7eb" },
grid: { line: { stroke: "#374151" } }
};
Разделение на темы позволяет сохранять единый API визуализации при радикально разных визуальных стилях.
В Nivo существует иерархия применения стилей:
Локальная настройка всегда имеет приоритет над темой, что позволяет точечно переопределять поведение отдельных элементов без изменения глобальной конфигурации.
В масштабных системах тема часто формируется из нескольких слоёв:
const finalTheme = {
...baseTheme,
...productTheme,
axis: {
...baseTheme.axis,
...productTheme.axis
}
};
Такой подход обеспечивает согласованность визуального языка при сохранении гибкости.
Корректно настроенная тема снижает когнитивную нагрузку за счёт:
Тема становится не только инструментом стилизации, но и механизмом управления читаемостью данных и визуальной структурой графиков.