Skip to content

Commit fe11fac

Browse files
authored
feat(ui): optional frosted liquid-glass on app-bar action chrome (#1249)
CircularIconButton gains an optional hazeState — when supplied it frosts whatever content scrolls beneath the bar (clip precedes hazeEffect so the blur is bounded to the circle); flat translucent fill when null. AppBarDefaults.UpNavigation/Close/Share and AppBarWithTitle thread the optional hazeState. Fully backward-compatible (default null = current look).
1 parent 359614a commit fe11fac

2 files changed

Lines changed: 39 additions & 7 deletions

File tree

‎ui/components/src/main/kotlin/com/getcode/ui/components/CircularIconButton.kt‎

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.getcode.ui.components
22

33
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.border
45
import androidx.compose.foundation.layout.Box
56
import androidx.compose.foundation.layout.size
67
import androidx.compose.foundation.shape.CircleShape
@@ -9,12 +10,18 @@ import androidx.compose.ui.Alignment
910
import androidx.compose.ui.Modifier
1011
import androidx.compose.ui.draw.clip
1112
import androidx.compose.ui.graphics.Color
13+
import androidx.compose.ui.graphics.lerp
1214
import androidx.compose.ui.platform.testTag
1315
import androidx.compose.ui.unit.Dp
1416
import androidx.compose.ui.unit.dp
1517
import com.getcode.ui.components.AppBarDefaults.IconSize
1618
import androidx.compose.foundation.clickable
1719
import com.getcode.theme.CodeTheme
20+
import dev.chrisbanes.haze.HazeState
21+
import dev.chrisbanes.haze.blur.HazeBlurStyle
22+
import dev.chrisbanes.haze.blur.HazeColorEffect
23+
import dev.chrisbanes.haze.blur.blurEffect
24+
import dev.chrisbanes.haze.hazeEffect
1825

1926
private val ButtonSize: Dp
2027
@Composable get() = CodeTheme.dimens.staticGrid.x8
@@ -26,15 +33,35 @@ fun CircularIconButton(
2633
modifier: Modifier = Modifier,
2734
imageSize: Dp = IconSize,
2835
buttonSize: Dp = ButtonSize,
36+
hazeState: HazeState? = null,
2937
onClick: () -> Unit,
3038
testTag: String? = null,
3139
content: @Composable (Dp) -> Unit,
3240
) {
41+
// When a HazeState is supplied the button frosts whatever content scrolls beneath the app bar
42+
// (iOS "liquid glass"), matching the v2 nav pill; `clip` precedes `hazeEffect` so the blur is
43+
// bounded to the circle. Falls back to the flat translucent fill when no HazeState is supplied.
44+
val fill = if (hazeState != null) {
45+
val glassTint = lerp(CodeTheme.colors.background, Color.White, 0.18f)
46+
val liquidGlass = HazeBlurStyle(
47+
blurRadius = CodeTheme.dimens.grid.x4,
48+
backgroundColor = CodeTheme.colors.background,
49+
colorEffect = HazeColorEffect.tint(glassTint.copy(alpha = 0.72f)),
50+
)
51+
Modifier
52+
.clip(CircleShape)
53+
.hazeEffect(hazeState) { blurEffect { style = liquidGlass } }
54+
.border(CodeTheme.dimens.border, Color.White.copy(alpha = 0.08f), CircleShape)
55+
} else {
56+
Modifier
57+
.background(ButtonBackground, CircleShape)
58+
.clip(CircleShape)
59+
}
60+
3361
Box(
3462
modifier = modifier
3563
.size(buttonSize)
36-
.background(ButtonBackground, CircleShape)
37-
.clip(CircleShape)
64+
.then(fill)
3865
.clickable { onClick() }
3966
.then(if (testTag != null) Modifier.testTag(testTag) else Modifier),
4067
contentAlignment = Alignment.Center,

‎ui/components/src/main/kotlin/com/getcode/ui/components/TitleBar.kt‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import androidx.compose.ui.text.style.TextOverflow
3232
import androidx.compose.ui.tooling.preview.Preview
3333
import androidx.compose.ui.unit.dp
3434
import com.getcode.navigation.core.LocalCodeNavigator
35+
import dev.chrisbanes.haze.HazeState
3536
import com.getcode.navigation.flow.FlowDismissStyle
3637
import com.getcode.navigation.flow.LocalFlowDismissStyle
3738
import com.getcode.navigation.scenes.LocalSheetNavigator
@@ -51,9 +52,10 @@ object AppBarDefaults {
5152
internal val IconSize = 20.dp
5253

5354
@Composable
54-
fun UpNavigation(modifier: Modifier = Modifier, onClick: () -> Unit) {
55+
fun UpNavigation(modifier: Modifier = Modifier, hazeState: HazeState? = null, onClick: () -> Unit) {
5556
CircularIconButton(
5657
modifier = modifier,
58+
hazeState = hazeState,
5759
onClick = onClick,
5860
testTag = "action_back"
5961
) { size ->
@@ -67,9 +69,10 @@ object AppBarDefaults {
6769
}
6870

6971
@Composable
70-
fun Close(modifier: Modifier = Modifier, onClick: () -> Unit) {
72+
fun Close(modifier: Modifier = Modifier, hazeState: HazeState? = null, onClick: () -> Unit) {
7173
CircularIconButton(
7274
modifier = modifier,
75+
hazeState = hazeState,
7376
onClick = onClick,
7477
testTag = "action_close"
7578
) { size ->
@@ -83,9 +86,10 @@ object AppBarDefaults {
8386
}
8487

8588
@Composable
86-
fun Share(modifier: Modifier = Modifier, onClick: () -> Unit) {
89+
fun Share(modifier: Modifier = Modifier, hazeState: HazeState? = null, onClick: () -> Unit) {
8790
CircularIconButton(
8891
modifier = modifier,
92+
hazeState = hazeState,
8993
onClick = onClick,
9094
testTag = "action_share"
9195
) { size ->
@@ -190,6 +194,7 @@ fun AppBarWithTitle(
190194
titleAlignment: Alignment.Horizontal = Alignment.Start,
191195
contentPadding: PaddingValues = AppBarDefaults.ContentPadding,
192196
onBackIconClicked: (() -> Unit)? = null,
197+
hazeState: HazeState? = null,
193198
endContent: @Composable RowScope.() -> Unit = { },
194199
) {
195200
val navigator = LocalCodeNavigator.current
@@ -215,7 +220,7 @@ fun AppBarWithTitle(
215220
contentPadding = contentPadding,
216221
leftIcon = {
217222
if (showBack && !showClose) {
218-
AppBarDefaults.UpNavigation { onBackIconClicked() }
223+
AppBarDefaults.UpNavigation(hazeState = hazeState) { onBackIconClicked() }
219224
}
220225
},
221226
titleRegion = {
@@ -229,7 +234,7 @@ fun AppBarWithTitle(
229234
rightContents = {
230235
endContent()
231236
if (showClose) {
232-
AppBarDefaults.Close { onBackIconClicked() }
237+
AppBarDefaults.Close(hazeState = hazeState) { onBackIconClicked() }
233238
}
234239
},
235240
)

0 commit comments

Comments
 (0)