Coverage Summary for Class: SurferSettingsGroupKt (com.georgeci.moneysurfer.uikit.components.settings)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| SurferSettingsGroupKt |
100%
(1/1)
|
50%
(1/2)
|
57.1%
(8/14)
|
100%
(30/30)
|
97.5%
(428/439)
|
package com.georgeci.moneysurfer.uikit.components.settings
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.georgeci.moneysurfer.uikit.icons.SurferIcons
import com.georgeci.moneysurfer.uikit.preview.SurferComponentPreview
import com.georgeci.moneysurfer.uikit.theme.AppTheme
/**
* Section wrapper for a stack of [SurferSettingsRow]s. Optional [title] is rendered above the
* first row in the primary tint; optional [footnote] sits below the last row in the variant tint.
*
* Default horizontal padding (16dp) matches the design's hub layout. Row gap (8dp) is applied
* automatically — children should be plain rows, not pre-stacked containers.
*/
@Composable
fun SurferSettingsGroup(
modifier: Modifier = Modifier,
title: String? = null,
footnote: String? = null,
contentPadding: PaddingValues = PaddingValues(horizontal = 16.dp),
rowSpacing: androidx.compose.ui.unit.Dp = 8.dp,
content: @Composable () -> Unit,
) {
Column(
modifier = modifier
.fillMaxWidth()
.padding(contentPadding)
.padding(bottom = 12.dp),
) {
if (title != null) {
Text(
text = title,
style = AppTheme.typography.labelLarge,
color = AppTheme.materialColors.primary,
modifier = Modifier.padding(start = 8.dp, end = 8.dp, top = 14.dp, bottom = 8.dp),
)
}
Column(verticalArrangement = Arrangement.spacedBy(rowSpacing)) {
content()
}
if (footnote != null) {
Text(
text = footnote,
style = AppTheme.typography.bodySmall,
color = AppTheme.materialColors.onSurfaceVariant,
modifier = Modifier.padding(start = 8.dp, end = 8.dp, top = 8.dp),
)
}
}
}
@Preview
@Composable
private fun SurferSettingsGroupPreview() {
SurferComponentPreview {
Column {
SurferSettingsGroup(title = "Personalization") {
SurferSettingsRow(
icon = SurferIcons.Palette,
title = "Appearance",
supportingText = "Plum · Light",
trailing = { SurferSettingsChevron() },
onClick = {},
)
SurferSettingsRow(
icon = SurferIcons.Notifications,
title = "Notifications",
trailing = { SurferSettingsSwitch(checked = true, onCheckedChange = {}) },
)
}
SurferSettingsGroup(
title = "Color source",
footnote = "Use a fixed accent, or match your wallpaper automatically.",
) {
SurferSettingsRow(
icon = SurferIcons.Sparkle,
title = "Dynamic colors",
supportingText = "Match wallpaper palette",
trailing = { SurferSettingsSwitch(checked = false, onCheckedChange = {}) },
)
}
}
}
}