Skip to content

fix(mobile): sheets close with an X and confirm with a checkmark - #21319

Merged
juliusmarminge merged 1 commit into
mainfrom
t3/fix-ios-modal-action-buttons
Oct 18, 2026
Merged

juliusmarminge merged 1 commit into
mainfrom
t3/fix-ios-modal-action-buttons

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

Thread settings on mobile showed Cancel and Done as two identical text buttons, so nothing told users that one discards edits and the other applies them. iOS convention is an X to close without changes and a prominent checkmark to apply.

Thread settings sheet: X on the left, prominent checkmark on the right (tinted with --color-prominent-action). The checkmark covers both the old "Done" and "Save" cases; its accessibility label still says which one it is.

Thread settings, light: before Cancel/Done text, after X and prominent checkmark
Thread settings, dark: before Cancel/Done text, after X and prominent checkmark

The same look-alike text buttons were in other places too:

Surface Before After
New thread sheet "Cancel" X
Custom snooze popover (iOS) X + "Snooze" text X + prominent checkmark
Shared Sheet header (iOS: terminal output, worktree setup, composer context) system-blue "Done", dismiss only X
Worktree setup sheet (Android) "Done" text X header action
Arrange threads modal "Done", dismiss only (each drop already saves) X
NumberField picker popover (iOS, e.g. auto-settle days) "Cancel" + "Done" in identical blue text bordered X + prominent checkmark

Sheets that only dismiss get an X. A checkmark appears only where something gets applied. Inline row toggles ("Edit"/"Done" in lists), alerts, and in-content banners are unchanged, since they aren't nav-bar actions. The user doc for Arrange threads no longer refers to a Done button.

Other surfaces, before/after

New thread sheet: Cancel text becomes X
Custom snooze popover: Snooze text becomes prominent checkmark
Auto-settle days picker, light: Cancel/Done text becomes X and prominent checkmark
Auto-settle days picker, dark: Cancel/Done text becomes X and prominent checkmark
Arrange threads: Done text becomes X
Shared Sheet header: system-blue Done becomes X

Verified

On an iPhone 17 Pro Max simulator (iOS 26.5) against an isolated dev backend seeded with real threads:

  • Thread settings: picking another model, then X, closes without changing the thread. Picking a model, then the checkmark, applies it (composer shows the new model). The checkmark's accessibility label switches from "Done" to "Save thread settings" once a model is pending.
  • Auto-settle days picker: X closes without changing the value; the checkmark applies a new value.
  • New thread, custom snooze, Arrange threads, and the shared Sheet: X closes each.
  • Light and dark mode both checked; the dark-mode checkmark keeps a dark glyph on its light fill.

Not run on Android; the Android change is the worktree-setup sheet header only.

Done with Claude Opus 5.5 in Claude Code.

🤖 Generated with Claude Code

Thread settings showed "Cancel" and "Done" as identical text buttons, so
nothing told users that one discards edits and the other applies them.
Follow the iOS convention instead: an X closes without changes, and a
prominent checkmark applies.

The same look-alike text pairs appeared in the new-thread sheet, the
custom snooze popover, the shared Sheet header, Arrange threads, the
Android worktree-setup sheet, and the NumberField picker.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Oct 18, 2026
@juliusmarminge juliusmarminge added the macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews label Oct 18, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at aa83f99

Macroscope's review found this PR approvable — This is a localized mobile UI polish change that replaces ambiguous text actions with conventional X and checkmark icons while preserving existing close and submit behavior. It introduces no schema, deployment, sensitive-data, product-default, or static-analysis configuration changes.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Oct 18, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Team
  • Run ID: 2abfd87a-495c-4f9d-b252-f1d2e7a470e5
📥 Commits

Reviewing files that changed from the base of the PR and between d8e9fd2 and aa83f99.

📒 Files selected for processing: 8
  • apps/mobile/src/components/ui/NumberField.tsx
  • apps/mobile/src/components/ui/Sheet.tsx
  • apps/mobile/src/features/threads/CustomSnoozeSheet.ios.tsx
  • apps/mobile/src/features/threads/NewTaskDraftScreen.tsx
  • apps/mobile/src/features/threads/ThreadArrangementSheet.tsx
  • apps/mobile/src/features/threads/ThreadSettingsSheet.tsx
  • apps/mobile/src/features/threads/worktree-setup-sheet.android.tsx
  • docs/user/thread-sidebar.md

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 0 remain after this review.

📝 Walkthrough

Mobile sheet and toolbar actions replace several text labels with icons. Existing actions and accessibility labels remain in place. The thread-sidebar instructions now describe closing the sheet to return to the thread list.

Changes: Mobile sheet actions

