brand(art): wire Date Match A5 (empty + it's-a-match) + Memory Lane A4; add all new art to debug gallery

DateMatches empty -> illustration_date_match_empty; the "It is a match!" modal replaces
the heart-icon circle with illustration_date_match_success (celebration). Memory Lane
empty replaces the 📦 emoji with illustration_memory_lane_capsule. ArtPreviewScreen
(debug) now shows all 12 new illustrations via BrandIllustration so they're verifiable on
both themes without needing empty/match data. Verified live (gallery, dark): A10/A11/A12
tiles render crisp + on-brand; 0 FATAL. (Empty/match states need data not present on the
baseline couple; render path proven via the shared tile.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
null 2026-06-26 09:48:13 -05:00
parent 5d74858679
commit fb4620559b
4 changed files with 45 additions and 15 deletions

View File

@ -63,6 +63,8 @@ import app.closer.domain.model.DateCostLevel
import app.closer.domain.model.DateIdea
import app.closer.domain.model.DateMatch
import app.closer.domain.model.SwipeAction
import app.closer.R
import app.closer.ui.components.BrandIllustration
import app.closer.ui.components.EmptyState
import app.closer.ui.components.ErrorState
import app.closer.ui.components.LoadingState
@ -539,20 +541,11 @@ private fun MatchOverlay(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Surface(
shape = CircleShape,
color = closerSoftPinkColor(),
modifier = Modifier.size(72.dp)
) {
Box(contentAlignment = Alignment.Center) {
Icon(
imageVector = Icons.Filled.Favorite,
contentDescription = null,
modifier = Modifier.size(36.dp),
tint = Color(0xFF9B1B5A)
)
}
}
BrandIllustration(
res = R.drawable.illustration_date_match_success,
contentDescription = null,
modifier = Modifier.size(168.dp)
)
Text(
text = "It is a match!",

View File

@ -1,5 +1,6 @@
package app.closer.ui.dates
import app.closer.R
import app.closer.ui.theme.closerCardColor
import app.closer.ui.theme.closerBackgroundBrush
import app.closer.ui.theme.closerSoftPinkColor
@ -133,6 +134,7 @@ private fun DateMatchesContent(
append(state.partnerName ?: "your partner")
append(" both love the same one, it shows up here as a match.")
},
illustrationResId = R.drawable.illustration_date_match_empty,
modifier = Modifier.padding(top = 80.dp)
)
}

View File

@ -2,6 +2,7 @@ package app.closer.ui.debug
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
@ -24,6 +25,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import app.closer.R
import app.closer.ui.components.BrandIllustration
import app.closer.ui.components.CelebrationOverlay
import app.closer.ui.components.CloserActionButton
import app.closer.ui.components.CloserMarkLoader
@ -96,6 +98,33 @@ fun ArtPreviewScreen(onNavigate: (String) -> Unit = {}) {
}
}
Text(
text = "New brand illustrations",
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.SemiBold,
color = MaterialTheme.colorScheme.onSurface,
modifier = Modifier.fillMaxWidth().padding(top = 8.dp)
)
ArtCard("Pairing success (A1)") {
BrandIllustration(R.drawable.illustration_pairing_success, null, Modifier.size(200.dp), tile = false)
}
ArtCard("Connection Challenges header (A3)") {
BrandIllustration(
R.drawable.illustration_connection_challenges_header, null,
Modifier.fillMaxWidth().aspectRatio(16f / 9f)
)
}
ArtCard("Answer history empty (A2)") { BrandIllustration(R.drawable.illustration_answer_history_empty, null, Modifier.size(160.dp)) }
ArtCard("Memory Lane capsule (A4)") { BrandIllustration(R.drawable.illustration_memory_lane_capsule, null, Modifier.size(160.dp)) }
ArtCard("Date match — empty (A5)") { BrandIllustration(R.drawable.illustration_date_match_empty, null, Modifier.size(160.dp)) }
ArtCard("Date match — it's a match (A5)") { BrandIllustration(R.drawable.illustration_date_match_success, null, Modifier.size(160.dp)) }
ArtCard("Bucket list empty (A6)") { BrandIllustration(R.drawable.illustration_bucket_list_empty, null, Modifier.size(160.dp)) }
ArtCard("Messages empty (A8)") { BrandIllustration(R.drawable.illustration_messages_empty, null, Modifier.size(160.dp)) }
ArtCard("Quiet hours (A9)") { BrandIllustration(R.drawable.illustration_quiet_hours, null, Modifier.size(160.dp)) }
ArtCard("Past games empty (A10)") { BrandIllustration(R.drawable.illustration_past_games_empty, null, Modifier.size(160.dp)) }
ArtCard("Privacy / recovery (A11)") { BrandIllustration(R.drawable.illustration_privacy_recovery, null, Modifier.size(160.dp)) }
ArtCard("Account deletion (A12)") { BrandIllustration(R.drawable.illustration_account_deletion_goodbye, null, Modifier.size(160.dp)) }
CloserActionButton(
label = "Play the celebration",
onClick = { celebrate = true },

View File

@ -36,6 +36,8 @@ import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Card
import androidx.compose.material3.CardDefaults
import app.closer.R
import app.closer.ui.components.BrandIllustration
import app.closer.ui.components.CloserHeartLoader
import androidx.compose.material3.DatePicker
import androidx.compose.material3.DatePickerDialog
@ -549,7 +551,11 @@ private fun CapsuleListScreen(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
Text("📦", style = MaterialTheme.typography.displayMedium)
BrandIllustration(
res = R.drawable.illustration_memory_lane_capsule,
contentDescription = null,
modifier = Modifier.size(150.dp)
)
Text("No capsules yet", style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.SemiBold), color = MaterialTheme.colorScheme.onSurface)
Text("Write a note to your future selves — it'll stay sealed until the date you choose.", style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center)
Spacer(Modifier.height(8.dp))