# UI-элементы и структура JSON

Документ описывает JSON, которым управляется UI кампаний в Gravity Field SDK (Android и Flutter). Ниже перечислены все элементы, их параметры, объект style и поддерживаемые действия onClick с учетом различий платформ.

# Общая структура CampaignContent

Визуальное представление кампании определяется объектом CampaignContent (данные приходят из Custom Code/API или template). Ключевые поля:

  • deliveryMethod – способ показа. Android принимает синонимы (snackBar/snackbar, bottomSheet/bottom_sheet, fullscreen/full_screen), Flutter ожидает значения в snake_case. Поддерживаемые значения: modal, bottom_sheet, full_screen, snackbar, inline.
  • variables – описание UI и событий:
    • frameUI – контейнер и кнопка закрытия (опционально).
    • elements – массив UI-элементов (обязательно).
    • onLoad, onImpression, onVisibleImpression, onClose – события контента. Значение action должно соответствовать enum Action (load, impression, visible_impression, close и т.д.).
  • products/items – данные для карточек товара/предметов, если используются products-container или items-container.
  • events – трекинг-события (видимые показы, клики по товарам и т.д.).
  • step (Number) — Индекс шага (для многошаговых сценариев, например, опросов).
  • items (List) — Список данных для items-container. Каждый объект содержит id и словарь values (ключ-значение).
{
  "deliveryMethod": "modal",
  "step": 1,
  "items": [
    { "id": "1", "values": { "title": "Option 1" } },
    { "id": "2", "values": { "title": "Option 2" } }
  ],
  "variables": {
    "frameUI": { ... },
    "elements": [ ... ],
    "onVisibleImpression": { "action": "visible_impression" },
    "onLoad": { "action": "load" },
    "onImpression": { "action": "impression" },
    "onClose": { "action": "close" }
  }
}

# FrameUI

Определяет корневой контейнер и кнопку закрытия. В Android container может содержать onClick, во Flutter — только style.

# Container

Основной контейнер (фон, скругление, отступы).

Поддерживаемые стили (style):

Свойство Тип Описание
backgroundColor String (Hex) Цвет фона.
backgroundImage String (URL) Фоновое изображение.
backgroundFit String Масштабирование фонового изображения (Android): cover, contain, fill, fitWidth, fitHeight, none, scaleDown.
cornerRadius Number Скругление углов.
padding Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.
contentAlignment String Горизонтальное выравнивание дочерних элементов: start, center, end.
verticalAlignment String Вертикальное выравнивание дочерних элементов: start, center, end.
size Object { "width": Number, "height": Number }.

# Close Button

Кнопка закрытия.

Поддерживаемые стили (style):

Свойство Тип Описание
size Object { "width": Number, "height": Number }.
positioned Object Абсолютное позиционирование: { "top": Number, "bottom": Number, "left": Number, "right": Number }.
"frameUI": {
  "container": {
    "style": {
      "backgroundColor": "#FFFFFF",
      "cornerRadius": 16,
      "padding": { "top": 20, "bottom": 20, "left": 16, "right": 16 },
      "size": { "width": 300 }
    }
  },
  "close": {
    "image": "https://example.com/close_icon.png",
    "style": {
      "size": { "width": 24, "height": 24 },
      "positioned": { "top": 10, "right": 10 }
    },
    "onClick": { "action": "close" }
  }
}

# Каталог элементов

Каждый объект из массива elements описывает конкретный UI-элемент. Поле type должно соответствовать одному из поддерживаемых значений.

# Text

Отображает текстовую строку.

Поддерживаемые стили (style):

Свойство Тип Описание
textColor String (Hex) Цвет текста.
fontSize Number Размер шрифта в sp.
fontWeight String "100"–"900".
contentAlignment String Горизонтальное выравнивание: start, center, end.
margin Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.

# Image

Отображает изображение по URL. style.fit управляет вписыванием: cover, contain, fill, fitWidth, fitHeight, none, scaleDown.

Поддерживаемые стили (style):

Свойство Тип Описание
size Object { "width": Number, "height": Number }.
fit String Масштабирование: cover, contain, fill, fitWidth, fitHeight, none, scaleDown.
cornerRadius Number Скругление углов.
layoutWidth String match_parent или wrap_content.
margin Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.

