Loading core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/PreviewWithThemeLightDark.kt +63 −39 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement Loading @@ -11,41 +12,80 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.movableContentOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.theme2.MainTheme /** * A Composable function that displays a preview of the content in both Thunderbird and K-9 Mail themes. * * It uses the current system theme (light or dark) for both previews. * * @param modifier The modifier to be applied to the layout. * @param useRow Whether to display the previews in a row or column. Defaults to `false` (column). * @param useScrim Whether to display a scrim behind the content. Defaults to `false`. * @param scrimAlpha The alpha value for the scrim. Defaults to `0.8f`. * @param scrimPadding The padding for the scrim. Defaults to `MainTheme.spacings.triple`. * @param arrangement The arrangement for the previews. Defaults to `Arrangement.spacedBy(MainTheme.spacings.triple)`. * @param content The content to be displayed in the previews. * * @see app.k9mail.core.ui.compose.theme2.default.defaultThemeSpacings for MainTheme.spacings */ @Composable fun PreviewWithThemeLightDark( modifier: Modifier = Modifier, useRow: Boolean = false, useScrim: Boolean = false, scrimAlpha: Float = 0.8f, scrimPadding: PaddingValues = PaddingValues(24.dp), arrangement: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(24.dp), scrimPadding: PaddingValues = PaddingValues(MainTheme.spacings.triple), arrangement: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(MainTheme.spacings.triple), content: @Composable () -> Unit, ) { val movableContent = remember { movableContentOf { PreviewWithTheme( ThemePreview( themeType = PreviewThemeType.THUNDERBIRD, isDarkTheme = isSystemInDarkTheme(), ) { PreviewSurface { if (useScrim) { Box( modifier = Modifier .background(MainTheme.colors.scrim.copy(alpha = scrimAlpha)) .padding(scrimPadding), useScrim = useScrim, scrimAlpha = scrimAlpha, scrimPadding = scrimPadding, content = content, ) ThemePreview( themeType = PreviewThemeType.K9MAIL, useScrim = useScrim, scrimAlpha = scrimAlpha, scrimPadding = scrimPadding, content = content, ) } } if (useRow) { Row( horizontalArrangement = arrangement, modifier = modifier, ) { content() movableContent() } } else { content() Column( verticalArrangement = arrangement, modifier = modifier, ) { movableContent() } PreviewHeader(themeName = PreviewThemeType.THUNDERBIRD.name) } } @Composable private fun ThemePreview( themeType: PreviewThemeType, useScrim: Boolean, scrimAlpha: Float, scrimPadding: PaddingValues, content: @Composable (() -> Unit), ) { val movableContent = remember { movableContentOf { content() } } PreviewWithTheme( themeType = PreviewThemeType.K9MAIL, themeType = themeType, isDarkTheme = isSystemInDarkTheme(), ) { PreviewSurface { Loading @@ -54,29 +94,13 @@ fun PreviewWithThemeLightDark( modifier = Modifier .background(MainTheme.colors.scrim.copy(alpha = scrimAlpha)) .padding(scrimPadding), ) { content() } } else { content() } PreviewHeader(themeName = PreviewThemeType.K9MAIL.name) } } } } if (useRow) { Row( horizontalArrangement = arrangement, ) { movableContent() } } else { Column( verticalArrangement = arrangement, ) { movableContent() } PreviewHeader(themeName = themeType.name) } } } core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/PreviewWithThemes.kt +2 −2 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ private fun PreviewWithThunderbirdTheme( } @Composable fun PreviewHeader( internal fun PreviewHeader( themeName: String, ) { Surface( Loading @@ -117,7 +117,7 @@ fun PreviewHeader( } @Composable fun PreviewSurface( internal fun PreviewSurface( content: @Composable () -> Unit, ) { Surface( Loading core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/organism/BasicDialogPreview.kt 0 → 100644 +147 −0 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.organism import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.Icon 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.unit.dp import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium import app.k9mail.core.ui.compose.designsystem.atom.text.TextHeadlineSmall import app.k9mail.core.ui.compose.theme2.MainTheme @PreviewLightDarkLandscape @Composable private fun BasicDialogPreview() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(MainTheme.spacings.quadruple), arrangement = Arrangement.spacedBy(MainTheme.spacings.triple), ) { BasicDialogContent( headline = { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier.fillMaxWidth(), ) { Icon(imageVector = Icons.Default.Refresh, contentDescription = null) TextHeadlineSmall(text = "Reset settings?") } }, supportingText = { TextBodyMedium( text = "This will reset your app preferences back to their default settings. " + "The following accounts will also be signed out:", color = MainTheme.colors.onSurfaceVariant, ) }, content = { Column( verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier .fillMaxWidth() .padding( start = MainTheme.spacings.triple, end = MainTheme.spacings.triple, ), ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(MainTheme.sizes.iconAvatar) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 1") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(MainTheme.sizes.iconAvatar) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 2") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(MainTheme.sizes.iconAvatar) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 3") } } }, buttons = { TextButton(onClick = {}) { Text(text = "Cancel") } TextButton(onClick = {}) { Text(text = "Accept") } }, showDividers = true, modifier = Modifier.width(300.dp), ) } } @PreviewLightDarkLandscape @Composable private fun PreviewOnlySupportingText() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(MainTheme.spacings.quadruple), arrangement = Arrangement.spacedBy(MainTheme.spacings.triple), ) { BasicDialogContent( headline = { TextHeadlineSmall(text = "Email can not be archived") }, supportingText = { TextBodyMedium( text = "Configure archive folder now", color = MainTheme.colors.onSurfaceVariant, ) }, content = null, buttons = { TextButton(onClick = {}) { Text(text = "Skip for now") } TextButton(onClick = {}) { Text(text = "Set archive folder") } }, showDividers = false, modifier = Modifier.width(300.dp), ) } } core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/organism/BasicDialog.kt +3 −136 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.organism import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column Loading @@ -8,25 +7,13 @@ import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.Icon 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.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal import app.k9mail.core.ui.compose.designsystem.atom.Surface import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium Loading Loading @@ -66,12 +53,12 @@ fun BasicDialog( @Composable fun BasicDialog( headlineText: String, supportingText: String?, onDismissRequest: () -> Unit, content: (@Composable () -> Unit)?, buttons: @Composable RowScope.() -> Unit, modifier: Modifier = Modifier, headlineText: String, supportingText: String?, contentPadding: PaddingValues = BasicDialogDefaults.contentPadding, showDividers: Boolean = BasicDialogDefaults.showDividers, dividerColor: Color = BasicDialogDefaults.dividerColor, Loading Loading @@ -99,7 +86,7 @@ fun BasicDialog( } @Composable private fun BasicDialogContent( internal fun BasicDialogContent( content: (@Composable () -> Unit)?, buttons: @Composable RowScope.() -> Unit, modifier: Modifier = Modifier, Loading Loading @@ -175,123 +162,3 @@ object BasicDialogDefaults { bottom = MainTheme.spacings.double, ) } @PreviewLightDarkLandscape @Composable private fun Preview() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(32.dp), arrangement = Arrangement.spacedBy(24.dp), ) { BasicDialogContent( headline = { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier.fillMaxWidth(), ) { Icon(imageVector = Icons.Default.Refresh, contentDescription = null) TextHeadlineSmall(text = "Reset settings?") } }, supportingText = { TextBodyMedium( text = "This will reset your app preferences back to their default settings. " + "The following accounts will also be signed out:", color = MainTheme.colors.onSurfaceVariant, ) }, content = { Column( verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier .fillMaxWidth() .padding( start = MainTheme.spacings.triple, end = MainTheme.spacings.triple, ), ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(48.dp) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 1") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(48.dp) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 2") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(48.dp) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 3") } } }, buttons = { TextButton(onClick = {}) { Text(text = "Cancel") } TextButton(onClick = {}) { Text(text = "Accept") } }, showDividers = true, modifier = Modifier.width(300.dp), ) } } @PreviewLightDarkLandscape @Composable private fun PreviewOnlySupportingText() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(32.dp), arrangement = Arrangement.spacedBy(24.dp), ) { BasicDialogContent( headline = { TextHeadlineSmall(text = "Email can not be archived") }, supportingText = { TextBodyMedium( text = "Configure archive folder now", color = MainTheme.colors.onSurfaceVariant, ) }, content = null, buttons = { TextButton(onClick = {}) { Text(text = "Skip for now") } TextButton(onClick = {}) { Text(text = "Set archive folder") } }, showDividers = false, modifier = Modifier.width(300.dp), ) } } feature/mail/message/list/src/debug/kotlin/net/thunderbird/feature/mail/message/list/ui/dialog/ChooseArchiveFolderDialogContentPreview.kt 0 → 100644 +94 −0 Original line number Diff line number Diff line package net.thunderbird.feature.mail.message.list.ui.dialog import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark import app.k9mail.core.ui.compose.designsystem.atom.Surface import app.k9mail.core.ui.compose.theme2.MainTheme import net.thunderbird.feature.mail.folder.api.FolderType import net.thunderbird.feature.mail.folder.api.RemoteFolder import net.thunderbird.feature.mail.message.list.ui.dialog.SetupArchiveFolderDialogContract.State private class ChooseArchiveFolderDialogContentParamsCol : CollectionPreviewParameterProvider<State.ChooseArchiveFolder>( setOf( State.ChooseArchiveFolder( isLoadingFolders = true, ), State.ChooseArchiveFolder( isLoadingFolders = false, folders = listOf( RemoteFolder( id = 1, serverId = "1", name = "[Gmail]/All Mail", type = FolderType.REGULAR, ), RemoteFolder(id = 2, serverId = "2", name = "[Gmail]/Draft", type = FolderType.REGULAR), RemoteFolder( id = 3, serverId = "3", name = "[Gmail]/Sent Mail", type = FolderType.REGULAR, ), RemoteFolder(id = 3, serverId = "3", name = "[Gmail]/Spam", type = FolderType.REGULAR), RemoteFolder(id = 3, serverId = "3", name = "[Gmail]/Trash", type = FolderType.REGULAR), RemoteFolder( id = 3, serverId = "3", name = "[Gmail]/Another Folder", type = FolderType.REGULAR, ), ), ), State.ChooseArchiveFolder( isLoadingFolders = false, errorMessage = "Error message", ), ), ) @PreviewLightDarkLandscape @Composable private fun ChooseArchiveFolderDialogContentPreview( @PreviewParameter(ChooseArchiveFolderDialogContentParamsCol::class) state: State.ChooseArchiveFolder, ) { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(32.dp), arrangement = Arrangement.spacedBy(24.dp), ) { Surface( shape = MainTheme.shapes.extraLarge, modifier = Modifier.width(300.dp), ) { Column { ChooseArchiveFolderDialogContent( state = state, onFolderSelect = {}, ) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End, ) { ChooseArchiveFolderDialogButtons( state = state, onCreateNewFolderClick = {}, onDoneClick = {}, ) } } } } } Loading
core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/PreviewWithThemeLightDark.kt +63 −39 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Arrangement Loading @@ -11,41 +12,80 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.movableContentOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.theme2.MainTheme /** * A Composable function that displays a preview of the content in both Thunderbird and K-9 Mail themes. * * It uses the current system theme (light or dark) for both previews. * * @param modifier The modifier to be applied to the layout. * @param useRow Whether to display the previews in a row or column. Defaults to `false` (column). * @param useScrim Whether to display a scrim behind the content. Defaults to `false`. * @param scrimAlpha The alpha value for the scrim. Defaults to `0.8f`. * @param scrimPadding The padding for the scrim. Defaults to `MainTheme.spacings.triple`. * @param arrangement The arrangement for the previews. Defaults to `Arrangement.spacedBy(MainTheme.spacings.triple)`. * @param content The content to be displayed in the previews. * * @see app.k9mail.core.ui.compose.theme2.default.defaultThemeSpacings for MainTheme.spacings */ @Composable fun PreviewWithThemeLightDark( modifier: Modifier = Modifier, useRow: Boolean = false, useScrim: Boolean = false, scrimAlpha: Float = 0.8f, scrimPadding: PaddingValues = PaddingValues(24.dp), arrangement: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(24.dp), scrimPadding: PaddingValues = PaddingValues(MainTheme.spacings.triple), arrangement: Arrangement.HorizontalOrVertical = Arrangement.spacedBy(MainTheme.spacings.triple), content: @Composable () -> Unit, ) { val movableContent = remember { movableContentOf { PreviewWithTheme( ThemePreview( themeType = PreviewThemeType.THUNDERBIRD, isDarkTheme = isSystemInDarkTheme(), ) { PreviewSurface { if (useScrim) { Box( modifier = Modifier .background(MainTheme.colors.scrim.copy(alpha = scrimAlpha)) .padding(scrimPadding), useScrim = useScrim, scrimAlpha = scrimAlpha, scrimPadding = scrimPadding, content = content, ) ThemePreview( themeType = PreviewThemeType.K9MAIL, useScrim = useScrim, scrimAlpha = scrimAlpha, scrimPadding = scrimPadding, content = content, ) } } if (useRow) { Row( horizontalArrangement = arrangement, modifier = modifier, ) { content() movableContent() } } else { content() Column( verticalArrangement = arrangement, modifier = modifier, ) { movableContent() } PreviewHeader(themeName = PreviewThemeType.THUNDERBIRD.name) } } @Composable private fun ThemePreview( themeType: PreviewThemeType, useScrim: Boolean, scrimAlpha: Float, scrimPadding: PaddingValues, content: @Composable (() -> Unit), ) { val movableContent = remember { movableContentOf { content() } } PreviewWithTheme( themeType = PreviewThemeType.K9MAIL, themeType = themeType, isDarkTheme = isSystemInDarkTheme(), ) { PreviewSurface { Loading @@ -54,29 +94,13 @@ fun PreviewWithThemeLightDark( modifier = Modifier .background(MainTheme.colors.scrim.copy(alpha = scrimAlpha)) .padding(scrimPadding), ) { content() } } else { content() } PreviewHeader(themeName = PreviewThemeType.K9MAIL.name) } } } } if (useRow) { Row( horizontalArrangement = arrangement, ) { movableContent() } } else { Column( verticalArrangement = arrangement, ) { movableContent() } PreviewHeader(themeName = themeType.name) } } }
core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/PreviewWithThemes.kt +2 −2 Original line number Diff line number Diff line Loading @@ -99,7 +99,7 @@ private fun PreviewWithThunderbirdTheme( } @Composable fun PreviewHeader( internal fun PreviewHeader( themeName: String, ) { Surface( Loading @@ -117,7 +117,7 @@ fun PreviewHeader( } @Composable fun PreviewSurface( internal fun PreviewSurface( content: @Composable () -> Unit, ) { Surface( Loading
core/ui/compose/designsystem/src/debug/kotlin/app/k9mail/core/ui/compose/designsystem/organism/BasicDialogPreview.kt 0 → 100644 +147 −0 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.organism import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.Icon 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.unit.dp import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium import app.k9mail.core.ui.compose.designsystem.atom.text.TextHeadlineSmall import app.k9mail.core.ui.compose.theme2.MainTheme @PreviewLightDarkLandscape @Composable private fun BasicDialogPreview() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(MainTheme.spacings.quadruple), arrangement = Arrangement.spacedBy(MainTheme.spacings.triple), ) { BasicDialogContent( headline = { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier.fillMaxWidth(), ) { Icon(imageVector = Icons.Default.Refresh, contentDescription = null) TextHeadlineSmall(text = "Reset settings?") } }, supportingText = { TextBodyMedium( text = "This will reset your app preferences back to their default settings. " + "The following accounts will also be signed out:", color = MainTheme.colors.onSurfaceVariant, ) }, content = { Column( verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier .fillMaxWidth() .padding( start = MainTheme.spacings.triple, end = MainTheme.spacings.triple, ), ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(MainTheme.sizes.iconAvatar) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 1") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(MainTheme.sizes.iconAvatar) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 2") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(MainTheme.sizes.iconAvatar) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 3") } } }, buttons = { TextButton(onClick = {}) { Text(text = "Cancel") } TextButton(onClick = {}) { Text(text = "Accept") } }, showDividers = true, modifier = Modifier.width(300.dp), ) } } @PreviewLightDarkLandscape @Composable private fun PreviewOnlySupportingText() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(MainTheme.spacings.quadruple), arrangement = Arrangement.spacedBy(MainTheme.spacings.triple), ) { BasicDialogContent( headline = { TextHeadlineSmall(text = "Email can not be archived") }, supportingText = { TextBodyMedium( text = "Configure archive folder now", color = MainTheme.colors.onSurfaceVariant, ) }, content = null, buttons = { TextButton(onClick = {}) { Text(text = "Skip for now") } TextButton(onClick = {}) { Text(text = "Set archive folder") } }, showDividers = false, modifier = Modifier.width(300.dp), ) } }
core/ui/compose/designsystem/src/main/kotlin/app/k9mail/core/ui/compose/designsystem/organism/BasicDialog.kt +3 −136 Original line number Diff line number Diff line package app.k9mail.core.ui.compose.designsystem.organism import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column Loading @@ -8,25 +7,13 @@ import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Refresh import androidx.compose.material3.Icon 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.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark import app.k9mail.core.ui.compose.designsystem.atom.DividerHorizontal import app.k9mail.core.ui.compose.designsystem.atom.Surface import app.k9mail.core.ui.compose.designsystem.atom.text.TextBodyMedium Loading Loading @@ -66,12 +53,12 @@ fun BasicDialog( @Composable fun BasicDialog( headlineText: String, supportingText: String?, onDismissRequest: () -> Unit, content: (@Composable () -> Unit)?, buttons: @Composable RowScope.() -> Unit, modifier: Modifier = Modifier, headlineText: String, supportingText: String?, contentPadding: PaddingValues = BasicDialogDefaults.contentPadding, showDividers: Boolean = BasicDialogDefaults.showDividers, dividerColor: Color = BasicDialogDefaults.dividerColor, Loading Loading @@ -99,7 +86,7 @@ fun BasicDialog( } @Composable private fun BasicDialogContent( internal fun BasicDialogContent( content: (@Composable () -> Unit)?, buttons: @Composable RowScope.() -> Unit, modifier: Modifier = Modifier, Loading Loading @@ -175,123 +162,3 @@ object BasicDialogDefaults { bottom = MainTheme.spacings.double, ) } @PreviewLightDarkLandscape @Composable private fun Preview() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(32.dp), arrangement = Arrangement.spacedBy(24.dp), ) { BasicDialogContent( headline = { Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier.fillMaxWidth(), ) { Icon(imageVector = Icons.Default.Refresh, contentDescription = null) TextHeadlineSmall(text = "Reset settings?") } }, supportingText = { TextBodyMedium( text = "This will reset your app preferences back to their default settings. " + "The following accounts will also be signed out:", color = MainTheme.colors.onSurfaceVariant, ) }, content = { Column( verticalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), modifier = Modifier .fillMaxWidth() .padding( start = MainTheme.spacings.triple, end = MainTheme.spacings.triple, ), ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(48.dp) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 1") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(48.dp) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 2") } Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(MainTheme.spacings.double), ) { Box( modifier = Modifier .size(48.dp) .background(color = MainTheme.colors.primary, shape = CircleShape), ) Text(text = "Account 3") } } }, buttons = { TextButton(onClick = {}) { Text(text = "Cancel") } TextButton(onClick = {}) { Text(text = "Accept") } }, showDividers = true, modifier = Modifier.width(300.dp), ) } } @PreviewLightDarkLandscape @Composable private fun PreviewOnlySupportingText() { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(32.dp), arrangement = Arrangement.spacedBy(24.dp), ) { BasicDialogContent( headline = { TextHeadlineSmall(text = "Email can not be archived") }, supportingText = { TextBodyMedium( text = "Configure archive folder now", color = MainTheme.colors.onSurfaceVariant, ) }, content = null, buttons = { TextButton(onClick = {}) { Text(text = "Skip for now") } TextButton(onClick = {}) { Text(text = "Set archive folder") } }, showDividers = false, modifier = Modifier.width(300.dp), ) } }
feature/mail/message/list/src/debug/kotlin/net/thunderbird/feature/mail/message/list/ui/dialog/ChooseArchiveFolderDialogContentPreview.kt 0 → 100644 +94 −0 Original line number Diff line number Diff line package net.thunderbird.feature.mail.message.list.ui.dialog import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider import androidx.compose.ui.unit.dp import app.k9mail.core.ui.compose.designsystem.PreviewLightDarkLandscape import app.k9mail.core.ui.compose.designsystem.PreviewWithThemeLightDark import app.k9mail.core.ui.compose.designsystem.atom.Surface import app.k9mail.core.ui.compose.theme2.MainTheme import net.thunderbird.feature.mail.folder.api.FolderType import net.thunderbird.feature.mail.folder.api.RemoteFolder import net.thunderbird.feature.mail.message.list.ui.dialog.SetupArchiveFolderDialogContract.State private class ChooseArchiveFolderDialogContentParamsCol : CollectionPreviewParameterProvider<State.ChooseArchiveFolder>( setOf( State.ChooseArchiveFolder( isLoadingFolders = true, ), State.ChooseArchiveFolder( isLoadingFolders = false, folders = listOf( RemoteFolder( id = 1, serverId = "1", name = "[Gmail]/All Mail", type = FolderType.REGULAR, ), RemoteFolder(id = 2, serverId = "2", name = "[Gmail]/Draft", type = FolderType.REGULAR), RemoteFolder( id = 3, serverId = "3", name = "[Gmail]/Sent Mail", type = FolderType.REGULAR, ), RemoteFolder(id = 3, serverId = "3", name = "[Gmail]/Spam", type = FolderType.REGULAR), RemoteFolder(id = 3, serverId = "3", name = "[Gmail]/Trash", type = FolderType.REGULAR), RemoteFolder( id = 3, serverId = "3", name = "[Gmail]/Another Folder", type = FolderType.REGULAR, ), ), ), State.ChooseArchiveFolder( isLoadingFolders = false, errorMessage = "Error message", ), ), ) @PreviewLightDarkLandscape @Composable private fun ChooseArchiveFolderDialogContentPreview( @PreviewParameter(ChooseArchiveFolderDialogContentParamsCol::class) state: State.ChooseArchiveFolder, ) { PreviewWithThemeLightDark( useRow = true, useScrim = true, scrimPadding = PaddingValues(32.dp), arrangement = Arrangement.spacedBy(24.dp), ) { Surface( shape = MainTheme.shapes.extraLarge, modifier = Modifier.width(300.dp), ) { Column { ChooseArchiveFolderDialogContent( state = state, onFolderSelect = {}, ) Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End, ) { ChooseArchiveFolderDialogButtons( state = state, onCreateNewFolderClick = {}, onDoneClick = {}, ) } } } } }