Repository navigation
feat(mobile): Material 3 navigation bar and creation FAB menu on Android - #2350
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8gcMTgoRjSRBNFswZT9T
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configuration
⛔ Files ignored due to path filters: 9
📒 Files selected for processing: 11
✨ Finishing Touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8gcMTgoRjSRBNFswZT9T
Captured on a Xiaomi phone (Android 16, HyperOS 3, arm64, gesture navigation, zh-CN) running an arm64 debug dev client of main 48f35fb with this branch's JavaScript, in light, dark and font scale 2.0. Chats with the new navigation bar and FAB, the FAB menu open, and Activity without a FAB. Status bar and computer names are redacted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
DoodleBears
marked this pull request as ready for review
October 20, 2026 07:38
Main moved Chats search into the header, so the bottom search field is gone. The Android FAB now sits 16dp above the navigation bar. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SJ8gcMTgoRjSRBNFswZT9T
Retaken on the Xiaomi phone (Android 16, HyperOS 3, zh-CN) with this branch's latest JavaScript (d440cc8) on an arm64 debug dev client of main d32694a, in light, dark and font scale 2.0. Replaces chats-* and fab-menu-* (light, dark, font) only. Status bar and computer names redacted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
At text size 2.0 the Activity tabs broke words across lines (待你处 / 理). Android now keeps each label on one line, as Material 3 tabs do, and shrinks it to the navigation bar's label scale floor. iOS still wraps. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QbudM552v4qrLMzopz7j7k
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QbudM552v4qrLMzopz7j7k
Root tsc includes apps/mobile/test/*.ts, and this test's react-native shim pulled DOM timer types into the packages. Mobile tests that use the shim are .tsx, which the root config excludes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QbudM552v4qrLMzopz7j7k
Main already keeps Activity tab labels on one line at large text, so this PR drops its own Android-only version of that fix. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QbudM552v4qrLMzopz7j7k
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
🤖 Generated with Claude Code
https://claude.ai/code/session_01SJ8gcMTgoRjSRBNFswZT9T
Why the change
Android drew the iOS-style floating island with a round + next to it. Material 3 uses a docked navigation bar and a FAB for the screen's main create action.
Before: on Android, the tabs sat in a floating rounded island, and a separate circle + opened a create panel in the island's place.
After: on Android, a docked full-width M3 flexible navigation bar is 64dp tall, edge to edge, with a 56×32 pill indicator, 4dp icon–label gap and 12sp labels. Chats shows a 56dp FAB with 16dp corners at the bottom right, 16dp above the navigation bar. It opens an M3 FAB menu: the FAB turns into a round close button, and New channel, New Bot and Join stack above it as full-pill items. iOS is unchanged.
Refs #2339, #2338. Builds on #2333 (now in main), whose Activity badge rule is kept: a capped count replaces the bell when Activity is not selected and something is pending, and they never appear together.
Special things to note
bottom-navigation.tsx(Platform branch),navigation-destinations.tsx/navigation-icon.android.tsx, the newcreation-panel.android.tsx. The shared creation state moved tocreation-menu.ts, so iOS uses the same logic.NavigationBarwraps only the baseline 80dp bar, which m3.material.io marks "not recommended", and it has no FAB menu. Both are RN views built to the official token values (md.comp.nav-bar.*,md.comp.fab.*,md.comp.fab-menu.*). This is recorded in DESIGN.md and as an amendment to ADR-0235.activity-font.png("待你处 / 理") is fixed on main by its own change, so this PR no longer carries a fix for it.pnpm lint(including CLI parity),pnpm format:check, root and mobiletsc --noEmit,vitest apps/mobile(144 files passed, 7 skipped).creation-fab-menu-android.test.tsxruns the creation-panel cases against the Android FAB menu, plus a Back step.Change outline
tokens.ts:materialNavigationBarandfab(from the m3.material.io token tables).bottom-navigation.tsx: Android docked bar and FAB; shareditems,createandpanel.creation-panel.android.tsx: FAB menu.creation-menu.ts: shared label and step logic.DESIGN.mdTabs section and the ADR-0235 amendment.Physical phone: Xiaomi, Android 16 / HyperOS 3, gesture navigation, Chinese UI. Debug dev client built from main 48f35fb with this branch's JS over Metro, paired to an isolated QA Host. Status bar and computer names redacted. Files are in
.github/pr-screenshots/2350-android-navbar/phone/on this branch (Files changed).chats-light.pngchats-dark.pngchats-font.pngfab-menu-light.pngfab-menu-dark.pngfab-menu-font.pngactivity-light.pngactivity-dark.pngactivity-font.pngChats and FAB menu retaken on
31a89dc0after the main merge: search is the header 🔍 left of ⚙, and the FAB sits 16dp above the navigation bar, in light, dark and text size 2.0.Result: PASS. Chats shows the docked bar and the FAB; the FAB menu opens with New channel, New Bot and Join; Activity has no FAB.
Generated by Claude Code
Summary by CodeRabbit
New Features
Documentation