Skip to content

Контролы Custom Containers

Контролы описывают, какие параметры Custom Container можно менять в правой панели редактора.

Поле resizable не является контролом. Это общее свойство контейнера, которое определяет, можно ли менять размер resize-ручками в редакторе.

Если контейнеру не нужны настройки, передайте пустой tool:

ts
tool: {
  sectionsConfig: {},
  controlsConfig: {}
}

Базовый формат

ts
tool: {
  sectionsConfig: {
    CustomContainerSection: {
      widgetProperties: ['productId', 'theme', 'enabled']
    }
  },
  controlsConfig: {
    productId: {
      type: 'TextInput',
      params: {
        label: 'Product ID',
        placeholder: 'sku-123'
      }
    },
    theme: {
      type: 'Tabs',
      params: {
        label: 'Theme',
        options: [
          { id: 'light', label: 'Light' },
          { id: 'dark', label: 'Dark' }
        ],
        variant: 'secondary'
      }
    },
    enabled: {
      type: 'Toggle',
      params: {
        label: 'Enabled'
      }
    }
  }
}

sectionsConfig.CustomContainerSection.widgetProperties задает список параметров и порядок их отображения.

controlsConfig описывает, каким контролом редактировать каждый параметр.

Где хранятся значения

Начальные значения задаются в customProps:

ts
customProps: {
  productId: '',
  theme: 'light',
  enabled: true
}

Когда дизайнер меняет контрол, значение сохраняется в этом параметре контейнера. В итоговом HTML параметры доступны как атрибуты:

html
data-vrstk-custom-param-product-id="sku-123" data-vrstk-custom-param-theme="dark" data-vrstk-custom-param-enabled="true"

Ключи преобразуются в kebab-case: productId становится product-id, openInNewTab становится open-in-new-tab.

Важное ограничение

Контролы не подставляют значения обратно в поле html автоматически.

Если контейнер содержит HTML:

ts
html: '<a class="client-buy-button">Купить</a>'

и дизайнер поменял параметр label, исходная HTML-строка не перепишется сама. Новое значение будет сохранено как параметр контейнера и попадет в HTML-атрибут. Сайт клиента должен использовать эти параметры при замене маркера или при своей JS-инициализации.

Рекомендуемые типы контролов

Для Custom Containers лучше использовать простые универсальные контролы.

ТипДля чегоОсновные параметры
TextInputСтроки, ID, URL, slug, текст кнопкиlabel, placeholder
NumberInputЧисла, приоритет, лимиты, количестваlabel, min, max, step, postfix
TabsВыбор одного варианта из короткого спискаlabel, options, variant
ToggleБулево значение в виде переключателяlabel
CheckboxБулево значение в виде чекбоксаlabel
DropdownВыбор одного варианта из длинного спискаlabel, options
ColorЦвет, если он нужен клиентскому виджетуlabel

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

TextInput

ts
title: {
  type: 'TextInput',
  params: {
    label: 'Title',
    placeholder: 'Введите заголовок'
  }
}

Подходит для:

  • ID виджета;
  • URL;
  • slug;
  • текстов;
  • CMS-ключей.

NumberInput

ts
priority: {
  type: 'NumberInput',
  params: {
    label: 'Priority',
    min: 1,
    max: 10,
    step: 1,
    roundTo: 'integers'
  }
}

Подходит для:

  • приоритета;
  • лимита элементов;
  • количества колонок;
  • таймаута;
  • числового ID, если он действительно числовой.

Tabs

ts
variant: {
  type: 'Tabs',
  params: {
    label: 'Variant',
    options: [
      { id: 'compact', label: 'Compact' },
      { id: 'wide', label: 'Wide' }
    ],
    variant: 'secondary'
  }
}

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

Toggle

ts
showAvatar: {
  type: 'Toggle',
  params: {
    label: 'Show avatar'
  }
}

Подходит для включения или выключения опции.

Checkbox

ts
closable: {
  type: 'Checkbox',
  params: {
    label: 'Closable'
  }
}

Тоже булево значение, но визуально выглядит спокойнее, чем Toggle.

ts
placement: {
  type: 'Dropdown',
  params: {
    label: 'Placement',
    options: [
      { id: 'top', label: 'Top' },
      { id: 'inline', label: 'Inline' },
      { id: 'bottom', label: 'Bottom' }
    ]
  }
}

Подходит для длинных списков, где Tabs занимали бы слишком много места.

Color

ts
accentColor: {
  type: 'Color',
  params: {
    label: 'Accent color'
  }
}

Используйте, если клиентский виджет действительно должен получать цвет из редактора.

Дополнительные флаги

У каждого контроля можно передать служебные флаги:

ФлагОписание
hideСкрывает контрол. Обычно не нужен в клиентских конфигах.
propagateУправляет распространением значения на дочерние контейнеры. Для Custom Containers обычно не нужен.
propagateDeltaПрименяет дельту значения к дочерним контейнерам. Обычно внутренний сценарий редактора.
propagateScaleМасштабирует дочерние контейнеры. Обычно внутренний сценарий редактора.
skipSelfНе применяет значение к самому выбранному контейнеру. Обычно внутренний сценарий редактора.

Для клиентских контейнеров в большинстве случаев достаточно type и params.