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:
parent
86679752b0
commit
9b1e946ed8
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue