Skip to content

feat(mobile): HIG and system-UI pass: glass sidebar, bottom search, chat soft edge, native dialogs and menus - #2333

Merged
DoodleBears merged 45 commits into
mainfrom
claude/project-thread-07shzq
Oct 19, 2026
Merged

DoodleBears merged 45 commits into
mainfrom
claude/project-thread-07shzq

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

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

  • Merge risk: JS only. No native inputs or packages change: @expo/ui SwiftUI 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.
  • Verification:
    • pnpm lint, mobile tsc and oxfmt --check pass.
    • vitest apps/mobile/test: 842 passed, 9 skipped.
    • iOS 26 Simulator: batch 49 was re-run on b9f692a (screenshots below). Steps 1–6 and 8 pass, including "Chats" shrinking instead of wrapping at the largest text size, and the group member ⋯ opening the native pull-down menu with VoiceOver reaching it.
      • Step 7 was re-shot on d60bff0 and passes in light and dark. The status-bar strip above the header is fully covered by the blur, and text under the composer is no longer readable. The fix in 4b0f9c0 makes the edge material ignore the safe area and use the thin material.
      • Steps 9 and 10 show only the state with nothing pending: the runner could not create a pending item. The tab code renders the count in place of the bell when Activity is not selected and something is pending.
    • Android is unverified on a device or emulator. The Android shots are on the shared queue's deferred Android list.
  • CI test plan: affected (mobile only).
  • Drift from the documented design, decided by Vain in the project thread:
    • The chat's colour-only edgeFade exception now also blurs on iOS 26.
    • The Host and group member ⋯ menus are native: a pull-down on iOS and a Material dropdown on Android.
    • Android confirmations are Material 3 AlertDialogs, and menus without an anchor are Material bottom sheets.
    • The Activity tab shows the bell or the pending count, never both, on both platforms.
    • DESIGN.md is amended for all of these.

Change outline

  1. Components
    • One TextField primitive.
    • SearchField leads with a magnifying glass.
    • Six destructive actions now confirm first and state the consequence: Settings › Unpair, remove folder access, reset computer look, revoke cloud agent, revoke invitation and cloud sign-out.
    • Item menus use showActionMenu, which is an action sheet on iOS.
  2. Workspace sidebar
    • On iOS 26 it is a floating Liquid Glass panel with clear rows and an inset highlight on the pressed and current row.
    • ⋯ opens a native pull-down Menu.
    • Older iOS, Reduce Transparency and Android keep the opaque drawer.
  3. Bottom search
    • The Chats search field is a glass capsule just above the navigation island and rides above the keyboard.
    • A glass ✕ beside it clears the query.
  4. Chat soft scroll edge
    • On iOS 26, messages blur as well as fade under the status bar, the header and the composer (EdgeMaterial).
    • The header's buttons and title sit on Liquid Glass.
  5. Android system dialogs and menus
    • Material 3 AlertDialog with Cancel in the dismiss slot, and Material bottom-sheet menus.
    • A Material dropdown for ⋯.
  6. Settings rows lead with a system icon (RowIcon: an SF Symbol on iOS, a Material Symbol on Android).
  7. Pairing sheet fits on one screen:
    • a smaller scan area with a caption under it;
    • a caption under the paste-link field;
    • cloud sign-in as a text button.
  8. Activity tab: the bell or the capped pending count, never both, on iOS and Android.
  9. Group member ⋯ sits outside the row's press area, as a SettingsRow accessory, so the native menu opens and VoiceOver can reach it.
  10. Tab labels stay on one line and shrink to fit at large text on iOS.

iOS 26 screenshots (b9f692a; step 7 on d60bff0)

Screen Light Dark
Chats
Chats, largest text <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-1-chats-ax5-light.png?raw=true" width="220"> <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-1-chats-ax5-dark.png?raw=true" width="220">
Bottom search <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-2-search-light.png?raw=true" width="220">
Glass sidebar <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-3-sidebar-light.png?raw=true" width="220"> <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-3-sidebar-dark.png?raw=true" width="220">
Computer ⋯ menu <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-4-host-menu-light.png?raw=true" width="220"> <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-4-host-menu-dark.png?raw=true" width="220">
Unpair confirmation <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-5-unpair-light.png?raw=true" width="220">
Group member ⋯ menu <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-6-member-menu-light.png?raw=true" width="220"> <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-6-member-menu-dark.png?raw=true" width="220">
Chat soft edge <img src="https://github.com/BotHarness/DeepSeekBot/blob/b6837447c4594d605c42b9056dc24cca7a0531c8/.github/pr-screenshots/2333-ios-hig/after-7-dm-scrolled-light.png?raw=true" width="220"> <img src="https://github.com/BotHarness/DeepSeekBot/blob/b6837447c4594d605c42b9056dc24cca7a0531c8/.github/pr-screenshots/2333-ios-hig/after-7-dm-scrolled-dark.png?raw=true" width="220">
Pairing sheet <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-8-pairing-sheet-light.png?raw=true" width="220"> <img src="https://github.com/BotHarness/DeepSeekBot/blob/ad11c1a00c2ca892c58f76eddfb3da65ce24a51c/.github/pr-screenshots/2333-ios-hig/after-8-pairing-sheet-dark.png?raw=true" width="220">
Activity tab, not selected <img src="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"> <img src="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">
Activity tab, selected <img src="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"> <img src="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

DoodleBears and others added 23 commits October 18, 2026 03:49
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
@DoodleBears DoodleBears self-assigned this Oct 19, 2026
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
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
@coderabbitai

coderabbitai Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 1406926b-cfc5-4a83-932a-a8924cb32891
📥 Commits

