You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Add bottom bar with Liquid Glass on iOS 26+ - #254
Uses a native UITabBar on iOS 26+ so it gets Liquid Glass, and the Material NavigationBar on Android and older iOS versions. Navigation itself is unchanged: tabs navigate on the existing single back stack.
New AppNavigationBar in core/ui. It only draws the bar: navigation stays the existing single back stack, with no tab containers.
Android and iOS < 26: Material NavigationBar (MaterialNavigationBar, with a Compose preview).
iOS 26+: native UITabBar (NativeTabBar), so it gets the Liquid Glass look. It's added through UIKitView with placedAsOverlay, so Compose positions it and measures its height.
Modifier: applied on every platform, including padding and position on iOS 26+.
Native tab bar behaviour: follows the app's dark mode and accent color, and updates its labels when the language changes. Native accessibility is on, so VoiceOver uses the native tab items.
BottomBarTab in shared defines the Home and Interop tabs.
NavigationRoot shows the bar only when a tab's screen is on top.
Switching tabs clears the back stack to Home.
Content scrolls behind the bar:
NavigationRoot provides the bar height as LocalAppNavigationBarHeight.
Screens add it as Scaffold bottomBar with AppNavigationBarSpacer, used in ScaffoldWithAppBar and SampleInteropScreen.
Snackbars stay above the bar.
New iOS utils in core/ui: isIosAtLeast() / isLiquidGlassAvailable and Color.toUIColor().
New resources: home_24 and extension_24 icons, and the navigation_tab_home / navigation_tab_interop strings.
Dutch translations
values-nl/strings.xml translates all strings except sample_lorem_ipsum.
Android:locales_config.xml and android:localeConfig, so the per-app language setting shows up (Android 13+).
iOS:CFBundleLocalizations (en, nl) in Info.plist, and nl in the Xcode project's knownRegions.
Sample app
Colored boxes and lorem ipsum on the sample home screen (SampleLoremIpsumBlocks), so there's content to see behind the glass.
The "Dummy content" title comes from the strings file (sample_dummy_content_title).
The platform greeting gets an (untranslated) prefix to show it doesn't follow the app language (SampleGetPlatformUserGreetingFlowUseCase).
Uses a native UITabBar on iOS 26+ so it gets Liquid Glass, and the
Material NavigationBar on Android and older iOS versions. Navigation
itself is unchanged: tabs navigate on the existing single back stack.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds two-tab bottom navigation for issue #201, using native Liquid Glass on iOS 26+ and Material navigation elsewhere, while retaining a single back stack.
Changes:
Adds shared navigation-bar components and platform implementations.
Connects Home and Interop tabs to navigation and content padding.
NavigationRoot no longer pads the content by the bar height. It provides
the height as LocalAppNavigationBarHeight instead, and screens add it as
Scaffold bottomBar via AppNavigationBarSpacer. Content now draws behind
the Liquid Glass bar while snackbars and FABs stay above it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Gives the home screen scrollable content, so the Liquid Glass effect of
the bottom bar is visible.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds values-nl strings and declares nl on both platforms (Android
localeConfig, iOS CFBundleLocalizations), so the per-app language setting
shows up and language changes can be tested. Also moves the hardcoded
"Dummy content" title to the strings file.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NativeTabBar now lays out a Compose placeholder with the caller's
modifier and pins the UITabBar to its bounds, so padding and positioning
work the same as on Android and iOS < 26.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the manual placeholder syncing with UIKitView placed as an
overlay. Compose now applies the modifier, positions the tab bar and
measures its height with Auto Layout. The tab bar requests a remeasure
when its safe area changes, so the height includes the bottom inset.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the caller supplies bottom or vertical padding, onSizeChanged runs inside that padding and reports less than the bar's total occupied height. NavigationRoot uses this value for AppNavigationBarSpacer, so content, snackbars and floating action buttons can overlap the raised Material bar. Place the callback before the incoming modifier so the reported height includes its padding.
The reason will be displayed to describe this comment to others. Learn more.
The system image is indeed referring to a built-in SF Symbol. All of our project use custom images. So after generating a project from the template, developers will change this to iosImageName and add their own images to the asset catalogue. It's a small thing, but still.
Tab bar labels don't grow with Dynamic Type. At the accessibility text
sizes a long press now shows the tab enlarged, like in a UITabBarController.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Uses a native UITabBar on iOS 26+ so it gets Liquid Glass, and the Material NavigationBar on Android and older iOS versions. Navigation itself is unchanged: tabs navigate on the existing single back stack.
Why is this important?
One of our projects needs it
What is included
Simulator.Recording.-.iPhone.17.Pro.-.2026-10-20.at.14.53.43.mp4
Bottom bar (CMP-201)
AppNavigationBarincore/ui. It only draws the bar: navigation stays the existing single back stack, with no tab containers.NavigationBar(MaterialNavigationBar, with a Compose preview).UITabBar(NativeTabBar), so it gets the Liquid Glass look. It's added throughUIKitViewwithplacedAsOverlay, so Compose positions it and measures its height.BottomBarTabinshareddefines the Home and Interop tabs.NavigationRootshows the bar only when a tab's screen is on top.NavigationRootprovides the bar height asLocalAppNavigationBarHeight.bottomBarwithAppNavigationBarSpacer, used inScaffoldWithAppBarandSampleInteropScreen.core/ui:isIosAtLeast()/isLiquidGlassAvailableandColor.toUIColor().home_24andextension_24icons, and thenavigation_tab_home/navigation_tab_interopstrings.Dutch translations
values-nl/strings.xmltranslates all strings exceptsample_lorem_ipsum.locales_config.xmlandandroid:localeConfig, so the per-app language setting shows up (Android 13+).CFBundleLocalizations(en, nl) inInfo.plist, andnlin the Xcode project'sknownRegions.Sample app
SampleLoremIpsumBlocks), so there's content to see behind the glass.sample_dummy_content_title).(untranslated)prefix to show it doesn't follow the app language (SampleGetPlatformUserGreetingFlowUseCase).Tested
Not tested
Notes
Fixes #201