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

Компоненты

Компоненты являются основными элементами настройки дизайн-системы. При совпадении типа компонента (внешнего вида) их можно переиспользовать на пользовательских сценариях (экранах). Например, кнопка с иконкой.

Позволяют быстро устанавливать и менять стиль оформления чата.

Пример настройки:

// Создание компонентов с кастомными цветами
let components = ChatComponents(colors: myColors, typography: myTypography)

// Переопределение параметров общих для SDK компонентов
components.navigationBarStyle.titleTextStyle.color = .white
components.searchBarStyle.cancelButtonStyle.tintColor = .white

// Создание темы из компонентов
let theme = ChatTheme(components: components)

или через конструктор build:

let components = ChatComponents.build { components in
components.searchBarStyle.cancelButtonStyle.tintColor = .black
components.loadingChatStyle.indicatorStyle.backgroundColor = .systemGray3
components.loadingChatStyle.indicatorStyle.cornerRadius = 20.0
components.audioPlayerStyle.playButtonStyle.image = ChatImage(system: "play.fill", tintColor: .red)
components.audioPlayerStyle.pauseButtonStyle.image = ChatImage(system: "pause.fill", tintColor: .green)
components.audioPlayerStyle.progressViewStyle.color = .black
components.audioPlayerStyle.progressViewStyle.backgroundColor = .yellow
}
примечание

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

Параметры конструктора (все опциональные, имеют значения по умолчанию):

  • images: ChatImages — изображения, используемые в теме.
  • colors: ChatColors — цветовая палитра.
  • typography: ChatTypography — настройки шрифтов.

Стили компонентов чата

НазваниеОписание
navigationBarStyleСтиль панели навигации (заголовок, кнопки назад/вперед, цвет фона и т.д.).
searchBarStyleСтиль панели поиска в панели навигации.
loadingIndicatorStyleСтиль индикатора загрузки (прогресс-бар, спиннер). Используется везде, где требуется отобразить процесс ожидания.
loadingChatStyleСтиль загрузки чата (экран при открытии чата).
chatPlaceholderStyleСтиль заглушки для пустого чата (например, когда нет сообщений).
errorPlaceholderStyleСтиль ошибки в чате (сетевая ошибка, сбой загрузки). Показывает информативное сообщение и действия (например, «Повторить»).
inputTextStyleСтиль текстового поля ввода сообщения. Настройка шрифта, цвета текста, placeholder'а, отступов и других параметров ввода.
inputSearchTextStyleСтиль текстового поля в панели поиска.
audioPlayerStyleСтиль аудиоплеера для воспроизведения голосовых сообщений. Включает внешний вид и поведение элементов управления.
inputViewStyleСтиль панели ввода сообщений (нижняя часть чата). Включает поле ввода, кнопки отправки и прикрепления.
chatMenuStyleСтиль меню выбора действий (добавление файла, фото, камера).
warning

photoPickerStyle — deprecated, используйте chatMenuStyle.

Примеры кастомизации типичных элементов

Поле ввода текста

components.inputTextStyle.apply { style in
style.cursorColor = UIColor(named: "BrandColor") ?? .systemBlue // курсор
style.textStyle.color = .label // цвет текста
style.backgroundColor = .systemBackground
}

Или только в экране чата (не затрагивая поиск):

let customInput = ChatInputTextStyle.build(with: components) { style in
style.tintColor = UIColor(named: "BrandColor") ?? .systemBlue
}
theme.flows.chatFlow.inputViewStyle.inputTextStyle = customInput

Навигационная панель

components.navigationBarStyle.apply { style in
style.titleTextStyle.font = .systemFont(ofSize: 17, weight: .semibold)
style.titleTextStyle.color = .white
style.backgroundColor = UIColor(named: "BrandColor") ?? .systemBlue
}

Цвет пузырей сообщений

// Входящие (от оператора)
theme.flows.chatFlow.incomeMessages.bubbleTintColor = UIColor(named: "BubbleIncoming") ?? .systemGray5
// Исходящие (от клиента)
theme.flows.chatFlow.outcomeMessages.bubbleTintColor = UIColor(named: "BrandColor") ?? .systemBlue
// Цвет текста в пузырях
theme.flows.chatFlow.incomeMessages.textMessageStyle.textStyle.color = .label
theme.flows.chatFlow.outcomeMessages.textMessageStyle.textStyle.color = .white

Кнопка отправки

let customInput = ChatInputStyle.build(with: components) { style in
style.sendButtonStyle.image = ChatImage(system: "paperplane.fill", tintColor: .white)
style.sendButtonStyle.tintColor = UIColor(named: "BrandColor") ?? .systemBlue
}
theme.flows.chatFlow.inputViewStyle = customInput

Панель поиска

components.searchBarStyle.apply { style in
style.tintColor = UIColor(named: "BrandColor") ?? .systemBlue
style.cancelButtonStyle.tintColor = .white
}

Индикатор загрузки

components.loadingIndicatorStyle.apply { style in
style.indicatorColor = UIColor(named: "BrandColor") ?? .systemBlue
}

Экран загрузки чата

components.loadingChatStyle.apply { style in
style.indicatorStyle.backgroundColor = .systemGray6
style.indicatorStyle.cornerRadius = 16.0
}

Пустое состояние чата

// Текст при пустом чате
components.chatPlaceholderStyle.apply { style in
style.titleTextStyle.color = .secondaryLabel
style.titleTextStyle.font = .systemFont(ofSize: 15, weight: .regular)
}

// Заменить иллюстрацию (через токен изображений)
let images = ChatImages()
images.emptyChatPlaceholderImage = ChatImage(named: "EmptyChat", bundle: .main)

Ошибка загрузки

components.errorPlaceholderStyle.apply { style in
style.titleTextStyle.color = .label
style.repeatButtonStyle.tintColor = UIColor(named: "BrandColor") ?? .systemBlue
}

// Заменить иллюстрацию ошибки (через токен)
images.errorPlaceholderImage = ChatImage(named: "ErrorIllustration", bundle: .main)

Аудиоплеер

components.audioPlayerStyle.apply { style in
style.playButtonStyle.image = ChatImage(system: "play.fill", tintColor: UIColor(named: "BrandColor") ?? .systemBlue)
style.pauseButtonStyle.image = ChatImage(system: "pause.fill", tintColor: UIColor(named: "BrandColor") ?? .systemBlue)
style.progressViewStyle.color = UIColor(named: "BrandColor") ?? .systemBlue
style.progressViewStyle.backgroundColor = .systemGray5
}

Поисковое поле ввода

components.inputSearchTextStyle.apply { style in
style.cursorColor = UIColor(named: "BrandColor") ?? .systemBlue
style.textStyle.color = .label
}

Соответствие Figma и SDK

На странице Components в Figma компоненты организованы в 8 секций. Ниже приведено соответствие между секциями Figma и стилями SDK:

Top Navigation компонент
Bottom Input состояния
Компонент FigmaВариантыСтиль SDK
Top NavigationiOS/Android × Light/DarknavigationBarStyle (NavigationBarStyle)
Bottom InputEmpty, Filled, Voice Record, Voice Recorded, Search NavigationinputViewStyle (ChatInputStyle)
Cite BottomMessage / Photo / Docs × Light/DarkChatInputQuoteStylechatFlow)
Scroll ButtonLight / DarkScrollToMessageButtonStyle
BadgeSingle / Numerous × Light/DarkВизуальный стиль бейджа не настраивается публично в SDK; количество непрочитанных доступно через getUnreadMessagesCount и делегат

Status (Figma)

Message Status варианты
Компонент FigmaВариантыСтиль SDK
Message statusПрочитано, Доставлено, Доставляется, Ошибка, Отредактировано (Client/Agent, с подложкой/без)ChatMessageStyle: readStatusImage, deliveredStatusImage, pendingStatusImage, editedStatusImage, errorStatusColor

Button (Figma)

Button типы и состояния
Тип кнопки (Figma)СостоянияСтиль SDK
BotNormal, Active, Pressed, Disable, Loading, ErrorQuickReplyStyle
TextNormal, Active, Pressed, Disable, Loading, ErrorTextButtonStyle
IconNormal, Active, Pressed, Disable, Loading, ErrorIconButtonStyle
ImageNormal, Active, Pressed, Disable, Loading, ErrorButtonStyle
SelectionNormal, Pressed, DisableQuickReplyStyle

Bubbles (Figma)

Message Base анатомия (Agent и Client)
Компонент FigmaВариантыСтиль SDK
Message Base (Agent)Normal, MultiContent, Deleted, Typing, Search agent, Snooze, ErrorChatMessagesStyles в chatFlow.incomeMessages / chatFlow.systemMessages
Message Base (Client)Normal, MultiContent, ErrorChatMessagesStyles в chatFlow.outcomeMessages

Анатомия баббла в Figma: Avatar → Tail → Content (текст/медиа) → Status. Настраивается через:

  • showAvatar — отображение аватара
  • messageBubbleEndMargin — отступ баббла от края экрана
  • containerLeftOffset / containerRightOffset — отступы контейнера

Figma-состояния → SDK-свойства

Figma состояниеОписаниеСвойство SDK
NormalОбычное сообщениеtextMessageStyle, imageMessageStyle, bubbleTintColor
MultiContentТекст + медиа в одном пузыреОпределяется типом контента автоматически
TypingИндикатор «печатает»chatFlow.systemMessages (системное сообщение)
SnoozeОператор временно недоступенScheduleChatMessageStyle
Search agentРезультат поиска с выделениемSearchChatMessageStylesearchFlow)
ErrorОшибка отправкиChatMessageStyle.errorStatusColor, errorTextStyle, errorInfoButton
DeletedУдалённое сообщениеНе настраивается публично

Input Field (Figma)

Компонент FigmaВариантыСтиль SDK
Input fieldПустое, частично заполненное, полностью заполненноеinputTextStyle (ChatInputTextStyle)

OS UI (Figma)

Компонент FigmaОписаниеСтиль SDK
iOS Select FileСистемный выбор файлаchatMenuStyle (ChatMenuStyle)
GalleryГалерея фотографийchatMenuStyle
Select ImageВыбор изображенияchatMenuStyle

Content (Figma)

Компонент FigmaОписаниеСтиль SDK
ContentТипы контента в сообщениях: текст, картинка, файл, аудио, опрос, цитата, OG-превью и др.TextChatMessageStyle, ImageChatMessageStyle, FileChatMessageStyle, AudioChatMessageStyle, SurveyChatMessageStyle, QuoteStyle, OpenGraphViewStyle

Illustration (Figma)

Компонент FigmaВариантыСтиль SDK
IllustrationПриветствие, Поиск, Ошибка и др.emptyChatPlaceholderImage, errorPlaceholderImage, searchNotFoundPlaceholderImageChatImages)

Меню вложений (chatMenuStyle)

chatMenuStyle управляет внешним видом меню выбора файлов, фотографий и камеры — всплывающего листа, который появляется при нажатии на кнопку прикрепления.

Доступные свойства

СвойствоТипОписаниеЗначение по умолчанию
backgroundColorUIColorФон листа менюcolors.background
tintColorUIColorЦвет иконок и кнопок.clear (системный)
titleTextStyleChatTextStyleСтиль текста кнопок менюbody шрифт, colors.link цвет
cornerRadiusCGFloatСкругление углов листа0.0
maximumImagesCountUInt8Максимальное количество изображений для выбора10

Пример настройки

// Глобально через ChatComponents (применяется ко всем экранам)
components.chatMenuStyle.apply { style in
style.backgroundColor = UIColor(named: "BackgroundPrimary") ?? .white
style.tintColor = UIColor(named: "BrandColor") ?? .systemBlue
}

Или через build для точечного создания нового экземпляра:

let menuStyle = ChatMenuStyle.build(with: components) { style in
style.backgroundColor = .white
style.tintColor = .systemBlue
style.maximumImagesCount = 5 // ограничить выбор до 5 изображений
}
components.chatMenuStyle = menuStyle

Только для экрана чата

Если нужно изменить стиль меню только в чате (не затрагивая другие экраны):

// Доступ через chatFlow (свойство называется addFileMenuStyle)
theme.flows.chatFlow.addFileMenuStyle.apply { style in
style.backgroundColor = UIColor(named: "BackgroundPrimary") ?? .white
style.tintColor = UIColor(named: "BrandColor") ?? .systemBlue
}
примечание

chatFlow.addFileMenuStyle и components.chatMenuStyle — это один объект по умолчанию. Чтобы изменить меню только в chatFlow без глобального эффекта, создайте новый экземпляр через build и присвойте его напрямую: theme.flows.chatFlow.addFileMenuStyle = myMenuStyle.