Skip to content

NavigationBar ​

NavigationBar is a bottom navigation bar component in Miuix, used to create navigation menus fixed at the bottom of applications. It supports 2 to 5 navigation items, offering different display modes (icon only, icon and text, icon with selected label).

FloatingNavigationBar is a floating-style bottom navigation bar component, also supporting 2 to 5 navigation items, showing icons only.

These components are typically used in conjunction with the Scaffold component to maintain consistent layout and behavior across different pages in the application.

Import ​

kotlin
import top.yukonga.miuix.kmp.basic.NavigationBar
import top.yukonga.miuix.kmp.basic.NavigationBarDefaults
import top.yukonga.miuix.kmp.basic.NavigationBarItem
import top.yukonga.miuix.kmp.basic.FloatingNavigationBar
import top.yukonga.miuix.kmp.basic.FloatingNavigationBarItem
import top.yukonga.miuix.kmp.basic.NavigationBarDisplayMode

Basic Usage ​

The NavigationBar component can be used to create bottom navigation menus fixed to the bottom:

kotlin
var selectedIndex by remember { mutableStateOf(0) }
val items = listOf("Home", "Profile", "Settings")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)

Scaffold(
    bottomBar = {
        NavigationBar {
            items.forEachIndexed { index, label ->
                NavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
)

FloatingNavigationBar ​

The FloatingNavigationBar component can be used to create floating navigation menus at the bottom:

kotlin
var selectedIndex by remember { mutableStateOf(0) }
val items = listOf("Home", "Profile", "Settings")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)

Scaffold(
    bottomBar = {
        FloatingNavigationBar {
            items.forEachIndexed { index, label ->
                FloatingNavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
)

Custom Colors ​

Both item components accept colors from NavigationBarDefaults.navigationBarItemColors(). For example, use the theme's primary color for the selected item:

kotlin
val itemColors = NavigationBarDefaults.navigationBarItemColors(
    unselectedContentColor = MiuixTheme.colorScheme.onSurfaceContainer,
    selectedContentColor = MiuixTheme.colorScheme.primary,
)

NavigationBar {
    items.forEachIndexed { index, label ->
        NavigationBarItem(
            selected = selectedIndex == index,
            onClick = { selectedIndex = index },
            icon = icons[index],
            label = label,
            colors = itemColors,
        )
    }
}

Pass the same colors = itemColors to FloatingNavigationBarItem inside a FloatingNavigationBar to customize its icons.

Colors are base colors: their alpha is multiplied by 0.4 when unselected, 0.6 when unselected and pressed, and 0.5 when selected and pressed. Selected, unpressed content uses the supplied color unchanged. Color.Transparent stays transparent in every state.

Component States ​

Selected State ​

NavigationBarItem automatically handles the visual style of the selected item, displaying it with bold text and highlighting the icon/text. FloatingNavigationBarItem highlights the icon when selected.

Properties ​

Property NameTypeDescriptionDefault ValueRequired
modifierModifierModifier applied to the nav barModifierNo
colorColorBackground color of the nav barMiuixTheme.colorScheme.surfaceNo
showDividerBooleanShow top divider line or nottrueNo
defaultWindowInsetsPaddingBooleanApply default window insets paddingtrueNo
modeNavigationBarDisplayModeDisplay mode for itemsNavigationBarDisplayMode.IconAndTextNo
content@Composable RowScope.()The content of the nav bar-Yes
Property NameTypeDescriptionDefault ValueRequired
selectedBooleanWhether the item is selected-Yes
onClick() -> UnitCallback when the item is clicked-Yes
iconImageVectorIcon of the item-Yes
labelStringLabel of the item-Yes
modifierModifierModifier applied to the itemModifierNo
enabledBooleanWhether the item is enabledtrueNo
colorsNavigationBarItemColorsIcon and label base colorsNavigationBarDefaults.navigationBarItemColors()No
badge(@Composable () -> Unit)?Optional badge shown on the item's icon, e.g. a BadgenullNo

FloatingNavigationBar Properties ​

Property NameTypeDescriptionDefault ValueRequired
modifierModifierModifier applied to the nav barModifierNo
colorColorBackground color of the nav barMiuixTheme.colorScheme.surfaceContainerNo
cornerRadiusDpCorner radius of the nav barFloatingToolbarDefaults.CornerRadiusNo
horizontalAlignmentAlignment.HorizontalHorizontal alignment within its parentCenterHorizontallyNo
horizontalOutSidePaddingDpHorizontal padding outside the nav barFloatingNavigationBarDefaults.HorizontalOutSidePaddingNo
shadowElevationDpThe shadow elevation of the nav barFloatingNavigationBarDefaults.ShadowElevationNo
showDividerBooleanShow divider line around the nav barfalseNo
defaultWindowInsetsPaddingBooleanApply default window insets paddingtrueNo
content@Composable () -> UnitThe content of the nav bar-Yes

FloatingNavigationBarItem Properties ​

Property NameTypeDescriptionDefault ValueRequired
selectedBooleanWhether the item is selected-Yes
onClick() -> UnitCallback when the item is clicked-Yes
iconImageVectorIcon of the item-Yes
labelStringLabel of the item-Yes
modifierModifierModifier applied to the itemModifierNo
enabledBooleanWhether the item is enabledtrueNo
colorsNavigationBarItemColorsIcon and label base colorsNavigationBarDefaults.navigationBarItemColors()No
badge(@Composable () -> Unit)?Optional badge shown on the item's icon, e.g. a BadgenullNo

The NavigationBarDefaults object provides default values for NavigationBar and NavigationBarItem components.

Constants ​

Constant NameTypeDescriptionDefault Value
ItemHeightDpItem height64.dp
IconSizeDpIcon size26.dp
LabelFontSizeTextUnitLabel font size12.sp
IconTopPaddingDpTop padding for the icon8.dp
BottomPaddingDpBottom padding for the label8.dp
SelectedPressedAlphaFloatAlpha value for selected item when pressed0.5f
UnselectedPressedAlphaFloatAlpha value for unselected item when pressed0.6f
UnselectedAlphaFloatAlpha value for unselected item0.4f

A composable factory returning a remembered NavigationBarItemColors, shared by both navigation item components. Omitting colors preserves the default theme appearance.

ParameterTypeDescriptionDefault Value
unselectedContentColorColorBase color for unselected contentMiuixTheme.colorScheme.onSurfaceContainer
selectedContentColorColorBase color for selected contentMiuixTheme.colorScheme.onSurfaceContainer

FloatingNavigationBarDefaults Object ​

The FloatingNavigationBarDefaults object provides default values for FloatingNavigationBar and FloatingNavigationBarItem components.

Constants ​

Constant NameTypeDescriptionDefault Value
HorizontalOutSidePaddingDpHorizontal outside padding36.dp
ShadowElevationDpShadow elevation1.dp
HorizontalPaddingDpHorizontal padding inside the bar12.dp
ItemSpacingDpSpacing between items12.dp
IconSizeDpIcon size28.dp
IconPaddingDpPadding around the icon10.dp
SelectedPressedAlphaFloatAlpha for selected pressed item0.5f
UnselectedPressedAlphaFloatAlpha for unselected pressed item0.6f
UnselectedAlphaFloatAlpha for unselected item0.4f
ValueDescription
IconAndTextShow both icon and text
IconOnlyShow icon only
IconWithSelectedLabelShow icon always, show text only when selected

Advanced Usage ​

Custom Colors ​

kotlin
NavigationBar(
    color = Color.Red.copy(alpha = 0.3f)
) {
    // ... items ...
}

Without Divider ​

kotlin
NavigationBar(
    showDivider = false
) {
    // ... items ...
}

Handling Window Insets ​

kotlin
NavigationBar(
    defaultWindowInsetsPadding = false // Handle window insets padding manually
) {
    // ... items ...
}

FloatingNavigationBar ​

Custom Color and Corner Radius ​

kotlin
FloatingNavigationBar(
    color = MiuixTheme.colorScheme.primaryContainer,
    cornerRadius = 28.dp
) {
    // ... items ...
}

Custom Alignment and Padding ​

kotlin
FloatingNavigationBar(
    horizontalAlignment = Alignment.Start, // Align to start
    horizontalOutSidePadding = 16.dp // Set outside padding
) {
    // ... items ...
}

Using with Page Navigation (Using Scaffold) ​

Using NavigationBar ​

kotlin
val pages = listOf("Home", "Profile", "Settings")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        NavigationBar {
            pages.forEachIndexed { index, label ->
                NavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
) { paddingValues ->
    // Content area needs to consider padding
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "Current Page: ${pages[selectedIndex]}",
            style = MiuixTheme.textStyles.title1
        )
    }
}

Using FloatingNavigationBar ​

kotlin
val pages = listOf("Home", "Profile", "Settings")
val icons = listOf(MiuixIcons.VerticalSplit, MiuixIcons.Contacts, MiuixIcons.Settings)
var selectedIndex by remember { mutableStateOf(0) }

Scaffold(
    bottomBar = {
        FloatingNavigationBar {
            pages.forEachIndexed { index, label ->
                FloatingNavigationBarItem(
                    selected = selectedIndex == index,
                    onClick = { selectedIndex = index },
                    icon = icons[index],
                    label = label
                )
            }
        }
    }
) { paddingValues ->
    // Content area needs to consider padding
    Box(
        modifier = Modifier
            .fillMaxSize()
            .padding(paddingValues),
        contentAlignment = Alignment.Center
    ) {
        Text(
            text = "Current Page: ${pages[selectedIndex]}",
            style = MiuixTheme.textStyles.title1
        )
    }
}

Changelog

Released under the Apache-2.0 License