Uh oh!
There was an error while loading. Please reload this page.
feat(swift-ios): add pull-down command drawer - #7345
Conversation
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Warning Your free Security trial is over. An organization admin can activate Security or dismiss this notice. Comment |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This is a substantial new iOS capability that adds a searchable command drawer, global pan-gesture arbitration, keyboard/focus handoff, and routing from both Home and thread detail. Because it changes core workspace interaction and introduces cross-view UIKit/SwiftUI lifecycle behavior across several production files, it warrants human review. You can add or adjust custom eligibility rules. Learn more. |
1f39d72 to
fce7740Compare9a94ad2 to
b815cd4Comparesaphid
commented
Aug 19, 2026
Adds the command drawer's gesture and fixes how it presents. The drawer now opens on a plain downward swipe that starts anywhere on the app's top bar — Home, an open thread, and the other pushed surfaces alike — instead of only on a deliberate long drag: the settle is an absolute commit distance measured from the rest position the drag started at, with the release's momentum projected a little ahead, so a short fast swipe commits on speed and a slow one on position, and the push that closes the drawer is as short as the swipe that opened it. Eligibility is unchanged, so Home's thread list and the thread transcript keep every ordinary scroll and the status bar above the safe-area inset stays the system's own notification-shade gesture. The drawer is also presented over the workspace rather than pushing it: the page underneath no longer translates at all, so the rows, header and composer stay exactly where they were while the drawer and its scrim move with the finger (measured on the simulator as a 0-pixel shift of the background, with a sharp minimum). Finally, the search field now reliably takes focus — the request is made when the pull starts, which is what puts the keyboard's height into the drawer's open height before the finger lifts, but at that moment the field is still above the window's top edge and the request can be dropped; it is now renewed once the drawer is open and still unfocused, so the keyboard arrives on every entry path including a quarter-second swipe. Coordination trace: T3 thread DD1ED949-643E-4C94-B93A-8A87DF73B471 · saphid/t3code-personal#122 |
Uh oh!
There was an error while loading. Please reload this page.
t3dotgg
commented
Aug 21, 2026
Desperately needs screenshots and videos |
saphid
commented
Aug 21, 2026
Added the visual proof to the PR description:
The assets are committed in |
saphid
commented
Aug 21, 2026
Replaced the obsolete command-palette media with fresh captures from the current SwiftUI PR build.
The PR description now embeds/links the replacements from commit |
saphid
commented
Aug 21, 2026
Updated the visual proof again with a populated simulator environment: 3 projects (T3 Code, React, Linux) and 9 recent threads. The replacement videos now open on the populated Home list and show the unfiltered drawer before searching:
The two replacement screenshots also visibly include the recent thread rows and all three project actions. Assets are in |
saphid
commented
Aug 21, 2026
Re-recorded both videos with the iOS software keyboard explicitly visible for the complete drawer search interaction.
Replacements are in |
Define the command drawer geometry, gesture arbitration, responder ownership, and bounded focus renewal as a focused foundation slice. Restore the exact prior responder after an abandoned pull and cover cancellation, teardown, and eligibility paths with focused tests.
b3a4673 to
0e0fb94CompareUh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
This reverts commit a5af613.
… into pr-refresh/pr-7345-command-drawer
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 55623cf. Configure here.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Current status: do not merge yet. Theo's SwiftUI target advanced to |

Important
Current delivery status: blocked. Theo's SwiftUI target advanced to
c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0after this PR's exact-target proof and checks were captured. The head remains textually mergeable, but review should wait for the already-rematerialized live-base command-drawer candidate to finish focused tests, retained builds, refreshed proof, and AI review.Upstream delivery
Delivery: blocked
Validated against Theo commit:
c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head
c1eef5a073bf25dfb277882444f187c1f64647b9has green required CI and successful CodeRabbit, Cursor Bugbot, and Macroscope correctness reviews with no unresolved threads. A merge-tree simulation against the live target exited 0. The existing media remains valid for this head, but exact-live-base focused tests and proof are pending.Dark mode evidence: yes
Clean screenshot: https://raw.githubusercontent.com/saphid/t3code/9aeb4bf7f25fe96cd5f22f664754a9ec5992b034/.github/pr-assets/7345-full-drawer-c1eef5a07/command-drawer-dark-catalog-tight.png
Annotated screenshot: https://raw.githubusercontent.com/saphid/t3code/9aeb4bf7f25fe96cd5f22f664754a9ec5992b034/.github/pr-assets/7345-full-drawer-c1eef5a07/command-drawer-dark-focus-lifecycle-annotated.gif
Clean video: https://raw.githubusercontent.com/saphid/t3code/9aeb4bf7f25fe96cd5f22f664754a9ec5992b034/.github/pr-assets/7345-full-drawer-c1eef5a07/command-drawer-dark-focus-lifecycle-clean.mp4
Annotated video: https://raw.githubusercontent.com/saphid/t3code/9aeb4bf7f25fe96cd5f22f664754a9ec5992b034/.github/pr-assets/7345-full-drawer-c1eef5a07/command-drawer-dark-focus-lifecycle-annotated.mp4
Summary
SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.
Proof
Exact target
b67837984e5650888b1eed0e1cd7fff83625f696→ headc1eef5a073bf25dfb277882444f187c1f64647b9.The dark-mode sequence shows
prior, an abandoned pull followed byrestored, then a complete pull/open/gesture-close followed byreturned. Both suffixes were typed without tapping Home search; the caret and software keyboard remain with the same field.Annotated MP4 · Clean MP4 · Contact sheet
Exact-target and light-mode context
Exact-target pull — the same top-edge pull leaves Home unchanged because the live target has no drawer.
Test
FeatureCommandDrawerTests+FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.command-drawerlane.Generated by GPT-5.6 Sol in the Codex harness.