Перейти к основному содержанию

Система дизайна

Цветовая палитра​

Для палитры Trainium установлено значение ui/theme/Color.kt. Он соответствует темной монохромной эстетике с синим электриком в качестве акцентного цвета.

Базовые тона (независимо от темы)​

ТокенШестнадцатеричное значениеОсновное использование
BlueDark#0B1426Темный фон темы
BlueMid#121F3DТемная поверхность темы
BlueDeep#162347Поверхность варианта темной темы
BlueAccent#2196F3Основной цвет действий (кнопок, активных границ)
BlueElectric#448AFFГрадиентные кнопки CTA
BlueSoft#64B5F6Второстепенные тексты и субтитры в темной теме
BlueGlow#332196F3Эффекты свечения и тени с прозрачностью
BlueLight#BBDEFBМягкие фоны в светлой теме
WhiteSoft#F0F4FFСветлый фон темы

Цветовая схема темной темы​

Рулонный материал 3ТокенПОРЯДОК доблести
primaryDarkPrimary#448AFF
onPrimaryDarkOnPrimary#001E5F
primaryContainerDarkPrimaryContainer#1A3A6E
backgroundDarkBackground#0B1426
surfaceDarkSurface#121F3D
surfaceVariantDarkSurfaceVariant#1A2D54
errorDarkError#FF6B6B

Цветовая схема светлой темы​

Рулонный материал 3ТокенПОРЯДОК доблести
primaryLightPrimary#1565C0
onPrimaryLightOnPrimary#FFFFFF
primaryContainerLightPrimaryContainer#D0E4FF
backgroundLightBackground#F0F4FF
surfaceLightSurface#FFFFFF
surfaceVariantLightSurfaceVariant#E3ECFA
errorLightError#D32F2F

Типографика​

Масштаб шрифта установлен на ui/theme/Type.kt и использует FontFamily.SansSerif (шрифт без засечек по умолчанию в системе Android, обычно Roboto) для всех уровней.

НивельВесТаманьоИнтерлетраже
displayLargeЧерный (900)34 сп-0,25 сп
headlineLargeЖирный (700)28 сп0 сп
headlineMediumЖирный (700)24 сп0 сп
titleLargeПолужирный (600)20 сп0,15 сп
titleMediumПолужирный (600)16 сп0,15 сп
bodyLargeОбычный (400)16 сп0,5 сп
bodyMediumОбычный (400)14 сп0,25 сп
labelLargeЖирный (700)14 сп1,2 сп
labelMediumСредний (500)12 сп0,5 сп
labelSmallСредний (500)11 сп0,5 сп

labelLarge с letterSpacing = 1.2 sp используются на кнопках CTA (например, «НАЧАТЬ СЕЙЧАС», «ПРОДОЛЖИТЬ»), чтобы придать характерный для интерфейса эффект расширенного текста.

Фигуры​

Пользовательская система форм PremiumShapes заменяет стандартную угловую схему Материала 3:

НивельРадио Эскина
small10 дп
medium16 дп
large22 дп
extraLarge28 дп

Эти более широкие радиусы, чем значения по умолчанию в Material 3, способствуют округлому премиальному виду карточек и кнопок.

Управление темами​

Тема управляется в два слоя:

MaterialTheme (ui/theme/Theme.kt): Определяет составной объект Trainium2Theme, который применяет ColorScheme, Typography и Shapes в соответствии с параметром darkTheme.

ThemeManager (ThemeManager.kt): сохраняет предпочтения пользователя в хранилище данных. Предпочтение считывается как Flow<Boolean?> и собирается в MainActivity.kt с помощью collectAsState(initial = null). Начальное значение null означает, что настройка еще не была прочитана с диска; в этом случае используется системная тема (isSystemInDarkTheme()).

val savedDarkMode by themeManager.isDarkMode.collectAsState(initial = null)
val systemTheme = isSystemInDarkTheme()
var isDarkTheme by remember(savedDarkMode) {
mutableStateOf(savedDarkMode ?: systemTheme)
}

Фоновые градиенты​

На всех экранах вместо плоского фона используются вертикальные градиенты. Градиент варьируется в зависимости от активной темы:

Тёмная тема:

Brush.verticalGradient(listOf(BlueDark, BlueMid, BlueDeep))
// #0B1426 → #121F3D → #162347

Очистить тему:

Brush.verticalGradient(listOf(Color(0xFFF0F4FF), Color(0xFFE3ECFF), Color(0xFFD6E4FF)))

Анимация входа​

На всех экранах реализована ступенчатая анимация ввода с использованием LaunchedEffect(Unit) + animateFloatAsState. Стандартный шаблон:

var elementoVisible by remember { mutableStateOf(false) }
val alpha by animateFloatAsState(
targetValue = if (elementoVisible) 1f else 0f,
animationSpec = tween(durationMillis = 500),
label = "elemento_alpha"
)

LaunchedEffect(Unit) {
delay(100)
elementoVisible = true
}

Элементы раскрываются последовательно с задержками в 100–300 мс между каждым, создавая эффект каскадного появления.