11package org.nsh07.nsh07.ui.homeScreen
22
33import androidx.compose.animation.*
4+ import androidx.compose.animation.core.FastOutLinearInEasing
45import androidx.compose.foundation.layout.*
56import androidx.compose.foundation.lazy.LazyColumn
67import androidx.compose.foundation.lazy.rememberLazyListState
78import androidx.compose.foundation.rememberScrollState
89import androidx.compose.foundation.verticalScroll
910import androidx.compose.material3.*
11+ import androidx.compose.material3.MaterialTheme.colorScheme
1012import androidx.compose.material3.MaterialTheme.motionScheme
1113import androidx.compose.material3.MaterialTheme.typography
14+ import androidx.compose.material3.TopAppBarDefaults.pinnedScrollBehavior
15+ import androidx.compose.material3.TopAppBarDefaults.topAppBarColors
1216import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
1317import androidx.compose.runtime.*
1418import androidx.compose.ui.Modifier
19+ import androidx.compose.ui.graphics.lerp
20+ import androidx.compose.ui.input.nestedscroll.nestedScroll
1521import androidx.compose.ui.platform.LocalLayoutDirection
1622import androidx.compose.ui.platform.LocalUriHandler
1723import androidx.compose.ui.unit.dp
1824import androidx.window.core.layout.WindowSizeClass
25+ import dev.chrisbanes.haze.HazeStyle
26+ import dev.chrisbanes.haze.hazeEffect
27+ import dev.chrisbanes.haze.hazeSource
28+ import dev.chrisbanes.haze.rememberHazeState
1929import kotlinx.coroutines.launch
2030
2131@OptIn(ExperimentalMaterial3ExpressiveApi ::class , ExperimentalMaterial3Api ::class )
@@ -129,6 +139,24 @@ fun AppHomeScreen(
129139 }
130140 }
131141 } else {
142+ val scrollBehavior = pinnedScrollBehavior()
143+ val hazeState = rememberHazeState(true )
144+ val topAppBarColors = topAppBarColors(
145+ containerColor = colorScheme.surface,
146+ scrolledContainerColor = colorScheme.surface
147+ )
148+
149+ val targetColor by remember(scrollBehavior) {
150+ derivedStateOf {
151+ val overlappingFraction = scrollBehavior.state.overlappedFraction
152+ lerp(
153+ topAppBarColors.containerColor,
154+ topAppBarColors.scrolledContainerColor,
155+ FastOutLinearInEasing .transform(if (overlappingFraction > 0.01f ) 1f else 0f ),
156+ )
157+ }
158+ }
159+
132160 Scaffold (
133161 topBar = {
134162 AnimatedVisibility (
@@ -168,10 +196,27 @@ fun AppHomeScreen(
168196 else -> Text (" About" )
169197 }
170198 }
171- }
199+ },
200+ scrollBehavior = scrollBehavior,
201+ colors = topAppBarColors.copy(
202+ scrolledContainerColor = topAppBarColors.scrolledContainerColor.copy(
203+ 0.7f
204+ )
205+ ),
206+ modifier = Modifier
207+ .hazeEffect(
208+ hazeState,
209+ style = HazeStyle (
210+ backgroundColor = targetColor,
211+ tint = null ,
212+ blurRadius = 20 .dp,
213+ noiseFactor = 0f
214+ )
215+ )
172216 )
173217 }
174- }
218+ },
219+ modifier = Modifier .nestedScroll(scrollBehavior.nestedScrollConnection)
175220 ) { innerPadding ->
176221 val layoutDirection = LocalLayoutDirection .current
177222 LazyColumn (
@@ -182,19 +227,17 @@ fun AppHomeScreen(
182227 end = innerPadding.calculateEndPadding(layoutDirection),
183228 bottom = 48 .dp
184229 ),
185- modifier = Modifier .fillMaxWidth().padding(horizontal = 8 .dp)
230+ modifier = Modifier .fillMaxWidth().padding(horizontal = 8 .dp).hazeSource(hazeState)
186231 ) {
187232 item { NameAndDesc (horizontalPadding = 16 .dp) }
188- item {
189- SocialIcons (Modifier .padding(top = 32 .dp, start = 12 .dp, end = 12 .dp))
190- Spacer (Modifier .height(96 .dp))
191- }
233+ item { SocialIcons (Modifier .padding(top = 32 .dp, start = 12 .dp, end = 12 .dp)) }
192234 mainContent(
193235 paragraphs,
194236 experiences,
195237 projectState,
196238 cardPadding,
197- uriHandler
239+ uriHandler,
240+ topPadding = 96 .dp
198241 )
199242 }
200243 }
0 commit comments