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.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import app.closer.ui.components.BrandIllustration
import app.closer.ui.components.CelebrationOverlay import app.closer.ui.components.CelebrationOverlay
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -198,32 +199,18 @@ fun PairingSuccessScreen(
.align(Alignment.CenterEnd) .align(Alignment.CenterEnd)
.zIndex(1f) .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 modifier = Modifier
.size(60.dp) .size(132.dp)
.zIndex(2f) .zIndex(2f)
.align(Alignment.Center) .align(Alignment.Center)
.scale(pulse) .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)) 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.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.navigationBarsPadding
@ -43,7 +45,9 @@ import androidx.fragment.app.FragmentActivity
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import app.closer.R
import app.closer.data.local.RecoveryPhraseStore import app.closer.data.local.RecoveryPhraseStore
import app.closer.ui.components.BrandIllustration
import app.closer.domain.repository.SettingsRepository import app.closer.domain.repository.SettingsRepository
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
@ -161,6 +165,14 @@ fun SecurityScreen(
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp),
verticalArrangement = Arrangement.spacedBy(12.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( Card(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(16.dp), shape = RoundedCornerShape(16.dp),