feat(mobile): native iOS tab bar (NativeTabs) + real More screen#4273
feat(mobile): native iOS tab bar (NativeTabs) + real More screen#4273voska wants to merge 2 commits into
Conversation
…switch confirm - Add WorkspaceSwitcherButton: the active workspace's avatar in the tab-root header's leading slot (Inbox / My Issues / Chat), tappable to open the switcher. Slack/Linear/Notion pattern — you can always tell which workspace you're in, and switch from anywhere (not just the More tab). - Remove the Alert.alert confirm on workspace switch. The switcher is now a dedicated full-sheet list of clearly-labelled rows (not the old cramped popover), so an accidental tap isn't a real risk and the confirm was friction.
Replace the JS <Tabs> (react-navigation) with expo-router NativeTabs over react-native-screens — the real UITabBar: iOS 26 liquid glass, native blur, system selection spring + haptic, SF Symbols that fill on selection. No new native dep (react-native-screens already linked); no rebuild. 'More' becomes a real tab destination: a pushed iOS-list screen (account → settings, current workspace → switcher, Pinned / Issues / Projects). This removes the dropdown-popover hack (MoreTabDropdownAnchor, deleted) that only existed because the JS tab bar let us preventDefault a tab press — NativeTabs can't, and it no longer needs to.
|
@voska is attempting to deploy a commit to the IndexLabs Team on Vercel. A member of the Team first needs to authorize it. |
|
Thanks for reporting these. Our iOS app is still under review, and we’ll address these issues together before the public release. |
|
I have a few more coming! Mostly just some polish things to make it feel a bit more like a native iOS26 app |
|
Thanks a lot — really appreciate the contributions. We haven’t iterated much on the mobile app for a while, so before release we’ll do a focused pass to align the core logic with the desktop/web client. Some mobile interactions will naturally be different or simplified, but we’ll review these together then. |
|
Understood. Feel free to close any that don't make sense for you or feedback to change them - but I feel most of them should be a nice upgrade for UI/UX. I tried to keep them scoped tight |
What does this PR do?
Replaces the JS
<Tabs>(react-navigation) with expo-routerNativeTabsoverreact-native-screens— the real iOSUITabBar: iOS 26 liquid glass, native blur, the system selection spring + haptic, and SF Symbol icons that fill on selection. The JS tab bar couldn't render any of that."More" becomes a real tab destination — a pushed iOS-list screen (account → settings, Pinned / Issues / Projects) — replacing the old dropdown-popover hack (
MoreTabDropdownAnchor, deleted). That hack only existed because the JS tab bar let uspreventDefaulta tab press;NativeTabscan't, and it no longer needs to.No new native dependency (
react-native-screensis already linked); no rebuild required.Related Issue
N/A — native-feel + IA improvement; no tracking issue.
Closes #
Type of Change
Changes Made
(tabs)/_layout.tsx—NativeTabswith Inbox / My Issues / Chat / More (SF Symbols + unread badges)(tabs)/more.tsx— real More screen (account → settings, Pinned / Issues / Projects)components/nav/more-tab-dropdown.tsx— deleted (the dropdown hack). Net −262 lines.How to Test
UITabBar(liquid glass; selected tab shows the iOS 26 pill).Checklist
pnpm typecheckpasses; verified manually in the iOS SimulatorAI Disclosure
AI tool used: Claude Code
Prompt / approach: Adopted
expo-router/unstable-native-tabsfor the realUITabBar, and reworked "More" from a JS dropdown into a proper pushed screen (now possible sinceNativeTabscan't intercept the tab press, and the workspace switcher already moved to the header). Verified in the iOS Simulator.Screenshots
Before (JS tab bar + More dropdown) / after (native UITabBar + More screen):

Native tab bar (liquid-glass selected tab):
