Coverage Summary for Class: SurferStatTileKt (com.georgeci.moneysurfer.uikit.components.budget)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| SurferStatTileKt |
100%
(1/1)
|
66.7%
(2/3)
|
62.5%
(5/8)
|
100%
(28/28)
|
97.8%
(356/364)
|
package com.georgeci.moneysurfer.uikit.components.budget
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
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.graphics.Color
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.georgeci.moneysurfer.uikit.atom.SurferCard
import com.georgeci.moneysurfer.uikit.preview.SurferComponentPreview
import com.georgeci.moneysurfer.uikit.theme.AppTheme
/**
* Label / value / caption tile used for the budget forecast row (daily average, projected
* total, per-day remaining). Values arrive pre-formatted; [valueColor] lets a tile pick up the
* status colour when the number itself is the warning.
*/
@Composable
fun SurferStatTile(
label: String,
value: String,
modifier: Modifier = Modifier,
caption: String? = null,
valueColor: Color? = null,
) {
SurferCard(modifier = modifier) {
Column(verticalArrangement = Arrangement.spacedBy(2.dp)) {
Text(
text = label,
style = AppTheme.typography.labelMedium,
color = AppTheme.materialColors.onSurfaceVariant,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
Text(
text = value,
style = AppTheme.typography.titleMedium,
color = valueColor ?: AppTheme.materialColors.onSurface,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
if (caption != null) {
Text(
text = caption,
style = AppTheme.typography.bodySmall,
color = AppTheme.materialColors.onSurfaceVariant,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
}
}
}
@Preview
@Composable
private fun SurferStatTilePreview() {
SurferComponentPreview {
Row(
modifier = Modifier.fillMaxWidth().padding(16.dp),
horizontalArrangement = Arrangement.spacedBy(12.dp),
) {
SurferStatTile(
label = "Daily average",
value = "€17.35",
caption = "18 days in",
modifier = Modifier.weight(1f),
)
SurferStatTile(
label = "Projected",
value = "€520.50",
caption = "over by €120.50",
valueColor = AppTheme.materialColors.error,
modifier = Modifier.weight(1f),
)
}
}
}