0
0
mirror of https://github.com/thunderbird/thunderbird-android.git synced 2024-09-20 04:02:14 +02:00

Merge pull request #7836 from thunderbird/change-catalog-app

Change catalog app
This commit is contained in:
Wolf-Martell Montwé 2024-05-13 14:00:20 +00:00 committed by GitHub
commit 6fd02f794a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 392 additions and 243 deletions

View File

@ -10,10 +10,23 @@ android {
versionCode = 1
versionName = "1.0"
}
buildTypes {
// Preview build type to render compose without debug features.
// This gives a better idea of the real world drawing performance.
create("preview") {
initWith(getByName("debug"))
applicationIdSuffix = ".preview"
isDebuggable = false
matchingFallbacks += listOf("release")
isDefault = true
}
}
}
dependencies {
implementation(projects.core.ui.compose.designsystem)
implementation(projects.core.ui.legacy.designsystem)
implementation(projects.core.ui.compose.theme2.thunderbird)
implementation(projects.core.ui.compose.theme2.k9mail)

View File

@ -1,11 +1,8 @@
package app.k9mail.ui.catalog.ui.atom.items
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonElevated
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonFilled
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonFilledTonal
@ -13,72 +10,111 @@ import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonIcon
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonOutlined
import app.k9mail.core.ui.compose.designsystem.atom.button.ButtonText
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.ui.catalog.ui.common.list.itemDefaultPadding
import app.k9mail.ui.catalog.ui.common.list.defaultItem
import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
@Suppress("LongMethod")
@OptIn(ExperimentalLayoutApi::class)
fun LazyGridScope.buttonItems() {
sectionHeaderItem(text = "Button - Filled")
item {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
modifier = Modifier.itemDefaultPadding(),
) {
ButtonFilled(text = "Enabled", onClick = { })
ButtonFilled(text = "Disabled", onClick = { }, enabled = false)
}
defaultItem {
ButtonFilled(
text = "Enabled",
onClick = { },
modifier = Modifier.padding(defaultItemPadding()),
)
}
defaultItem {
ButtonFilled(
text = "Disabled",
onClick = { },
enabled = false,
modifier = Modifier.padding(defaultItemPadding()),
)
}
sectionHeaderItem(text = "Button - Filled Tonal")
item {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
modifier = Modifier.itemDefaultPadding(),
) {
ButtonFilledTonal(text = "Enabled", onClick = { })
ButtonFilledTonal(text = "Disabled", onClick = { }, enabled = false)
}
defaultItem {
ButtonFilledTonal(
text = "Enabled",
onClick = { },
modifier = Modifier.padding(defaultItemPadding()),
)
}
defaultItem {
ButtonFilledTonal(
text = "Disabled",
onClick = { },
enabled = false,
modifier = Modifier.padding(defaultItemPadding()),
)
}
sectionHeaderItem(text = "Button - Elevated")
item {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
modifier = Modifier.itemDefaultPadding(),
) {
ButtonElevated(text = "Enabled", onClick = { })
ButtonElevated(text = "Disabled", onClick = { }, enabled = false)
}
defaultItem {
ButtonElevated(
text = "Enabled",
onClick = { },
modifier = Modifier.padding(defaultItemPadding()),
)
}
defaultItem {
ButtonElevated(
text = "Disabled",
onClick = { },
enabled = false,
modifier = Modifier.padding(defaultItemPadding()),
)
}
sectionHeaderItem(text = "Button - Outlined")
item {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
modifier = Modifier.itemDefaultPadding(),
) {
ButtonOutlined(text = "Enabled", onClick = { })
ButtonOutlined(text = "Disabled", onClick = { }, enabled = false)
}
defaultItem {
ButtonOutlined(
text = "Enabled",
onClick = { },
modifier = Modifier.padding(defaultItemPadding()),
)
}
defaultItem {
ButtonOutlined(
text = "Disabled",
onClick = { },
enabled = false,
modifier = Modifier.padding(defaultItemPadding()),
)
}
sectionHeaderItem(text = "Button - Text")
item {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
modifier = Modifier.itemDefaultPadding(),
) {
ButtonText(text = "Enabled", onClick = { })
ButtonText(text = "Colored", onClick = { }, color = Color.Magenta)
ButtonText(text = "Disabled", onClick = { }, enabled = false)
}
defaultItem {
ButtonText(
text = "Enabled",
onClick = { },
modifier = Modifier.padding(defaultItemPadding()),
)
}
defaultItem {
ButtonText(
text = "Disabled",
onClick = { },
enabled = false,
modifier = Modifier.padding(defaultItemPadding()),
)
}
sectionHeaderItem(text = "Button - Icon")
item {
FlowRow(
horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
modifier = Modifier.itemDefaultPadding(),
) {
ButtonIcon(onClick = { }, imageVector = Icons.Outlined.Info)
ButtonIcon(onClick = { }, imageVector = Icons.Outlined.Info, enabled = false)
}
defaultItem {
ButtonIcon(
imageVector = Icons.Outlined.AccountCircle,
onClick = { },
modifier = Modifier.padding(defaultItemPadding()),
)
}
defaultItem {
ButtonIcon(
imageVector = Icons.Outlined.AccountCircle,
onClick = { },
enabled = false,
modifier = Modifier.padding(defaultItemPadding()),
)
}
}

View File

@ -4,32 +4,33 @@ import androidx.compose.foundation.lazy.grid.LazyGridScope
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.ui.catalog.ui.atom.view.ColorContent
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
import app.k9mail.ui.catalog.ui.common.list.wideItem
@Suppress("LongMethod")
fun LazyGridScope.colorItems() {
sectionHeaderItem(text = "Material 3 theme colors")
item {
wideItem {
ColorContent(
text = "Primary",
color = MainTheme.colors.primary,
textColor = MainTheme.colors.onPrimary,
)
}
item {
wideItem {
ColorContent(
text = "On Primary",
color = MainTheme.colors.onPrimary,
textColor = MainTheme.colors.primary,
)
}
item {
wideItem {
ColorContent(
text = "Primary Container",
color = MainTheme.colors.primaryContainer,
textColor = MainTheme.colors.onPrimaryContainer,
)
}
item {
wideItem {
ColorContent(
text = "On Primary Container",
color = MainTheme.colors.onPrimaryContainer,
@ -37,28 +38,28 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Secondary",
color = MainTheme.colors.secondary,
textColor = MainTheme.colors.onSecondary,
)
}
item {
wideItem {
ColorContent(
text = "On Secondary",
color = MainTheme.colors.onSecondary,
textColor = MainTheme.colors.secondary,
)
}
item {
wideItem {
ColorContent(
text = "Secondary Container",
color = MainTheme.colors.secondaryContainer,
textColor = MainTheme.colors.onSecondaryContainer,
)
}
item {
wideItem {
ColorContent(
text = "On Secondary Container",
color = MainTheme.colors.onSecondaryContainer,
@ -66,28 +67,28 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Tertiary",
color = MainTheme.colors.tertiary,
textColor = MainTheme.colors.onTertiary,
)
}
item {
wideItem {
ColorContent(
text = "On Tertiary",
color = MainTheme.colors.onTertiary,
textColor = MainTheme.colors.tertiary,
)
}
item {
wideItem {
ColorContent(
text = "Tertiary Container",
color = MainTheme.colors.tertiaryContainer,
textColor = MainTheme.colors.onTertiaryContainer,
)
}
item {
wideItem {
ColorContent(
text = "On Tertiary Container",
color = MainTheme.colors.onTertiaryContainer,
@ -95,28 +96,28 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Error",
color = MainTheme.colors.error,
textColor = MainTheme.colors.onError,
)
}
item {
wideItem {
ColorContent(
text = "On Error",
color = MainTheme.colors.onError,
textColor = MainTheme.colors.error,
)
}
item {
wideItem {
ColorContent(
text = "Error Container",
color = MainTheme.colors.errorContainer,
textColor = MainTheme.colors.onErrorContainer,
)
}
item {
wideItem {
ColorContent(
text = "On Error Container",
color = MainTheme.colors.onErrorContainer,
@ -124,56 +125,56 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Surface",
color = MainTheme.colors.surface,
textColor = MainTheme.colors.onSurface,
)
}
item {
wideItem {
ColorContent(
text = "On Surface",
color = MainTheme.colors.onSurface,
textColor = MainTheme.colors.surface,
)
}
item {
wideItem {
ColorContent(
text = "On Surface Variant",
color = MainTheme.colors.onSurfaceVariant,
textColor = MainTheme.colors.surface,
)
}
item {
wideItem {
ColorContent(
text = "Surface Container Lowest",
color = MainTheme.colors.surfaceContainerLowest,
textColor = MainTheme.colors.onSurface,
)
}
item {
wideItem {
ColorContent(
text = "Surface Container Low",
color = MainTheme.colors.surfaceContainerLow,
textColor = MainTheme.colors.onSurface,
)
}
item {
wideItem {
ColorContent(
text = "Surface Container",
color = MainTheme.colors.surfaceContainer,
textColor = MainTheme.colors.onSurface,
)
}
item {
wideItem {
ColorContent(
text = "Surface Container High",
color = MainTheme.colors.surfaceContainerHigh,
textColor = MainTheme.colors.onSurface,
)
}
item {
wideItem {
ColorContent(
text = "Surface Container Highest",
color = MainTheme.colors.surfaceContainerHighest,
@ -181,21 +182,21 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Inverse Surface",
color = MainTheme.colors.inverseSurface,
textColor = MainTheme.colors.inverseOnSurface,
)
}
item {
wideItem {
ColorContent(
text = "Inverse On Surface",
color = MainTheme.colors.inverseOnSurface,
textColor = MainTheme.colors.inverseSurface,
)
}
item {
wideItem {
ColorContent(
text = "Inverse Primary",
color = MainTheme.colors.inversePrimary,
@ -203,7 +204,7 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Outline",
color = MainTheme.colors.outline,
@ -211,7 +212,7 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Outline Variant",
color = MainTheme.colors.outlineVariant,
@ -219,14 +220,14 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Surface Bright",
color = MainTheme.colors.surfaceBright,
textColor = MainTheme.colors.onSurface,
)
}
item {
wideItem {
ColorContent(
text = "Surface Dim",
color = MainTheme.colors.surfaceDim,
@ -236,28 +237,28 @@ fun LazyGridScope.colorItems() {
sectionHeaderItem(text = "Material 3 theme custom colors")
item {
wideItem {
ColorContent(
text = "Info",
color = MainTheme.colors.info,
textColor = MainTheme.colors.onInfo,
)
}
item {
wideItem {
ColorContent(
text = "On Info",
color = MainTheme.colors.onInfo,
textColor = MainTheme.colors.info,
)
}
item {
wideItem {
ColorContent(
text = "Info Container",
color = MainTheme.colors.infoContainer,
textColor = MainTheme.colors.onInfoContainer,
)
}
item {
wideItem {
ColorContent(
text = "On Info Container",
color = MainTheme.colors.onInfoContainer,
@ -265,28 +266,28 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Success",
color = MainTheme.colors.success,
textColor = MainTheme.colors.onSuccess,
)
}
item {
wideItem {
ColorContent(
text = "On Success",
color = MainTheme.colors.onSuccess,
textColor = MainTheme.colors.success,
)
}
item {
wideItem {
ColorContent(
text = "Success Container",
color = MainTheme.colors.successContainer,
textColor = MainTheme.colors.onSuccessContainer,
)
}
item {
wideItem {
ColorContent(
text = "On Success Container",
color = MainTheme.colors.onSuccessContainer,
@ -294,28 +295,28 @@ fun LazyGridScope.colorItems() {
)
}
item {
wideItem {
ColorContent(
text = "Warning",
color = MainTheme.colors.warning,
textColor = MainTheme.colors.onWarning,
)
}
item {
wideItem {
ColorContent(
text = "On Warning",
color = MainTheme.colors.onWarning,
textColor = MainTheme.colors.warning,
)
}
item {
wideItem {
ColorContent(
text = "Warning Container",
color = MainTheme.colors.warningContainer,
textColor = MainTheme.colors.onWarningContainer,
)
}
item {
wideItem {
ColorContent(
text = "On Warning Container",
color = MainTheme.colors.onWarningContainer,

View File

@ -2,25 +2,39 @@ package app.k9mail.ui.catalog.ui.atom.items
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.LazyGridScope
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.vector.ImageVector
import androidx.compose.ui.res.painterResource
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icon
import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.ui.catalog.ui.common.list.itemDefaultPadding
import app.k9mail.ui.catalog.ui.common.list.defaultItem
import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem
import androidx.compose.material3.Icon as Material3Icon
import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons as LegacyIcons
fun LazyGridScope.iconItems() {
sectionHeaderItem(text = "Filled")
sectionHeaderItem(
text = "Compose Icons",
)
sectionSubtitleItem(text = "Filled")
getIconsFor(Icons.Filled)
sectionHeaderItem(text = "Outlined")
sectionSubtitleItem(text = "Outlined")
getIconsFor(Icons.Outlined)
sectionHeaderItem(
text = "Legacy Icons",
)
sectionSubtitleItem(text = "Filled")
getLegacyIconsFor(LegacyIcons.Filled)
sectionSubtitleItem(text = "Outlined")
getLegacyIconsFor(LegacyIcons.Outlined)
}
private inline fun <reified T> LazyGridScope.getIconsFor(icons: T) {
@ -28,7 +42,7 @@ private inline fun <reified T> LazyGridScope.getIconsFor(icons: T) {
if (exclusions.contains(method.name)) {
continue
} else if (method.name.startsWith("get")) {
item {
defaultItem {
method.isAccessible = true
val imageVector = method.invoke(icons) as ImageVector
IconItem(
@ -40,6 +54,23 @@ private inline fun <reified T> LazyGridScope.getIconsFor(icons: T) {
}
}
private inline fun <reified T> LazyGridScope.getLegacyIconsFor(icons: T) {
for (method in T::class.java.methods) {
if (exclusions.contains(method.name)) {
continue
} else if (method.name.startsWith("get")) {
defaultItem {
method.isAccessible = true
val drawableResId = method.invoke(icons) as Int
LegacyIconItem(
name = method.name.replaceFirst("get", ""),
drawableResId = drawableResId,
)
}
}
}
}
private val exclusions = listOf("getClass")
@Composable
@ -50,20 +81,35 @@ private fun IconItem(
) {
Column(
modifier = Modifier
.itemDefaultPadding()
.padding(defaultItemPadding())
.then(modifier),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
) {
Row {
Icon(
imageVector = imageVector,
)
Icon(
imageVector = imageVector,
tint = Color.Magenta,
)
}
Icon(
imageVector = imageVector,
)
TextBodySmall(text = name)
}
}
@Composable
private fun LegacyIconItem(
name: String,
drawableResId: Int,
modifier: Modifier = Modifier,
) {
Column(
modifier = Modifier
.padding(defaultItemPadding())
.then(modifier),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
) {
Material3Icon(
painter = painterResource(id = drawableResId),
contentDescription = null,
)
TextBodySmall(text = name)
}
}

View File

@ -5,6 +5,7 @@ import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.runtime.Composable
@ -16,17 +17,19 @@ import androidx.compose.ui.unit.dp
import app.k9mail.core.ui.compose.designsystem.atom.image.FixedScaleImage
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.ui.catalog.ui.common.list.itemDefaultPadding
import app.k9mail.ui.catalog.ui.common.list.defaultItem
import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding
import app.k9mail.ui.catalog.ui.common.list.fullSpanItem
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem
fun LazyGridScope.imageItems() {
sectionHeaderItem(text = "Images")
item {
defaultItem {
Image(
painter = painterResource(id = MainTheme.images.logo),
contentDescription = "logo",
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
)
}
@ -38,21 +41,21 @@ fun LazyGridScope.imageItems() {
private fun LazyGridScope.fixedScaleImagesCropped() {
sectionSubtitleItem(text = "Images are cropped by parent container size")
item {
fullSpanItem {
FixedScaleImageView(
description = "Small container",
width = 40.dp,
height = 40.dp,
)
}
item {
fullSpanItem {
FixedScaleImageView(
description = "Small horizontal container",
width = 40.dp,
height = 200.dp,
)
}
item {
fullSpanItem {
FixedScaleImageView(
description = "Small vertical container",
width = 200.dp,
@ -63,7 +66,7 @@ private fun LazyGridScope.fixedScaleImagesCropped() {
private fun LazyGridScope.fixedScaleImagesOverflow() {
sectionSubtitleItem(text = "Images overflow parent container size")
item {
fullSpanItem {
FixedScaleImageView(
description = "Small container",
width = 40.dp,
@ -71,7 +74,7 @@ private fun LazyGridScope.fixedScaleImagesOverflow() {
allowOverflow = true,
)
}
item {
fullSpanItem {
FixedScaleImageView(
description = "Small horizontal container",
width = 40.dp,
@ -79,7 +82,7 @@ private fun LazyGridScope.fixedScaleImagesOverflow() {
allowOverflow = true,
)
}
item {
fullSpanItem {
FixedScaleImageView(
description = "Small vertical container",
width = 200.dp,
@ -91,14 +94,14 @@ private fun LazyGridScope.fixedScaleImagesOverflow() {
private fun LazyGridScope.fixedScaleImagesAlignment() {
sectionSubtitleItem(text = "Images with different alignments")
item {
fullSpanItem {
FixedScaleImageView(
description = "Center",
width = 200.dp,
height = 200.dp,
)
}
item {
fullSpanItem {
FixedScaleImageView(
description = "Top center",
width = 200.dp,
@ -106,7 +109,7 @@ private fun LazyGridScope.fixedScaleImagesAlignment() {
alignment = Alignment.TopCenter,
)
}
item {
fullSpanItem {
FixedScaleImageView(
description = "Bottom center",
width = 200.dp,
@ -125,7 +128,7 @@ private fun FixedScaleImageView(
allowOverflow: Boolean = false,
) {
Column(
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Box(

View File

@ -1,6 +1,7 @@
package app.k9mail.ui.catalog.ui.atom.items
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
@ -8,7 +9,8 @@ import androidx.compose.ui.Modifier
import app.k9mail.core.ui.compose.designsystem.atom.Checkbox
import app.k9mail.core.ui.compose.designsystem.atom.Switch
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall
import app.k9mail.ui.catalog.ui.common.list.itemDefaultPadding
import app.k9mail.ui.catalog.ui.common.list.defaultItem
import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
fun LazyGridScope.selectionControlItems() {
@ -44,10 +46,10 @@ private fun LazyGridScope.captionItem(
caption: String,
content: @Composable () -> Unit,
) {
item {
defaultItem {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
) {
content()
TextBodySmall(text = caption)

View File

@ -23,7 +23,8 @@ import app.k9mail.core.ui.compose.designsystem.atom.textfield.TextFieldOutlinedS
import app.k9mail.core.ui.compose.designsystem.molecule.input.CheckboxInput
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.ui.catalog.ui.common.helper.WithRememberedState
import app.k9mail.ui.catalog.ui.common.list.itemDefaultPadding
import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding
import app.k9mail.ui.catalog.ui.common.list.fullSpanItem
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem
import kotlinx.collections.immutable.ImmutableList
@ -69,7 +70,7 @@ fun <T> TextFieldDemo(
Column(
modifier = Modifier
.fillMaxWidth()
.itemDefaultPadding()
.padding(defaultItemPadding())
.then(modifier),
) {
key(state.value.showLabel, state.value.isRequired) {
@ -148,7 +149,7 @@ fun <T> TextFieldDemo(
private val defaultPadding = PaddingValues(0.dp)
private fun LazyGridScope.textFieldOutlinedItems() {
item {
fullSpanItem {
TextFieldDemo(
hasTrailingIcon = true,
hasSingleLine = true,
@ -175,7 +176,7 @@ private fun LazyGridScope.textFieldOutlinedItems() {
}
private fun LazyGridScope.passwordTextFieldOutlinedItems() {
item {
fullSpanItem {
TextFieldDemo(
initialState = TextFieldState(
input = "",
@ -197,7 +198,7 @@ private fun LazyGridScope.passwordTextFieldOutlinedItems() {
}
private fun LazyGridScope.emailTextFieldOutlinedItems() {
item {
fullSpanItem {
TextFieldDemo(
initialState = TextFieldState(
input = "",
@ -219,7 +220,7 @@ private fun LazyGridScope.emailTextFieldOutlinedItems() {
}
private fun LazyGridScope.numberTextFieldOutlinedItems() {
item {
fullSpanItem {
TextFieldDemo(
initialState = TextFieldState<Long?>(
input = 123L,
@ -246,7 +247,7 @@ private data class TextFieldSelectState(
)
private fun LazyGridScope.selectionTextFieldOutlinedItems() {
item {
fullSpanItem {
TextFieldDemo(
initialState = TextFieldState(
input = TextFieldSelectState(),

View File

@ -1,5 +1,6 @@
package app.k9mail.ui.catalog.ui.atom.items
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -22,7 +23,8 @@ import app.k9mail.core.ui.compose.designsystem.atom.text.TextLabelSmall
import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleLarge
import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleMedium
import app.k9mail.core.ui.compose.designsystem.atom.text.TextTitleSmall
import app.k9mail.ui.catalog.ui.common.list.itemDefaultPadding
import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding
import app.k9mail.ui.catalog.ui.common.list.fullSpanItem
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
fun LazyGridScope.typographyItems() {
@ -41,112 +43,112 @@ private fun LazyGridScope.textItems(
isAnnotated: Boolean = false,
color: Color = Color.Unspecified,
) {
item {
fullSpanItem {
TextDisplayLarge(
text = annotatedString("DisplayLarge", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextDisplayMedium(
text = annotatedString("DisplayMedium", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextDisplaySmall(
text = annotatedString("DisplaySmall", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextHeadlineLarge(
text = annotatedString("HeadlineLarge", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextHeadlineMedium(
text = annotatedString("HeadlineMedium", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextHeadlineSmall(
text = annotatedString("HeadlineSmall", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextTitleLarge(
text = annotatedString("TitleLarge", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextTitleMedium(
text = annotatedString("TitleMedium", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextTitleSmall(
text = annotatedString("TitleSmall", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextBodyLarge(
text = annotatedString("BodyLarge", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextBodyMedium(
text = annotatedString("BodyMedium", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextBodySmall(
text = annotatedString("BodySmall", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextLabelLarge(
text = annotatedString("LabelLarge", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextLabelMedium(
text = annotatedString("LabelMedium", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}
item {
fullSpanItem {
TextLabelSmall(
text = annotatedString("LabelSmall", isAnnotated),
modifier = Modifier.itemDefaultPadding(),
modifier = Modifier.padding(defaultItemPadding()),
color = color,
)
}

View File

@ -13,7 +13,7 @@ import app.k9mail.core.ui.compose.designsystem.atom.Surface
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyLarge
import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodySmall
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.ui.catalog.ui.common.list.itemDefaultPadding
import app.k9mail.ui.catalog.ui.common.list.defaultItemPadding
@Composable
internal fun ColorContent(
@ -25,7 +25,7 @@ internal fun ColorContent(
Surface(
color = color,
modifier = Modifier
.itemDefaultPadding()
.padding(defaultItemPadding())
.then(modifier),
) {
Row(

View File

@ -18,9 +18,9 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import app.k9mail.core.ui.compose.designsystem.template.ResponsiveContentWithSurface
import app.k9mail.core.ui.compose.theme2.MainTheme
import app.k9mail.ui.catalog.ui.common.list.fullSpanItem
import kotlinx.collections.immutable.ImmutableList
import kotlinx.coroutines.launch
@ -65,7 +65,7 @@ fun <T> PagedContent(
.fillMaxSize(),
) { page ->
LazyVerticalGrid(
columns = GridCells.Adaptive(300.dp),
columns = GridCells.Adaptive(MainTheme.sizes.larger),
modifier = Modifier
.fillMaxSize()
.imePadding(),
@ -73,7 +73,7 @@ fun <T> PagedContent(
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double),
) {
onRenderPage(pages[page])
item { Spacer(modifier = Modifier.height(MainTheme.sizes.smaller)) }
fullSpanItem { Spacer(modifier = Modifier.height(MainTheme.sizes.smaller)) }
}
}
}

View File

@ -0,0 +1,14 @@
package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.lazy.grid.LazyGridItemScope
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.runtime.Composable
import java.util.UUID
fun LazyGridScope.defaultItem(content: @Composable LazyGridItemScope.() -> Unit) {
item(
key = UUID.randomUUID().toString(),
) {
content()
}
}

View File

@ -0,0 +1,10 @@
package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.Composable
import app.k9mail.core.ui.compose.theme2.MainTheme
@Composable
fun defaultItemPadding(): PaddingValues = PaddingValues(
horizontal = MainTheme.spacings.double,
)

View File

@ -0,0 +1,16 @@
package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyGridItemScope
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.runtime.Composable
import java.util.UUID
fun LazyGridScope.fullSpanItem(content: @Composable LazyGridItemScope.() -> Unit) {
item(
key = UUID.randomUUID().toString(),
span = { GridItemSpan(maxLineSpan) },
) {
content()
}
}

View File

@ -1,12 +0,0 @@
package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.layout.padding
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import app.k9mail.core.ui.compose.theme2.MainTheme
fun Modifier.itemDefaultPadding(): Modifier = composed {
padding(
horizontal = MainTheme.spacings.double,
)
}

View File

@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@ -12,14 +13,14 @@ import androidx.compose.ui.unit.dp
import app.k9mail.core.ui.compose.theme2.MainTheme
@Composable
fun ItemOutlined(
fun ItemOutlinedView(
modifier: Modifier = Modifier,
content: @Composable () -> Unit,
) {
Column(
verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.default),
modifier = Modifier
.itemDefaultPadding()
.padding(defaultItemPadding())
.then(modifier),
) {
Box(

View File

@ -3,7 +3,6 @@ package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.ui.Modifier
import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal
@ -13,7 +12,7 @@ import app.k9mail.core.ui.compose.theme2.MainTheme
fun LazyGridScope.sectionHeaderItem(
text: String,
) {
item(span = { GridItemSpan(maxLineSpan) }) {
fullSpanItem {
Column(
modifier = Modifier
.fillMaxWidth()

View File

@ -3,7 +3,6 @@ package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@ -13,7 +12,7 @@ import app.k9mail.core.ui.compose.theme2.MainTheme
fun LazyGridScope.sectionInfoItem(
text: String,
) {
item(span = { GridItemSpan(maxLineSpan) }) {
fullSpanItem {
Column(
modifier = Modifier
.fillMaxWidth()

View File

@ -3,7 +3,6 @@ package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.ui.Modifier
import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal
@ -13,7 +12,7 @@ import app.k9mail.core.ui.compose.theme2.MainTheme
fun LazyGridScope.sectionSubtitleItem(
text: String,
) {
item(span = { GridItemSpan(maxLineSpan) }) {
fullSpanItem {
Column(
modifier = Modifier
.fillMaxWidth()

View File

@ -0,0 +1,16 @@
package app.k9mail.ui.catalog.ui.common.list
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyGridItemScope
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.runtime.Composable
import java.util.UUID
fun LazyGridScope.wideItem(content: @Composable LazyGridItemScope.() -> Unit) {
item(
key = UUID.randomUUID().toString(),
span = { GridItemSpan(2) },
) {
content()
}
}

View File

@ -9,7 +9,8 @@ import app.k9mail.core.ui.compose.designsystem.molecule.input.SelectInput
import app.k9mail.core.ui.compose.designsystem.molecule.input.SwitchInput
import app.k9mail.core.ui.compose.designsystem.molecule.input.TextInput
import app.k9mail.ui.catalog.ui.common.helper.WithRememberedState
import app.k9mail.ui.catalog.ui.common.list.ItemOutlined
import app.k9mail.ui.catalog.ui.common.list.ItemOutlinedView
import app.k9mail.ui.catalog.ui.common.list.fullSpanItem
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem
import kotlinx.collections.immutable.persistentListOf
@ -18,8 +19,8 @@ import kotlinx.collections.immutable.persistentListOf
fun LazyGridScope.inputItems() {
sectionHeaderItem(text = "TextInput")
sectionSubtitleItem(text = "Default")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = "") { state ->
TextInput(
text = state.value,
@ -29,8 +30,8 @@ fun LazyGridScope.inputItems() {
}
}
sectionSubtitleItem(text = "With error")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = "") { state ->
TextInput(
text = state.value,
@ -43,8 +44,8 @@ fun LazyGridScope.inputItems() {
sectionHeaderItem(text = "EmailAddressInput")
sectionSubtitleItem(text = "Default")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = "") { state ->
EmailAddressInput(
emailAddress = state.value,
@ -54,8 +55,8 @@ fun LazyGridScope.inputItems() {
}
}
sectionSubtitleItem(text = "With error")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = "wrong email address") { state ->
EmailAddressInput(
emailAddress = state.value,
@ -68,8 +69,8 @@ fun LazyGridScope.inputItems() {
sectionHeaderItem(text = "NumberInput")
sectionSubtitleItem(text = "Default")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState<Long?>(input = null) { state ->
NumberInput(
value = state.value,
@ -79,8 +80,8 @@ fun LazyGridScope.inputItems() {
}
}
sectionSubtitleItem(text = "With error")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState<Long?>(input = 123L) { state ->
NumberInput(
value = state.value,
@ -93,8 +94,8 @@ fun LazyGridScope.inputItems() {
sectionHeaderItem(text = "PasswordInput")
sectionSubtitleItem(text = "Default")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = "") { state ->
PasswordInput(
password = state.value,
@ -104,8 +105,8 @@ fun LazyGridScope.inputItems() {
}
}
sectionSubtitleItem(text = "With error")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = "wrong password") { state ->
PasswordInput(
password = state.value,
@ -117,9 +118,9 @@ fun LazyGridScope.inputItems() {
}
sectionHeaderItem(text = "SelectInput")
item {
fullSpanItem {
val options = persistentListOf("Option 1", "Option 2", "Option 3")
ItemOutlined {
ItemOutlinedView {
WithRememberedState(input = options.first()) { state ->
SelectInput(
options = options,
@ -132,8 +133,8 @@ fun LazyGridScope.inputItems() {
sectionHeaderItem(text = "CheckboxInput")
sectionSubtitleItem(text = "Default")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = false) { state ->
CheckboxInput(
text = "Check the box",
@ -144,8 +145,8 @@ fun LazyGridScope.inputItems() {
}
}
sectionSubtitleItem(text = "With error")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = false) { state ->
CheckboxInput(
text = "Check the box",
@ -159,8 +160,8 @@ fun LazyGridScope.inputItems() {
sectionHeaderItem(text = "SwitchInput")
sectionSubtitleItem(text = "Default")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = false) { state ->
SwitchInput(
text = "Switch the toggle",
@ -171,8 +172,8 @@ fun LazyGridScope.inputItems() {
}
}
sectionSubtitleItem(text = "With error")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
WithRememberedState(input = false) { state ->
SwitchInput(
text = "Switch the toggle",

View File

@ -15,38 +15,39 @@ import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingErrorState
import app.k9mail.core.ui.compose.designsystem.molecule.ContentLoadingErrorView
import app.k9mail.core.ui.compose.designsystem.molecule.ErrorView
import app.k9mail.core.ui.compose.designsystem.molecule.LoadingView
import app.k9mail.ui.catalog.ui.common.list.ItemOutlined
import app.k9mail.ui.catalog.ui.common.list.ItemOutlinedView
import app.k9mail.ui.catalog.ui.common.list.fullSpanItem
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
import app.k9mail.ui.catalog.ui.common.list.sectionInfoItem
import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem
fun LazyGridScope.stateItems() {
sectionHeaderItem(text = "ErrorView")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
ErrorView(
title = "Error",
)
}
}
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
ErrorView(
title = "Error with message",
message = "Something went wrong",
)
}
}
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
ErrorView(
title = "Error with retry",
onRetry = {},
)
}
}
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
ErrorView(
title = "Error with retry and message",
message = "Something went wrong",
@ -57,14 +58,14 @@ fun LazyGridScope.stateItems() {
sectionHeaderItem(text = "LoadingView")
sectionSubtitleItem(text = "Default")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
LoadingView()
}
}
sectionSubtitleItem(text = "With message")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
LoadingView(
message = "Loading...",
)
@ -73,9 +74,9 @@ fun LazyGridScope.stateItems() {
sectionHeaderItem(text = "ContentLoadingErrorView")
sectionInfoItem(text = "Click below to change state")
item {
fullSpanItem {
Column {
ItemOutlined {
ItemOutlinedView {
StatefulContentLoadingErrorState()
}
}

View File

@ -9,15 +9,16 @@ import app.k9mail.core.ui.compose.designsystem.atom.icon.Icons
import app.k9mail.core.ui.compose.designsystem.organism.TopAppBar
import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithBackButton
import app.k9mail.core.ui.compose.designsystem.organism.TopAppBarWithMenuButton
import app.k9mail.ui.catalog.ui.common.list.ItemOutlined
import app.k9mail.ui.catalog.ui.common.list.ItemOutlinedView
import app.k9mail.ui.catalog.ui.common.list.fullSpanItem
import app.k9mail.ui.catalog.ui.common.list.sectionHeaderItem
import app.k9mail.ui.catalog.ui.common.list.sectionSubtitleItem
fun LazyGridScope.appBarItems() {
sectionHeaderItem(text = "TopAppBar")
sectionSubtitleItem(text = "With menu icon")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
TopAppBarItem(
title = "Title",
actionIcon = Icons.Outlined.Info,
@ -25,8 +26,8 @@ fun LazyGridScope.appBarItems() {
}
}
sectionSubtitleItem(text = "With back menu icon")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
TopAppBarWithMenuButton(
title = "Title",
onMenuClick = {},
@ -34,8 +35,8 @@ fun LazyGridScope.appBarItems() {
}
}
sectionSubtitleItem(text = "With back icon")
item {
ItemOutlined {
fullSpanItem {
ItemOutlinedView {
TopAppBarWithBackButton(
title = "Title",
onBackClick = {},