Skip to main content

Sistema de diseño

Paleta de colores​

La paleta de Trainium está definida en ui/theme/Color.kt. Sigue una estética oscura y monocromática con azul eléctrico como color de acento.

Tonos base (independientes del tema)​

TokenValor HEXUso principal
BlueDark#0B1426Fondo del tema oscuro
BlueMid#121F3DSuperficie del tema oscuro
BlueDeep#162347Superficie variante del tema oscuro
BlueAccent#2196F3Color primario de acciones (botones, bordes activos)
BlueElectric#448AFFGradiente de botones CTA
BlueSoft#64B5F6Textos secundarios y subtítulos en tema oscuro
BlueGlow#332196F3Efectos de brillo y sombras con transparencia
BlueLight#BBDEFBFondos suaves en tema claro
WhiteSoft#F0F4FFFondo del tema claro

Esquema de colores del tema oscuro​

Rol Material 3TokenValor HEX
primaryDarkPrimary#448AFF
onPrimaryDarkOnPrimary#001E5F
primaryContainerDarkPrimaryContainer#1A3A6E
backgroundDarkBackground#0B1426
surfaceDarkSurface#121F3D
surfaceVariantDarkSurfaceVariant#1A2D54
errorDarkError#FF6B6B

Esquema de colores del tema claro​

Rol Material 3TokenValor HEX
primaryLightPrimary#1565C0
onPrimaryLightOnPrimary#FFFFFF
primaryContainerLightPrimaryContainer#D0E4FF
backgroundLightBackground#F0F4FF
surfaceLightSurface#FFFFFF
surfaceVariantLightSurfaceVariant#E3ECFA
errorLightError#D32F2F

Tipografia​

La escala tipográfica está definida en ui/theme/Type.kt y utiliza FontFamily.SansSerif (la fuente sans-serif por defecto del sistema Android, normalmente Roboto) para todos los niveles.

NivelWeightTamañoInterletraje
displayLargeBlack (900)34 sp-0.25 sp
headlineLargeBold (700)28 sp0 sp
headlineMediumBold (700)24 sp0 sp
titleLargeSemiBold (600)20 sp0.15 sp
titleMediumSemiBold (600)16 sp0.15 sp
bodyLargeNormal (400)16 sp0.5 sp
bodyMediumNormal (400)14 sp0.25 sp
labelLargeBold (700)14 sp1.2 sp
labelMediumMedium (500)12 sp0.5 sp
labelSmallMedium (500)11 sp0.5 sp

El labelLarge con letterSpacing = 1.2 sp se usa en los botones CTA (como "COMENZAR AHORA", "CONTINUAR") para dar el efecto de texto expandido característico de la interfaz.

Formas (Shapes)​

El sistema de formas personalizado PremiumShapes reemplaza el esquema de esquinas por defecto de Material 3:

NivelRadio de esquina
small10 dp
medium16 dp
large22 dp
extraLarge28 dp

Estos radios más generosos que los valores por defecto de Material 3 contribuyen al aspecto premium redondeado de tarjetas y botones.

Gestion del tema​

El tema se gestiona en dos capas:

MaterialTheme (ui/theme/Theme.kt): Define el Trainium2Theme composable que aplica el ColorScheme, la Typography y las Shapes según el parámetro darkTheme.

ThemeManager (ThemeManager.kt): Persiste la preferencia del usuario en DataStore. La preferencia se lee como un Flow<Boolean?> y se colecciona en MainActivity.kt con collectAsState(initial = null). El valor inicial null significa que la preferencia aún no se ha leído del disco; en ese caso, se usa el tema del sistema (isSystemInDarkTheme()).

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

Gradientes de fondo​

Todas las pantallas utilizan gradientes verticales en lugar de fondos planos. El gradiente varía según el tema activo:

Tema oscuro:

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

Tema claro:

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

Animaciones de entrada​

Todas las pantallas implementan animaciones de entrada escalonadas mediante LaunchedEffect(Unit) + animateFloatAsState. El patrón estándar es:

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
}

Los elementos se revelan secuencialmente con retardos de 100–300 ms entre cada uno, creando un efecto de aparición en cascada.