Темы и переменные

Настройка тем и переменных в SkateJS опирается на гибкую систему кастомизации интерфейса, построенную вокруг реактивных свойств и CSS-переменных. Библиотека придерживается минималистичного подхода: каждый компонент имеет базовый набор визуальных параметров, которые могут быть переопределены глобально, на уровне темы или непосредственно в компоненте.

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

  1. Глобальные значения, задающие дефолтный вид интерфейса.
  2. Тема приложения, формирующая единый визуальный стиль.
  3. Локальные переменные, применяемые к отдельным компонентам.

Переопределение происходит по принципу каскада. Если локальное значение не определено, компонент обращается к теме, затем к глобальным параметрам.

Переменные CSS как основа

Тематическая система опирается на CSS Custom Properties. SkateJS генерирует предсказуемые имена переменных, позволяя объединять их в группы:

  • Цветовая палитра
  • Размеры и отступы
  • Шрифты и начертания
  • Радиусы и рамки
  • Состояния и интерактивность

Например, переменные палитры могут выглядеть как:

--sk-color-primary
--sk-color-primary-hover
--sk-color-primary-active

Аналогично организуются шрифты:

--sk-font-base
--sk-font-mono
--sk-font-size-s
--sk-font-size-m
--sk-font-size-l

Реактивные переменные

SkateJS обрабатывает часть переменных как реактивные: изменение значения приводит к немедленному обновлению интерфейса. Механизм актуален для элементов, реагирующих на динамические данные, например отображение темы в зависимости от системных настроек (светлая/тёмная).

Реактивность реализуется через связывание JavaScript-состояния и CSS-переменных. Например, при переключении темы компонент лишь обновляет набор переменных, не выполняя перерисовку ручным образом.

Декларативное определение тем

Темы в SkateJS описываются декларативно. Обычно применяется объектная нотация, содержащая набор переменных и модификаторов. Пример типичной структуры темы:

const theme = {
  colors: {
    primary: '#3476E2',
    secondary: '#1F2937',
    background: '#FFFFFF'
  },
  fonts: {
    base: 'Inter, sans-serif',
    mono: 'Fira Code, monospace'
  },
  radii: {
    sm: '4px',
    md: '8px',
    lg: '12px'
  }
};

После определения тема сериализуется в CSS-переменные. SkateJS автоматически преобразует вложенные ключи в имена переменных с префиксом --sk-.

Тёмные и альтернативные темы

Для переключения тем библиотека использует механизм корневого переключателя, основанный на переопределении переменных. Например, тёмная тема может содержать тот же набор ключей, но с иной палитрой. Переключение темы не влияет на внутреннюю логику компонентов: они используют единую точку доступа к переменным.

Тематическая система допускает наложение дополнительных тем поверх основной. Это удобно для локальных сценариев: акцентные секции, панели настроек, диалоговые окна.

Переменные уровня компонента

Компонент SkateJS может объявить набор переменных, доступных для переопределения. Такие переменные оформляются в виде контракта: имя, тип значения и дефолт. Контракт обеспечивает единообразие. Например:

button {
  --sk-button-padding-x: 12px;
  --sk-button-padding-y: 6px;
  --sk-button-radius: var(--sk-radii-md);
}

Компонент при этом не знает, какие конкретные значения применяет тема, он лишь объявляет точки конфигурации.

Наследование тем

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

  • Базовая корпоративная тема.
  • Продуктовая тема.
  • Тема страницы или раздела.

Процесс похож на наследование классов: базовые свойства остаются, а изменённые перекрывают их сверху.

Переменные состояний

Отдельный аспект — переменные состояний, связанных с интерактивностью: hover, active, focus, disabled. SkateJS предлагает хранить их как отдельные группы переменных, что упрощает синхронизацию визуального отклика. Например:

--sk-button-bg
--sk-button-bg-hover
--sk-button-bg-active
--sk-button-bg-disabled

Такой подход избегает хрупких CSS-селекторов и даёт возможность темам контролировать ощущения от взаимодействия.

Размерные шкалы и модульность

Темы используют модульные сетки для размеров и типографики. Шкалы определяются через переменные:

--sk-space-1: 4px;
--sk-space-2: 8px;
--sk-space-3: 12px;
--sk-space-4: 16px;

Шрифты — через аналогичную шкалу. Унификация размеров улучшает регулярность интерфейса.

Синхронизация с JavaScript-логикой

Темы могут влиять не только на визуальную часть. SkateJS позволяет экспортировать выбранные переменные обратно в JavaScript. Например, если значение --sk-space-4 должно вычисляться в логике анимаций, его можно прочитать через API компонента. Такой обмен устраняет дублирование данных и обеспечивает согласованность.

Локальная конфигурация компонентов

Возможна локальная подстройка темы через определённые секции. Например, блок форм может использовать иной радиус кнопок и контрастную палитру. Локальная секция переопределяет переменные внутри своей области и не затрагивает остальную часть интерфейса.

Именование и соглашения

SkateJS придерживается строгой системы именования переменных:

  • Префикс --sk-
  • Категория (color, font, space, radius)
  • Компонент или контекст (button, input, modal)
  • Состояние или размер (hover, sm, lg)

Такой формат минимизирует конфликты и улучшает читабельность тем.

Типизация тем

При использовании TypeScript темы могут быть типизированы. Контракты переменных получают явную структуру, позволяя проверять корректность значений на этапе разработки. Типизация предотвращает ошибки в ключах и обеспечивает стабильность интерфейса при масштабировании проекта.

Динамические темы

Помимо статических вариантов SkateJS допускает динамические темы. Такие темы формируются на лету, например, в зависимости от пользовательских параметров или системных настроек. Динамическое вычисление переменных используется для адаптивных интерфейсов: крупные шрифты, повышенный контраст, кастомная палитра.

Интеграция с CSS-препроцессорами

Темы SkateJS остаются совместимыми с Sass и PostCSS. Препроцессоры могут генерировать дополнительные переменные, миксины и карты, которые в дальнейшем замещаются системой тем. Это даёт возможность сохранять существующие практики верстки.

Масштабирование в больших проектах

В крупных проектах темы превращаются в фундаментальный ресурс. SkateJS предлагает модульное разделение тем на файлы: палитра, типографика, сетка, компоненты. Такое разделение облегчает обновление бренда и делает визуальные изменения более предсказуемыми.

Ключевые свойства системы

  • Полная поддержка CSS Custom Properties.
  • Реактивность значений без ручного управления перерисовкой.
  • Декларативное описывание тем.
  • Наследование и наложение тем.
  • Типизация контрактов.
  • Динамические вычисления.
  • Совместимость с внешней инфраструктурой стилей.

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