fix(mobile): keep terminal Paste visible beside keyboard dismissal#25387
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 neededvp ifor 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 portrait | Before (3de45c6254) | After (87a794338a) | Diff zero ×8 | Diff >16/255 |
|---|---|---|---|---|
| Light | Light before | Light after | Light diff zero | Light diff threshold |
| Dark | Dark before | Dark after | Dark diff zero | Dark 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
Added 2 commits
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.
No actionable comments were generated in the recent review.
External image Recent review info
External image Run configuration
- Source mode: Auto
- Repository: pingdotgg/t3code
- Branch: fix/issue-24694
- File: .coderabbit.config.ts
- Commit: 4002c08
- Layers: Repository TS config
- Review profile: CHILL
- Plan: Team
- Run ID:
fac7f5e3-121c-429b-a8fd-63662dd3295f
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.tsxapps/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_pasteMaterial symbol maps to a clipboard icon.Changes: Mobile terminal paste access
Layer / File(s) Summary Clipboard icon mapping
apps/mobile/src/components/ui/AppSymbol.tsxThe content_pasteMaterial symbol maps toIconClipboard.Dedicated terminal Paste button
apps/mobile/src/features/terminal/ThreadTerminalRouteScreen.tsxPaste 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
- pingdotgg/t3code#24628: This PR also changes the mobile terminal keyboard accessory layout.
- pingdotgg/t3code#25071: This PR also changes the terminal paste handling and presentation.
Suggested labels:
size:SSuggested 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 name Status Explanation Title check Passed The title clearly summarizes the main change: keeping the terminal Paste action visible beside keyboard dismissal. Description check Passed 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, i… Linked Issues check Passed Issue #24694has 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 check Passed 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 … 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
#24694has 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.