feat: question pack library screen, pack art assets, iOS question views

This commit is contained in:
null 2026-06-22 13:45:48 -05:00
parent d96221c5c8
commit f350c91b55
22 changed files with 83 additions and 3 deletions

View File

@ -2,6 +2,7 @@ package app.closer.ui.questions
import app.closer.ui.theme.closerCardColor import app.closer.ui.theme.closerCardColor
import app.closer.ui.theme.closerBackgroundBrush import app.closer.ui.theme.closerBackgroundBrush
import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.horizontalScroll
@ -37,14 +38,18 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import app.closer.R
import app.closer.core.navigation.AppRoute import app.closer.core.navigation.AppRoute
import app.closer.domain.model.QuestionCategory import app.closer.domain.model.QuestionCategory
import app.closer.ui.components.CategoryGlyph import app.closer.ui.components.CategoryGlyph
@ -212,9 +217,23 @@ private fun QuestionPackCard(
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.height(5.dp) .height(94.dp)
.background(if (item.isLocked) Color(0xFFE3D4EB) else accent) .clip(RoundedCornerShape(topStart = 22.dp, topEnd = 22.dp))
) ) {
Image(
painter = painterResource(packArtworkRes(item.category.id)),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.fillMaxSize()
)
Box(
modifier = Modifier
.align(Alignment.BottomStart)
.fillMaxWidth()
.height(5.dp)
.background(if (item.isLocked) Color(0xFFE3D4EB) else accent)
)
}
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
@ -366,6 +385,33 @@ private fun packAccent(categoryId: String): Color {
return palette[kotlin.math.abs(categoryId.hashCode()) % palette.size] return palette[kotlin.math.abs(categoryId.hashCode()) % palette.size]
} }
private fun packArtworkRes(categoryId: String): Int = when (categoryId) {
"communication" -> R.drawable.pack_art_communication
"trust",
"boundaries",
"conflict",
"conflict_repair",
"rebuilding_trust" -> R.drawable.pack_art_trust_repair
"emotional_intimacy",
"gratitude",
"couple_intimacy" -> R.drawable.pack_art_intimacy
"fun",
"date_night",
"quality_time" -> R.drawable.pack_art_fun_date
"future",
"values" -> R.drawable.pack_art_future_goals
"home_life",
"stress" -> R.drawable.pack_art_home_life
"money" -> R.drawable.pack_art_money_values
"marriage",
"parenting" -> R.drawable.pack_art_family_commitment
"sex_and_desire",
"sexual_preferences",
"physical_intimacy" -> R.drawable.pack_art_desire
"difficult_conversations" -> R.drawable.pack_art_deep_reflection
else -> R.drawable.pack_art_deep_reflection
}
@Composable @Composable
private fun LoadingPackCard() { private fun LoadingPackCard() {
Card( Card(

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB

View File

@ -409,6 +409,13 @@ struct PackCard: View {
var body: some View { var body: some View {
VStack(alignment: .leading, spacing: CloserSpacing.sm) { VStack(alignment: .leading, spacing: CloserSpacing.sm) {
Image(packArtworkName(pack.id))
.resizable()
.scaledToFill()
.frame(maxWidth: .infinity)
.frame(height: 82)
.clipShape(RoundedRectangle(cornerRadius: CloserRadius.medium, style: .continuous))
CategoryGlyph(name: pack.name, color: .closerPrimary) CategoryGlyph(name: pack.name, color: .closerPrimary)
Text(pack.name) Text(pack.name)
@ -431,6 +438,33 @@ struct PackCard: View {
} }
} }
private func packArtworkName(_ packId: String) -> String {
switch packId {
case "communication":
return "pack-art-communication"
case "trust", "boundaries", "conflict", "conflict_repair", "rebuilding_trust":
return "pack-art-trust-repair"
case "emotional_intimacy", "gratitude", "couple_intimacy":
return "pack-art-intimacy"
case "fun", "date_night", "quality_time":
return "pack-art-fun-date"
case "future", "values":
return "pack-art-future-goals"
case "home_life", "stress":
return "pack-art-home-life"
case "money":
return "pack-art-money-values"
case "marriage", "parenting":
return "pack-art-family-commitment"
case "sex_and_desire", "sexual_preferences", "physical_intimacy":
return "pack-art-desire"
case "difficult_conversations":
return "pack-art-deep-reflection"
default:
return "pack-art-deep-reflection"
}
}
// MARK: - Question Category // MARK: - Question Category
struct QuestionCategoryView: View { struct QuestionCategoryView: View {

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 587 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 KiB