Reviewing files that changed from the base of the PR and between 39c2d16 and 3d6d537.

⛔ Files ignored due to path filters: 22
  • .github/pr-screenshots/2333-ios-hig/after-1-chats-ax5-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-1-chats-ax5-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-1-chats-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-1-chats-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-10-activity-selected-no-pending-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-10-activity-selected-no-pending-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-2-search-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-2-search-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-3-sidebar-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-3-sidebar-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-4-host-menu-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-4-host-menu-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-5-unpair-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-5-unpair-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-6-member-menu-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-6-member-menu-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-7-dm-scrolled-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-7-dm-scrolled-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-8-pairing-sheet-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-8-pairing-sheet-light.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-9-activity-unselected-no-pending-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/2333-ios-hig/after-9-activity-unselected-no-pending-light.png is excluded by !**/*.png
📒 Files selected for processing: 56
  • apps/mobile/DESIGN.md
  • apps/mobile/app/(tabs)/(home)/index.tsx
  • apps/mobile/app/pair.tsx
  • apps/mobile/app/settings/index.tsx
  • apps/mobile/src/ui/chat/chat-title.tsx
  • apps/mobile/src/ui/chat/conversation-screen.tsx
  • apps/mobile/src/ui/chat/group-info.tsx
  • apps/mobile/src/ui/chat/header-chrome.tsx
  • apps/mobile/src/ui/chat/model-settings-screen.tsx
  • apps/mobile/src/ui/chat/question-card.tsx
  • apps/mobile/src/ui/chat/routine-sheet.tsx
  • apps/mobile/src/ui/chat/workspace-sheet.tsx
  • apps/mobile/src/ui/cloud/agents-screen.tsx
  • apps/mobile/src/ui/cloud/channels-screen.tsx
  • apps/mobile/src/ui/cloud/create-channel-screen.tsx
  • apps/mobile/src/ui/cloud/invitations-screen.tsx
  • apps/mobile/src/ui/cloud/join-screen.tsx
  • apps/mobile/src/ui/cloud/organizations-screen.tsx
  • apps/mobile/src/ui/cloud/services-screen.tsx
  • apps/mobile/src/ui/design/tokens.ts
  • apps/mobile/src/ui/primitives/action-menu-button.android.tsx
  • apps/mobile/src/ui/primitives/action-menu-button.ios.tsx
  • apps/mobile/src/ui/primitives/action-menu-button.tsx
  • apps/mobile/src/ui/primitives/app-dialog-host.tsx
  • apps/mobile/src/ui/primitives/app-dialog.ts
  • apps/mobile/src/ui/primitives/connection-name-field.tsx
  • apps/mobile/src/ui/primitives/drawer-material.ios.tsx
  • apps/mobile/src/ui/primitives/drawer-material.tsx
  • apps/mobile/src/ui/primitives/row-icon.tsx
  • apps/mobile/src/ui/primitives/search-field.tsx
  • apps/mobile/src/ui/primitives/settings-row.tsx
  • apps/mobile/src/ui/primitives/text-field.tsx
  • apps/mobile/src/ui/question-view.tsx
  • apps/mobile/src/ui/settings-view.tsx
  • apps/mobile/src/ui/shell/activity-count-settings.tsx
  • apps/mobile/src/ui/shell/activity-toolbar-base.tsx
  • apps/mobile/src/ui/shell/bottom-search.tsx
  • apps/mobile/src/ui/shell/host-drawer.tsx
  • apps/mobile/src/ui/shell/host-look-editor.tsx
  • apps/mobile/src/ui/shell/navigation-destinations.ios.tsx
  • apps/mobile/src/ui/shell/navigation-icon.tsx
  • apps/mobile/src/ui/shell/workspace-add.tsx
  • apps/mobile/src/ui/strings.ts
  • apps/mobile/test/action-menu-android.test.tsx
  • apps/mobile/test/activity-feed.test.ts
  • apps/mobile/test/app-dialog-host-android.test.tsx
  • apps/mobile/test/app-dialog.test.tsx
  • apps/mobile/test/drawer-material.test.tsx
  • apps/mobile/test/group-info.test.tsx
  • apps/mobile/test/home-search.test.tsx
  • apps/mobile/test/host-look.test.tsx
  • apps/mobile/test/native-navigation-controls.test.tsx
  • apps/mobile/test/settings-sheet.test.tsx
  • apps/mobile/test/style-guard.test.ts
  • apps/mobile/test/usage-screen.test.tsx
  • changes/2333-ios-hig-glass.md
+------------------------------------------------------------+
| When you say, “I meant to do that,” I totally believe you. |
+------------------------------------------------------------+
  \
   \     /)/)
        ( '')
        /  |
      o(___)
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

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
@DoodleBears DoodleBears changed the title feat(mobile): iOS 26 HIG pass: glass sidebar, bottom search, chat soft edge, one text field and HIG alerts feat(mobile): HIG and system-UI pass: glass sidebar, bottom search, chat soft edge, native dialogs and menus Oct 19, 2026
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
DoodleBears and others added 6 commits October 20, 2026 04:39
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
DoodleBears marked this pull request as ready for review October 19, 2026 20:17
DoodleBears and others added 2 commits October 20, 2026 05:21
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…-07shzq

# Conflicts:
#	apps/mobile/src/ui/strings.ts
@DoodleBears
DoodleBears merged commit 55c8848 into main Oct 19, 2026
10 of 11 checks passed
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>

Copy link
Copy Markdown
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): composer-*, chat-header-*, dialog-*, menu-*, light and dark. Material composer, top app bar, dialogs and menus render as expected on Android.


Generated by Claude Code

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