Pular para o conteúdo principal

Sistema de projeto

Paleta de cores​

A paleta Trainium está definida como ui/theme/Color.kt. Segue uma estética escura e monocromática com o azul elétrico como cor de destaque.

Tons básicos (independente do tema)​

FichaValor hexadecimalUtilização principal
BlueDark#0B1426Fundo tema escuro
BlueMid#121F3DSuperfície tema escuro
BlueDeep#162347Superfície variante de tema escuro
BlueAccent#2196F3Cor primária das ações (botões, bordas ativas)
BlueElectric#448AFFBotões CTA gradientes
BlueSoft#64B5F6Textos secundários e legendas em tema escuro
BlueGlow#332196F3Efeitos de brilho e sombra com transparência
BlueLight#BBDEFBFundos suaves em tema claro
WhiteSoft#F0F4FFFundo tema claro

Esquema de cores do tema escuro​

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

Esquema de cores do tema claro​

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

Tipografia​

A escala da fonte é definida como ui/theme/Type.kt e usa FontFamily.SansSerif (a fonte sem serifa padrão do sistema Android, geralmente Roboto) para todos os níveis.

NívelPesoTamanhoEntretraje
displayLargePreto (900)34 sp-0,25 sp
headlineLargeNegrito (700)28 sp0 sp
headlineMediumNegrito (700)24 sp0 sp
titleLargeSemiNegrito (600)20 sp0,15 sp
titleMediumSemiNegrito (600)16 sp0,15 sp
bodyLargeNormal (400)16 sp0,5 sp
bodyMediumNormal (400)14 sp0,25 sp
labelLargeNegrito (700)14 sp1,2 sp
labelMediumMédio (500)12 sp0,5 sp
labelSmallMédio (500)11 sp0,5 sp

O labelLarge com letterSpacing = 1.2 sp é usado em botões CTA (como "COMEÇAR AGORA", "CONTINUAR") para dar o efeito de texto expandido característico da interface.

Formas (Shapes)​

O sistema de formas personalizadas PremiumShapes substitui o esquema de canto padrão do Material 3:

NívelRádio de esquina
small10 dp
medium16 DP
large22 dp
extraLarge28 dp

Esses raios mais generosos do que os valores padrão do Material 3 contribuem para a aparência premium arredondada dos cartões e botões.

Gerenciamento de tema​

O tema é gerenciado em duas camadas:

MaterialTheme (ui/theme/Theme.kt): Define o elemento que pode ser composto Trainium2Theme que aplica o ColorScheme, o Typography e o Shapes de acordo com o parâmetro darkTheme.

ThemeManager (ThemeManager.kt): Persiste a preferência do usuário no DataStore. A preferência é lida como Flow<Boolean?> e coletada em MainActivity.kt com collectAsState(initial = null). O valor inicial null significa que a preferência ainda não foi lida do disco; nesse caso, o tema do sistema (isSystemInDarkTheme()) é usado.

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

Gradientes de fundo​

Todas as telas usam gradientes verticais em vez de fundos planos. O gradiente varia dependendo do tema ativo:

Tema escuro:

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

Tema claro:

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

Animações de entrada​

Todas as telas implementam animações de entrada escalonadas usando LaunchedEffect(Unit) + animateFloatAsState. O padrão padrão é:

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
}

Os elementos são revelados sequencialmente com atrasos de 100–300 ms entre cada um, criando um efeito de aparência em cascata.