Skip to content

feat(swift-ios): add pull-down command drawer - #7345

Open
saphid wants to merge 12 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue86-command-palette-drawer
Open

feat(swift-ios): add pull-down command drawer#7345
saphid wants to merge 12 commits into
pingdotgg:t3code/rebuild-mobile-app-swiftfrom
saphid:feat/issue86-command-palette-drawer

Conversation

@saphid

@saphid saphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

What Changed

Add a searchable command drawer for actions, threads and projects, reachable from visible controls and a pull-down gesture. Closing or abandoning the drawer restores the prior text-input focus.

This consolidates native work items saphid/t3code-personal#86, saphid/t3code-personal#122, saphid/t3code-personal#135 and saphid/t3code-personal#154 and supersedes the former stacked draft #8350.

Why

This gives the native client a common place to find commands and navigate while preserving ordinary transcript/list scrolling and keyboard use.

Verification and remaining proof

Candidate: c1eef5a073bf25dfb277882444f187c1f64647b9. This PR targets t3code/rebuild-mobile-app-swift; its historical integration base is b67837984e5650888b1eed0e1cd7fff83625f696. The current native parent inspected in the readiness review is b99405468a6b2be1e0f67d551ece824b1627e35c. Merging this child does not by itself deliver the native app to upstream main.

The hosted native build/test job passed on the candidate. The earlier report records 61 FeatureCommandDrawerTests and FeatureCommandDrawerPresentationTests on iPhone 16 Pro / iOS 26.5, for this head on base b678379. No local build, test or client session was run for this description update; full historical local invocations were not recovered here.

Integrate the drawer with the current attachment, voice, caret and gesture lifecycle; repeat open, cancel, selection, dismissal and focus-restoration proof. This PR is not evidence-complete for human merge review against the current native parent.

Earlier visual evidence

These retained captures/reports belong to the revisions and conditions stated below. They were not recaptured, visually inspected or revalidated for current-parent integration in this pass. Historical access/playback statements describe the original check, not a new one.

Earlier captures and their original conditions

Exact target b67837984e5650888b1eed0e1cd7fff83625f696 → head c1eef5a073bf25dfb277882444f187c1f64647b9.

The dark-mode sequence shows prior, an abandoned pull followed by restored, then a complete pull/open/gesture-close followed by returned. Both suffixes were typed without tapping Home search; the caret and software keyboard remain with the same field.

Annotated focus and gesture lifecycle

Annotated MP4 · Clean MP4 · Contact sheet

Full command catalog in dark mode
Exact-target and light-mode context

Exact-target pull — the same top-edge pull leaves Home unchanged because the live target has no drawer.

Light-mode Home with visible command entry

Light-mode catalog opened from the command button

Tracking: native work item #122.

Generated by GPT-5.6 Sol in the Codex harness.

Description and evidence audit: GPT-6 in Codex, using prepare-proof-media from #9926.

@coderabbitai

coderabbitai Bot commented Aug 17, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a191db4a-3185-480d-9f30-6447d7074691

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Warning

Your free Security trial is over. An organization admin can activate Security or dismiss this notice.


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

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 17, 2026
Comment thread apps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment thread apps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeapp Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: 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.

@t3dotgg
t3dotgg force-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740 Compare August 18, 2026 21:35
@saphid
saphid force-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4 Compare August 18, 2026 22:23
@saphid

saphid commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

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. FeatureCommandDrawerTests covers the settle thresholds, the grab band against both top bars in the app, the drawer's offset against the open edge it advertises, and the focus-renewal contract: 38 tests, all passing on this head.

Coordination trace: T3 thread DD1ED949-643E-4C94-B93A-8A87DF73B471 · saphid/t3code-personal#122

Comment thread apps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

t3dotgg commented Aug 21, 2026

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

saphid commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Added the visual proof to the PR description:

  • screenshots of the drawer open over Home and over an active thread, both with the keyboard visible
  • a 42.5s video covering the drawer gesture and presentation from both surfaces
  • a 51.7s video showing Home list scrolling remains independent of the drawer gesture

The assets are committed in 8f3b994a2.

@saphid

saphid commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Replaced the obsolete command-palette media with fresh captures from the current SwiftUI PR build.

  • Light mode: pull open the new flat command drawer, filter to Settings, and route to Settings (16s)
  • Dark mode: pull open the new flat command drawer, filter to New task, and route to the composer (15s)
  • Added matching light/dark screenshots
  • Removed all four stale screenshots/videos from the previous upload

The PR description now embeds/links the replacements from commit 0e4ee4391. I reviewed sampled frames across both clips and verified the files served by GitHub match the local captures byte-for-byte and decode cleanly.

@saphid

saphid commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

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:

  • light: browse the thread/project catalog, search react, select the React project, and land on filtered Home
  • dark: browse and scroll the catalog, search boot, select the Linux thread, and open that conversation

The two replacement screenshots also visibly include the recent thread rows and all three project actions. Assets are in 9f3a8706d; I reviewed the final encoded contact sheets and verified the GitHub-served files byte-for-byte.

@saphid

saphid commented Aug 21, 2026

Copy link
Copy Markdown
Contributor Author

Re-recorded both videos with the iOS software keyboard explicitly visible for the complete drawer search interaction.

  • the drawer opens with the keyboard already raised
  • react and boot are entered through individual taps on the visible simulator keyboard, not hidden text injection
  • the populated thread/project results remain visible above the keyboard
  • the matching light/dark screenshots now include the keyboard too

Replacements are in b3a467304. I reviewed the final encoded frame sheets for keyboard presence and verified the GitHub-served MP4s byte-for-byte with clean full decodes.

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.
@saphid
saphid force-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94 Compare August 27, 2026 02:30
@saphid saphid changed the title feat(swift-ios): add a command drawer over the workspace feat(swift-ios): add command drawer gesture foundation Aug 27, 2026
Comment thread apps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift
Comment thread apps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphid saphid changed the title feat(swift-ios): add command drawer gesture foundation feat(swift-ios): add pull-down command drawer Aug 30, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ 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.

Comment thread apps/swift-ios/Features/Workspace/FeatureCommandDrawerPresentationView.swift Outdated
@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
Contributor Author

Current status: do not merge yet. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after this PR's exact-target proof was captured. The head is textually mergeable and current CI/AI reviews are green, but it is classified blocked until the already-rematerialized live-base command-drawer candidate completes focused native tests, retained builds, refreshed proof, and fresh AI review.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL 1,000+ 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.

2 participants