Setup and configurationConfiguring the theme

Configuring the theme

Run this command to generate the theme after configuring properties.

./gradlew lumo --setup

It will generate, Theme.kt, Colors.kt, Typography.kt, and foundation files.

      • Theme.kt
      • Colors.kt
      • Typography.kt
    • lumo.properties

The generated theme implementation shown below is a simplified example.

object AppTheme {
    val colors: Colors
        @ReadOnlyComposable @Composable get() = LocalColors.current
 
    val typography: Typography
        @ReadOnlyComposable @Composable get() = LocalTypography.current
}
 
@Composable
fun AppTheme(
    isDarkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit,
) {
    val colors = if (isDarkTheme) DarkColors else LightColors
    ...
    CompositionLocalProvider(
        LocalColors provides colors,
        LocalTypography provides typography,
        LocalIndication provides rippleIndication,
        LocalTextSelectionColors provides selectionColors,
        LocalContentColor provides colors.contentColorFor(colors.background),
        LocalTextStyle provides typography.body1,
        content = content
    )
}

Colors

The Colors provides a comprehensive structure for managing theme colors in both light and dark modes.

@Immutable
data class Colors(
    val primary: Color,
    val onPrimary: Color,
    ...
    val scrim: Color,
    val elevation: Color,
)
 
internal val LightColors = Colors(
    primary = Black,
    ...
    elevation = Gray700,
)
 
internal val DarkColors = Colors(
    primary = White,
    ...
    elevation = Gray200,
)
 
fun Colors.contentColorFor(backgroundColor: Color): Color {
    return when (backgroundColor) {
        primary -> onPrimary
        ...
        else -> Color.Unspecified
    }
}

Typography

Provides a structured way to define text styles such as headings, body text, and labels.

data class Typography(
    val h1: TextStyle = TextStyle(
        fontFamily = fontFamily,
        fontWeight = FontWeight.Bold,
        fontSize = 24.sp,
        ...
    ),
    val body1: TextStyle = TextStyle(
        ...
    ),
    val label1: TextStyle = TextStyle(
        ...
    ),
    ...
)
 
val typography = Typography()
val LocalTypography = staticCompositionLocalOf { typography }

Foundation

The foundation package provides essential utilities and defaults for theming, such as ripple effects, elevation, button styling, and system bar configurations.