🚀 Variable fonts

* Replaced all fonts with variable versions
* Allows more weight/italic options (and more)
* Increased overall app size on release build by ~8mb (sadly, not much I can do here..)
This commit is contained in:
Acclorite 2025-01-19 16:57:59 +02:00
parent d9f8448de8
commit 5cf333d3d2
107 changed files with 117 additions and 118 deletions

View file

@ -34,7 +34,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import ua.acclorite.book_story.R
@ -177,7 +176,6 @@ private fun SegmentedButton(
Text(
text = button.title,
style = button.textStyle,
fontWeight = FontWeight.Medium,
color = if (button.selected) colors.activeContentColor
else colors.inactiveContentColor
)

View file

@ -1,14 +1,18 @@
package ua.acclorite.book_story.presentation.core.constants
import androidx.annotation.FontRes
import androidx.compose.ui.text.ExperimentalTextApi
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontVariation
import androidx.compose.ui.text.font.FontWeight
import ua.acclorite.book_story.R
import ua.acclorite.book_story.domain.reader.FontWithName
import ua.acclorite.book_story.domain.ui.UIText
fun Constants.provideFonts(withRandom: Boolean): List<FontWithName> {
@OptIn(ExperimentalTextApi::class)
fun Constants.provideFonts(): List<FontWithName> {
return mutableListOf(
FontWithName(
"default",
@ -18,175 +22,163 @@ fun Constants.provideFonts(withRandom: Boolean): List<FontWithName> {
FontWithName(
"raleway",
UIText.StringValue("Raleway"),
FontFamily(
Font(R.font.raleway_regular),
Font(R.font.raleway_regular_italic, style = FontStyle.Italic),
Font(R.font.raleway_medium, weight = FontWeight.Medium),
Font(R.font.raleway_semibold, weight = FontWeight.SemiBold),
Font(R.font.raleway_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.raleway_variable,
italicResId = R.font.raleway_variable_italic
)
),
FontWithName(
"open_sans",
UIText.StringValue("Open Sans"),
FontFamily(
Font(R.font.opensans_regular),
Font(R.font.opensans_regular_italic, style = FontStyle.Italic),
Font(R.font.opensans_medium, weight = FontWeight.Medium),
Font(R.font.opensans_semibold, weight = FontWeight.SemiBold),
Font(R.font.opensans_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.opensans_variable,
italicResId = R.font.opensans_variable_italic
)
),
FontWithName(
"mulish",
UIText.StringValue("Mulish"),
FontFamily(
Font(R.font.mulish_regular),
Font(R.font.mulish_regular_italic, style = FontStyle.Italic),
Font(R.font.mulish_medium, weight = FontWeight.Medium),
Font(R.font.mulish_semibold, weight = FontWeight.SemiBold),
Font(R.font.mulish_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.mulish_variable,
italicResId = R.font.mulish_variable_italic
)
),
FontWithName(
"arimo",
UIText.StringValue("Arimo"),
FontFamily(
Font(R.font.arimo_regular),
Font(R.font.arimo_regular_italic, style = FontStyle.Italic),
Font(R.font.arimo_medium, weight = FontWeight.Medium),
Font(R.font.arimo_semibold, weight = FontWeight.SemiBold),
Font(R.font.arimo_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.arimo_variable,
italicResId = R.font.arimo_variable_italic
)
),
FontWithName(
"garamond",
UIText.StringValue("Garamond"),
FontFamily(
Font(R.font.garamond_regular),
Font(R.font.garamond_regular_italic, style = FontStyle.Italic),
Font(R.font.garamond_medium, weight = FontWeight.Medium),
Font(R.font.garamond_semibold, weight = FontWeight.SemiBold),
Font(R.font.garamond_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.garamond_variable,
italicResId = R.font.garamond_variable_italic
)
),
FontWithName(
"roboto_serif",
UIText.StringValue("Roboto Serif"),
FontFamily(
Font(R.font.robotoserif_regular),
Font(R.font.robotoserif_regular_italic, style = FontStyle.Italic),
Font(R.font.robotoserif_medium, weight = FontWeight.Medium),
Font(R.font.robotoserif_semibold, weight = FontWeight.SemiBold),
Font(R.font.robotoserif_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.robotoserif_variable,
italicResId = R.font.robotoserif_variable_italic
)
),
FontWithName(
"noto_serif",
UIText.StringValue("Noto Serif"),
FontFamily(
Font(R.font.notoserif_regular),
Font(R.font.notoserif_regular_italic, style = FontStyle.Italic),
Font(R.font.notoserif_medium, weight = FontWeight.Medium),
Font(R.font.notoserif_semibold, weight = FontWeight.SemiBold),
Font(R.font.notoserif_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.notoserif_variable,
italicResId = R.font.notoserif_variable_italic
)
),
FontWithName(
"noto_sans",
UIText.StringValue("Noto Sans"),
FontFamily(
Font(R.font.notosans_regular),
Font(R.font.notosans_regular_italic, style = FontStyle.Italic),
Font(R.font.notosans_medium, weight = FontWeight.Medium),
Font(R.font.notosans_semibold, weight = FontWeight.SemiBold),
Font(R.font.notosans_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.notosans_variable,
italicResId = R.font.notosans_variable_italic
)
),
FontWithName(
"roboto",
UIText.StringValue("Roboto"),
FontFamily(
Font(R.font.roboto_regular),
Font(R.font.roboto_regular_italic, style = FontStyle.Italic),
Font(R.font.roboto_medium, weight = FontWeight.Medium),
Font(R.font.roboto_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.roboto_variable_with_italic,
italicResId = R.font.roboto_variable_with_italic
)
),
FontWithName(
"jost",
UIText.StringValue("Jost"),
FontFamily(
Font(R.font.jost_regular),
Font(R.font.jost_regular_italic, style = FontStyle.Italic),
Font(R.font.jost_medium, weight = FontWeight.Medium),
Font(R.font.jost_semibold, weight = FontWeight.SemiBold),
Font(R.font.jost_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.jost_variable,
italicResId = R.font.jost_variable_italic
)
),
FontWithName(
"merriweather",
UIText.StringValue("Merriweather"),
FontFamily(
Font(R.font.merriweather_regular),
Font(R.font.merriweather_regular_italic, style = FontStyle.Italic),
Font(R.font.merriweather_medium, weight = FontWeight.Medium),
Font(R.font.merriweather_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.merriweather_variable,
italicResId = R.font.merriweather_variable_italic
)
),
FontWithName(
"montserrat",
UIText.StringValue("Montserrat"),
FontFamily(
Font(R.font.montserrat_regular),
Font(R.font.montserrat_regular_italic, style = FontStyle.Italic),
Font(R.font.montserrat_medium, weight = FontWeight.Medium),
Font(R.font.montserrat_semibold, weight = FontWeight.SemiBold),
Font(R.font.montserrat_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.montserrat_variable,
italicResId = R.font.montserrat_variable_italic
)
),
FontWithName(
"nunito",
UIText.StringValue("Nunito"),
FontFamily(
Font(R.font.nunito_regular),
Font(R.font.nunito_regular_italic, style = FontStyle.Italic),
Font(R.font.nunito_medium, weight = FontWeight.Medium),
Font(R.font.nunito_semibold, weight = FontWeight.SemiBold),
Font(R.font.nunito_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.nunito_variable,
italicResId = R.font.nunito_variable_italic
)
),
FontWithName(
"roboto_slab",
UIText.StringValue("Roboto Slab"),
FontFamily(
Font(R.font.robotoslab_regular),
Font(R.font.robotoslab_medium, weight = FontWeight.Medium),
Font(R.font.robotoslab_semibold, weight = FontWeight.SemiBold),
Font(R.font.robotoslab_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.robotoslab_variable_with_italic,
italicResId = R.font.robotoslab_variable_with_italic
)
),
FontWithName(
"lora",
UIText.StringValue("Lora"),
FontFamily(
Font(R.font.lora_regular),
Font(R.font.lora_regular_italic, style = FontStyle.Italic),
Font(R.font.lora_medium, weight = FontWeight.Medium),
Font(R.font.lora_semibold, weight = FontWeight.SemiBold),
Font(R.font.lora_bold, weight = FontWeight.Bold),
provideVariableFontFamily(
normalResId = R.font.lora_variable,
italicResId = R.font.lora_variable_italic
)
)
).apply {
if (withRandom) {
add(
1,
FontWithName(
"random",
UIText.StringResource(R.string.random_string),
provideFonts(withRandom = false).random().font
)
)
}
}
}
@OptIn(ExperimentalTextApi::class)
private fun provideVariableFontFamily(
@FontRes normalResId: Int,
@FontRes italicResId: Int
): FontFamily {
fun provideVariableFont(weight: FontWeight): Array<Font> {
return arrayOf(
Font(
resId = normalResId,
weight = weight,
style = FontStyle.Normal,
variationSettings = FontVariation.Settings(
weight = weight,
style = FontStyle.Normal
)
),
Font(
resId = italicResId,
weight = weight,
style = FontStyle.Italic,
variationSettings = FontVariation.Settings(
weight = weight,
style = FontStyle.Italic
)
)
)
}
return FontFamily(
*provideVariableFont(weight = FontWeight.W100),
*provideVariableFont(weight = FontWeight.W200),
*provideVariableFont(weight = FontWeight.W300),
*provideVariableFont(weight = FontWeight.W400),
*provideVariableFont(weight = FontWeight.W500),
*provideVariableFont(weight = FontWeight.W600),
*provideVariableFont(weight = FontWeight.W700),
*provideVariableFont(weight = FontWeight.W800),
*provideVariableFont(weight = FontWeight.W900)
)
}

View file

@ -4,7 +4,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import ua.acclorite.book_story.R
@ -21,29 +20,32 @@ fun FontFamilyOption() {
val state = mainModel.state.collectAsStateWithLifecycle()
val fontFamily = remember(state.value.fontFamily) {
Constants.provideFonts(withRandom = true).find {
Constants.provideFonts().run {
find {
it.id == state.value.fontFamily
} ?: Constants.provideFonts(withRandom = false)[0]
} ?: get(0)
}
}
ChipsWithTitle(
title = stringResource(id = R.string.font_family_option),
chips = Constants.provideFonts(withRandom = true)
chips = Constants.provideFonts()
.map {
ButtonItem(
id = it.id,
title = it.fontName.asString(),
textStyle = MaterialTheme.typography.labelLarge.copy(
fontFamily = when (it.id) {
"random" -> FontFamily.Default
else -> it.font
}
fontFamily = it.font
),
selected = it.id == fontFamily.id
)
},
onClick = {
mainModel.onEvent(MainEvent.OnChangeFontFamily(it.id))
mainModel.onEvent(
MainEvent.OnChangeFontFamily(
it.id
)
)
}
)
}

View file

@ -21,9 +21,11 @@ fun FontStyleOption() {
val state = mainModel.state.collectAsStateWithLifecycle()
val fontFamily = remember(state.value.fontFamily) {
Constants.provideFonts(withRandom = false).find {
Constants.provideFonts().run {
find {
it.id == state.value.fontFamily
} ?: Constants.provideFonts(withRandom = false)[0]
} ?: get(0)
}
}
SegmentedButtonWithTitle(

View file

@ -101,9 +101,11 @@ class MainModel @Inject constructor(
value = event.value,
updateState = {
it.copy(
fontFamily = Constants.provideFonts(withRandom = true)
.find { font -> font.id == event.value }?.id
?: Constants.provideFonts(withRandom = false)[0].id
fontFamily = Constants.provideFonts().run {
find { font ->
font.id == event.value
}?.id ?: get(0).id
}
)
}
)

View file

@ -63,6 +63,7 @@ data class MainState(
// Reader Settings
val fontFamily: String = provideDefaultValue { Constants.provideFonts(withRandom = false)[0].id },
val fontFamily: String = provideDefaultValue { Constants.provideFonts()[0].id },
val isItalic: Boolean = provideDefaultValue { false },
val fontSize: Int = provideDefaultValue { 16 },
val lineHeight: Int = provideDefaultValue { 4 },

View file

@ -110,9 +110,11 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable {
}
val fontFamily = remember(mainState.value.fontFamily) {
Constants.provideFonts(withRandom = true).find {
Constants.provideFonts().run {
find {
it.id == mainState.value.fontFamily
} ?: Constants.provideFonts(withRandom = false)[0]
} ?: get(0)
}
}
val backgroundColor = animateColorAsState(
targetValue = settingsState.value.selectedColorPreset.backgroundColor

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more