diff --git a/app/src/main/java/app/closer/ui/home/HomeScreen.kt b/app/src/main/java/app/closer/ui/home/HomeScreen.kt index e3759211..7b69abbc 100644 --- a/app/src/main/java/app/closer/ui/home/HomeScreen.kt +++ b/app/src/main/java/app/closer/ui/home/HomeScreen.kt @@ -87,6 +87,12 @@ import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.hilt.navigation.compose.hiltViewModel import app.closer.R +import app.closer.ui.home.components.HomeActionColors +import app.closer.ui.home.components.HomeGlyphIcon +import app.closer.ui.home.components.HomePill +import app.closer.ui.home.components.actionColors +import app.closer.ui.home.components.homeActionGlyph +import app.closer.ui.home.components.homePrimaryArt @Composable fun HomeScreen( @@ -411,37 +417,6 @@ private fun HomeContent( } } -@DrawableRes -private fun homeActionGlyph(target: HomeActionTarget): Int = when (target) { - HomeActionTarget.InvitePartner -> R.drawable.glyph_couple - HomeActionTarget.DailyQuestion -> R.drawable.glyph_daily_card - HomeActionTarget.AnswerHistory -> R.drawable.glyph_paired_cards - HomeActionTarget.QuestionPacks -> R.drawable.glyph_question_packs - HomeActionTarget.Settings -> R.drawable.glyph_settings - HomeActionTarget.AnswerReveal -> R.drawable.glyph_sealed_answer - HomeActionTarget.Game -> R.drawable.glyph_closer_heart_keyhole - HomeActionTarget.Challenge -> R.drawable.glyph_connection_challenge - HomeActionTarget.DatePlan -> R.drawable.glyph_date_card_heart - HomeActionTarget.MemoryCapsule -> R.drawable.glyph_memory_capsule - HomeActionTarget.DateMemories -> R.drawable.glyph_date_replay - HomeActionTarget.WeeklyRecap -> R.drawable.glyph_paired_cards -} - -@Composable -private fun HomeGlyphIcon( - @DrawableRes resId: Int, - contentDescription: String?, - tint: Color, - modifier: Modifier = Modifier -) { - Icon( - imageVector = ImageVector.vectorResource(resId), - contentDescription = contentDescription, - tint = tint, - modifier = modifier - ) -} - @Composable private fun HomeStatusStrip( streakCount: Int, @@ -1201,14 +1176,6 @@ private fun PrimaryHomeActionCard( } } -@DrawableRes -private fun homePrimaryArt(target: HomeActionTarget): Int? = when (target) { - HomeActionTarget.DailyQuestion, - HomeActionTarget.AnswerReveal -> R.drawable.illustration_home_tonight_ritual - HomeActionTarget.Challenge -> R.drawable.illustration_connection_challenges_header - else -> null -} - @Composable private fun ActionFeedSection( actions: List, @@ -1343,94 +1310,6 @@ private fun MomentCueCard() { } } -private data class HomeActionColors( - val soft: Color, - val accent: Color, - val deep: Color, - val onAccent: Color -) - -@Composable -private fun HomeActionTone.actionColors(): HomeActionColors { - val scheme = MaterialTheme.colorScheme - if (isCloserDarkTheme()) { - return when (this) { - HomeActionTone.Daily, - HomeActionTone.Ritual, - HomeActionTone.Starter, - HomeActionTone.Pack -> HomeActionColors( - soft = scheme.secondaryContainer, - accent = scheme.secondary, - deep = scheme.secondary, - onAccent = scheme.onSecondary - ) - HomeActionTone.Reflection -> HomeActionColors( - soft = scheme.tertiaryContainer, - accent = scheme.tertiary, - deep = scheme.tertiary, - onAccent = scheme.onTertiary - ) - else -> HomeActionColors( - soft = scheme.primaryContainer, - accent = scheme.primary, - deep = scheme.primary, - onAccent = scheme.onPrimary - ) - } - } - - return when (this) { - HomeActionTone.Invite -> HomeActionColors( - soft = CloserPalette.PurpleSoft, - accent = MaterialTheme.colorScheme.primary, - deep = CloserPalette.PurpleDeep, - onAccent = MaterialTheme.colorScheme.onPrimary - ) - HomeActionTone.Daily -> HomeActionColors( - soft = CloserPalette.PinkSoft, - accent = CloserPalette.PinkBright, - deep = CloserPalette.PinkAccentDeep, - onAccent = Color(0xFF24122F) - ) - HomeActionTone.Reflection -> HomeActionColors( - soft = CloserPalette.PurpleGlow, - accent = CloserPalette.PurpleRich, - deep = CloserPalette.PurpleDeep, - onAccent = Color(0xFF24122F) - ) - HomeActionTone.Ritual -> HomeActionColors( - soft = CloserPalette.PurpleSoft, - accent = CloserPalette.PinkBright, - deep = CloserPalette.PinkAccentDeep, - onAccent = Color(0xFF24122F) - ) - HomeActionTone.Starter -> HomeActionColors( - soft = CloserPalette.PinkSoft, - accent = CloserPalette.PinkBright, - deep = CloserPalette.PinkAccentDeep, - onAccent = Color(0xFF24122F) - ) - HomeActionTone.Pack -> HomeActionColors( - soft = CloserPalette.PinkSoft, - accent = CloserPalette.PinkBright, - deep = CloserPalette.PinkAccentDeep, - onAccent = Color(0xFF24122F) - ) - HomeActionTone.Utility -> HomeActionColors( - soft = CloserPalette.PurpleSoft, - accent = MaterialTheme.colorScheme.primary, - deep = CloserPalette.PurpleDeep, - onAccent = MaterialTheme.colorScheme.onPrimary - ) - HomeActionTone.Pending -> HomeActionColors( - soft = CloserPalette.PurpleSoft, - accent = MaterialTheme.colorScheme.primary, - deep = CloserPalette.PurpleDeep, - onAccent = MaterialTheme.colorScheme.onPrimary - ) - } -} - @Composable private fun CategoryPreviewGrid( categories: List, @@ -1664,19 +1543,6 @@ private fun EmptyHomeContent( } } -@Composable -private fun HomePill(label: String) { - CloserPill( - label = label, - containerColor = if (isCloserDarkTheme()) { - MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.78f) - } else { - CloserPalette.PinkMist.copy(alpha = 0.72f) - }, - contentColor = MaterialTheme.colorScheme.onSurface - ) -} - @Preview @Composable fun HomeScreenPreview() { diff --git a/app/src/main/java/app/closer/ui/home/components/HomeActionStyle.kt b/app/src/main/java/app/closer/ui/home/components/HomeActionStyle.kt new file mode 100644 index 00000000..9889d30b --- /dev/null +++ b/app/src/main/java/app/closer/ui/home/components/HomeActionStyle.kt @@ -0,0 +1,162 @@ +package app.closer.ui.home.components + +import androidx.annotation.DrawableRes +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import app.closer.R +import app.closer.ui.components.CloserPill +import app.closer.ui.home.HomeActionTarget +import app.closer.ui.home.HomeActionTone +import app.closer.ui.theme.CloserPalette +import app.closer.ui.theme.isCloserDarkTheme + +/** + * Shared low-level style kit for the Home cards — glyph/art resolution, the icon wrapper, the pill, + * and the per-tone color set. Extracted from HomeScreen.kt so every Home component cluster + * (`HomePrimaryCards`, `HomeStatusStrip`, `HomeActionFeed`, …) can reuse it. Pure/theme-only, no state. + */ + +@DrawableRes +fun homeActionGlyph(target: HomeActionTarget): Int = when (target) { + HomeActionTarget.InvitePartner -> R.drawable.glyph_couple + HomeActionTarget.DailyQuestion -> R.drawable.glyph_daily_card + HomeActionTarget.AnswerHistory -> R.drawable.glyph_paired_cards + HomeActionTarget.QuestionPacks -> R.drawable.glyph_question_packs + HomeActionTarget.Settings -> R.drawable.glyph_settings + HomeActionTarget.AnswerReveal -> R.drawable.glyph_sealed_answer + HomeActionTarget.Game -> R.drawable.glyph_closer_heart_keyhole + HomeActionTarget.Challenge -> R.drawable.glyph_connection_challenge + HomeActionTarget.DatePlan -> R.drawable.glyph_date_card_heart + HomeActionTarget.MemoryCapsule -> R.drawable.glyph_memory_capsule + HomeActionTarget.DateMemories -> R.drawable.glyph_date_replay + HomeActionTarget.WeeklyRecap -> R.drawable.glyph_paired_cards +} + +@Composable +fun HomeGlyphIcon( + @DrawableRes resId: Int, + contentDescription: String?, + tint: Color, + modifier: Modifier = Modifier +) { + Icon( + imageVector = ImageVector.vectorResource(resId), + contentDescription = contentDescription, + tint = tint, + modifier = modifier + ) +} + +@DrawableRes +fun homePrimaryArt(target: HomeActionTarget): Int? = when (target) { + HomeActionTarget.DailyQuestion, + HomeActionTarget.AnswerReveal -> R.drawable.illustration_home_tonight_ritual + HomeActionTarget.Challenge -> R.drawable.illustration_connection_challenges_header + else -> null +} + +data class HomeActionColors( + val soft: Color, + val accent: Color, + val deep: Color, + val onAccent: Color +) + +@Composable +fun HomeActionTone.actionColors(): HomeActionColors { + val scheme = MaterialTheme.colorScheme + if (isCloserDarkTheme()) { + return when (this) { + HomeActionTone.Daily, + HomeActionTone.Ritual, + HomeActionTone.Starter, + HomeActionTone.Pack -> HomeActionColors( + soft = scheme.secondaryContainer, + accent = scheme.secondary, + deep = scheme.secondary, + onAccent = scheme.onSecondary + ) + HomeActionTone.Reflection -> HomeActionColors( + soft = scheme.tertiaryContainer, + accent = scheme.tertiary, + deep = scheme.tertiary, + onAccent = scheme.onTertiary + ) + else -> HomeActionColors( + soft = scheme.primaryContainer, + accent = scheme.primary, + deep = scheme.primary, + onAccent = scheme.onPrimary + ) + } + } + + return when (this) { + HomeActionTone.Invite -> HomeActionColors( + soft = CloserPalette.PurpleSoft, + accent = MaterialTheme.colorScheme.primary, + deep = CloserPalette.PurpleDeep, + onAccent = MaterialTheme.colorScheme.onPrimary + ) + HomeActionTone.Daily -> HomeActionColors( + soft = CloserPalette.PinkSoft, + accent = CloserPalette.PinkBright, + deep = CloserPalette.PinkAccentDeep, + onAccent = Color(0xFF24122F) + ) + HomeActionTone.Reflection -> HomeActionColors( + soft = CloserPalette.PurpleGlow, + accent = CloserPalette.PurpleRich, + deep = CloserPalette.PurpleDeep, + onAccent = Color(0xFF24122F) + ) + HomeActionTone.Ritual -> HomeActionColors( + soft = CloserPalette.PurpleSoft, + accent = CloserPalette.PinkBright, + deep = CloserPalette.PinkAccentDeep, + onAccent = Color(0xFF24122F) + ) + HomeActionTone.Starter -> HomeActionColors( + soft = CloserPalette.PinkSoft, + accent = CloserPalette.PinkBright, + deep = CloserPalette.PinkAccentDeep, + onAccent = Color(0xFF24122F) + ) + HomeActionTone.Pack -> HomeActionColors( + soft = CloserPalette.PinkSoft, + accent = CloserPalette.PinkBright, + deep = CloserPalette.PinkAccentDeep, + onAccent = Color(0xFF24122F) + ) + HomeActionTone.Utility -> HomeActionColors( + soft = CloserPalette.PurpleSoft, + accent = MaterialTheme.colorScheme.primary, + deep = CloserPalette.PurpleDeep, + onAccent = MaterialTheme.colorScheme.onPrimary + ) + HomeActionTone.Pending -> HomeActionColors( + soft = CloserPalette.PurpleSoft, + accent = MaterialTheme.colorScheme.primary, + deep = CloserPalette.PurpleDeep, + onAccent = MaterialTheme.colorScheme.onPrimary + ) + } +} + +@Composable +fun HomePill(label: String) { + CloserPill( + label = label, + containerColor = if (isCloserDarkTheme()) { + MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.78f) + } else { + CloserPalette.PinkMist.copy(alpha = 0.72f) + }, + contentColor = MaterialTheme.colorScheme.onSurface + ) +}