Skip to content

feat(mobile): native iOS tab bar (NativeTabs) + real More screen#4273

Open
voska wants to merge 2 commits into
multica-ai:mainfrom
voska:feat/native-tab-bar
Open

feat(mobile): native iOS tab bar (NativeTabs) + real More screen#4273
voska wants to merge 2 commits into
multica-ai:mainfrom
voska:feat/native-tab-bar

Conversation

@voska

@voska voska commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

Replaces the JS <Tabs> (react-navigation) with expo-router NativeTabs over react-native-screens — the real iOS UITabBar: 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 us preventDefault a tab press; NativeTabs can't, and it no longer needs to.

No new native dependency (react-native-screens is already linked); no rebuild required.

⚠️ Stacked on #4272 (workspace switcher). Please merge #4272 first; until then this PR's diff includes that branch's commit. Review the last commit here. Because the workspace switcher moved workspace context into the header, the More screen here deliberately omits a workspace row (no duplication).

Related Issue

N/A — native-feel + IA improvement; no tracking issue.

Closes #

Type of Change

  • New feature (non-breaking change that adds functionality)
  • Refactor / code improvement

Changes Made

  • (tabs)/_layout.tsxNativeTabs with 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.tsxdeleted (the dropdown hack). Net −262 lines.

How to Test

  1. Open the app on iOS — the bottom tab bar is the native UITabBar (liquid glass; selected tab shows the iOS 26 pill).
  2. Tap More → it pushes the More list screen (no popover).
  3. Inbox / Chat unread badges still appear on their tabs.

Checklist

  • If this change affects the UI, I have included before/after screenshots
  • pnpm typecheck passes; verified manually in the iOS Simulator
  • No automated test — native tab bar / navigation
  • No new runtime/tool/UI tab added that needs landing-copy sync (More was an existing tab)

AI Disclosure

AI tool used: Claude Code

Prompt / approach: Adopted expo-router/unstable-native-tabs for the real UITabBar, and reworked "More" from a JS dropdown into a proper pushed screen (now possible since NativeTabs can'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):
Tab bar before/after

Native tab bar (liquid-glass selected tab):
Native tab bar

voska added 2 commits June 17, 2026 16:21
…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.
@vercel

vercel Bot commented Jun 17, 2026

Copy link
Copy Markdown

@voska is attempting to deploy a commit to the IndexLabs Team on Vercel.

A member of the Team first needs to authorize it.

@NevilleQingNY

Copy link
Copy Markdown
Collaborator

Thanks for reporting these. Our iOS app is still under review, and we’ll address these issues together before the public release.

@voska

voska commented Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

I have a few more coming! Mostly just some polish things to make it feel a bit more like a native iOS26 app

@NevilleQingNY

Copy link
Copy Markdown
Collaborator

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.

@voska

voska commented Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants