Структура компонента Nivo

Библиотека Nivo построена вокруг композиционного подхода, в котором каждый график представляет собой набор независимых, но согласованных слоёв. Архитектура ориентирована на декларативное описание данных и визуальных правил, где итоговый рендер формируется из цепочки преобразований: данные → масштабирование → геометрия → оформление → интерактивность.

Каждый компонент Nivo представляет собой React-компонент с чётко определённым набором входных данных и внутренней структурой обработки. Несмотря на разнообразие типов графиков (bar, line, pie, radar, heatmap), внутренняя логика компонентов подчиняется общей схеме.

Базовые элементы архитектуры:

  • Data layer (слой данных) — отвечает за нормализацию входных данных и подготовку структуры для визуализации
  • Scales (масштабы) — преобразование значений в координаты SVG/Canvas
  • Geometry (геометрия) — построение визуальных примитивов (линии, столбцы, дуги, точки)
  • Axes & Grid (оси и сетка) — вспомогательная система координат
  • Layers (слои) — композиция визуальных элементов
  • Interactions (интерактивность) — hover, click, tooltip, events
  • Theme (тема) — единый стиль отображения

Каждый слой может быть переопределён или расширен, что делает архитектуру гибкой и модульной.

Компонент как композиция слоёв

В основе Nivo лежит концепция layered rendering. Любой график можно представить как стек слоёв, которые рендерятся последовательно:

  1. Сетка и фон
  2. Оси
  3. Основная геометрия
  4. Маркеры и индикаторы
  5. Подписи и аннотации
  6. Интерактивные элементы

Каждый слой — это либо встроенная функция, либо пользовательский React-компонент. Такая модель позволяет изменять визуализацию без переписывания логики данных.

Пример концепции слоёв:

  • grid
  • axes
  • bars / lines / slices
  • markers
  • legends

Слои могут быть отключены или переупорядочены, что влияет на итоговую визуальную композицию.

Обработка данных внутри компонента

Данные в Nivo не используются напрямую. Перед рендером они проходят несколько стадий трансформации.

Нормализация структуры

Входные данные приводятся к единому формату, где каждая точка или группа данных получает:

  • индекс
  • значение
  • дополнительные метаданные
  • вычисленные координаты (на следующем этапе)

Например, для линейного графика данные преобразуются в массив точек с координатами X/Y, где X зависит от категории или времени, а Y — от числового значения.

Группировка и агрегация

Для столбчатых и составных графиков данные группируются:

  • по категориям
  • по сериям
  • по временным интервалам

Это формирует структуру stacked/grouped, которая влияет на выбор геометрии.

Система масштабов (scales)

Масштабы являются центральным элементом архитектуры. Они преобразуют абстрактные значения в экранные координаты.

Основные типы масштабов:

  • linear — линейное преобразование чисел
  • band — распределение категорий (bar chart)
  • point — дискретные точки (line chart по категориям)
  • time — временные шкалы
  • log — логарифмические преобразования

Каждый масштаб задаёт:

  • диапазон входных значений (domain)
  • диапазон выходных координат (range)
  • padding и интерполяцию

Масштабы формируют основу для построения осей и геометрии.

Геометрический слой

Геометрия определяет, как данные превращаются в визуальные элементы.

Столбцы (Bar geometry)

Столбец формируется как прямоугольник:

  • x — позиция категории
  • y — значение
  • width — ширина band scale
  • height — разница между baseline и значением

В stacked режиме высота каждого сегмента зависит от суммы предыдущих значений.

Линии (Line geometry)

Линейный график строится как последовательность точек:

  • каждая точка связывается с предыдущей через path
  • используется интерполяция (linear, monotone, basis)

Круговые диаграммы (Pie geometry)

Круговая диаграмма использует дуги:

  • значение преобразуется в угол
  • вычисляется startAngle и endAngle
  • радиус фиксируется или адаптивен

Система слоёв (layers)

Layers в Nivo — это ключевой механизм расширения.