Layer / File(s) Summary
Shared control actions
apps/mobile/src/components/ui/NumberField.tsx, apps/mobile/src/components/ui/Sheet.tsx
NumberField uses xmark and checkmark icons for Cancel and Done. The sheet header uses an xmark close action and a new identifier.
Thread sheet actions and instructions
apps/mobile/src/features/threads/CustomSnoozeSheet.ios.tsx, apps/mobile/src/features/threads/NewTaskDraftScreen.tsx, apps/mobile/src/features/threads/ThreadArrangementSheet.tsx, apps/mobile/src/features/threads/ThreadSettingsSheet.tsx, apps/mobile/src/features/threads/worktree-setup-sheet.android.tsx, docs/user/thread-sidebar.md
Thread toolbar actions use icon controls for snoozing, cancellation, closing, and saving. Android worktree setup uses the header close action. The mobile instructions now say to close the sheet to return to the thread list.

Priority: ➖ Normal

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix

Suggested reviewers: maria-rcks

Merge Risk: ⚪ Minimal · up to aa83f

The sheet actions now use icons while retaining their labels and existing actions. No concrete functional or checked-in automation issue is established; visual parity still awaits simulator validation.

Pre-merge checks: Passed 3 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Description check Warning The description clearly explains the problem, affected surfaces, implementation, screenshots, and focused verification results. It does not include the required Scope and approval information, such as… Add a Scope and approval section. Include the triaged issue or explicit maintainer approval with a link and approval comment. If no prior issue or discussion exists, explain why this focused, obvious fix qualifies for the exemption.
Passed Passed checks: 3 passed
Check name Status Explanation
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Title check Passed The title clearly summarizes the main change: dismiss-only mobile sheets use an X, and actions that apply changes use a checkmark.
Full details: Description check

Explanation

The description clearly explains the problem, affected surfaces, implementation, screenshots, and focused verification results. It does not include the required Scope and approval information, such as a linked issue, maintainer approval, or an explanation that this focused fix qualifies for an exemption.

Resolution

Add a Scope and approval section. Include the triaged issue or explicit maintainer approval with a link and approval comment. If no prior issue or discussion exists, explain why this focused, obvious fix qualifies for the exemption.

  • Fix all pre-merge checks with AI
✨ 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

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

