brand(art): pairing-success hero -> A1 celebration; Security header -> A11 privacy-lock

PairingSuccessScreen replaces the white-keyhole app-icon chip joining the two partner
avatars with the illustration_pairing_success celebration (transparent, tile=false,
keeps the spring + pulse) so the "you're connected" beat shows the mark resolving with a
burst of hearts. SecurityScreen gains the illustration_privacy_recovery scene at the top.
Verified live: Security on dark (warm privacy-lock, not cold vault); A1 confirmed in the
debug gallery (transparent floats cleanly). 0 FATAL. Pairing-success needs a fresh pairing
to see in situ; A1 render proven via gallery.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
null 2026-06-26 09:57:26 -05:00
parent 86679752b0
commit 9b1e946ed8
2 changed files with 21 additions and 22 deletions

View File

@ -42,6 +42,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.Color
import app.closer.ui.components.BrandIllustration
import app.closer.ui.components.CelebrationOverlay
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
@ -198,32 +199,18 @@ fun PairingSuccessScreen(
.align(Alignment.CenterEnd)
.zIndex(1f)
)
Box(
// Celebration: the Closer mark resolving into place with a burst of hearts,
// floating over where the two partners meet.
BrandIllustration(
res = R.drawable.illustration_pairing_success,
contentDescription = null,
tile = false,
modifier = Modifier
.size(60.dp)
.size(132.dp)
.zIndex(2f)
.align(Alignment.Center)
.scale(pulse)
.clip(CircleShape)
.background(MaterialTheme.colorScheme.background)
.padding(4.dp)
.clip(CircleShape),
contentAlignment = Alignment.Center
) {
// White-keyhole app-icon chip: aubergine gradient + the brand mark.
Image(
painter = painterResource(R.drawable.ic_launcher_background),
contentDescription = null,
contentScale = ContentScale.Crop,
modifier = Modifier.matchParentSize()
)
Image(
painter = painterResource(R.drawable.ic_launcher_foreground),
contentDescription = null,
contentScale = ContentScale.Fit,
modifier = Modifier.matchParentSize()
)
}
)
}
Spacer(Modifier.height(32.dp))

View File

@ -7,7 +7,9 @@ import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding
@ -43,7 +45,9 @@ import androidx.fragment.app.FragmentActivity
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import app.closer.R
import app.closer.data.local.RecoveryPhraseStore
import app.closer.ui.components.BrandIllustration
import app.closer.domain.repository.SettingsRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
@ -161,6 +165,14 @@ fun SecurityScreen(
.padding(horizontal = 16.dp, vertical = 8.dp),
verticalArrangement = Arrangement.spacedBy(12.dp)
) {
Box(modifier = Modifier.fillMaxWidth(), contentAlignment = Alignment.Center) {
BrandIllustration(
res = R.drawable.illustration_privacy_recovery,
contentDescription = null,
modifier = Modifier.size(150.dp).padding(vertical = 4.dp)
)
}
Card(
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(16.dp),