Repository navigation
feat(mobile): HIG and system-UI pass: glass sidebar, bottom search, chat soft edge, native dialogs and menus - #2333
Merged
Merged
Conversation
Issue: #2107 Agent-Task: codex/local/01a145db-40f8-7e41-bc55-a7bd997b525b
Issue: #2107 Agent-Task: codex/local/01a145db-40f8-7e41-bc55-a7bd997b525b
Issue: #2107 Agent-Task: codex/local/01a145db-40f8-7e41-bc55-a7bd997b525b
Refs #2107; native regression found the text Close clipped in the fixed iOS toolbar.
Issue: #2107 Agent-Task: codex/local/01a145db-40f8-7e41-bc55-a7bd997b525b Claim: #2107 (comment)
Issue: #2107 Agent-Task: codex/local/01a145db-40f8-7e41-bc55-a7bd997b525b Claim: #2107 (comment)
Issue: #2107 Agent-Task: codex/local/01a145db-40f8-7e41-bc55-a7bd997b525b Claim: #2107 (comment)
Issue: #2107 Agent-Task: codex/local/01a145db-40f8-7e41-bc55-a7bd997b525b
…er sheets; say 活动 in Chinese Activity Settings, the pairing sheet and the Activity filter sheet now open with the shared DrawerHeader (glass capsule title and close button on iOS), the same header the first-run privacy notice uses. Pairing becomes a form sheet. Chinese Activity copy now says 活动 throughout and drops leftover English. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
On iOS, a formSheet that holds a nested Stack opens with nothing in it (#2107): only the grabber shows and the accessibility tree is empty. Settings is the only sheet with a nested Stack, so on iOS it now opens as a modal. The title capsule, close button and nested pages work the same; Android keeps its sheet. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
…alogs Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
#2112 owns the blank-Settings fix (#2107) and its handle-only dismissal, so this PR no longer changes Settings: drop the modal presentation and the DrawerHeader close button there. The glass title for Settings follows once #2112 is on main. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
…HIG action sheets Every form field now uses a shared TextField on the field layer with a hairline edge, radius.md, a touch-height minimum and the iOS clear button. The search field leads with a magnifying glass and Activity search no longer shows two clear buttons on iOS. Unpair from Settings, removing a folder grant, resetting a computer's look, revoking a cloud agent or invitation and signing out of a cloud service now ask first. Item menus use an iOS action sheet with the destructive action last, instead of a centered alert. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
On iOS 26 with transparency allowed, the Computers / Cloud drawer is a floating glass panel inset from the screen edges with display-concentric corners. Rows are clear with an inset rounded highlight for the pressed row and the current Computer or workspace, and a Computer's ⋯ opens a native pull-down menu anchored to it. Older iOS, Reduce Transparency and Android keep the opaque drawer. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
The Chats search field moves out of the list header into a glass capsule just above the navigation island, where the thumb reaches it, as iOS 26 places search. It rides above the keyboard while typing, hides with the navigation on scroll, and keeps the navigation in place while searching. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
While the Chats search field is focused or holds a query, a circular close button beside it clears the query and dismisses the keyboard, as iOS 26 bottom search does. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
…nto claude/project-thread-ineaf6
Settings now opens with the same DrawerHeader capsule as the other sheets. It has no close button because #2112 dismisses the sheet with its drag handle. This branch merges #2112 so the batch simulator pass can test both together. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configuration
⛔ Files ignored due to path filters: 22
📒 Files selected for processing: 56
✨ 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_01Sy2JCiCuwenHdjoHUByCXM
Messages blur as well as fade under the chat header and composer using a gradient-masked system material, and the back button, title capsule and trailing header button sit on Liquid Glass instead of a frosted fill. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Vain chose leading placement after the HIG sheet audit on #2324. The close button now comes before the glass title capsule, which matches the single-step Cancel/Close placement in OVERLAYS.md. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
… menus Vain chose system components over the app-drawn OCAT dialog. AppDialogHost now renders the @expo/ui Compose AlertDialog: Cancel in the dismiss slot, the action in the confirm slot, menu choices as text buttons in the body, with the existing request-id, pending and retry state unchanged. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Generalises the Host drawer's native ⋯ menu into ActionMenuButton (SwiftUI pull-down on iOS, Material dropdown on Android) and uses it for the group member menu, closing both iOS gaps that DESIGN.md listed. Merges main's Native first and iOS menus rules with the Android system dialogs. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
…pple, consequence text on cloud confirmations From the Android Material 3 audit: unanchored menus are a modal bottom sheet of list items instead of buttons inside an AlertDialog; the ⋯ dropdown separates its destructive item and uses a borderless ripple; sign-out and revoke confirmations now state what happens. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
SF Symbols on iOS and Material Symbols on Android lead each Settings row, following the reference Vain shared. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Vain chose the iOS 26 system-sheet layout: close (×) on the leading side, the glass title centred, and an optional confirm (✓) on the trailing side for sheets that commit a change. Empty slots keep their width so the title stays centred, including on Settings, which has no close button. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Sy2JCiCuwenHdjoHUByCXM
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Settings, Pair, Activity filter and the statistics notice, light and dark, taken in the batch-49 Simulator pass. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Merge origin/claude/project-thread-ineaf6 (50d4123). The pairing sheet keeps the compact scan card and gains the leading-close DrawerHeader. Batch-49 fixes: - Group member ⋯ sits outside the row press (SettingsRow accessory), so it opens the native menu and is reachable by VoiceOver. - iOS tab labels stay on one line and shrink to fit at large text. - Chat edge material is full strength under the status bar, header and composer and only fades beyond them; the bottom fade spans the composer. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
Chats at default and largest text, search, sidebar, host and member menus, Unpair, DM header edge, pairing sheet and Activity tab, light and dark, from the batch-49 Simulator pass. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The SwiftUI edge material respected the safe area, so bubbles above the header stayed sharp. It now ignores the safe area and uses the thin material so text under the composer is no longer readable. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1
…-07shzq # Conflicts: # apps/mobile/DESIGN.md # apps/mobile/app/settings/_layout.tsx # apps/mobile/src/ui/settings-view.tsx
…-07shzq # Conflicts: # apps/mobile/app/pair.tsx # apps/mobile/src/ui/settings-view.tsx
DoodleBears
marked this pull request as ready for review
October 19, 2026 20:17
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-07shzq # Conflicts: # apps/mobile/src/ui/strings.ts
This was referenced Oct 19, 2026
Merged
DoodleBears
added a commit
that referenced
this pull request
Oct 20, 2026
Captured on the Xiaomi phone (Android 16, HyperOS 3, zh-CN) running a Release build of main d220792, light and dark: the Material chat composer with the keyboard open, the chat header, the Unpair confirmation dialog (cancelled, nothing unpaired) and the message actions menu. The same set is filed under each PR. Status bar, computer names and the keyboard suggestion strip are redacted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Contributor
Author
|
Android phone result: PASS (Xiaomi, Android 16 / HyperOS 3, isolated QA Host, deepseek-v4.1-flash), release build of main d220792 Screenshots: 2333-android-hig/phone (commit 73da8de): Generated by Claude Code |
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.
Requested by Vain · project thread
Why the change
The iOS app drifts from Apple's HIG for sidebars, search fields, text fields, alerts, action sheets and scroll views, and doesn't use iOS 26 Liquid Glass where the system would. Vain also set the project rule that system UI and system components are the standard on both iOS and Android wherever they fit.
Refs: HIG sidebars, tab bars, search fields, action sheets, alerts, text fields, scroll views. Merged with #2112, #2324 and #2341 on main.
Special things to note
@expo/uiSwiftUI and Jetpack Compose components already ship in SDK 58. Review focus: the floating search field's keyboard and scroll-chrome behaviour, the glass sidebar geometry, the chat edge blur, and the Android dialog's pending, Back and outside-tap behaviour.pnpm lint, mobiletscandoxfmt --checkpass.vitest apps/mobile/test: 842 passed, 9 skipped.thinmaterial.edgeFadeexception now also blurs on iOS 26.AlertDialogs, and menus without an anchor are Material bottom sheets.DESIGN.mdis amended for all of these.Change outline
TextFieldprimitive.SearchFieldleads with a magnifying glass.showActionMenu, which is an action sheet on iOS.Menu.EdgeMaterial).AlertDialogwith Cancel in the dismiss slot, and Material bottom-sheet menus.RowIcon: an SF Symbol on iOS, a Material Symbol on Android).SettingsRowaccessory, so the native menu opens and VoiceOver can reach it.iOS 26 screenshots (b9f692a; step 7 on d60bff0)
https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-1-chats-ax5-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-1-chats-ax5-dark.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-2-search-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-3-sidebar-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-3-sidebar-dark.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-4-host-menu-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-4-host-menu-dark.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-5-unpair-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-6-member-menu-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-6-member-menu-dark.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/b6837447c4594d605c42b9056dc24cca7a0531c8/.github/pr-screenshots/2333-ios-hig/after-7-dm-scrolled-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/b6837447c4594d605c42b9056dc24cca7a0531c8/.github/pr-screenshots/2333-ios-hig/after-7-dm-scrolled-dark.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-8-pairing-sheet-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-8-pairing-sheet-dark.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-9-activity-unselected-no-pending-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-9-activity-unselected-no-pending-dark.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-10-activity-selected-no-pending-light.png?raw=true"width="220">https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-10-activity-selected-no-pending-dark.png?raw=true"width="220">🤖 Generated with Claude Code
https://claude.ai/code/session_01Pfa9gqyZUnwgh2fwSFVQQ1