Каждый слой представляет собой функцию:

  • принимает текущее состояние графика
  • возвращает React-элементы SVG или Canvas

Типовая последовательность слоёв:

  • фон (background)
  • сетка (grid)
  • оси (axes)
  • данные (bars, lines, arcs)
  • маркеры (markers)
  • легенды (legends)

Особенность системы заключается в том, что пользователь может:

  • добавлять собственные слои
  • заменять стандартные
  • изменять порядок отрисовки

Таким образом достигается полная контрольная точка над визуальной композицией.

Оси и координатная система

Оси формируются на основе масштабов.

Каждая ось включает:

  • шкалу значений
  • деления (ticks)
  • подписи
  • линии разметки

Оси синхронизированы с геометрией через shared scale context.

Типы осей:

  • xAxis (горизонтальная)
  • yAxis (вертикальная)
  • radial axis (для круговых графиков)

Подписи осей могут автоматически поворачиваться, обрезаться или переноситься в зависимости от доступного пространства.

Интерактивный слой

Интерактивность строится поверх визуальных элементов.

Основные механизмы:

  • hover events
  • click events
  • focus state
  • tooltip system

Tooltip не является отдельным DOM-элементом графика — он подключается как overlay-компонент, который получает данные активного элемента.

Каждый элемент графика содержит metadata:

  • id серии
  • значение
  • координаты
  • индекс

Это позволяет строить универсальную систему взаимодействий независимо от типа графика.

Темизация (Theme system)

Theme в Nivo представляет собой централизованный объект стилей.

Он управляет:

  • цветами
  • шрифтами
  • толщиной линий
  • стилями осей
  • оформлением сетки

Темизация распространяется через context и применяется ко всем слоям.

Структура темы включает:

  • axis styles
  • grid styles
  • labels styles
  • tooltip styles

Темы могут быть объединены (extend), что позволяет строить кастомные дизайн-системы поверх базовой модели.

SVG и Canvas режимы

Nivo поддерживает два режима рендеринга:

SVG

Используется для:

  • интерактивных графиков
  • небольших наборов данных
  • высокой точности DOM-интеракций

Преимущества:

  • простота стилизации через CSS
  • нативные события
  • доступность элементов

Canvas

Используется для:

  • больших объёмов данных
  • высокой производительности
  • сложной анимации

В Canvas режиме рендеринг выполняется через imperative drawing API, а интерактивность реализуется через вычисление hit regions.

Responsive контейнер

Каждый график Nivo обычно оборачивается в responsive wrapper.

Он выполняет:

  • измерение контейнера
  • пересчёт размеров графика
  • адаптацию scales

Механизм основан на ResizeObserver, что позволяет графику реагировать на любые изменения layout без ручного управления размерами.

Анимационная система

Анимации реализованы через transition engine.

Каждое изменение данных приводит к:

  • вычислению начального состояния
  • интерполяции значений
  • обновлению геометрии по кадрам

Поддерживаются:

  • входные анимации
  • обновление данных
  • выходные переходы

Анимация привязана к конкретным визуальным элементам, а не к целому графику.

Система легенд

Легенды представляют собой отдельный слой UI, который получает данные из:

  • series definitions
  • color mappings
  • active states

Каждая легенда может:

  • отображать статус серии
  • управлять видимостью
  • реагировать на взаимодействие

Расположение легенд задаётся независимо от основной области графика.

Контекстная модель данных

Внутри компонента используется shared context, который содержит:

  • размеры графика
  • scales
  • данные после трансформации
  • theme
  • active states

Этот контекст доступен всем слоям и обеспечивает согласованность между визуальными элементами без необходимости prop drilling.

Принцип независимости слоёв

Ключевая особенность архитектуры заключается в том, что каждый слой:

  • не зависит от конкретного типа графика
  • получает унифицированный API
  • работает с уже подготовленными координатами

Это позволяет повторно использовать слои между различными типами визуализаций и строить новые графики на основе существующих компонентов без изменения ядра библиотеки.