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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

@saphidsaphid commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Important

Current delivery status: blocked. Theo's SwiftUI target advanced to c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0 after 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: c49bcc5d8a56324eb0ad9cf1b19d5dcc6ca0caa0
Depends on: none
Merge order: this PR only, after refreshed live-base validation
Validation status: current PR head c1eef5a073bf25dfb277882444f187c1f64647b9 has 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

  • Adds the complete native SwiftUI command drawer: visible Home/thread entry, searchable action/thread/project catalog, selection, and dismissal.
  • Adds the pull/open/close gesture lifecycle while leaving ordinary list and transcript scrolling alone.
  • Restores the exact prior responder after an abandoned pull or gesture close, so keyboard input resumes without another tap.

SwiftUI-only. This is the consolidated implementation for #86, #122, #135, and #154 and supersedes the former stacked draft #8350.

Proof

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

Test

  • FeatureCommandDrawerTests + FeatureCommandDrawerPresentationTests: 61 passed, 0 failed on iPhone 16 Pro / iOS 26.5.
  • Timeline-derived current-head and exact-target media packets: passed.
  • Current-head semantic snapshots are bound to the protected command-drawer lane.

Generated by GPT-5.6 Sol in the Codex harness.

@coderabbitai

coderabbitaiBot 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-actionsgithub-actionsBot 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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
Comment threadapps/swift-ios/Features/Workspace/WorkspaceView.swift
@macroscopeapp

macroscopeappBot 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
t3dotggforce-pushed the t3code/rebuild-mobile-app-swift branch from 1f39d72 to fce7740CompareAugust 18, 2026 21:35
@saphid
saphidforce-pushed the feat/issue86-command-palette-drawer branch from 9a94ad2 to b815cd4CompareAugust 18, 2026 22:23
@saphid

Copy link
Copy Markdown
ContributorAuthor

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 threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@t3dotgg

Copy link
Copy Markdown
Member

Desperately needs screenshots and videos

@saphid

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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

Copy link
Copy Markdown
ContributorAuthor

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
saphidforce-pushed the feat/issue86-command-palette-drawer branch from b3a4673 to 0e0fb94CompareAugust 27, 2026 02:30
@saphidsaphid changed the title feat(swift-ios): add a command drawer over the workspacefeat(swift-ios): add command drawer gesture foundationAug 27, 2026
Comment threadapps/swift-ios/Features/Workspace/FeatureCommandDrawerView.swift Outdated
@saphidsaphid changed the title feat(swift-ios): add command drawer gesture foundationfeat(swift-ios): add pull-down command drawerAug 30, 2026

@cursorcursorBot 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.

@saphid

saphid commented Aug 30, 2026

Copy link
Copy Markdown
ContributorAuthor

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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL1,000+ changed lines (additions + deletions).vouch:trustedPR 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

@saphid@t3dotgg