Типографика
ChatTypography управляет двумя слоями типографики SDK:
- Размерами шрифтов — 6 семантических токенов (
big,medium,mediumUpper,regular,small,error). Это параметры конструктораChatTypography(...), каждый — экземплярChatFontStyle. - Кастомными шрифтами — 20 точек подмены TTF-файла (
*FontPath: String?). Этоvar-свойства в теле класса; задаются после создания объекта (черезapply { ... }или прямое присваивание), не через конструктор. Пути указываются относительноapp/src/main/assets/.
В таблицах ниже перечислены все настраиваемые шрифты и размеры SDK. Если в коде SDK встречается поле, которого в этих списках нет, оно не входит в публичный API и менять его нельзя.
Размеры шрифтов
| Поле | Тип | Дефолтный размер | Описание |
|---|---|---|---|
big | ChatFontStyle | 20 sp (R.dimen.ecc_text_big) | Большой шрифт (заголовки, акценты) |
mediumUpper | ChatFontStyle | 18 sp (R.dimen.ecc_text_medium_upper) | Чуть больше среднего |
medium | ChatFontStyle | 16 sp (R.dimen.ecc_text_medium) | Средний шрифт |
regular | ChatFontStyle | 14 sp (R.dimen.ecc_text_regular) | Основной шрифт SDK (текст сообщений) |
small | ChatFontStyle | 12 sp (R.dimen.ecc_text_small) | Малый шрифт (timestamps, подписи) |
error | ChatFontStyle | 11 sp (R.dimen.ecc_error_text_size) | Шрифт для сообщений об ошибках |
ChatFontStyle хранит размер как ссылку на dimen-ресурс в единицах sp (что обеспечивает уважение к accessibility scaling на стороне системы) — изменения системного font scale автоматически масштабируют все 6 семантических токенов.
Кастомные шрифты — 20 точек подмены
Все поля имеют тип String? со значением по умолчанию null (используется системный шрифт). Значение — относительный путь от app/src/main/assets/, например "fonts/Roboto-Regular.ttf".
| Поле | Описание |
|---|---|
defaultFontRegularPath | Шрифт по умолчанию (Regular) |
defaultFontBoldPath | Жирный шрифт по умолчанию |
defaultFontLightPath | Тонкий шрифт по умолчанию |
toolbarTitleFontPath | Заголовок тулбара |
toolbarSubtitleFontPath | Подзаголовок тулбара |
placeholderTitleFontPath | Заголовок приветственного экрана |
placeholderSubtitleFontPath | Подзаголовок приветственного экрана |
quoteHeaderFontPath | Заголовок при цитировании |
quoteAuthorFontPath | Автор цитируемого сообщения |
quoteMessageFontPath | Текст цитируемого сообщения |
quoteTimeFontPath | Метка времени цитаты |
inputQuotedMessageFontPath | Сообщение при цитировании в поле ввода |
bubbleMessageFontPath | Текст сообщения в чате |
bubbleTimeFontPath | Метка времени в чате |
messageHeaderFontPath | Заголовки даты/времени между сообщениями |
typingFontPath | Индикатор набора текста |
scheduleAlertFontPath | Уведомление о расписании |
systemMessageFontPath | Системные сообщения |
emptyMediaAndFilesHeaderFontPath | Заголовок пустого списка «Медиа и файлы» |
emptyMediaAndFilesDescriptionFontPath | Описание пустого списка «Медиа и файлы» |
Базовая настройка
val typography = ChatTypography().apply {
// Глобальные дефолты — заполнят все остальные поля, если они null
defaultFontRegularPath = "fonts/MyFont-Regular.ttf"
defaultFontBoldPath = "fonts/MyFont-Bold.ttf"
defaultFontLightPath = "fonts/MyFont-Light.ttf"
// Точечные переопределения
toolbarTitleFontPath = "fonts/MyFont-Medium.ttf"
bubbleMessageFontPath = "fonts/MyFont-Regular.ttf"
}
val theme = ChatTheme(
applicationContext,
typography = typography
)
Сначала задайте defaultFontRegularPath / defaultFontBoldPath / defaultFontLightPath — это покроет 95% поверхности. Затем добавляйте *FontPath только для тех элементов, где нужен другой шрифт.
SDK кеширует Typeface через внутренний TypefaceCache. Если файл по указанному пути отсутствует в assets/, SDK молча fallback-нет на системный шрифт — без exception. Проверьте список файлов в app/src/main/assets/fonts/ перед релизом.
Полный бренд-комплект
Переопределение и шрифта, и размеров. Семантические токены задаются через конструктор, *FontPath-поля — через apply { ... }.
fontSize — строго @DimenResR.dimen.brand_text_* и R.color.brand_* ниже — плейсхолдеры. Объявите их в app/src/main/res/values/dimens.xml (или соответствующем colors.xml) своего приложения перед сборкой, иначе получите Unresolved reference.
ChatFontStyle.fontSize: Int? объявлено без аннотации @DimenRes, но в большинстве пайплайнов SDK значение обрабатывается через Resources.getDimension(...) (см. TextViewFabric, InputViewFabric). Передавайте только R.dimen.*-идентификатор. Литерал в sp (fontSize = 22) приведёт либо к Resources$NotFoundException, либо к некорректному размеру (например, в spannable-тексте, где значение применяется как сырой пиксельный размер).
val brandTypography = ChatTypography(
big = ChatFontStyle(fontSize = R.dimen.brand_text_big), // например, 22 sp
regular = ChatFontStyle(fontSize = R.dimen.brand_text_regular), // например, 15 sp
small = ChatFontStyle(fontSize = R.dimen.brand_text_small) // например, 13 sp
).apply {
defaultFontRegularPath = "fonts/Brand-Regular.ttf"
defaultFontBoldPath = "fonts/Brand-Bold.ttf"
defaultFontLightPath = "fonts/Brand-Light.ttf"
toolbarTitleFontPath = "fonts/Brand-Medium.ttf"
}
val theme = ChatTheme(
applicationContext,
colors = brandColors,
images = brandImages,
typography = brandTypography
)
Подробный сценарий сборки светлой и тёмной тем — в разделе Темы.
Связанные разделы
- Дизайн-система: обзор — как устроены
ChatTheme,ChatColors,ChatImages,ChatTypography. - Компоненты экранов — где на экране отображаются перечисленные шрифты.
- Цвета — таблица
ChatColors. - Изображения — поля
ChatImages. - Темы — как
ChatTypographyвстраивается вChatTheme. - Потоки (Flows) — экран-специфичная кастомизация.
- Доступность — sp-units и Dynamic Type.
- Известные ограничения — параметры с приоритетом серверной настройки.