Стилизация через CSS

Интерфейс Kepler.gl построен поверх React-компонентов и тесно связан с визуализационным стеком deck.gl и Mapbox GL. Основной принцип кастомизации заключается не в глубокой модификации логики, а в переопределении CSS-слоёв, управляющих панелями, контролами и всплывающими элементами. При этом структура DOM остаётся достаточно стабильной, что позволяет применять предсказуемые стратегии стилизации.

Базовая модель CSS-архитектуры Kepler.gl

Kepler.gl использует набор предопределённых классов, разделённых по функциональным областям интерфейса:

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

Каждый блок реализован как React-компонент с привязанным CSS-модулем. В результате стили могут применяться как через глобальные селекторы, так и через более специфичные переопределения.

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

Переопределение базовых стилей

Самый прямолинейный способ стилизации — подключение собственного CSS-файла после загрузки стандартных стилей Kepler.gl.

.kepler-gl {
  font-family: Inter, system-ui, sans-serif;
  background-color: #0b0f1a;
}

.kepler-gl__panel {
  background-color: rgba(20, 24, 35, 0.95);
  border-radius: 10px;
  box-shadow: 0 10px 30px rgba(0,0,0,0.4);
}

Переопределение выполняется через каскадность CSS. Чем специфичнее селектор, тем выше приоритет изменения.

Важно учитывать, что внутренняя структура классов может меняться между версиями, поэтому устойчивые стили обычно строятся на более стабильных контейнерах уровня приложения.

Работа с контейнером приложения

Корневой элемент Kepler.gl обычно размещается внутри контейнера с фиксированным позиционированием:

#app {
  width: 100%;
  height: 100vh;
  overflow: hidden;
}

Слой карты занимает всю доступную область, поэтому любые внешние отступы должны задаваться на уровне родительских контейнеров, а не внутри компонентов Kepler.gl.

Дополнительно часто требуется управление z-index-иерархией:

.kepler-gl {
  position: relative;
  z-index: 0;
}

.kepler-gl__modal {
  z-index: 1000;
}

Темизация интерфейса

Темизация строится через переопределение переменных и глобальных цветов. Хотя Kepler.gl не всегда использует полноценные CSS variables, цветовая схема может быть изменена через селекторы.

Основные зоны изменения:

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

Пример тёмной темы:

.kepler-gl {
  --panel-bg: #111827;
  --accent-color: #3b82f6;
}

.kepler-gl__button {
  background-color: var(--panel-bg);
  color: #e5e7eb;
}

.kepler-gl__button:hover {
  background-color: #1f2937;
}

Даже при отсутствии нативной поддержки переменных, такой подход упрощает поддержку единого визуального языка.

Стилизация панели слоёв

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

.kepler-gl__layer-panel {
  width: 320px;
  background: #0f172a;
  border-left: 1px solid #1e293b;
}

.kepler-gl__layer-panel-header {
  font-weight: 600;
  padding: 12px 16px;
}

Особое внимание уделяется состояниям элементов:

.kepler-gl__layer-item--active {
  background-color: rgba(59, 130, 246, 0.15);
}

.kepler-gl__layer-item:hover {
  background-color: rgba(255, 255, 255, 0.05);
}

Состояния hover и active формируют основную интерактивность интерфейса без изменения JavaScript-логики.

Стилизация всплывающих окон и тултипов

Popup-элементы в Kepler.gl часто создаются поверх WebGL-контекста Mapbox GL JS, поэтому требуют строгого контроля прозрачности и слоёв.

.kepler-gl__tooltip {
  background-color: rgba(17, 24, 39, 0.95);
  color: #f9fafb;
  border-radius: 6px;
  padding: 8px 10px;
  font-size: 12px;
  backdrop-filter: blur(6px);
}

Mapbox GL добавляет собственные контейнеры для popups, поэтому иногда требуется перекрытие стандартных классов Mapbox:

.mapboxgl-popup-content {
  background: transparent;
  box-shadow: none;
}

Такой подход позволяет полностью синхронизировать внешний вид Kepler.gl с картографическим слоем.

Стилизация кнопок и контролов

Контролы интерфейса формируют основное взаимодействие пользователя с картой. Их стилизация должна учитывать активные, disabled и hover состояния.

.kepler-gl__control-button {
  width: 36px;
  height: 36px;
  border-radius: 8px;
  border: 1px solid transparent;
  transition: all 0.2s ease;
}

.kepler-gl__control-button:active {
  transform: scale(0.96);
}

Отклик интерфейса через визуальные состояния играет ключевую роль при работе с плотными аналитическими слоями.

Интеграция со стилями Mapbox GL

Kepler.gl использует Mapbox GL JS как базовый рендерер карт, поэтому часть визуальных изменений должна выполняться через переопределение Mapbox-стилей.

.mapboxgl-ctrl-group {
  background: #0b1220;
  border-radius: 8px;
  overflow: hidden;
}

.mapboxgl-ctrl button {
  filter: brightness(0.9);
}

Изменения здесь влияют на стандартные элементы управления масштабом, компасом и навигацией.

Управление шрифтами и типографикой

Типографика распространяется на весь интерфейс Kepler.gl, поэтому изменение базового font-family является наиболее эффективным способом унификации визуального стиля.

.kepler-gl {
  font-family: "Roboto", "Helvetica Neue", Arial, sans-serif;
  font-size: 13px;
  line-height: 1.4;
}

Дополнительно можно выделять заголовки панелей:

.kepler-gl__panel-title {
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.2px;
}

Переопределение модальных окон

Модальные окна являются отдельным уровнем интерфейса, часто перекрывающим карту и панели.

.kepler-gl__modal-overlay {
  background-color: rgba(0, 0, 0, 0.6);
}

.kepler-gl__modal {
  background-color: #0f172a;
  border-radius: 12px;
  padding: 20px;
}

Контроль overlay-слоя влияет на восприятие глубины интерфейса и визуальную иерархию элементов.

Адаптация под плотные интерфейсы данных

При работе с большими наборами данных интерфейс требует визуального упрощения:

.kepler-gl__legend {
  font-size: 11px;
  opacity: 0.85;
}

.kepler-gl__filter-item {
  padding: 6px 8px;
}

Снижение визуального шума позволяет повысить читаемость аналитических элементов без изменения функционала.

Стратегии устойчивой стилизации

Для долгосрочной поддержки интерфейса применяются следующие подходы:

  • минимизация зависимости от глубоких селекторов
  • использование контейнерных классов уровня приложения
  • изоляция тем через отдельные CSS-файлы
  • контроль специфичности вместо !important
  • разделение базовых и оверрайд-стилей

Такая структура позволяет сохранять предсказуемость поведения интерфейса при обновлениях библиотеки и изменениях DOM-структуры.