# Button

Интерактивная кнопка. Для цвета нажатия используйте pressColor (ripple).

Поддерживаемые стили (style):

Свойство Тип Описание
backgroundColor String (Hex) Цвет кнопки.
pressColor String (Hex) Цвет нажатия (ripple).
cornerRadius Number Скругление углов.
size Object { "height": Number }.
layoutWidth String match_parent или wrap_content.
margin Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.
textStyle Object Стили текста внутри кнопки: { "color", "fontSize", "fontWeight" }.

# Spacer

Гибкое пространство (распорка) для настройки макета.

Поддерживаемые стили (style):

Свойство Тип Описание
rows Number Вес для Spacer на Android (1.0 по умолчанию).

# WebView

Встраивает веб-страницу.

Поддерживаемые стили (style):

Свойство Тип Описание
size Object { "height": Number }.
layoutWidth String match_parent или wrap_content.
cornerRadius Number Скругление углов.
margin Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.
padding Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.

# ProductsContainer

Контейнер для отображения списка или сетки товаров.

Поддерживаемые стили (style):

Свойство Тип Описание
productContainerType String row (горизонтальный список) или grid (сетка).
gridColumns Number Кол-во колонок сетки (Android).
rowSpacing Number Вертикальный интервал между рядами (Android).
gridSettings Object Flutter-настройки сетки: { "columns", "horizontalSpacing", "verticalSpacing" }.
padding Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.
margin Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.
backgroundColor String (Hex) Цвет фона контейнера.

# ItemsContainer

Контейнер для отображения горизонтального списка произвольных элементов (в отличие от products-container, который работает с товарами).

Специфичные поля:

  • itemCard (Object) — Шаблон для отрисовки каждого элемента списка.

Поддерживаемые стили (style):

Свойство Тип Описание
rowSpacing Number Интервал между элементами.
backgroundColor String (Hex) Цвет фона.
padding Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.
margin Object { "top": Number, "bottom": Number, "left": Number, "right": Number }.
size Object { "height": Number }.

Пример JSON:

{
  "type": "items-container",
  "style": {
    "rowSpacing": 8,
    "size": { "height": 150 }
  },
  "itemCard": {
    "template": {
      "frameUI": {
        "container": {
          "style": {
            "backgroundColor": "#F0F0F0",
            "cornerRadius": 8,
            "size": { "width": 120, "height": 150 }
          },
          "onClick": {
            "action": "open_step",
            "step": 2
          }
        }
      },
      "elements": [
        {
          "type": "text",
          "text": "title_key",
          "style": { "fontSize": 14, "textColor": "#000000" }
        }
      ]
    }
  }
}

# ItemCard

Шаблон для отображения одного элемента в items-container.

  • template (Object): Содержит frameUI и elements.
  • Важно: Внутри ItemCard поля text и src в элементах воспринимаются как ключи для подстановки значений из массива items (передается в CampaignContent).

# Действия (onClick и события)

onClick можно указать у большинства элементов, у кнопки закрытия и (только Android) у контейнера. Поля:

Свойство Тип Описание
action String Тип действия.
url String Используется для follow_url.
type String Android: способ открытия URL — browser или webview.
deeplink String Используется для follow_deeplink.
copyData String Текст для copy.
step Number Шаг для open_step (Android).
itemId String ID товара/слота для open_step (Android).
closeOnClick Boolean Flutter: закрыть кампанию после действия (по умолчанию true).

Поддерживаемые action:

  • close – закрыть кампанию.
  • follow_url – открыть URL (Android: обязательно укажите type).
  • follow_deeplink – открыть диплинк.
  • copy – скопировать текст в буфер обмена.
  • request_push – открыть системные настройки уведомлений.
  • request_tracking – запросить ATT (iOS).
  • open_step – Переход к другому шагу кампании.
    • step (Number): Индекс целевого шага.
    • itemId (String): Автоматически передается при клике внутри items-container для передачи контекста выбора.
  • cancel – закрыть кампанию и отправить событие отмены (Android).