@juliusmarminge
juliusmarminge merged commit ca4d583 into main Oct 18, 2026
32 of 33 checks passed
@juliusmarminge
juliusmarminge deleted the t3/fix-ios-modal-action-buttons branch October 18, 2026 23:14
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 19, 2026
## What's Changed
* fix(mobile): sheets close with an X and confirm with a checkmark by @juliusmarminge in pingdotgg/t3code#21319
* fix(tailscale): a slow tailscale status no longer hides Tailscale in Settings by @SunkenInTime in pingdotgg/t3code#21057
* chore(deps): web and mobile share React 19.3 from the catalog by @juliusmarminge in pingdotgg/t3code#21376
* fix(server): migrate legacy thread pull request links by @Yash-Singh1 in pingdotgg/t3code#19129
* fix(server): a failed Codex turn no longer traps the queue behind its subagents by @juliusmarminge in pingdotgg/t3code#21366
* feat(server): count which product features people use by @juliusmarminge in pingdotgg/t3code#15921
* feat(server): count which T3 MCP tools agents use by @juliusmarminge in pingdotgg/t3code#15913
* perf(web): HTML renders drop the loading skeleton by @maria-rcks in pingdotgg/t3code#21480
* fix(mobile): sent steer and queued messages are marked like desktop by @flamboh in pingdotgg/t3code#21417
* fix(server): keep queued subagent status in sync by @Yash-Singh1 in pingdotgg/t3code#21487
* perf(web): virtualize large changed-file trees by @Yash-Singh1 in pingdotgg/t3code#21482
* fix(pull-requests): distinguish skipped checks with a slash icon by @Yash-Singh1 in pingdotgg/t3code#21498
* fix(mobile): crash report shows the store build number by @mohamed-akef in pingdotgg/t3code#16052
* fix(files): load PDFs in browser previews by @Yash-Singh1 in pingdotgg/t3code#21095
* fix(server): device-host SSH tunnels exit when the server dies by @kcazin in pingdotgg/t3code#17448
* fix(web): Open in → Finder in the file preview opened the file in its default app instead of revealing it by @jamesvillarrubia in pingdotgg/t3code#16955
* fix(web): project actions no longer reuse the right-panel terminal by @TonybynMp4 in pingdotgg/t3code#18340
* fix(web): the device screen keeps focus when typing or returning to the window by @haydenkz in pingdotgg/t3code#14534
* fix(server): keep browser input responsive during slow navigation by @josephv123 in pingdotgg/t3code#16691
* fix(grok): a Homebrew-installed Grok updates through brew and is compared against the cask by @Mnigos in pingdotgg/t3code#18772
* fix(antigravity): read usage from each instance data directory by @fixfon in pingdotgg/t3code#17769
* fix(server): reconnecting no longer reopens a closed terminal by @Gigioxx in pingdotgg/t3code#18444
* fix(shared): preview addresses containing another URL open instead of searching by @maxwellyoung in pingdotgg/t3code#17943
* fix(server): ACP Registry loads on networks with slow IPv4 connects by @Gigioxx in pingdotgg/t3code#15054
* fix(preview): keep desktop-rendered tabs out of idle cleanup by @TDanks2000 in pingdotgg/t3code#18147
* fix(server): auto-delivered messages queue between provider turns by @Gigioxx in pingdotgg/t3code#15691
* fix(server): OpenCode 2 threads keep T3's tools after an idle project is evicted by @voltcrash in pingdotgg/t3code#16796
* fix(server): install the advertised version for pnpm-global provider updates by @RaphaelFakhri in pingdotgg/t3code#14295
* fix(web): ignore right-clicks in the flat Device viewport by @samaluk in pingdotgg/t3code#17020
* fix(web): "No project" picker shows its full label on the new-thread screen by @flamboh in pingdotgg/t3code#21504
* fix(web): up-arrow recall skips automation and agent messages by @maria-rcks in pingdotgg/t3code#21510
* fix(desktop): reattach a browser tab whose debugger Chromium dropped by @tobymarks in pingdotgg/t3code#17525
* fix(web): Integrations settings show one Browser section, not two by @RakshithBhat03 in pingdotgg/t3code#18264
* fix(web): hide the empty reset badge on unstarted limit windows by @akash3444 in pingdotgg/t3code#18579
* fix(cli): browser setup installs missing fonts by @adrilasar in pingdotgg/t3code#17570
* fix(web,mobile): queued messages no longer say "From queue" once sent by @flamboh in pingdotgg/t3code#21474
* fix(web): refresh embedded assets in markdown file previews by @Saikrishna1876 in pingdotgg/t3code#18647
* fix(web,mobile): keep reporting client activity after an interrupted report by @skyhong2002 in pingdotgg/t3code#15738
* fix(web): paste terminal text once and clear the shortcut on release by @t3dotgg in pingdotgg/t3code#19366
* fix(server): fall back when checkpoint fsync is unsupported by @mdshzb04 in pingdotgg/t3code#14411
* fix(preview): browser tabs no longer go blank when the tab list reorders by @mkiera in pingdotgg/t3code#13799
* fix(server): terminals no longer inherit the launching tmux session by @UzEE in pingdotgg/t3code#13359

## New Contributors
* @mohamed-akef made their first contribution in pingdotgg/t3code#16052
* @haydenkz made their first contribution in pingdotgg/t3code#14534
* @RaphaelFakhri made their first contribution in pingdotgg/t3code#14295
* @samaluk made their first contribution in pingdotgg/t3code#17020
* @tobymarks made their first contribution in pingdotgg/t3code#17525
* @adrilasar made their first contribution in pingdotgg/t3code#17570
* @skyhong2002 made their first contribution in pingdotgg/t3code#15738
* @mkiera made their first contribution in pingdotgg/t3code#13799

**Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261018.3335...v0.1.1-nightly.20261019.3348

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3348
github-actions Bot added a commit to davidvanderklay/t3code-flake that referenced this pull request Oct 19, 2026
## What's Changed
* fix(mobile): sheets close with an X and confirm with a checkmark by @juliusmarminge in pingdotgg/t3code#21319
* fix(tailscale): a slow tailscale status no longer hides Tailscale in Settings by @SunkenInTime in pingdotgg/t3code#21057
* chore(deps): web and mobile share React 19.3 from the catalog by @juliusmarminge in pingdotgg/t3code#21376
* fix(server): migrate legacy thread pull request links by @Yash-Singh1 in pingdotgg/t3code#19129
* fix(server): a failed Codex turn no longer traps the queue behind its subagents by @juliusmarminge in pingdotgg/t3code#21366
* feat(server): count which product features people use by @juliusmarminge in pingdotgg/t3code#15921
* feat(server): count which T3 MCP tools agents use by @juliusmarminge in pingdotgg/t3code#15913
* perf(web): HTML renders drop the loading skeleton by @maria-rcks in pingdotgg/t3code#21480
* fix(mobile): sent steer and queued messages are marked like desktop by @flamboh in pingdotgg/t3code#21417
* fix(server): keep queued subagent status in sync by @Yash-Singh1 in pingdotgg/t3code#21487
* perf(web): virtualize large changed-file trees by @Yash-Singh1 in pingdotgg/t3code#21482
* fix(pull-requests): distinguish skipped checks with a slash icon by @Yash-Singh1 in pingdotgg/t3code#21498
* fix(mobile): crash report shows the store build number by @mohamed-akef in pingdotgg/t3code#16052
* fix(files): load PDFs in browser previews by @Yash-Singh1 in pingdotgg/t3code#21095
* fix(server): device-host SSH tunnels exit when the server dies by @kcazin in pingdotgg/t3code#17448
* fix(web): Open in → Finder in the file preview opened the file in its default app instead of revealing it by @jamesvillarrubia in pingdotgg/t3code#16955
* fix(web): project actions no longer reuse the right-panel terminal by @TonybynMp4 in pingdotgg/t3code#18340
* fix(web): the device screen keeps focus when typing or returning to the window by @haydenkz in pingdotgg/t3code#14534
* fix(server): keep browser input responsive during slow navigation by @josephv123 in pingdotgg/t3code#16691
* fix(grok): a Homebrew-installed Grok updates through brew and is compared against the cask by @Mnigos in pingdotgg/t3code#18772
* fix(antigravity): read usage from each instance data directory by @fixfon in pingdotgg/t3code#17769
* fix(server): reconnecting no longer reopens a closed terminal by @Gigioxx in pingdotgg/t3code#18444
* fix(shared): preview addresses containing another URL open instead of searching by @maxwellyoung in pingdotgg/t3code#17943
* fix(server): ACP Registry loads on networks with slow IPv4 connects by @Gigioxx in pingdotgg/t3code#15054
* fix(preview): keep desktop-rendered tabs out of idle cleanup by @TDanks2000 in pingdotgg/t3code#18147
* fix(server): auto-delivered messages queue between provider turns by @Gigioxx in pingdotgg/t3code#15691
* fix(server): OpenCode 2 threads keep T3's tools after an idle project is evicted by @voltcrash in pingdotgg/t3code#16796
* fix(server): install the advertised version for pnpm-global provider updates by @RaphaelFakhri in pingdotgg/t3code#14295
* fix(web): ignore right-clicks in the flat Device viewport by @samaluk in pingdotgg/t3code#17020
* fix(web): "No project" picker shows its full label on the new-thread screen by @flamboh in pingdotgg/t3code#21504
* fix(web): up-arrow recall skips automation and agent messages by @maria-rcks in pingdotgg/t3code#21510
* fix(desktop): reattach a browser tab whose debugger Chromium dropped by @tobymarks in pingdotgg/t3code#17525
* fix(web): Integrations settings show one Browser section, not two by @RakshithBhat03 in pingdotgg/t3code#18264
* fix(web): hide the empty reset badge on unstarted limit windows by @akash3444 in pingdotgg/t3code#18579
* fix(cli): browser setup installs missing fonts by @adrilasar in pingdotgg/t3code#17570
* fix(web,mobile): queued messages no longer say "From queue" once sent by @flamboh in pingdotgg/t3code#21474
* fix(web): refresh embedded assets in markdown file previews by @Saikrishna1876 in pingdotgg/t3code#18647
* fix(web,mobile): keep reporting client activity after an interrupted report by @skyhong2002 in pingdotgg/t3code#15738
* fix(web): paste terminal text once and clear the shortcut on release by @t3dotgg in pingdotgg/t3code#19366
* fix(server): fall back when checkpoint fsync is unsupported by @mdshzb04 in pingdotgg/t3code#14411
* fix(preview): browser tabs no longer go blank when the tab list reorders by @mkiera in pingdotgg/t3code#13799
* fix(server): terminals no longer inherit the launching tmux session by @UzEE in pingdotgg/t3code#13359

## New Contributors
* @mohamed-akef made their first contribution in pingdotgg/t3code#16052
* @haydenkz made their first contribution in pingdotgg/t3code#14534
* @RaphaelFakhri made their first contribution in pingdotgg/t3code#14295
* @samaluk made their first contribution in pingdotgg/t3code#17020
* @tobymarks made their first contribution in pingdotgg/t3code#17525
* @adrilasar made their first contribution in pingdotgg/t3code#17570
* @skyhong2002 made their first contribution in pingdotgg/t3code#15738
* @mkiera made their first contribution in pingdotgg/t3code#13799

**Full Changelog**: pingdotgg/t3code@v0.1.1-nightly.20261018.3335...v0.1.1-nightly.20261019.3348

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.1-nightly.20261019.3348
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

macroscope-review Opt PRs made by unvouched contributors in for Macroscope review. Vouched contributors auto-reviews size:M 30-99 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant