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),
             )
         }
     }
 }