Перейти к основному содержимому
Версия: 5.9.0

Дизайн-система

Для настройки пользовательского интерфейса в SDK используется дизайн-система на основе класса ChatTheme.

SDK поддерживает светлую и тёмную темы — они задаются через свойства theme и darkTheme на экземпляре ChatCenterUISDK. Если darkTheme не задана явно, для тёмного режима используются значения из theme.

Установка theme сбрасывает darkTheme — назначайте darkTheme после theme.

Дизайн-система в Figma

Визуальное представление дизайн-системы доступно в виде UIKit в Figma.

Файл содержит следующие страницы:

  • Foundation — цвета, типографика, иконки (светлая и тёмная темы)
  • Message Type — все типы сообщений в контексте чата
  • Components — Navigation, Status, Button, Bubbles, Input Field, OS UI, Content, Illustration
  • User Flow — 40+ экранов с полным пользовательским сценарием
С чего начать

Начните с Быстрого старта — готовый пример, который можно скопировать и адаптировать.

Термины «токен», «компонент», «flow» описаны в Глоссарии.

Быстрый пример

// Создание темы с кастомными цветами
let colors = ChatColors()
colors.main = .black
colors.link = .systemBlue

let theme = ChatTheme(colors: colors)

// Применение
chatCenterSDK.theme = theme
// chatCenterSDK.darkTheme = darkTheme // опционально, если отдельная тёмная тема задана

ChatTheme можно создать двумя способами:

// Из базовых токенов (цвета, шрифты, изображения) — любой аргумент можно опустить
ChatTheme(colors: myColors, typography: myTypography)

// Из настроенных компонентов (для более детальной кастомизации)
ChatTheme(components: myComponents)

Что и когда настраивать

Как выбрать уровень кастомизации?

Дизайн-система имеет три уровня кастомизации. Выберите подходящий:

ЗадачаУровеньЧто изменить
Изменить фирменный цвет во всём SDKТокенChatColors
Изменить шрифты во всём SDKТокенChatTypography
Заменить иконкиТокенChatImages
Настроить кнопку, панель или виджет во всём SDKКомпонентChatComponents
Настроить элемент только в экране чатаСценарийChatFlow
Настроить элемент только в экране поискаСценарийSearchFlow

Все параметры опциональны — по умолчанию используются стандартные настройки.

Архитектура

ChatTheme содержит ChatComponents (общие стили, переиспользуемые на всех экранах SDK) и ChatFlows (переопределения для конкретных экранов). Компоненты опираются на три набора токенов: ChatColors, ChatTypography, ChatImages.

Полный список полей ChatComponents — в Компонентах. Точечная кастомизация через chatFlow / searchFlow — в Сценариях.

Приоритет применения

ChatFlows (точечно, для одного экрана) > ChatComponents (глобально) > ChatColors / ChatTypography / ChatImages (токены по умолчанию).

Метод apply и протокол Applicable

Все объекты дизайн-системы (ChatTheme, ChatColors, ChatTypography, ChatImages, ChatComponents, стили и сценарии) поддерживают метод apply(_ configure:) через протокол Applicable.

theme.flows.chatFlow.apply {
$0.incomeMessages.showAvatar = true
$0.outcomeMessages.showAvatar = false
$0.inputViewStyle.sendButtonStyle.tintColor = .white
}

Метод apply возвращает Self, что позволяет настроить свежесозданный объект в одном выражении:

let theme = ChatTheme().apply { $0.flows.chatFlow.incomeMessages.bubbleTintColor = .red }

Для создания стиля с кастомной конфигурацией используйте фабричный метод build.

Базовый класс ChatStyle

Все стили в SDK наследуют от базового класса ChatStyle. Он реализует протокол Applicable и предоставляет статический метод build(with:configure:) для создания подклассов.

Основные свойства базового класса:

СвойствоТипОписание
backgroundColorUIColorЦвет фона элемента
tintColorUIColorЦвет элемента (кнопка, иконка и т.п.)
cornerRadiusCGFloatСкругление углов (если применимо)
componentsChatComponentsСсылка на основные компоненты стиля

Каждый подкласс (например, ChatInputTextStyle, NavigationBarStyle, QuickReplyStyle) наследует эти свойства и добавляет свои специфичные параметры. ChatStyle напрямую не создаётся — используйте конкретный подкласс через конструктор с components или статический метод build:

let customStyle = ChatInputTextStyle.build(with: components) { style in
style.backgroundColor = .white
style.cursorColor = .systemBlue
}

Расширенные настройки

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

Рекомендации по производительности

  • Создавайте ChatTheme один раз — при инициализации SDK (в AppDelegate / SceneDelegate), а не перед каждым открытием чата или в цикле
  • SF Symbols для иконок кнопок — масштабируются без потери качества и весят меньше растровых изображений. Растровые PNG/PDF лучше для сложных кастомных иллюстраций
  • Для адаптивных цветов предпочтительнее один UIColor(dynamicProvider:) вместо двух объектов ChatColors с theme/darkTheme — если отличаются только цвета
  • Не переиспользуйте один ChatComponents в разных ChatTheme при использовании ChatTheme(components:) — обе темы будут ссылаться на один объект, и изменения в одной затронут другую (подробнее в Быстром старте)
  • iPad и большие экраны: SDK автоматически адаптируется к iPad. При фиксированных размерах шрифтов проверяйте читаемость — на крупном экране может потребоваться увеличить размер
  • Dynamic Type: если приложение поддерживает Dynamic Type, передавайте масштабируемые шрифты через UIFontMetrics:
    let baseFont = UIFont.systemFont(ofSize: 15, weight: .regular)
    typography.message = UIFontMetrics.default.scaledFont(for: baseFont)

Быстрый поиск: куда идти

Хочу...ФайлКласс / свойство
Применить фирменный цветЦветаChatColors.link
Заменить шрифт в пузыряхТипографикаChatTypography.message
Заменить иконку отправкиИзображенияChatImages.sendButtonImage
Настроить навигационную панельКомпонентыChatComponents.navigationBarStyle
Скрыть аватар у исходящихСценарииchatFlow.outcomeMessages.showAvatar
Изменить цвет выделения в поискеСценарииsearchFlow.searchMessageStyle.matchTextStyle.color
Настроить аудиоплеерКомпонентыChatComponents.audioPlayerStyle
Задать тёмную темуБыстрый стартchatCenterSDK.darkTheme
Найти все классы стилейСтили
Что-то не работаетTroubleshooting
Изменить цвет кнопки отправки (везде)Компонентыcomponents.inputViewStyle.sendButtonStyle.tintColor
Изменить цвет кнопки отправки (только чат)СценарииchatFlow.inputViewStyle.sendButtonStyle.tintColor
Настроить пустой экран чатаКомпонентыcomponents.chatPlaceholderStyle