Skip to content

Commit a7b76b7

Browse files
committed
Add the NavigationBar and NavigationBarItem composables and test them in the demo
The corresponding commit: huanshankeji/compose-html-material@414a42d
1 parent d4de7c3 commit a7b76b7

File tree

5 files changed

+161
-0
lines changed

5 files changed

+161
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.huanshankeji.compose.material3.ext
2+
3+
import androidx.compose.material3.NavigationBarItem
4+
import androidx.compose.runtime.Composable
5+
import com.huanshankeji.compose.foundation.layout.PlatformRowScope
6+
import com.huanshankeji.compose.toContentWithoutModifier
7+
import com.huanshankeji.compose.ui.Modifier
8+
9+
@Composable
10+
actual fun NavigationBar(
11+
modifier: Modifier,
12+
content: @Composable NavigationBarScope.() -> Unit
13+
) =
14+
androidx.compose.material3.NavigationBar(modifier.platformModifier) {
15+
NavigationBarScope(this).content()
16+
}
17+
18+
actual class NavigationBarScope(val rowScope: PlatformRowScope)
19+
20+
@Composable
21+
actual fun NavigationBarScope.NavigationBarItem(
22+
selected: Boolean,
23+
onClick: () -> Unit,
24+
selectedIcon: @Composable (Modifier) -> Unit,
25+
unselectedIcon: @Composable (Modifier) -> Unit,
26+
modifier: Modifier,
27+
enabled: Boolean,
28+
label: String?,
29+
alwaysShowLabel: Boolean
30+
) =
31+
rowScope.NavigationBarItem(
32+
selected,
33+
onClick,
34+
(if (selected) selectedIcon else unselectedIcon).toContentWithoutModifier(),
35+
modifier.platformModifier,
36+
enabled,
37+
label.toNullableInlineText(),
38+
alwaysShowLabel
39+
)
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.huanshankeji.compose.material3.ext
2+
3+
import androidx.compose.runtime.Composable
4+
import com.huanshankeji.compose.material.icons.Icon
5+
import com.huanshankeji.compose.ui.Modifier
6+
7+
@Composable
8+
expect fun NavigationBar(
9+
modifier: Modifier = Modifier,
10+
content: @Composable NavigationBarScope.() -> Unit
11+
)
12+
13+
expect class NavigationBarScope
14+
15+
@Composable
16+
expect fun NavigationBarScope.NavigationBarItem(
17+
selected: Boolean,
18+
onClick: () -> Unit,
19+
selectedIcon: @Composable (Modifier) -> Unit,
20+
unselectedIcon: @Composable (Modifier) -> Unit = selectedIcon,
21+
modifier: Modifier = Modifier,
22+
enabled: Boolean = true,
23+
label: String? = null,
24+
alwaysShowLabel: Boolean = true,
25+
)
26+
27+
@Composable
28+
fun NavigationBarScope.NavigationBarItemWithMaterialIcons(
29+
selected: Boolean,
30+
onClick: () -> Unit,
31+
selectedIcon: Icon,
32+
unselectedIcon: Icon = selectedIcon,
33+
modifier: Modifier = Modifier,
34+
enabled: Boolean = true,
35+
label: String? = null,
36+
alwaysShowLabel: Boolean = true,
37+
) =
38+
NavigationBarItem(
39+
selected,
40+
onClick,
41+
selectedIcon.toContentWithModifier(),
42+
unselectedIcon.toContentWithModifier(),
43+
modifier,
44+
enabled,
45+
label,
46+
alwaysShowLabel
47+
)

compose-multiplatform-material3/src/commonMain/kotlin/com/huanshankeji/compose/material3/ext/Text.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ fun String.toTextWithModifier(): @Composable (Modifier) -> Unit =
2424

2525
fun String?.toNullableTextWithModifier(): @Composable ((Modifier) -> Unit)? =
2626
this?.toTextWithModifier()
27+
28+
fun String.toInlineText(): @Composable () -> Unit =
29+
{ InlineText(this) }
30+
31+
fun String?.toNullableInlineText(): @Composable (() -> Unit)? =
32+
this?.toInlineText()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.huanshankeji.compose.material3.ext
2+
3+
import androidx.compose.runtime.Composable
4+
import com.huanshankeji.compose.html.material3.MaterialWebLabsApi
5+
import com.huanshankeji.compose.html.material3.MdNavigationBar
6+
import com.huanshankeji.compose.html.material3.MdNavigationTab
7+
import com.huanshankeji.compose.html.material3.MdNavigationTabScope
8+
import com.huanshankeji.compose.ui.Modifier
9+
import com.huanshankeji.compose.ui.PlatformModifier
10+
import com.huanshankeji.compose.ui.toAttrs
11+
import com.huanshankeji.compose.ui.toCommonModifier
12+
import com.huanshankeji.compose.web.attributes.isFalseOrNull
13+
import com.huanshankeji.compose.web.attributes.isTrueOrNull
14+
import com.varabyte.kobweb.compose.ui.attrsModifier
15+
import org.jetbrains.compose.web.dom.ElementScope
16+
import org.w3c.dom.HTMLElement
17+
18+
@Composable
19+
actual fun NavigationBar(
20+
modifier: Modifier,
21+
content: @Composable NavigationBarScope.() -> Unit
22+
) =
23+
@OptIn(MaterialWebLabsApi::class)
24+
MdNavigationBar(attrs = modifier.toAttrs()) {
25+
NavigationBarScope(this).content()
26+
}
27+
28+
actual class NavigationBarScope(val elementScope: ElementScope<HTMLElement>)
29+
30+
@Composable
31+
actual fun NavigationBarScope.NavigationBarItem(
32+
selected: Boolean,
33+
onClick: () -> Unit,
34+
selectedIcon: @Composable (Modifier) -> Unit,
35+
unselectedIcon: @Composable (Modifier) -> Unit,
36+
modifier: Modifier,
37+
enabled: Boolean,
38+
label: String?,
39+
alwaysShowLabel: Boolean
40+
) =
41+
@OptIn(MaterialWebLabsApi::class)
42+
MdNavigationTab(
43+
enabled.isFalseOrNull(),
44+
selected.isTrueOrNull(),
45+
alwaysShowLabel.isFalseOrNull(),
46+
label,
47+
attrs = modifier.toAttrs()
48+
) {
49+
selectedIcon(PlatformModifier.attrsModifier { slot(MdNavigationTabScope.Slot.ActiveIcon) }.toCommonModifier())
50+
unselectedIcon(
51+
PlatformModifier.attrsModifier { slot(MdNavigationTabScope.Slot.InactiveIcon) }.toCommonModifier()
52+
)
53+
}

demo/src/commonMain/kotlin/com/huanshankeji/compose/material/demo/Material3.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,5 +164,21 @@ fun Material3(modifier: Modifier) {
164164
ElevatedCard { Text("elevated card", contentPaddingModifier) }
165165
OutlinedCard { Text("outlined card", contentPaddingModifier) }
166166
}
167+
168+
var selectedIndex by remember { mutableStateOf(0) }
169+
NavigationBar {
170+
NavigationBarItemWithMaterialIcons(
171+
selectedIndex == 0,
172+
{ selectedIndex = 0 },
173+
Icons.Default.Add,
174+
label = "Add"
175+
)
176+
NavigationBarItemWithMaterialIcons(
177+
selectedIndex == 1,
178+
{ selectedIndex = 1 },
179+
Icons.Default.Remove,
180+
label = "Remove"
181+
)
182+
}
167183
}
168184
}

0 commit comments

Comments
 (0)