0
0
mirror of https://github.com/florisboard/florisboard.git synced 2024-09-19 19:42:20 +02:00

Migrate Settings UI to Material 3 (#2467)

* implement material3 for the settings ui

* fix chip colors

* fix statusbar color

* fix aboutlibraries color

* fix alignment of subcheckboxen

* fix wrong card colors

* Update cornershape of the dropdown menu

* update ScrollableModifiers to material 3

* better card and background colors

* update jetpref

* change contrast of outlined cards

* apply suggestions

* implement suggestions

* add corners on text background in the theme editor

* apply the systembar color for the navbar

* set material you as default on android 12+

* fix card content padding

* Fix status bar color not adapting to navbar color state

* update jetpref dependency to 0.2.0-beta01

---------

Co-authored-by: Patrick Goldinger <patrick@patrickgold.dev>
This commit is contained in:
Lars Mühlbauer 2024-05-08 00:29:42 +02:00 committed by GitHub
parent f2e76cc72a
commit 6f169997e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
55 changed files with 754 additions and 447 deletions

View File

@ -47,7 +47,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.material.ButtonDefaults
import androidx.compose.material3.ButtonDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.SideEffect
@ -769,7 +769,7 @@ class FlorisImeService : LifecycleInputMethodService() {
?: "ACTION",
shape = actionStyle.shape.shape(),
colors = ButtonDefaults.buttonColors(
backgroundColor = actionStyle.background.solidColor(context, FlorisImeTheme.fallbackContentColor()),
containerColor = actionStyle.background.solidColor(context, FlorisImeTheme.fallbackContentColor()),
contentColor = actionStyle.foreground.solidColor(context, FlorisImeTheme.fallbackSurfaceColor()),
),
)

View File

@ -65,6 +65,10 @@ class AppPrefs : PreferenceModel("florisboard-app-prefs") {
key = "advanced__settings_theme",
default = AppTheme.AUTO,
)
val useMaterialYou = boolean(
key = "advanced__use_material_you",
default = true,
)
val settingsLanguage = string(
key = "advanced__settings_language",
default = "auto",

View File

@ -25,8 +25,8 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.SideEffect
@ -50,7 +50,6 @@ import dev.patrickgold.florisboard.lib.android.showAppIcon
import dev.patrickgold.florisboard.lib.compose.LocalPreviewFieldController
import dev.patrickgold.florisboard.lib.compose.PreviewKeyboardField
import dev.patrickgold.florisboard.lib.compose.ProvideLocalizedResources
import dev.patrickgold.florisboard.lib.compose.SystemUiApp
import dev.patrickgold.florisboard.lib.compose.rememberPreviewFieldController
import dev.patrickgold.florisboard.lib.compose.stringRes
import dev.patrickgold.florisboard.lib.util.AppVersionUtils
@ -111,9 +110,9 @@ class FlorisAppActivity : ComponentActivity() {
AppVersionUtils.updateVersionOnInstallAndLastUse(this, prefs)
setContent {
ProvideLocalizedResources(resourcesContext) {
FlorisAppTheme(theme = appTheme) {
Surface(color = MaterialTheme.colors.background) {
SystemUiApp()
FlorisAppTheme(theme = appTheme, isMaterialYouAware = prefs.advanced.useMaterialYou.observeAsState().value) {
Surface(color = MaterialTheme.colorScheme.background) {
//SystemUiApp()
AppContent()
}
}
@ -154,7 +153,7 @@ class FlorisAppActivity : ComponentActivity() {
) {
Column(
modifier = Modifier
.statusBarsPadding()
//.statusBarsPadding()
.navigationBarsPadding()
.imePadding(),
) {

View File

@ -18,7 +18,85 @@ package dev.patrickgold.florisboard.app.apptheme
import androidx.compose.ui.graphics.Color
/* Legacy Colors
val Green500 = Color(0xFF4CAF50)
val Green700 = Color(0xFF388E3C)
val Orange700 = Color(0xFFF57C00)
val Orange900 = Color(0xFFE65100)
*/
//Colors created with the material theme builder
val primaryLight = Color(0xFF006E1C)
val onPrimaryLight = Color(0xFFFFFFFF)
val primaryContainerLight = Color(0xFF58BC5B)
val onPrimaryContainerLight = Color(0xFF002204)
val secondaryLight = Color(0xFF005E16)
val onSecondaryLight = Color(0xFFFFFFFF)
val secondaryContainerLight = Color(0xFF2E8534)
val onSecondaryContainerLight = Color(0xFFFFFFFF)
val tertiaryLight = Color(0xFF964900)
val onTertiaryLight = Color(0xFFFFFFFF)
val tertiaryContainerLight = Color(0xFFFF8926)
val onTertiaryContainerLight = Color(0xFF341500)
val errorLight = Color(0xFFBA1A1A)
val onErrorLight = Color(0xFFFFFFFF)
val errorContainerLight = Color(0xFFFFDAD6)
val onErrorContainerLight = Color(0xFF410002)
val backgroundLight = Color(0xFFF5FBEF)
val onBackgroundLight = Color(0xFF171D16)
val surfaceLight = Color(0xFFF5FBEF)
val onSurfaceLight = Color(0xFF171D16)
val surfaceVariantLight = Color(0xFFDAE6D4)
val onSurfaceVariantLight = Color(0xFF3F4A3C)
val outlineLight = Color(0xFF6F7A6B)
val outlineVariantLight = Color(0xFFBECAB9)
val scrimLight = Color(0xFF000000)
val inverseSurfaceLight = Color(0xFF2C322A)
val inverseOnSurfaceLight = Color(0xFFEDF3E7)
val inversePrimaryLight = Color(0xFF78DC77)
val surfaceDimLight = Color(0xFFD6DCD0)
val surfaceBrightLight = Color(0xFFF5FBEF)
val surfaceContainerLowestLight = Color(0xFFFFFFFF)
val surfaceContainerLowLight = Color(0xFFF0F6EA)
val surfaceContainerLight = Color(0xFFEAF0E4)
val surfaceContainerHighLight = Color(0xFFE4EADE)
val surfaceContainerHighestLight = Color(0xFFDEE4D9)
val primaryDark = Color(0xFF78DC77)
val onPrimaryDark = Color(0xFF00390A)
val primaryContainerDark = Color(0xFF43A648)
val onPrimaryContainerDark = Color(0xFF000000)
val secondaryDark = Color(0xFF82DB7E)
val onSecondaryDark = Color(0xFF00390A)
val secondaryContainerDark = Color(0xFF2D8433)
val onSecondaryContainerDark = Color(0xFFFFFFFF)
val tertiaryDark = Color(0xFFFFB786)
val onTertiaryDark = Color(0xFF502400)
val tertiaryContainerDark = Color(0xFFEA7600)
val onTertiaryContainerDark = Color(0xFF030100)
val errorDark = Color(0xFFFFB4AB)
val onErrorDark = Color(0xFF690005)
val errorContainerDark = Color(0xFF93000A)
val onErrorContainerDark = Color(0xFFFFDAD6)
val backgroundDark = Color(0xFF0F120E)
val onBackgroundDark = Color(0xFFDEE4D9)
val surfaceDark = Color(0xFF0F120E)
val onSurfaceDark = Color(0xFFDEE4D9)
val surfaceVariantDark = Color(0xFF3F4A3C)
val onSurfaceVariantDark = Color(0xFFBECAB9)
val outlineDark = Color(0xFF899484)
val outlineVariantDark = Color(0xFF3F4A3C)
val scrimDark = Color(0xFF000000)
val inverseSurfaceDark = Color(0xFFDEE4D9)
val inverseOnSurfaceDark = Color(0xFF2C322A)
val inversePrimaryDark = Color(0xFF006E1C)
val surfaceDimDark = Color(0xFF0F150E)
val surfaceBrightDark = Color(0xFF353B33)
val surfaceContainerLowestDark = Color(0xFF0A1009)
val surfaceContainerLowDark = Color(0xFF171D16)
val surfaceContainerDark = Color(0xFF1B211A)
val surfaceContainerHighDark = Color(0xFF262C24)
val surfaceContainerHighestDark = Color(0xFF30362E)
val amoledDark = Color(0xFF000000)

View File

@ -17,7 +17,7 @@
package dev.patrickgold.florisboard.app.apptheme
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Shapes
import androidx.compose.material3.Shapes
import androidx.compose.ui.unit.dp
val Shapes = Shapes(

View File

@ -16,41 +16,50 @@
package dev.patrickgold.florisboard.app.apptheme
import android.app.Activity
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Colors
import androidx.compose.material.MaterialTheme
import androidx.compose.material.darkColors
import androidx.compose.material.lightColors
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.core.view.WindowCompat
import dev.patrickgold.florisboard.app.AppTheme
import dev.patrickgold.florisboard.lib.android.AndroidVersion
private val AmoledDarkColorPalette = darkColors(
/*private val AmoledDarkColorPalette = darkColorScheme(
primary = Green500,
primaryVariant = Green700,
secondary = Orange700,
secondaryVariant = Orange900,
secondary = Green700,
tertiary = Orange700,
// = Orange900,
background = Color(0xFF000000),
surface = Color(0xFF212121),
)
private val DarkColorPalette = darkColors(
private val DarkColorPalette = darkColorScheme(
primary = Green500,
primaryVariant = Green700,
secondary = Orange700,
secondaryVariant = Orange900,
secondary = Green700,
tertiary = Orange700,
//secondaryVariant = Orange900,
background = Color(0xFF1F1F1F),
surface = Color(0xFF212121),
)
private val LightColorPalette = lightColors(
private val LightColorPalette = lightColorScheme(
primary = Green500,
primaryVariant = Green700,
secondary = Orange700,
secondaryVariant = Orange900,
secondary = Green700,
tertiary = Orange700,
//secondaryVariant = Orange900,
background = Color(0xFFFFFFFF),
surface = Color(0xFFE7E7E7),
@ -63,35 +72,184 @@ private val LightColorPalette = lightColors(
onBackground = Color.Black,
onSurface = Color.Black,
*/
)*/
private val lightScheme = lightColorScheme(
primary = primaryLight,
onPrimary = onPrimaryLight,
primaryContainer = primaryContainerLight,
onPrimaryContainer = onPrimaryContainerLight,
secondary = secondaryLight,
onSecondary = onSecondaryLight,
secondaryContainer = secondaryContainerLight,
onSecondaryContainer = onSecondaryContainerLight,
tertiary = tertiaryLight,
onTertiary = onTertiaryLight,
tertiaryContainer = tertiaryContainerLight,
onTertiaryContainer = onTertiaryContainerLight,
error = errorLight,
onError = onErrorLight,
errorContainer = errorContainerLight,
onErrorContainer = onErrorContainerLight,
background = backgroundLight,
onBackground = onBackgroundLight,
surface = surfaceLight,
onSurface = onSurfaceLight,
surfaceVariant = surfaceVariantLight,
onSurfaceVariant = onSurfaceVariantLight,
outline = outlineLight,
outlineVariant = outlineVariantLight,
scrim = scrimLight,
inverseSurface = inverseSurfaceLight,
inverseOnSurface = inverseOnSurfaceLight,
inversePrimary = inversePrimaryLight,
surfaceDim = surfaceDimLight,
surfaceBright = surfaceBrightLight,
surfaceContainerLowest = surfaceContainerLowestLight,
surfaceContainerLow = surfaceContainerLowLight,
surfaceContainer = surfaceContainerLight,
surfaceContainerHigh = surfaceContainerHighLight,
surfaceContainerHighest = surfaceContainerHighestLight,
)
private val darkScheme = darkColorScheme(
primary = primaryDark,
onPrimary = onPrimaryDark,
primaryContainer = primaryContainerDark,
onPrimaryContainer = onPrimaryContainerDark,
secondary = secondaryDark,
onSecondary = onSecondaryDark,
secondaryContainer = secondaryContainerDark,
onSecondaryContainer = onSecondaryContainerDark,
tertiary = tertiaryDark,
onTertiary = onTertiaryDark,
tertiaryContainer = tertiaryContainerDark,
onTertiaryContainer = onTertiaryContainerDark,
error = errorDark,
onError = onErrorDark,
errorContainer = errorContainerDark,
onErrorContainer = onErrorContainerDark,
background = backgroundDark,
onBackground = onBackgroundDark,
surface = surfaceDark,
onSurface = onSurfaceDark,
surfaceVariant = surfaceVariantDark,
onSurfaceVariant = onSurfaceVariantDark,
outline = outlineDark,
outlineVariant = outlineVariantDark,
scrim = scrimDark,
inverseSurface = inverseSurfaceDark,
inverseOnSurface = inverseOnSurfaceDark,
inversePrimary = inversePrimaryDark,
surfaceDim = surfaceDimDark,
surfaceBright = surfaceBrightDark,
surfaceContainerLowest = surfaceContainerLowestDark,
surfaceContainerLow = surfaceContainerLowDark,
surfaceContainer = surfaceContainerDark,
surfaceContainerHigh = surfaceContainerHighDark,
surfaceContainerHighest = surfaceContainerHighestDark,
)
private val amoledScheme = darkScheme.copy(
background = amoledDark,
surface = amoledDark
)
@Composable
fun FlorisAppTheme(
theme: AppTheme,
isMaterialYouAware: Boolean,
content: @Composable () -> Unit
) {
val colors = when (theme) {
val colors = if (AndroidVersion.ATLEAST_API31_S) {
when (theme) {
AppTheme.AUTO -> when {
isSystemInDarkTheme() -> DarkColorPalette
else -> LightColorPalette
isMaterialYouAware -> when {
isSystemInDarkTheme() -> dynamicDarkColorScheme(LocalContext.current)
else -> dynamicLightColorScheme(LocalContext.current)
}
else -> {
when {
isSystemInDarkTheme() -> darkScheme
else -> lightScheme
}
}
}
AppTheme.AUTO_AMOLED -> when {
isSystemInDarkTheme() -> AmoledDarkColorPalette
else -> LightColorPalette
isMaterialYouAware -> when {
isSystemInDarkTheme() -> dynamicDarkColorScheme(LocalContext.current).copy(
background = amoledDark,
surface = amoledDark,
)
else -> dynamicLightColorScheme(LocalContext.current)
}
else -> {
when {
isSystemInDarkTheme() -> amoledScheme
else -> lightScheme
}
}
}
AppTheme.LIGHT -> when {
isMaterialYouAware -> dynamicLightColorScheme(LocalContext.current)
else -> lightScheme
}
AppTheme.DARK -> when {
isMaterialYouAware -> dynamicDarkColorScheme(LocalContext.current)
else -> darkScheme
}
AppTheme.AMOLED_DARK -> when {
isMaterialYouAware -> dynamicDarkColorScheme(LocalContext.current).copy(
background = amoledDark,
surface = amoledDark,
)
else -> amoledScheme
}
}
} else {
when (theme) {
AppTheme.AUTO -> when {
isSystemInDarkTheme() -> darkScheme
else -> lightScheme
}
AppTheme.AUTO_AMOLED -> when {
isSystemInDarkTheme() -> darkScheme
else -> lightScheme
}
AppTheme.LIGHT -> lightScheme
AppTheme.DARK -> darkScheme
AppTheme.AMOLED_DARK -> amoledScheme
}
}
val darkTheme =
theme == AppTheme.DARK
|| theme == AppTheme.AMOLED_DARK
|| (theme == AppTheme.AUTO && isSystemInDarkTheme())
|| (theme == AppTheme.AUTO_AMOLED && isSystemInDarkTheme())
val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
val window = (view.context as Activity).window
WindowCompat.getInsetsController(window, window.decorView).isAppearanceLightStatusBars = !darkTheme
}
AppTheme.LIGHT -> LightColorPalette
AppTheme.DARK -> DarkColorPalette
AppTheme.AMOLED_DARK -> AmoledDarkColorPalette
}
MaterialTheme(
colors = colors,
colorScheme = colors,
typography = Typography,
shapes = Shapes,
content = content,
)
}
val Colors.outline: Color
@Composable
get() = this.onSurface.copy(alpha = ButtonDefaults.OutlinedBorderOpacity)

View File

@ -16,7 +16,7 @@
package dev.patrickgold.florisboard.app.apptheme
import androidx.compose.material.Typography
import androidx.compose.material3.Typography
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
@ -24,7 +24,7 @@ import androidx.compose.ui.unit.sp
// Set of Material typography styles to start with
val Typography = Typography(
body1 = TextStyle(
bodyLarge = TextStyle(
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal,
fontSize = 16.sp

View File

@ -21,15 +21,14 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Save
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontFamily
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.ime.core.DisplayLanguageNamesIn

View File

@ -19,7 +19,7 @@ package dev.patrickgold.florisboard.app.devtools
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.Text
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf

View File

@ -21,8 +21,8 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.LocalContentColor
import androidx.compose.material.Text
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.collectAsState

View File

@ -21,7 +21,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.Text
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect

View File

@ -21,21 +21,18 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.ListItem
import androidx.compose.material.LocalContentAlpha
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ListItem
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
@ -97,8 +94,8 @@ fun ExtensionComponentView(
}
Text(
text = text,
style = MaterialTheme.typography.body2,
color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current),
style = MaterialTheme.typography.bodyMedium,
color = LocalContentColor.current,
)
}
is LanguagePackComponent -> {
@ -113,8 +110,8 @@ fun ExtensionComponentView(
}
Text(
text = text,
style = MaterialTheme.typography.body2,
color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current),
style = MaterialTheme.typography.bodyMedium,
color = LocalContentColor.current,
)
}
else -> { }
@ -132,7 +129,7 @@ fun ExtensionComponentView(
icon = Icons.Default.Delete,
text = stringRes(R.string.action__delete),
colors = ButtonDefaults.textButtonColors(
contentColor = MaterialTheme.colors.error,
contentColor = MaterialTheme.colorScheme.error,
),
)
}
@ -149,7 +146,6 @@ fun ExtensionComponentView(
}
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun <T : ExtensionComponent> ExtensionComponentListView(
modifier: Modifier = Modifier,
@ -160,19 +156,19 @@ fun <T : ExtensionComponent> ExtensionComponentListView(
) {
Column(modifier = modifier) {
ListItem(
text = { Text(
headlineContent = { Text(
text = title,
color = MaterialTheme.colors.secondary,
color = MaterialTheme.colorScheme.secondary,
fontWeight = FontWeight.Bold,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
) },
trailing = if (onCreateBtnClick != null) {
trailingContent = if (onCreateBtnClick != null) {
@Composable {
FlorisIconButton(
onClick = onCreateBtnClick,
icon = Icons.Default.Add,
iconColor = MaterialTheme.colors.secondary,
iconColor = MaterialTheme.colorScheme.secondary,
)
}
} else { null },

View File

@ -28,14 +28,14 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Code
import androidx.compose.material.icons.outlined.LibraryBooks
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -47,7 +47,6 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.apptheme.outline
import dev.patrickgold.florisboard.app.settings.advanced.RadioListItem
import dev.patrickgold.florisboard.app.settings.theme.DialogProperty
import dev.patrickgold.florisboard.app.settings.theme.ThemeEditorScreen
@ -863,7 +862,7 @@ private fun EditorSheetTextField(
showValidationError: Boolean = false,
validationResult: ValidationResult? = null,
) {
val borderColor = MaterialTheme.colors.outline
val borderColor = MaterialTheme.colorScheme.outline
Column(modifier = Modifier.padding(vertical = TextFieldVerticalPadding)) {
Row(
modifier = Modifier
@ -872,14 +871,14 @@ private fun EditorSheetTextField(
) {
Text(
text = label,
style = MaterialTheme.typography.subtitle2,
style = MaterialTheme.typography.titleSmall,
)
if (isRequired) {
Text(
modifier = Modifier.padding(start = 2.dp),
text = "*",
style = MaterialTheme.typography.subtitle2,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.error,
)
}
}
@ -891,7 +890,7 @@ private fun EditorSheetTextField(
singleLine = singleLine,
showValidationError = showValidationError,
validationResult = validationResult,
colors = TextFieldDefaults.outlinedTextFieldColors(
colors = OutlinedTextFieldDefaults.colors(
unfocusedBorderColor = borderColor,
disabledBorderColor = borderColor,
)

View File

@ -29,9 +29,9 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -228,8 +228,8 @@ fun ExtensionImportScreen(type: ExtensionImportScreenType, initUuid: String?) =
Text(
modifier = Modifier.padding(horizontal = 16.dp),
text = stringRes(R.string.ext__import__error_unexpected_exception),
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.error,
)
SelectionContainer {
Text(
@ -237,8 +237,8 @@ fun ExtensionImportScreen(type: ExtensionImportScreenType, initUuid: String?) =
.florisHorizontalScroll()
.padding(horizontal = 16.dp),
text = result.exceptionOrNull()?.stackTraceToString() ?: "null",
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.error,
fontStyle = FontStyle.Italic,
)
}
@ -266,20 +266,20 @@ private fun FileInfoView(
Row {
Text(
text = Formatter.formatShortFileSize(LocalContext.current, fileInfo.size),
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
color = grayColor,
)
if (ext != null) {
FlorisBulletSpacer()
Text(
text = ext.meta.id,
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
color = grayColor,
)
FlorisBulletSpacer()
Text(
text = ext.meta.version,
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
color = grayColor,
)
}
@ -288,12 +288,12 @@ private fun FileInfoView(
Spacer(modifier = Modifier.height(8.dp))
Text(
text = ext.meta.title,
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
)
ext.meta.description?.let { description ->
Text(
text = description,
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
fontStyle = FontStyle.Italic,
)
}
@ -303,13 +303,13 @@ private fun FileInfoView(
}
Text(
text = stringRes(R.string.ext__meta__maintainers_by, "maintainers" to maintainers),
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
)
Spacer(modifier = Modifier.height(8.dp))
for (component in ext.components()) {
Text(
text = component.id,
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
)
}
}
@ -318,16 +318,16 @@ private fun FileInfoView(
.fillMaxWidth()
.height(19.dp)
.padding(top = 10.dp, bottom = 8.dp)
.background(MaterialTheme.colors.error.copy(alpha = 0.56f)))
.background(MaterialTheme.colorScheme.error.copy(alpha = 0.56f)))
Text(
text = stringRes(R.string.ext__import__file_skip),
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.error,
)
Text(
text = stringRes(fileInfo.skipReason),
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.error,
fontStyle = FontStyle.Italic,
)
}

View File

@ -18,7 +18,7 @@ package dev.patrickgold.florisboard.app.ext
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

View File

@ -27,13 +27,13 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Divider
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Share
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Divider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -42,7 +42,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
@ -150,7 +149,7 @@ private fun ViewScreen(ext: Extension) = FlorisScreen {
icon = Icons.Default.Delete,
text = stringRes(R.string.action__delete),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = MaterialTheme.colors.error,
contentColor = MaterialTheme.colorScheme.error,
),
)
}

View File

@ -22,13 +22,13 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Code
import androidx.compose.material.icons.filled.History
import androidx.compose.material.icons.outlined.Description
import androidx.compose.material.icons.outlined.Info
import androidx.compose.material.icons.outlined.Policy
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier

View File

@ -18,7 +18,7 @@ package dev.patrickgold.florisboard.app.settings.about
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.Text
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Modifier

View File

@ -18,9 +18,11 @@ package dev.patrickgold.florisboard.app.settings.about
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.mikepenz.aboutlibraries.ui.compose.LibrariesContainer
import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer
import com.mikepenz.aboutlibraries.ui.compose.m3.LibraryDefaults
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.compose.FlorisScreen
import dev.patrickgold.florisboard.lib.compose.florisScrollbar
@ -39,6 +41,13 @@ fun ThirdPartyLicensesScreen() = FlorisScreen {
modifier = Modifier
.fillMaxSize()
.florisScrollbar(lazyListState, isVertical = true),
colors = LibraryDefaults.libraryColors(
backgroundColor = MaterialTheme.colorScheme.background,
badgeBackgroundColor = MaterialTheme.colorScheme.primaryContainer,
badgeContentColor = MaterialTheme.colorScheme.onPrimaryContainer,
contentColor = MaterialTheme.colorScheme.onBackground,
dialogConfirmButtonColor = MaterialTheme.colorScheme.primary,
),
lazyListState = lazyListState,
)
}

View File

@ -18,6 +18,7 @@ package dev.patrickgold.florisboard.app.settings.advanced
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Archive
import androidx.compose.material.icons.filled.FormatPaint
import androidx.compose.material.icons.filled.Language
import androidx.compose.material.icons.filled.Palette
import androidx.compose.material.icons.filled.Preview
@ -77,6 +78,14 @@ fun AdvancedScreen() = FlorisScreen {
)
},
)
SwitchPreference(
pref = prefs.advanced.useMaterialYou,
icon = Icons.Default.FormatPaint,
title = stringRes(R.string.pref__advanced__settings_material_you__label),
visibleIf = {
AndroidVersion.ATLEAST_API31_S
},
)
ListPreference(
prefs.advanced.settingsLanguage,
icon = Icons.Default.Language,

View File

@ -23,8 +23,8 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.width
import androidx.compose.material.Checkbox
import androidx.compose.material.RadioButton
import androidx.compose.material3.Checkbox
import androidx.compose.material3.RadioButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -370,7 +370,7 @@ internal fun CheckboxListItem(
icon = {
Row {
if (isSecondaryListItem) {
Spacer(modifier = Modifier.width(56.dp))
Spacer(modifier = Modifier.width(40.dp))
}
Checkbox(
checked = checked,

View File

@ -25,13 +25,13 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.LocalContentAlpha
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Code
import androidx.compose.material.icons.filled.Schedule
import androidx.compose.material.icons.outlined.Info
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -54,8 +54,8 @@ import dev.patrickgold.florisboard.ime.clipboard.provider.ItemType
import dev.patrickgold.florisboard.lib.android.readToFile
import dev.patrickgold.florisboard.lib.android.showLongToast
import dev.patrickgold.florisboard.lib.cache.CacheManager
import dev.patrickgold.florisboard.lib.compose.CardDefaults
import dev.patrickgold.florisboard.lib.compose.FlorisButtonBar
import dev.patrickgold.florisboard.lib.compose.FlorisCardDefaults
import dev.patrickgold.florisboard.lib.compose.FlorisOutlinedBox
import dev.patrickgold.florisboard.lib.compose.FlorisOutlinedButton
import dev.patrickgold.florisboard.lib.compose.FlorisScreen
@ -314,23 +314,23 @@ fun RestoreScreen() = FlorisScreen {
},
)
if (workspace.restoreErrorId != null) {
Column(modifier = Modifier.padding(CardDefaults.ContentPadding)) {
Column(modifier = Modifier.padding(FlorisCardDefaults.ContentPadding)) {
Box(
modifier = Modifier
.fillMaxWidth()
.height(9.dp)
.padding(bottom = 8.dp)
.background(MaterialTheme.colors.error.copy(alpha = 0.56f))
.background(MaterialTheme.colorScheme.error.copy(alpha = 0.56f))
)
Text(
text = stringRes(workspace.restoreErrorId!!),
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.error,
fontStyle = FontStyle.Italic,
)
}
} else if (workspace.restoreWarningId != null) {
Column(modifier = Modifier.padding(CardDefaults.ContentPadding)) {
Column(modifier = Modifier.padding(FlorisCardDefaults.ContentPadding)) {
Box(
modifier = Modifier
.fillMaxWidth()
@ -340,7 +340,7 @@ fun RestoreScreen() = FlorisScreen {
)
Text(
text = stringRes(workspace.restoreWarningId!!),
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
color = LocalContentColor.current.copy(alpha = LocalContentAlpha.current),
fontStyle = FontStyle.Italic,
)

View File

@ -23,16 +23,16 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.ExtendedFloatingActionButton
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.MoreVert
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
@ -43,7 +43,6 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
@ -214,14 +213,14 @@ fun UserDictionaryScreen(type: UserDictionaryType) = FlorisScreen {
importDictionary.launch("*/*")
expanded = false
},
content = { Text(text = stringRes(R.string.action__import)) },
text = { Text(text = stringRes(R.string.action__import)) },
)
DropdownMenuItem(
onClick = {
exportDictionary.launch("my-personal-dictionary.clb")
expanded = false
},
content = { Text(text = stringRes(R.string.action__export)) },
text = { Text(text = stringRes(R.string.action__export)) },
)
if (type == UserDictionaryType.SYSTEM) {
DropdownMenuItem(
@ -229,7 +228,7 @@ fun UserDictionaryScreen(type: UserDictionaryType) = FlorisScreen {
context.launchActivity { it.action = SystemUserDictionaryUiIntentAction }
expanded = false
},
content = { Text(text = stringRes(R.string.settings__udm__open_system_manager_ui)) },
text = { Text(text = stringRes(R.string.settings__udm__open_system_manager_ui)) },
)
}
}

View File

@ -25,12 +25,12 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Input
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
@ -177,7 +177,7 @@ fun LanguagePackManagerScreen(action: LanguagePackManagerScreenAction?) = Floris
icon = Icons.Default.Delete,
text = stringRes(R.string.action__delete),
colors = ButtonDefaults.textButtonColors(
contentColor = MaterialTheme.colors.error,
contentColor = MaterialTheme.colorScheme.error,
),
)
Spacer(modifier = Modifier.weight(1f))

View File

@ -17,11 +17,12 @@
package dev.patrickgold.florisboard.app.settings.localization
import androidx.compose.foundation.layout.padding
import androidx.compose.material.ExtendedFloatingActionButton
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.FloatingActionButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
@ -70,6 +71,7 @@ fun LocalizationScreen() = FlorisScreen {
text = stringRes(R.string.settings__localization__subtype_add_title),
)
},
shape = FloatingActionButtonDefaults.extendedFabShape,
onClick = { navController.navigate(Routes.Settings.SubtypeAdd) },
)
}

View File

@ -24,13 +24,13 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.Icon
import androidx.compose.material.LocalContentColor
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -41,7 +41,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
@ -107,7 +106,7 @@ fun SelectLocaleScreen() = FlorisScreen {
},
singleLine = true,
shape = RectangleShape,
colors = TextFieldDefaults.textFieldColors(
colors = TextFieldDefaults.colors(
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
disabledIndicatorColor = Color.Transparent,

View File

@ -25,14 +25,14 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.Button
import androidx.compose.material.Card
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Delete
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.MutableState
@ -48,7 +48,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@ -66,7 +65,6 @@ import dev.patrickgold.florisboard.ime.core.SubtypePreset
import dev.patrickgold.florisboard.ime.keyboard.LayoutArrangementComponent
import dev.patrickgold.florisboard.ime.keyboard.LayoutType
import dev.patrickgold.florisboard.ime.keyboard.extCorePopupMapping
import dev.patrickgold.florisboard.ime.text.key.KeyCode
import dev.patrickgold.florisboard.ime.nlp.han.HanShapeBasedLanguageProvider
import dev.patrickgold.florisboard.ime.nlp.latin.LatinLanguageProvider
import dev.patrickgold.florisboard.keyboardManager
@ -82,7 +80,6 @@ import dev.patrickgold.florisboard.subtypeManager
import dev.patrickgold.jetpref.datastore.model.observeAsState
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog
import dev.patrickgold.jetpref.material.ui.JetPrefListItem
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
private val SelectComponentName = ExtensionComponentName("00", "00")
@ -281,7 +278,7 @@ fun SubtypeEditorScreen(id: Long?) = FlorisScreen {
Text(
modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
text = stringRes(R.string.settings__localization__suggested_subtype_presets),
color = MaterialTheme.colors.primary,
color = MaterialTheme.colorScheme.primary,
fontWeight = FontWeight.Bold,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
@ -583,7 +580,7 @@ private fun SubtypeProperty(text: String, content: @Composable () -> Unit) {
Text(
modifier = Modifier.padding(bottom = 8.dp),
text = text,
style = MaterialTheme.typography.subtitle2,
style = MaterialTheme.typography.titleSmall,
)
content()
}

View File

@ -30,12 +30,11 @@ import androidx.compose.foundation.shape.CutCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.HelpOutline
import androidx.compose.material.icons.outlined.HelpOutline
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect
@ -49,7 +48,6 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
@ -94,7 +92,7 @@ import dev.patrickgold.florisboard.lib.snygg.value.SnyggValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggValueEncoder
import dev.patrickgold.florisboard.lib.snygg.value.SnyggVarValueEncoders
import dev.patrickgold.florisboard.lib.stripUnicodeCtrlChars
import dev.patrickgold.jetpref.material.ui.ExperimentalJetPrefMaterialUi
import dev.patrickgold.jetpref.material.ui.ExperimentalJetPrefMaterial3Ui
import dev.patrickgold.jetpref.material.ui.JetPrefAlertDialog
import dev.patrickgold.jetpref.material.ui.JetPrefColorPicker
import dev.patrickgold.jetpref.material.ui.rememberJetPrefColorPickerState
@ -220,7 +218,7 @@ internal fun EditPropertyDialog(
},
onNeutral = onDelete,
neutralColors = ButtonDefaults.textButtonColors(
contentColor = MaterialTheme.colors.error,
contentColor = MaterialTheme.colorScheme.error,
),
) {
Column {
@ -228,7 +226,7 @@ internal fun EditPropertyDialog(
Text(
modifier = Modifier.padding(bottom = 16.dp),
text = stringRes(R.string.settings__theme_editor__property_already_exists),
color = MaterialTheme.colors.error,
color = MaterialTheme.colorScheme.error,
)
}
@ -353,7 +351,7 @@ private fun PropertyValueEncoderDropdown(
)
}
@OptIn(ExperimentalJetPrefMaterialUi::class)
@OptIn(ExperimentalJetPrefMaterial3Ui::class)
@Composable
private fun PropertyValueEditor(
value: SnyggValue,
@ -417,7 +415,7 @@ private fun PropertyValueEditor(
.padding(end = 12.dp)
.weight(1f),
text = colorPickerStr,
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
fontFamily = FontFamily.Monospace,
)
SnyggValueIcon(
@ -477,7 +475,7 @@ private fun PropertyValueEditor(
rgb(r,g,b)
-> r,g,b in 0..255
""".trimIndent(),
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
fontFamily = FontFamily.Monospace,
)
}
@ -680,7 +678,7 @@ private fun PropertyValueEditor(
Box(
modifier = Modifier
.requiredSize(40.dp)
.border(1.dp, MaterialTheme.colors.onBackground, shape),
.border(1.dp, MaterialTheme.colorScheme.onBackground, shape),
)
Column {
FlorisChip(
@ -849,7 +847,7 @@ private fun PropertyValueEditor(
Box(
modifier = Modifier
.requiredSize(40.dp)
.border(1.dp, MaterialTheme.colors.onBackground, shape),
.border(1.dp, MaterialTheme.colorScheme.onBackground, shape),
)
Column {
FlorisChip(
@ -938,7 +936,7 @@ private fun PropertyValueEditor(
Box(
modifier = Modifier
.requiredSize(40.dp)
.border(1.dp, MaterialTheme.colors.onBackground, value.shape),
.border(1.dp, MaterialTheme.colorScheme.onBackground, value.shape),
)
}
}

View File

@ -39,16 +39,17 @@ import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.text.selection.LocalTextSelectionColors
import androidx.compose.foundation.text.selection.TextSelectionColors
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.HelpOutline
import androidx.compose.material.icons.filled.Pageview
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
@ -65,7 +66,6 @@ import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@ -190,7 +190,7 @@ internal fun EditRuleDialog(
} else {
null
},
neutralColors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colors.error),
neutralColors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error),
onNeutral = { onDeleteRule(initRule) },
) {
Column {
@ -198,7 +198,7 @@ internal fun EditRuleDialog(
Text(
modifier = Modifier.padding(bottom = 16.dp),
text = stringRes(R.string.settings__theme_editor__rule_already_exists),
color = MaterialTheme.colors.error,
color = MaterialTheme.colorScheme.error,
)
}
@ -224,7 +224,8 @@ internal fun EditRuleDialog(
SnyggLevel.DEVELOPER -> SnyggRule.PRESSED_SELECTOR
else -> stringRes(R.string.snygg__rule_selector__pressed)
},
color = if (pressedSelector) MaterialTheme.colors.primaryVariant else Color.Unspecified,
selected = pressedSelector,
color = if (pressedSelector) MaterialTheme.colorScheme.secondary else Color.Unspecified,
)
FlorisChip(
onClick = { focusSelector = !focusSelector },
@ -233,7 +234,8 @@ internal fun EditRuleDialog(
SnyggLevel.DEVELOPER -> SnyggRule.FOCUS_SELECTOR
else -> stringRes(R.string.snygg__rule_selector__focus)
},
color = if (focusSelector) MaterialTheme.colors.primaryVariant else Color.Unspecified,
selected = focusSelector,
color = if (focusSelector) MaterialTheme.colorScheme.secondary else Color.Unspecified,
)
FlorisChip(
onClick = { disabledSelector = !disabledSelector },
@ -241,7 +243,8 @@ internal fun EditRuleDialog(
SnyggLevel.DEVELOPER -> SnyggRule.DISABLED_SELECTOR
else -> stringRes(R.string.snygg__rule_selector__disabled)
},
color = if (disabledSelector) MaterialTheme.colors.primaryVariant else Color.Unspecified,
selected = disabledSelector,
color = if (disabledSelector) MaterialTheme.colorScheme.secondary else Color.Unspecified,
)
}
}
@ -270,6 +273,7 @@ internal fun EditRuleDialog(
FlorisChip(
onClick = { editCodeDialogValue = code },
text = code.toString(),
selected = editCodeDialogValue == code,
shape = MaterialTheme.shapes.medium,
)
}
@ -286,7 +290,8 @@ internal fun EditRuleDialog(
}
else -> stringRes(R.string.enum__input_shift_state__unshifted)
},
color = if (shiftStateUnshifted) MaterialTheme.colors.primaryVariant else Color.Unspecified,
selected = shiftStateUnshifted,
color = if (shiftStateUnshifted) MaterialTheme.colorScheme.secondary else Color.Unspecified,
)
FlorisChip(
onClick = { shiftStateShiftedManual = !shiftStateShiftedManual },
@ -296,7 +301,8 @@ internal fun EditRuleDialog(
}
else -> stringRes(R.string.enum__input_shift_state__shifted_manual)
},
color = if (shiftStateShiftedManual) MaterialTheme.colors.primaryVariant else Color.Unspecified,
selected = shiftStateShiftedManual,
color = if (shiftStateShiftedManual) MaterialTheme.colorScheme.secondary else Color.Unspecified,
)
FlorisChip(
onClick = { shiftStateShiftedAutomatic = !shiftStateShiftedAutomatic },
@ -306,7 +312,8 @@ internal fun EditRuleDialog(
}
else -> stringRes(R.string.enum__input_shift_state__shifted_automatic)
},
color = if (shiftStateShiftedAutomatic) MaterialTheme.colors.primaryVariant else Color.Unspecified,
selected = shiftStateShiftedAutomatic,
color = if (shiftStateShiftedAutomatic) MaterialTheme.colorScheme.secondary else Color.Unspecified,
)
FlorisChip(
onClick = { shiftStateCapsLock = !shiftStateCapsLock },
@ -316,7 +323,8 @@ internal fun EditRuleDialog(
}
else -> stringRes(R.string.enum__input_shift_state__caps_lock)
},
color = if (shiftStateCapsLock) MaterialTheme.colors.primaryVariant else Color.Unspecified,
selected = shiftStateCapsLock,
color = if (shiftStateCapsLock) MaterialTheme.colorScheme.secondary else Color.Unspecified,
)
}
}
@ -335,6 +343,7 @@ internal fun EditRuleDialog(
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun EditCodeValueDialog(
codeValue: Int,
@ -368,7 +377,7 @@ private fun EditCodeValueDialog(
val recordingKeyColor = if (isRecordingKey) {
rememberInfiniteTransition().animateColor(
initialValue = LocalContentColor.current,
targetValue = MaterialTheme.colors.error,
targetValue = MaterialTheme.colorScheme.error,
animationSpec = infiniteRepeatable(
tween(750),
repeatMode = RepeatMode.Reverse,
@ -461,7 +470,7 @@ private fun EditCodeValueDialog(
} else {
null
},
neutralColors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colors.error),
neutralColors = ButtonDefaults.textButtonColors(contentColor = MaterialTheme.colorScheme.error),
onNeutral = {
onDelete(codeValue)
onDismiss()
@ -526,12 +535,12 @@ private fun EditCodeValueDialog(
isError = showError,
singleLine = true,
colors = if (isRecordingKey) {
TextFieldDefaults.outlinedTextFieldColors(
textColor = Color.Transparent,
OutlinedTextFieldDefaults.colors(
focusedTextColor = Color.Transparent,
cursorColor = Color.Transparent,
)
} else {
TextFieldDefaults.outlinedTextFieldColors()
OutlinedTextFieldDefaults.colors()
},
)
}
@ -550,7 +559,7 @@ private fun EditCodeValueDialog(
"i_min" to KeyCode.Spec.INTERNAL_MIN,
"i_max" to KeyCode.Spec.INTERNAL_MAX,
),
color = MaterialTheme.colors.error,
color = MaterialTheme.colorScheme.error,
)
}
}
@ -593,7 +602,7 @@ private fun TextKeyDataPreviewBox(
modifier = Modifier
.padding(end = 16.dp)
.background(
color = MaterialTheme.colors.onSurface.copy(alpha = 0.12f),
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f),
shape = MaterialTheme.shapes.medium,
)
.height(36.dp)

View File

@ -25,26 +25,23 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.shape.CutCornerShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.FormatSize
import androidx.compose.material.icons.filled.Link
import androidx.compose.material.icons.filled.Straighten
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.snygg.value.SnyggCutCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDefinedVarValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggDpSizeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouLightColorValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggMaterialYouValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggRoundedCornerDpShapeValue
import dev.patrickgold.florisboard.lib.snygg.value.SnyggShapeValue
@ -102,7 +99,7 @@ internal fun SnyggValueIcon(
Box(
modifier = modifier
.requiredSize(spec.iconSizeMinusBorder)
.border(spec.borderWith, MaterialTheme.colors.onBackground, value.alwaysPercentShape())
.border(spec.borderWith, MaterialTheme.colorScheme.onBackground, value.alwaysPercentShape())
)
}
is SnyggDpSizeValue -> {
@ -143,7 +140,7 @@ internal fun SnyggValueIcon(
.offset(x = 1.dp)
.requiredSize(smallSpec.iconSize)
.padding(vertical = 2.dp)
.background(MaterialTheme.colors.background, spec.boxShape),
.background(MaterialTheme.colorScheme.background, spec.boxShape),
)
Icon(
modifier = Modifier.requiredSize(smallSpec.iconSize),
@ -167,8 +164,8 @@ internal fun SnyggValueColorBox(
) {
Surface(
modifier = modifier.requiredSize(spec.iconSize),
color = MaterialTheme.colors.background,
elevation = spec.elevation,
color = MaterialTheme.colorScheme.background,
shadowElevation = spec.elevation,
shape = spec.boxShape,
) {
Box(

View File

@ -33,18 +33,19 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.selection.toggleable
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.ExtendedFloatingActionButton
import androidx.compose.material.Icon
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Switch
import androidx.compose.material.Text
import androidx.compose.material.ChipDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Close
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Tune
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.ExtendedFloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
@ -62,13 +63,13 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.apptheme.Shapes
import dev.patrickgold.florisboard.app.ext.ExtensionComponentView
import dev.patrickgold.florisboard.app.florisPreferenceModel
import dev.patrickgold.florisboard.ime.theme.FlorisImeUiSpec
@ -300,7 +301,7 @@ fun ThemeEditorScreen(
Text(
modifier = Modifier.padding(bottom = 8.dp, start = 16.dp, end = 16.dp),
text = stringRes(R.string.snygg__rule_element__defines_description),
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
fontStyle = FontStyle.Italic,
)
}
@ -549,9 +550,9 @@ private fun SnyggRuleRow(
Text(
modifier = Modifier
.padding(end = 8.dp)
.background(MaterialTheme.colors.primaryVariant),
.background(MaterialTheme.colorScheme.primaryContainer, shape = Shapes.small),
text = text,
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
fontFamily = FontFamily.Monospace,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
@ -562,7 +563,7 @@ private fun SnyggRuleRow(
fun AttributesList(text: String, list: String) {
Text(
text = "$text = $list",
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
color = LocalContentColor.current.copy(alpha = 0.56f),
fontFamily = FontFamily.Monospace,
maxLines = 1,
@ -582,7 +583,7 @@ private fun SnyggRuleRow(
) {
Text(
text = translateElementName(rule, level),
style = MaterialTheme.typography.body2,
style = MaterialTheme.typography.bodyMedium,
fontFamily = FontFamily.Monospace,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
@ -618,14 +619,14 @@ private fun SnyggRuleRow(
FlorisIconButton(
onClick = onEditRuleBtnClick,
icon = Icons.Default.Edit,
iconColor = MaterialTheme.colors.primary,
iconColor = MaterialTheme.colorScheme.primary,
iconModifier = Modifier.size(ButtonDefaults.IconSize),
)
}
FlorisIconButton(
onClick = onAddPropertyBtnClick,
icon = Icons.Default.Add,
iconColor = MaterialTheme.colors.secondary,
iconColor = MaterialTheme.colorScheme.secondary,
iconModifier = Modifier.size(ButtonDefaults.IconSize),
)
}
@ -645,7 +646,7 @@ internal fun DialogProperty(
.weight(1f)
.padding(vertical = 8.dp),
text = text,
style = MaterialTheme.typography.subtitle2,
style = MaterialTheme.typography.titleSmall,
)
trailingIconTitle()
}

View File

@ -21,11 +21,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.RadioButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.DarkMode
@ -33,6 +28,11 @@ import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Input
import androidx.compose.material.icons.filled.LightMode
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.getValue
@ -204,7 +204,7 @@ fun ThemeManagerScreen(action: ThemeManagerScreenAction?) = FlorisScreen {
icon = Icons.Default.Delete,
text = stringRes(R.string.action__delete),
colors = ButtonDefaults.textButtonColors(
contentColor = MaterialTheme.colors.error,
contentColor = MaterialTheme.colorScheme.error,
),
)
Spacer(modifier = Modifier.weight(1f))

View File

@ -18,15 +18,15 @@ package dev.patrickgold.florisboard.app.settings.theme
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.Card
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.BrightnessAuto
import androidx.compose.material.icons.filled.DarkMode
import androidx.compose.material.icons.filled.FormatPaint
import androidx.compose.material.icons.filled.LightMode
import androidx.compose.material.icons.outlined.Palette
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier

View File

@ -23,16 +23,15 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.material.Icon
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.HelpOutline
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.lib.android.AndroidSettings

View File

@ -18,13 +18,13 @@ package dev.patrickgold.florisboard.app.settings.typing
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Card
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Contacts
import androidx.compose.material.icons.filled.Language
import androidx.compose.material.icons.filled.LibraryBooks
import androidx.compose.material.icons.filled.SpaceBar
import androidx.compose.material3.Card
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf

View File

@ -28,8 +28,8 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue

View File

@ -46,10 +46,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.ClearAll
@ -58,6 +54,11 @@ import androidx.compose.material.icons.filled.ToggleOff
import androidx.compose.material.icons.filled.ToggleOn
import androidx.compose.material.icons.filled.Videocam
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -81,7 +82,6 @@ import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.apptheme.Green500
import dev.patrickgold.florisboard.app.florisPreferenceModel
import dev.patrickgold.florisboard.clipboardManager
import dev.patrickgold.florisboard.ime.ImeUiMode
@ -543,7 +543,7 @@ fun ClipboardInputLayout(
.align(Alignment.End),
onClick = { prefs.clipboard.historyEnabled.set(true) },
colors = ButtonDefaults.buttonColors(
backgroundColor = Green500,
containerColor = MaterialTheme.colorScheme.primary,
contentColor = Color.White,
),
) {

View File

@ -17,21 +17,24 @@
package dev.patrickgold.florisboard.lib.compose
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FlorisAppBar(
title: String,
navigationIcon: FlorisScreenNavigationIcon?,
actions: @Composable RowScope.() -> Unit = { },
scrollBehavior: TopAppBarScrollBehavior
) {
TopAppBar(
navigationIcon = navigationIcon,
navigationIcon = navigationIcon ?: {},
title = {
Text(
text = title,
@ -40,7 +43,7 @@ fun FlorisAppBar(
)
},
actions = actions,
backgroundColor = Color.Transparent,
elevation = 0.dp,
colors = TopAppBarDefaults.topAppBarColors(),
scrollBehavior = scrollBehavior
)
}

View File

@ -22,13 +22,12 @@ import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.app.apptheme.outline
@Composable
fun RowScope.FlorisBulletSpacer(
@ -40,6 +39,6 @@ fun RowScope.FlorisBulletSpacer(
.padding(horizontal = 8.dp)
.size(4.dp)
.clip(CircleShape)
.background(MaterialTheme.colors.outline),
.background(MaterialTheme.colorScheme.outline),
)
}

View File

@ -16,7 +16,6 @@
package dev.patrickgold.florisboard.lib.compose
import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
@ -24,33 +23,32 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
@Composable
fun FlorisButtonBar(content: @Composable FlorisButtonBarScope.() -> Unit) {
Surface(
modifier = Modifier.fillMaxWidth(),
color = MaterialTheme.colors.background,
elevation = 8.dp,
color = MaterialTheme.colorScheme.background,
tonalElevation = 8.dp,
) {
Column {
Surface(
modifier = Modifier
.fillMaxWidth()
.height(1.dp),
color = MaterialTheme.colors.surface,
color = MaterialTheme.colorScheme.surface,
) {}
Row(
modifier = Modifier
@ -77,8 +75,8 @@ class FlorisButtonBarScope(rowScope: RowScope) : RowScope by rowScope {
modifier = modifier.padding(start = 16.dp),
enabled = enabled,
colors = ButtonDefaults.buttonColors(
backgroundColor = MaterialTheme.colors.primary,
contentColor = MaterialTheme.colors.onPrimary,
containerColor = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onPrimary,
),
onClick = onClick,
) {
@ -105,7 +103,7 @@ class FlorisButtonBarScope(rowScope: RowScope) : RowScope by rowScope {
modifier = modifier.padding(start = 16.dp),
enabled = enabled,
colors = ButtonDefaults.textButtonColors(
contentColor = MaterialTheme.colors.primary,
contentColor = MaterialTheme.colorScheme.primary,
),
onClick = onClick,
) {

View File

@ -22,21 +22,21 @@ import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.Button
import androidx.compose.material.ButtonColors
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.LocalContentAlpha
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedButton
import androidx.compose.material.Text
import androidx.compose.material.TextButton
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonColors
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.takeOrElse
@ -114,7 +114,7 @@ fun FlorisTextButton(
icon: ImageVector? = null,
text: String,
enabled: Boolean = true,
shape: Shape = MaterialTheme.shapes.small,
shape: Shape = ButtonDefaults.shape,
contentPadding: PaddingValues = ButtonDefaults.TextButtonContentPadding,
colors: ButtonColors = ButtonDefaults.textButtonColors(),
) {
@ -153,10 +153,9 @@ fun FlorisIconButton(
enabled = enabled,
onClick = onClick,
) {
val contentAlpha = if (enabled) LocalContentAlpha.current else 0.14f
val contentColor = iconColor.takeOrElse { LocalContentColor.current }
val contentAlpha = if (enabled) 1f else 0.14f
val contentColor = iconColor.takeOrElse { LocalContentColor.current }.copy(alpha = contentAlpha)
CompositionLocalProvider(
LocalContentAlpha provides contentAlpha,
LocalContentColor provides contentColor,
) {
Icon(
@ -182,9 +181,8 @@ fun FlorisIconButtonWithInnerPadding(
enabled = enabled,
onClick = onClick,
) {
val contentAlpha = if (enabled) LocalContentAlpha.current else 0.14f
val contentAlpha = if (enabled) 1f else 0.14f
CompositionLocalProvider(
LocalContentAlpha provides contentAlpha,
LocalContentColor provides iconColor,
) {
Box(
@ -195,6 +193,7 @@ fun FlorisIconButtonWithInnerPadding(
contentAlignment = Alignment.Center,
) {
Icon(
modifier = modifier.alpha(contentAlpha),
imageVector = icon,
contentDescription = null,
)

View File

@ -29,39 +29,36 @@ import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Card
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Icon
import androidx.compose.material.LocalContentColor
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.contentColorFor
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ErrorOutline
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.outlined.Warning
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import dev.patrickgold.florisboard.R
import dev.patrickgold.florisboard.app.apptheme.outline
object CardDefaults {
object FlorisCardDefaults {
val IconRequiredSize = 24.dp
val IconSpacing = 8.dp
val IconSpacing = 12.dp
val ContentPadding = PaddingValues(vertical = 8.dp, horizontal = 16.dp)
val ContentPadding = PaddingValues(start = 0.dp, end = 16.dp, top = 8.dp, bottom = 8.dp)
}
object BoxDefaults {
@ -70,15 +67,14 @@ object BoxDefaults {
val ContentPadding = PaddingValues(all = 0.dp)
}
@OptIn(ExperimentalMaterialApi::class)
@Composable
fun FlorisSimpleCard(
modifier: Modifier = Modifier,
text: String,
secondaryText: String? = null,
backgroundColor: Color = MaterialTheme.colors.surface,
contentColor: Color = contentColorFor(backgroundColor),
contentPadding: PaddingValues = CardDefaults.ContentPadding,
backgroundColor: Color = MaterialTheme.colorScheme.surfaceContainer,
contentColor: Color = MaterialTheme.colorScheme.onSurface,
contentPadding: PaddingValues = FlorisCardDefaults.ContentPadding,
icon: (@Composable () -> Unit)? = null,
onClick: (() -> Unit)? = null,
) {
@ -86,8 +82,14 @@ fun FlorisSimpleCard(
onClick = onClick ?: { },
enabled = onClick != null,
modifier = modifier.fillMaxWidth(),
backgroundColor = backgroundColor,
colors = CardDefaults.cardColors(
contentColor = contentColor,
containerColor = backgroundColor,
disabledContainerColor = backgroundColor,
disabledContentColor = contentColor,
)
//backgroundColor = backgroundColor,
//contentColor = contentColor,
) {
Row(
modifier = Modifier.padding(contentPadding),
@ -99,18 +101,18 @@ fun FlorisSimpleCard(
Column(
modifier = Modifier
.weight(1f)
.padding(start = if (icon != null) 16.dp else 0.dp),
.padding(start = if (icon == null) 16.dp else 0.dp),
) {
Text(
modifier = Modifier.fillMaxWidth(),
text = text,
style = MaterialTheme.typography.subtitle1,
style = MaterialTheme.typography.titleMedium,
)
if (secondaryText != null) {
Text(
modifier = Modifier.fillMaxWidth(),
text = secondaryText,
style = MaterialTheme.typography.subtitle2,
style = MaterialTheme.typography.titleSmall,
)
}
}
@ -123,18 +125,18 @@ fun FlorisErrorCard(
text: String,
modifier: Modifier = Modifier,
showIcon: Boolean = true,
contentPadding: PaddingValues = CardDefaults.ContentPadding,
contentPadding: PaddingValues = FlorisCardDefaults.ContentPadding,
onClick: (() -> Unit)? = null,
) {
FlorisSimpleCard(
modifier = modifier,
backgroundColor = Color(0xFFCC0000),
backgroundColor = Color.Red,
contentColor = Color.White,
onClick = onClick,
icon = if (showIcon) ({ Icon(
modifier = Modifier
.padding(end = CardDefaults.IconSpacing)
.requiredSize(CardDefaults.IconRequiredSize),
.padding(all = FlorisCardDefaults.IconSpacing)
.requiredSize(FlorisCardDefaults.IconRequiredSize),
imageVector = Icons.Default.ErrorOutline,
contentDescription = null,
) }) else null,
@ -148,7 +150,7 @@ fun FlorisWarningCard(
text: String,
modifier: Modifier = Modifier,
showIcon: Boolean = true,
contentPadding: PaddingValues = CardDefaults.ContentPadding,
contentPadding: PaddingValues = FlorisCardDefaults.ContentPadding,
onClick: (() -> Unit)? = null,
) {
FlorisSimpleCard(
@ -158,8 +160,8 @@ fun FlorisWarningCard(
onClick = onClick,
icon = if (showIcon) ({ Icon(
modifier = Modifier
.padding(end = CardDefaults.IconSpacing)
.requiredSize(CardDefaults.IconRequiredSize),
.padding(all = FlorisCardDefaults.IconSpacing)
.requiredSize(FlorisCardDefaults.IconRequiredSize),
imageVector = Icons.Outlined.Warning,
contentDescription = null,
) }) else null,
@ -173,7 +175,7 @@ fun FlorisInfoCard(
text: String,
modifier: Modifier = Modifier,
showIcon: Boolean = true,
contentPadding: PaddingValues = CardDefaults.ContentPadding,
contentPadding: PaddingValues = FlorisCardDefaults.ContentPadding,
onClick: (() -> Unit)? = null,
) {
FlorisSimpleCard(
@ -181,8 +183,8 @@ fun FlorisInfoCard(
onClick = onClick,
icon = if (showIcon) ({ Icon(
modifier = Modifier
.padding(end = CardDefaults.IconSpacing)
.requiredSize(CardDefaults.IconRequiredSize),
.padding(all = FlorisCardDefaults.IconSpacing)
.requiredSize(FlorisCardDefaults.IconRequiredSize),
imageVector = Icons.Default.Info,
contentDescription = null,
) }) else null,
@ -199,7 +201,7 @@ fun FlorisOutlinedBox(
subtitle: String? = null,
onSubtitleClick: (() -> Unit)? = null,
borderWidth: Dp = 1.dp,
borderColor: Color = MaterialTheme.colors.outline,
borderColor: Color = MaterialTheme.colorScheme.outlineVariant,
shape: Shape = BoxDefaults.OutlinedBoxShape,
contentPadding: PaddingValues = BoxDefaults.ContentPadding,
content: @Composable ColumnScope.() -> Unit,
@ -209,7 +211,7 @@ fun FlorisOutlinedBox(
title = {
Text(
text = title,
style = MaterialTheme.typography.subtitle2,
style = MaterialTheme.typography.titleSmall,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
@ -249,7 +251,7 @@ fun FlorisOutlinedBox(
subtitle: (@Composable () -> Unit)? = null,
onSubtitleClick: (() -> Unit)? = null,
borderWidth: Dp = 1.dp,
borderColor: Color = MaterialTheme.colors.outline,
borderColor: Color = MaterialTheme.colorScheme.outlineVariant,
shape: Shape = BoxDefaults.OutlinedBoxShape,
contentPadding: PaddingValues = BoxDefaults.ContentPadding,
content: @Composable ColumnScope.() -> Unit,
@ -287,7 +289,7 @@ fun FlorisOutlinedBox(
modifier = Modifier
.height(23.dp)
.offset(x = 10.dp, y = (-12).dp)
.background(MaterialTheme.colors.background)
.background(MaterialTheme.colorScheme.background)
.rippleClickable(enabled = onTitleClick != null) {
onTitleClick!!()
}

View File

@ -16,44 +16,82 @@
package dev.patrickgold.florisboard.lib.compose
import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.InputChip
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterialApi::class)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun FlorisChip(
text: String,
modifier: Modifier = Modifier,
onClick: () -> Unit = { },
selected: Boolean = false,
enabled: Boolean = true,
color: Color = Color.Unspecified,
shape: Shape = CircleShape,
shape: Shape = MaterialTheme.shapes.small,
leadingIcons: List<ImageVector> = listOf(),
trailingIcons: List<ImageVector> = listOf(),
) {
val backgroundColor = color.takeOrElse {
MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.BackgroundOpacity)
MaterialTheme.colorScheme.onSurface.copy()
}
Surface(
InputChip(
selected = selected,
onClick = onClick,
enabled = enabled,
shape = shape,
label = {
Text(
text = text,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
},
modifier = modifier,
leadingIcon = {
Row {
for (leadingIcon in leadingIcons) {
Icon(
modifier = Modifier
.padding(end = 8.dp)
.size(16.dp),
imageVector = leadingIcon,
contentDescription = null,
)
}
}
},
trailingIcon = {
Row {
for (trailingIcon in trailingIcons) {
Icon(
modifier = Modifier
.padding(start = 8.dp)
.size(16.dp),
imageVector = trailingIcon,
contentDescription = null,
)
}
}
}
)
/*Surface(
modifier = modifier,
onClick = onClick,
enabled = enabled,
@ -67,7 +105,9 @@ fun FlorisChip(
) {
for (leadingIcon in leadingIcons) {
Icon(
modifier = Modifier.padding(end = 8.dp).size(16.dp),
modifier = Modifier
.padding(end = 8.dp)
.size(16.dp),
imageVector = leadingIcon,
contentDescription = null,
)
@ -79,11 +119,13 @@ fun FlorisChip(
)
for (trailingIcon in trailingIcons) {
Icon(
modifier = Modifier.padding(start = 8.dp).size(16.dp),
modifier = Modifier
.padding(start = 8.dp)
.size(16.dp),
imageVector = trailingIcon,
contentDescription = null,
)
}
}
}
}*/
}

View File

@ -16,7 +16,7 @@
package dev.patrickgold.florisboard.lib.compose
import androidx.compose.material.Text
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import dev.patrickgold.florisboard.R

View File

@ -21,17 +21,17 @@ import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.ContentAlpha
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.Icon
import androidx.compose.material.MaterialTheme
import androidx.compose.material.OutlinedButton
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight
import androidx.compose.material.icons.filled.KeyboardArrowDown
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.ShapeDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
@ -40,7 +40,6 @@ import androidx.compose.ui.draw.rotate
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import dev.patrickgold.florisboard.app.apptheme.outline
@Composable
fun <T : Any> FlorisDropdownMenu(
@ -64,19 +63,20 @@ fun <T : Any> FlorisDropdownMenu(
val indicatorRotation by animateFloatAsState(targetValue = if (expanded) 180f else 0f)
val index = selectedIndex.coerceIn(items.indices)
val color = if (!enabled) {
MaterialTheme.colors.outline
MaterialTheme.colorScheme.outline
} else if (isError) {
MaterialTheme.colors.error
MaterialTheme.colorScheme.error
} else {
MaterialTheme.colors.onBackground
MaterialTheme.colorScheme.onBackground
}
OutlinedButton(
modifier = Modifier.fillMaxWidth(),
border = if (isError && enabled) {
BorderStroke(ButtonDefaults.OutlinedBorderSize, MaterialTheme.colors.error)
BorderStroke(ButtonDefaults.outlinedButtonBorder.width, MaterialTheme.colorScheme.error)
} else {
ButtonDefaults.outlinedBorder
ButtonDefaults.outlinedButtonBorder
},
shape = ShapeDefaults.ExtraSmall,
enabled = enabled,
onClick = onExpandRequest,
) {
@ -93,7 +93,7 @@ fun <T : Any> FlorisDropdownMenu(
modifier = Modifier.rotate(indicatorRotation),
imageVector = Icons.Filled.KeyboardArrowDown,
tint = if (enabled) {
color.copy(alpha = ContentAlpha.medium)
color.copy(alpha = 0.74f) //Also test 0.60f
} else {
color
},
@ -106,13 +106,14 @@ fun <T : Any> FlorisDropdownMenu(
) {
for ((n, item) in items.withIndex()) {
DropdownMenuItem(
text = {
Text(text = asString(item))
},
onClick = {
onSelectItem(n)
onDismissRequest()
},
) {
Text(text = asString(item))
}
)
}
}
}
@ -127,18 +128,19 @@ fun FlorisDropdownLikeButton(
) {
Box(modifier = modifier.wrapContentSize(Alignment.TopStart)) {
val color = if (isError) {
MaterialTheme.colors.error
MaterialTheme.colorScheme.error
} else {
MaterialTheme.colors.onBackground
MaterialTheme.colorScheme.onBackground
}
OutlinedButton(
modifier = Modifier
.fillMaxWidth(),
border = if (isError) {
BorderStroke(ButtonDefaults.OutlinedBorderSize, MaterialTheme.colors.error)
BorderStroke(ButtonDefaults.outlinedButtonBorder.width, MaterialTheme.colorScheme.error)
} else {
ButtonDefaults.outlinedBorder
ButtonDefaults.outlinedButtonBorder
},
shape = ShapeDefaults.ExtraSmall,
onClick = onClick,
) {
Text(
@ -152,7 +154,7 @@ fun FlorisDropdownLikeButton(
)
Icon(
imageVector = Icons.AutoMirrored.Filled.KeyboardArrowRight,
tint = color.copy(alpha = ContentAlpha.medium),
tint = color.copy(alpha = 0.74f), //Also test 0.60f
contentDescription = "Dropdown indicator",
)
}

View File

@ -17,8 +17,8 @@
package dev.patrickgold.florisboard.lib.compose
import androidx.compose.foundation.clickable
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -32,7 +32,7 @@ fun FlorisHyperlinkText(
url: String,
modifier: Modifier = Modifier,
enabled: Boolean = true,
color: Color = MaterialTheme.colors.primary,
color: Color = MaterialTheme.colorScheme.primary,
) {
val context = LocalContext.current

View File

@ -16,12 +16,15 @@
package dev.patrickgold.florisboard.lib.compose
import android.app.Activity
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Scaffold
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.getValue
@ -29,8 +32,10 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import dev.patrickgold.florisboard.R
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import dev.patrickgold.florisboard.app.AppPrefs
import dev.patrickgold.florisboard.app.LocalNavController
import dev.patrickgold.florisboard.app.florisPreferenceModel
@ -112,29 +117,38 @@ private class FlorisScreenScopeImpl : FlorisScreenScope {
this.navigationIcon = navigationIcon
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun Render() {
val context = LocalContext.current
val previewFieldController = LocalPreviewFieldController.current
SideEffect {
val window = (context as Activity).window
previewFieldController?.isVisible = previewFieldVisible
window.statusBarColor = Color.Transparent.toArgb()
window.navigationBarColor = Color.Transparent.toArgb()
}
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
Scaffold(
topBar = { FlorisAppBar(title, navigationIcon.takeIf { navigationIconVisible }, actions) },
modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = { FlorisAppBar(title, navigationIcon.takeIf { navigationIconVisible }, actions, scrollBehavior) },
bottomBar = bottomBar,
floatingActionButton = fab,
) { innerPadding ->
val modifier = if (scrollable) {
val scrollModifier = if (scrollable) {
Modifier.florisVerticalScroll()
} else {
Modifier
}
PreferenceLayout(
florisPreferenceModel(),
modifier = modifier
modifier = Modifier
.padding(innerPadding)
.fillMaxWidth(),
.fillMaxWidth()
.then(scrollModifier),
iconSpaceReserved = iconSpaceReserved,
content = content,
)

View File

@ -35,19 +35,17 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Button
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.ContentAlpha
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text
import androidx.compose.material.contentColorFor
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.contentColorFor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.Saver
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@ -61,7 +59,6 @@ import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.app.apptheme.outline
private val StepHeaderPaddingVertical = 8.dp
private val StepHeaderNumberBoxSize = 40.dp
@ -105,7 +102,7 @@ class FlorisStepLayoutScope(
.align(Alignment.CenterHorizontally)
.padding(top = 16.dp),
colors = ButtonDefaults.buttonColors(
backgroundColor = primaryColor,
containerColor = primaryColor,
),
onClick = onClick,
) {
@ -162,7 +159,7 @@ fun FlorisStepLayout(
stepState: FlorisStepState,
steps: List<FlorisStep>,
modifier: Modifier = Modifier,
primaryColor: Color = MaterialTheme.colors.primary,
primaryColor: Color = MaterialTheme.colorScheme.primary,
header: @Composable FlorisStepLayoutScope.() -> Unit = { },
footer: @Composable FlorisStepLayoutScope.() -> Unit = { },
) {
@ -200,14 +197,14 @@ private fun ColumnScope.Step(
val autoStepId by stepState.getCurrentAuto()
val backgroundColor = when (ownStepId) {
currentStepId -> primaryColor
else -> MaterialTheme.colors.outline
else -> primaryColor.copy(alpha = 0.38f)
}
val contentVisible = ownStepId == currentStepId
StepHeader(
modifier = when {
ownStepId <= autoStepId -> Modifier
.clickable(enabled = !contentVisible) { stepState.setCurrentManual(ownStepId) }
else -> Modifier.alpha(ContentAlpha.disabled)
else -> Modifier.alpha(0.38f)
},
backgroundColor = backgroundColor,
step = ownStepId,
@ -226,7 +223,7 @@ private fun ColumnScope.Step(
enter = fadeIn(animationSpec = animSpec),
exit = fadeOut(animationSpec = animSpec),
) {
val onBackground = MaterialTheme.colors.onSurface
val onBackground = MaterialTheme.colorScheme.onSurface
Box(
modifier = Modifier
.padding(start = 56.dp)

View File

@ -26,13 +26,13 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.ButtonDefaults
import androidx.compose.material.MaterialTheme
import androidx.compose.material.ProvideTextStyle
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.material.TextFieldColors
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.ProvideTextStyle
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextFieldColors
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
@ -51,7 +51,6 @@ import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import dev.patrickgold.florisboard.app.apptheme.outline
import dev.patrickgold.florisboard.lib.ValidationResult
@Composable
@ -74,7 +73,7 @@ fun FlorisOutlinedTextField(
visualTransformation: VisualTransformation = VisualTransformation.None,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
shape: Shape = MaterialTheme.shapes.small,
colors: TextFieldColors = TextFieldDefaults.outlinedTextFieldColors(),
colors: TextFieldColors = OutlinedTextFieldDefaults.colors(),
) {
var textFieldValueState by remember { mutableStateOf(TextFieldValue(text = value)) }
val textFieldValue = textFieldValueState.copy(text = value)
@ -127,13 +126,17 @@ fun FlorisOutlinedTextField(
visualTransformation: VisualTransformation = VisualTransformation.None,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
shape: Shape = MaterialTheme.shapes.small,
colors: TextFieldColors = TextFieldDefaults.outlinedTextFieldColors(
unfocusedBorderColor = MaterialTheme.colors.outline,
disabledBorderColor = MaterialTheme.colors.outline,
colors: TextFieldColors = OutlinedTextFieldDefaults.colors(
unfocusedBorderColor = MaterialTheme.colorScheme.outline,
disabledBorderColor = MaterialTheme.colorScheme.outline,
),
) {
val textColor = textStyle.color.takeOrElse {
colors.textColor(enabled).value
if (!enabled) {
colors.disabledTextColor
} else {
colors.unfocusedTextColor
}
}
val mergedTextStyle = textStyle.copy(color = textColor, textDirection = TextDirection.Content)
val isFocused by interactionSource.collectIsFocusedAsState()
@ -152,17 +155,33 @@ fun FlorisOutlinedTextField(
singleLine = singleLine,
maxLines = maxLines,
visualTransformation = visualTransformation,
cursorBrush = SolidColor(colors.cursorColor(isErrorState).value),
cursorBrush = SolidColor(
if (isErrorState) {
colors.errorCursorColor
} else {
colors.cursorColor
}
),
decorationBox = { innerTextField ->
Surface(
modifier = modifier.fillMaxWidth(),
color = colors.backgroundColor(enabled).value,
border = if (isErrorState && enabled) {
BorderStroke(ButtonDefaults.OutlinedBorderSize, MaterialTheme.colors.error)
color = if (enabled) {
if (isErrorState) {
colors.errorContainerColor
} else if (isFocused) {
BorderStroke(ButtonDefaults.OutlinedBorderSize, MaterialTheme.colors.primary)
colors.focusedContainerColor
} else {
ButtonDefaults.outlinedBorder
colors.unfocusedContainerColor
}
} else {
colors.disabledContainerColor
},
border = if (isErrorState && enabled) {
BorderStroke(ButtonDefaults.outlinedButtonBorder.width, MaterialTheme.colorScheme.error)
} else if (isFocused) {
BorderStroke(ButtonDefaults.outlinedButtonBorder.width, MaterialTheme.colorScheme.primary)
} else {
ButtonDefaults.outlinedButtonBorder
},
shape = shape,
) {
@ -181,8 +200,8 @@ fun FlorisOutlinedTextField(
if (!placeholder.isNullOrBlank()) {
Text(
text = placeholder,
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.56f),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.56f),
)
}
}
@ -194,16 +213,16 @@ fun FlorisOutlinedTextField(
if (showValidationHint && validationResult?.isValid() == true && validationResult.hasHintMessage()) {
Text(
text = validationResult.hintMessage(),
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.onSurface.copy(alpha = 0.56f),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.56f),
)
}
if (showValidationError && validationResult?.isInvalid() == true && validationResult.hasErrorMessage()) {
Text(
text = validationResult.errorMessage(),
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.error,
)
}
}

View File

@ -25,14 +25,15 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.selection.SelectionContainer
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.LocalTextStyle
import androidx.compose.material.Text
import androidx.compose.material.TextField
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Keyboard
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.TextFieldDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@ -50,7 +51,6 @@ import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onPreviewKeyEvent
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.text.style.TextOverflow
@ -77,7 +77,7 @@ class PreviewFieldController {
var text by mutableStateOf(TextFieldValue(""))
}
@OptIn(ExperimentalComposeUiApi::class)
@OptIn(ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class)
@Composable
fun PreviewKeyboardField(
controller: PreviewFieldController,
@ -134,7 +134,7 @@ fun PreviewKeyboardField(
keyboardOptions = KeyboardOptions(autoCorrect = true),
singleLine = true,
shape = RectangleShape,
colors = TextFieldDefaults.textFieldColors(
colors = TextFieldDefaults.colors(
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent,
disabledIndicatorColor = Color.Transparent,

View File

@ -28,8 +28,9 @@ import androidx.compose.foundation.lazy.grid.LazyGridItemInfo
import androidx.compose.foundation.lazy.grid.LazyGridState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.MaterialTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@ -44,7 +45,6 @@ import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.delay
import java.lang.Math.min
private val DefaultScrollbarSize = 4.dp
// IgnoreInVeryFastOut (basically)
@ -88,7 +88,7 @@ fun Modifier.florisScrollbar(
targetValue = targetAlpha,
animationSpec = tween(durationMillis = duration, easing = ScrollbarAnimationEasing),
)
val scrollbarColor = MaterialTheme.colors.onSurface.copy(alpha = 0.28f)
val scrollbarColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.28f)
LaunchedEffect(Unit) {
delay(1850)
@ -144,14 +144,14 @@ fun Modifier.florisScrollbar(
targetValue = targetAlpha,
animationSpec = tween(durationMillis = duration, easing = ScrollbarAnimationEasing),
)
val scrollbarColor = color.takeOrElse { MaterialTheme.colors.onSurface.copy(alpha = 0.28f) }
val scrollbarColor = color.takeOrElse { MaterialTheme.colorScheme.onSurface.copy(alpha = 0.28f) }
LaunchedEffect(Unit) {
delay(1850)
isInitial = false
}
val visibleItemsInfo = state.layoutInfo.visibleItemsInfo
val visibleItemsInfo = remember { derivedStateOf { state.layoutInfo } }.value.visibleItemsInfo
val visibleItems = if (visibleItemsInfo.isNotEmpty()) remember { visibleItemsInfo.size } else 0
drawWithContent {
drawContent()
@ -199,15 +199,15 @@ fun Modifier.florisScrollbar(
targetValue = targetAlpha,
animationSpec = tween(durationMillis = duration, easing = ScrollbarAnimationEasing),
)
val scrollbarColor = color.takeOrElse { MaterialTheme.colors.onSurface.copy(alpha = 0.28f) }
val scrollbarColor = color.takeOrElse { MaterialTheme.colorScheme.onSurface.copy(alpha = 0.28f) }
LaunchedEffect(Unit) {
delay(1850)
isInitial = false
}
val orientation = state.layoutInfo.orientation
val visibleItemsInfo = state.layoutInfo.visibleItemsInfo
val orientation = remember { derivedStateOf { state.layoutInfo } }.value.orientation
val visibleItemsInfo = remember { derivedStateOf { state.layoutInfo } }.value.visibleItemsInfo
val visibleItems = if (visibleItemsInfo.isNotEmpty()) remember { visibleItemsInfo.size } else 0
val last = visibleItemsInfo.lastOrNull()
val stacks = if (last != null && orientation == Orientation.Vertical) {
@ -233,13 +233,13 @@ fun Modifier.florisScrollbar(
scrollbarWidth = size.toPx()
scrollbarOffsetX = this.size.width - scrollbarWidth
scrollbarOffsetY = (firstVisibleElementIndex - stacks*percentOffset(first, orientation)) * elementHeight
scrollbarHeight = min(visibleItems * elementHeight, this.size.height - scrollbarOffsetY)
scrollbarHeight = (visibleItems * elementHeight).coerceAtMost(this.size.height - scrollbarOffsetY)
} else {
val elementWidth = this.size.width / state.layoutInfo.totalItemsCount
scrollbarHeight = size.toPx()
scrollbarOffsetX = (firstVisibleElementIndex - stacks*percentOffset(first, orientation)) * elementWidth
scrollbarOffsetY = this.size.height - scrollbarHeight
scrollbarWidth = min(visibleItems * elementWidth, this.size.height - scrollbarOffsetX)
scrollbarWidth = (visibleItems * elementWidth).coerceAtMost(this.size.height - scrollbarOffsetX)
}
drawRect(

View File

@ -22,7 +22,6 @@ import android.content.ContextWrapper
import android.inputmethodservice.InputMethodService
import android.view.View
import android.view.Window
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.remember
@ -39,25 +38,6 @@ import dev.patrickgold.florisboard.ime.theme.FlorisImeUi
import dev.patrickgold.florisboard.lib.android.AndroidVersion
import dev.patrickgold.florisboard.lib.snygg.ui.solidColor
@Composable
fun SystemUiApp() {
val systemUiController = rememberFlorisSystemUiController()
val useDarkIcons = MaterialTheme.colors.isLight
SideEffect {
systemUiController.setStatusBarColor(
color = Color.Transparent,
darkIcons = useDarkIcons,
)
if (AndroidVersion.ATLEAST_API26_O) {
systemUiController.setNavigationBarColor(
color = Color.Transparent,
darkIcons = useDarkIcons,
navigationBarContrastEnforced = false,
)
}
}
}
@Composable
fun SystemUiIme() {

View File

@ -434,6 +434,7 @@
<string name="pref__advanced__settings_theme__light" comment="Possible value of Settings theme preference in Advanced">Light</string>
<string name="pref__advanced__settings_theme__dark" comment="Possible value of Settings theme preference in Advanced">Dark</string>
<string name="pref__advanced__settings_theme__amoled_dark" comment="Possible value of Settings theme preference in Advanced">AMOLED Dark</string>
<string name="pref__advanced__settings_material_you__label" comment="Label of Material You preference in Advanced">Use Material You</string>
<string name="pref__advanced__settings_language__label" comment="Label of Settings language preference in Advanced">Settings language</string>
<string name="pref__advanced__show_app_icon__label" comment="Label of Show app icon preference in Advanced">Show app icon in launcher</string>
<string name="pref__advanced__show_app_icon__summary_atleast_q" comment="Summary of Show app icon preference in Advanced for Android 10+">Always enabled on Android 10+ due to restrictions of the system</string>

View File

@ -24,7 +24,7 @@ ksp = "1.9.22-1.0.17"
mannodermaus-android-junit5 = "1.10.0.0"
mikepenz-aboutlibraries = "10.10.0"
patrickgold-compose-tooltip = "0.1.0"
patrickgold-jetpref = "0.1.0-rc02"
patrickgold-jetpref = "0.2.0-beta01"
xmlutil = "0.86.3"
# Testing
@ -62,7 +62,7 @@ cache4k = { module = "io.github.reactivecircus.cache4k:cache4k", version.ref = "
kotlinx-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" }
mikepenz-aboutlibraries-core = { module = "com.mikepenz:aboutlibraries-core", version.ref = "mikepenz-aboutlibraries" }
mikepenz-aboutlibraries-compose = { module = "com.mikepenz:aboutlibraries-compose", version.ref = "mikepenz-aboutlibraries" }
mikepenz-aboutlibraries-compose = { module = "com.mikepenz:aboutlibraries-compose-m3", version.ref = "mikepenz-aboutlibraries" }
patrickgold-compose-tooltip = { module = "dev.patrickgold.compose.tooltip:tooltip", version.ref = "patrickgold-compose-tooltip" }
patrickgold-jetpref-datastore-model = { module = "dev.patrickgold.jetpref:jetpref-datastore-model", version.ref = "patrickgold-jetpref" }
patrickgold-jetpref-datastore-ui = { module = "dev.patrickgold.jetpref:jetpref-datastore-ui", version.ref = "patrickgold-jetpref" }