fix(mobile): keep terminal Paste visible beside keyboard dismissal#25387

open2
main
fix/issue-24694
opened3d agobyJJulius Marminge
View on GitHubTwo-way sync enabledPR last imported 2d ago

Problem

On a phone, opening a thread terminal and showing the keyboard leaves Paste off-screen in the horizontal accessory toolbar. Pasting requires discovering and scrolling the toolbar.

Change

Move Paste into a fixed clipboard icon button beside Dismiss keyboard. Keep the existing clipboard write path and modifier reset, and map the Android clipboard icon to the existing icon library.

Scope and approval

Fixes https://github.com/pingdotgg/t3code/issues/24694

Triaged bug via the automated issue flow. GitCafe: #24694. This is a focused visibility fix to an existing terminal action.

Verification

  • Reproduced on current main in the real Android dev client, pooled Pixel 9, Android 16, Gboard, font size large, native 1080×2424 portrait capture. Explicit isolated --home-dir /home/ubuntu/t3code/.t3/issue-24694.
  • After: Paste stays visible at both ends of the scroller, pastes once, and keyboard dismiss/show and continued typing work.
  • Existing terminal input/paste tests: 2 files, 9 tests passed, including after merging main.
  • vp run check:changed: format, lint, both knip passes, mobile/scripts typechecks reported pass. Initial post-merge attempt needed vp i for newly added upstream dependencies; rerun completed its passing summary but wrapper exited 143.
  • Two independent implementation reviews: MERGE; no concrete findings.
  • Proof audit: Android core behavior confirmed; full fixture set remains incomplete. iOS glyph/layout, macOS-host modifier labels, landscape/wider layout, logical dp width and runtime modifier-reset proof are unverified. The CTRL tap recording does not visibly establish selected state, so no reset-proof claim is made. Final lead recheck was blocked by expired pool lease.

Before source: 3de45c6254; after source: 87a794338a. Final head merges main without changing either implementation file. Evidence index, environment, scripts, matrix and detailed visible differences.

Phone portraitBefore (3de45c6254)After (87a794338a)Diff zero ×8Diff >16/255
LightLight beforeLight afterLight diff zeroLight diff threshold
DarkDark beforeDark afterDark diff zeroDark diff threshold

Visible differences: fixed clipboard circle, earlier scroller fade, less of CTRL visible; Dismiss stays in place. Unrelated capture deltas: clock/signal pixels in dark and keyboard-dismiss chevron tint in light. No “nothing else changed” claim.

Before: scroll to discover Paste · After: fixed Paste, scroll, paste, dismiss/show and type. Narrated action timing and original drivers are in the evidence index.

Models: Claude Opus 5.5 (implementation and review), GPT-6.1 Sol (triage, review, evidence and audit), through T3 Code / Claude and Codex harnesses.

Checks

21 successful · 6 skipped
All checks passed
4002c08

Added 2 commits

  • Merge main into fix/issue-246944002c08
  • fix(mobile): terminal Paste stays visible beside dismiss keyboard87a7943
Synced from GitHub

Approvability

Verdict: Approved at 4002c08

Macroscope's review found this PR approvable — This localized mobile fix moves the existing Paste action outside the scrollable terminal controls so it stays visible beside keyboard dismissal, and adds its Android icon mapping. The underlying paste and terminal input behavior is unchanged.

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

Synced from GitHub

Review in Change Stack →

No actionable comments were generated in the recent review.

External image Recent review info
External image Run configuration
External image Commits

Reviewing files that changed from the base of the PR and between 572cf74275bc0fc4dcdaee754db64fb3d5b575c1 and 4002c085f3d2d4294c12c31bb09ab26d5b555740.

External image Files selected for processing: 2
  • apps/mobile/src/components/ui/AppSymbol.tsx
  • apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx

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

Walkthrough

The mobile terminal now presents Paste as a dedicated keyboard accessory button rather than as an action in the scrolling toolbar. The content_paste Material symbol maps to a clipboard icon.

Changes: Mobile terminal paste access

Layer / File(s)Summary
Clipboard icon mapping
apps/mobile/src/components/ui/AppSymbol.tsx
The content_paste Material symbol maps to IconClipboard.
Dedicated terminal Paste button
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsx
Paste is removed from the toolbar actions. A separate keyboard accessory button clears any pending modifier and starts clipboard paste. The button uses platform-specific clipboard icons.

Priority: External image Low

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

Change: Bug fix · Severity of issue fixed: Low

Possibly related PRs

Suggested labels: size:S

Suggested reviewers: maria-rcks

Merge Risk: External image Minimal · up to 4002c

The focused Paste visibility change has no established merge-blocking risk.

Pre-merge checks: Passed 4
Check nameStatusExplanation
Title checkPassedThe title clearly summarizes the main change: keeping the terminal Paste action visible beside keyboard dismissal.
Description checkPassedThe description covers the required Problem, Change, Scope and approval, and Verification sections. It explains the issue and fix, identifies the linked issue, reports test and manual-check results, i…
Linked Issues checkPassedIssue #24694 has one active direct target. Its coding objective is to keep Paste visible without scrolling in the mobile terminal accessory, using a pinned icon button beside Dismiss keyboard. The dif…
Out of Scope Changes checkPassedThe changes are limited to two files. AppSymbol.tsx adds one icon import and one Material-name mapping (content_paste). This supports the new Android Paste icon. ThreadTerminalRouteScreen.tsx removes …
Full details: Description check

Explanation

The description covers the required Problem, Change, Scope and approval, and Verification sections. It explains the issue and fix, identifies the linked issue, reports test and manual-check results, includes screenshots and recordings, and states remaining verification gaps.

Full details: Linked Issues check

Explanation

Issue #24694 has one active direct target. Its coding objective is to keep Paste visible without scrolling in the mobile terminal accessory, using a pinned icon button beside Dismiss keyboard. The diff implements this. In ThreadTerminalRouteScreen.tsx, Paste is removed from the scrolling toolbar action list (the 'paste' entry and its kind branch are deleted). A new ComposerToolbarButton with accessibilityLabel 'Paste' is rendered outside ComposerToolbarScroller, directly before the existing 'Dismiss keyboard' button. Its icon is { ios: 'doc.on.clipboard', android: 'content_paste' }. This matches the suggested approach in the issue. The handlePaste function clears pending modifier state and calls pasteFromClipboard, which keeps the existing clipboard write path and modifier reset. In AppSymbol.tsx, content_paste maps to IconClipboard from @tabler/icons-react-native, so the Android icon resolves. The issue names iOS as its environment. The button is shared across platforms, and the iOS symbol name is a standard SF Symbol. The PR reports runtime verification only on Android. That gap is runtime proof, not a missing coding requirement. The issue does not request new automated tests. No coding requirement is unmet.

Full details: Out of Scope Changes check

Explanation

The changes are limited to two files. AppSymbol.tsx adds one icon import and one Material-name mapping (content_paste). This supports the new Android Paste icon. ThreadTerminalRouteScreen.tsx removes the paste action kind from the toolbar union and action list, moves the paste behavior into handlePaste, and adds the Paste button beside Dismiss keyboard. Each hunk directly implements the linked issue. No unrelated refactoring, dependency, or behavior change appears in the reviewed diff. The PR description's image and video evidence is not part of the code diff and does not affect this assessment.

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.