Цветовая схема
Для светлой и тёмной тем используйте либо два отдельных объекта ChatColors в theme и darkTheme, либо один ChatColors с динамическими UIColor — через UIColor { traitCollection in ... } или extension SDK UIColor.colorFor(light:dark:).
Сводная таблица свойств
У всех свойств есть значения по умолчанию — переопределяйте только нужные.
| Свойство | Light (по умолчанию) | Dark (по умолчанию) | Где используется |
|---|---|---|---|
main | #191E23 | #E1E1EA | Основной текст сообщений, время сообщения, имена операторов, текст системных сообщений; цвет автора и текста цитаты в исходящих сообщениях |
secondary | #777B7E | #B0B0BA | Дата-разделитель в ленте сообщений, подзаголовок плейсхолдера пустого чата, текст в панели цитаты над полем ввода, URL в превью ссылок |
disabled | #9FA5A9 | #8A8A8E | Disabled-состояния кнопок и быстрых ответов, граница поля ввода, текст удалённого сообщения и сообщения о нерабочем времени |
background | #F1F1F7 | #1C1C1E | Фон экранов чата и поиска; базовый фон стилей компонентов (большинство видимых элементов переопределяет его на backgroundWhite) |
backgroundWhite | #FFFFFF | #2C2C2F | Пузыри сообщений (входящих и исходящих по умолчанию), фон превью ссылок (OpenGraph), цвет спиннера и подписи в оверлее загрузки чата |
link | #007AFF | #007AFF | Ссылки в тексте, курсор в поле ввода, кнопки навигационной панели («Назад», «Закрыть», поиск), разделитель цитаты, индикатор загрузки, прогресс-бар, кнопки быстрых ответов |
linkLight | #4EAAFF | #4EAAFF | Фон цитаты, tint поля ввода, нажатое состояние акцентных кнопок (в т.ч. быстрых ответов) |
positive | #09A460 | #09A460 | Иконки статусов сообщений (отправлено / доставлено / прочитано), активная кнопка «да» в опросах да/нет, pull-to-refresh, фон тостов, иконка кнопки прокрутки к непрочитанным |
warning | #FFC043 | #FFC043 | Иконки рейтинговых опросов, цвет автора и текста цитаты во входящих сообщениях (ChatFlow.incomeMessages.quoteStyle) |
error | #AF1400 | #E11900 | Цвет статус-индикатора и времени при ошибке отправки, цвет пузыря сообщения с ошибкой |
errorLight | #E11900 | #FF594C | Цвет текста ошибки отправки, фон кнопки прокрутки к непрочитанным |
darkThemeЕсли chatCenterSDK.darkTheme не задан, светлая палитра применяется и в системно тёмной теме.
Требования к контрастности (WCAG AA) и проверка кастомных цветов — см. Доступность.
Способы инициализации
Прямое присваивание свойств:
let colors = ChatColors()
colors.main = .black
colors.background = .systemBackground
colors.link = .systemBlue
Фабричный метод build — возвращает настроенный экземпляр:
let colors = ChatColors.build { colors in
colors.main = .black
colors.background = .systemBackground
colors.link = .systemBlue
}
Метод apply (из протокола Applicable) — мутирует существующий экземпляр и поддерживает цепочку вызовов:
let colors = ChatColors().apply { colors in
colors.main = .black
colors.link = .systemBlue
}
Полный пример настройки палитры — в демо MainViewController+Full.swift, метод makeFullTheme(), блок // MARK: - ChatColors - полная палитра.
Светлая и тёмная темы
chatCenterSDK.theme принимает ChatTheme для светлой темы, chatCenterSDK.darkTheme — для тёмной.
let lightColors = ChatColors()
lightColors.main = .black
lightColors.background = .white
// fallback на системный цвет, если asset не найден
lightColors.link = UIColor(named: "BrandBlue") ?? .systemBlue
let darkColors = ChatColors()
darkColors.main = .white
darkColors.background = UIColor(named: "BackgroundDark") ?? .black
darkColors.link = UIColor(named: "BrandBlueDark") ?? .systemBlue
chatCenterSDK.theme = ChatTheme(colors: lightColors)
chatCenterSDK.darkTheme = ChatTheme(colors: darkColors)
Присвоение chatCenterSDK.theme автоматически перезаписывает chatCenterSDK.darkTheme тем же объектом. Если присвоить darkTheme до theme, тёмная тема будет потеряна. Всегда задавайте darkTheme после theme.
ChatTheme(colors:) — короткая форма; полная сигнатура — ChatTheme(colors:images:typography:), все параметры с дефолтами. Стили компонентов копируют цвета в момент создания: часть из них (inputViewStyle, addFileMenuStyle) создаётся сразу при ChatTheme.init, остальные — лениво при первом доступе. После открытия чата правки ChatColors уже не применятся — пересоздайте ChatTheme и присвойте chatCenterSDK.theme / darkTheme заново.
Одна палитра на обе темы
Если цветовая схема отличается только оттенками, используйте один ChatColors с динамическими UIColor:
let adaptiveLink = UIColor { traitCollection in
traitCollection.userInterfaceStyle == .dark
? UIColor(red: 0.31, green: 0.67, blue: 1.0, alpha: 1)
: UIColor(red: 0.0, green: 0.48, blue: 1.0, alpha: 1)
}
let colors = ChatColors()
colors.link = adaptiveLink
chatCenterSDK.theme = ChatTheme(colors: colors)
Ограничения
| Эффект | Статус в SDK | Альтернатива |
|---|---|---|
| Градиенты (линейный, радиальный) | Не поддерживается | Solid-цвет — выберите доминирующий оттенок |
| Drop Shadow (сложные конфигурации) | Нет публичного API | Доступен только cornerRadius в стилях |
| Blur / Frosted Glass | Не поддерживается | Solid-цвет с нужной прозрачностью |
| Semi-transparent overlays | Частично | UIColor(white: 0, alpha: 0.4) |
Дополнительные акцентные цвета (помимо link/linkLight) | Нет прямого токена | Настраиваются точечно через стили компонентов |
Связанные разделы
- Доступность — требования к контрасту и тестированию
- Стили компонентов — детальная настройка цветов для конкретных компонентов
- Типографика — настройка шрифтов