Skip to content

Unify iOS shortcut strip background - #9859

Closed
azooz2003-bit wants to merge 7 commits into
mainfrom
feat-ios-shortcut-bar-background
Closed

azooz2003-bit wants to merge 7 commits into
mainfrom
feat-ios-shortcut-bar-background

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Aug 9, 2026 •

Copy link
Copy Markdown
Collaborator

Fix the iOS 26 light-mode background mismatch in the terminal shortcut strip.

The horizontal shortcut scroller now stays transparent and suppresses iOS 26 scroll-edge effects, so the pinned controls and scrolling controls share one continuous dock background.

Adds a runtime UIKit regression that verifies the scroller does not draw separate chrome.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.


Note

Low Risk
Localized UIKit compositing and styling on the terminal input accessory bar; no input routing, networking, or auth changes.

Overview
Fixes a light-mode visual mismatch on iOS where the horizontally scrolling shortcut row looked like it had its own background, separate from the pinned keyboard/dismiss controls and the dock’s backgroundView.

The accessory toolbar’s UIScrollView and inner UIStackView are now clear and non-opaque, with an inline note that UIKit can still composite an opaque stack inside a scroll view as a rectangular fill—so only backgroundView should own the bar color.

Adds accessoryShortcutScrollerDoesNotDrawSeparateChrome in GhosttySurfaceThemeTests to assert those transparency settings at runtime.

Reviewed by Cursor Bugbot for commit 55eb45e. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Fixes the iOS 26 light‑mode background mismatch in the terminal shortcut strip. The scroller/stack stay transparent, edge effects are hidden, and iOS 26 buttons use clear glass so pinned and scrolling controls share one continuous dock background.

  • Bug Fixes
    • Made the shortcut UIScrollView and inner UIStackView clear/non‑opaque and hid iOS 26 edge effects; added a UIKit test to assert transparency and no separate chrome.
    • On iOS 26, switched shortcut buttons to .clearGlass() / .prominentClearGlass() to prevent a scroller‑wide backdrop and keep one dock background.

Written for commit bfb3611. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Bug Fixes
    • Updated the accessory toolbar’s shortcut scroller and supporting layout to use transparent, non-opaque backgrounds.
    • On iOS 26, accessory buttons now use clear Liquid Glass styling.
    • Preserved existing horizontal scrolling and scroll indicator behavior for a consistent interaction experience.
    • Added coverage to verify the accessory toolbar maintains its transparent appearance.

@coderabbitai

coderabbitai Bot commented Aug 9, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The accessory shortcut scroll view and stack now use transparent, non-opaque backgrounds. On iOS 26, accessory buttons use clear Liquid Glass configurations. An iOS test verifies the view configuration.

Changes

Accessory toolbar rendering

Layer / File(s) Summary
Scroller rendering and validation
Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/TerminalInputTextView.swift, Packages/iOS/CmuxMobileTerminal/Tests/CmuxMobileTerminalTests/GhosttySurfaceThemeTests.swift
The accessory shortcut scroll view and stack use transparent, non-opaque rendering. The test verifies both background and opacity settings. Existing scrolling and indicator settings remain unchanged.
Clear Liquid Glass buttons
Packages/iOS/CmuxMobileTerminal/Sources/CmuxMobileTerminal/TerminalInputTextView.swift
On iOS 26, accessory buttons use clear and prominent-clear Glass configurations. The button-style documentation describes the clear Liquid Glass behavior.

Estimated code review effort: 1 (Trivial) | ~5 minutes

Possibly related PRs

Suggested reviewers: lawrencecchen

🚥 Pre-merge checks | ✅ 23 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The description explains the fix and regression test but omits the required Testing, Demo Video, Review Trigger, and Checklist sections. Add the required template sections, document test results and manual verification, include a demo video, and complete the review and checklist items.
✅ Passed checks (23 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed The production diff only changes UIKit visual properties and button configurations inside the existing UIView subclass; it adds no actor, Sendable, protocol, model, or background-access isolation c...
Cmux Swift Blocking Runtime ✅ Passed The complete PR diff adds only UIKit transparency/glass configuration and a synchronous UI assertion; it introduces no semaphore, wait, sleep, delayed dispatch, polling, sync, or lock primitive.
Cmux Browser Automation Off-Main ✅ Passed The full diff against main contains only two iOS terminal UI files; it adds no browser socket commands, WebKit waits, worker routing, or policy tests.
Cmux Expensive Synchronous Load ✅ Passed The PR diff only changes UIKit transparency/glass styling and adds a runtime view test; it adds no agent-history loader, large-file parse, directory scan, or synchronous load to production paths.
Cmux Cache Substitution Correctness ✅ Passed The production diff only changes UIKit rendering and button configuration; it does not replace an authoritative read or alter persistence, history, undo, or snapshot paths.
Cmux No Hacky Sleeps ✅ Passed The PR changes only Swift source and Swift tests; the rule explicitly scopes TypeScript, JavaScript, shell, and non-Swift runtime scripts.
Cmux Algorithmic Complexity ✅ Passed The production diff adds only UIKit property assignments and configuration selection; it adds no collection scans or nested iteration. The test-only compactMap checks a fixed view hierarchy.
Cmux Swift Concurrency ✅ Passed The diff only changes iOS 26 button glass configuration and comments; it adds no Dispatch, Task, Combine, completion-handler, or other legacy async pattern.
Cmux Swift @Concurrent ✅ Passed The PR adds only synchronous UIKit setup and a synchronous @MainActor test; it introduces no nonisolated async work, @concurrent annotation, or heavy async helper call.
Cmux Swift Package Boundaries ✅ Passed The production diff only changes UIKit accessory-button rendering from glass to clear glass in TerminalInputTextView; this is small UI glue covered by the rule's allowed cases.
Cmux Swiftpm Lockfiles ✅ Passed The merge-base diff contains only TerminalInputTextView.swift and GhosttySurfaceThemeTests.swift; no Package.swift, Package.resolved, Xcode project, .gitignore, workflow, or dependency changes trig...
Cmux Swift Logging ✅ Passed The PR diff only changes UIKit transparency, edge effects, and clear-glass button configuration; it adds or changes no print, debugPrint, dump, NSLog, file logging, or Logger declarations.
Cmux User-Facing Error Privacy ✅ Passed The production diff only changes UIKit transparency and glass configuration; added comments are developer-only, and it adds no user-facing errors, alerts, output, or recovery text.
Cmux Full Internationalization ✅ Passed The PR changes only UIKit rendering and adds a UIKit regression test; it introduces no user-facing text, localization keys, catalogs, or locale-dependent web content.
Cmux Swiftui State Layout ✅ Passed The PR changes UIKit code in TerminalInputTextView (UIView) and adds UIKit tests; it introduces no SwiftUI state, GeometryReader, lazy-row store reference, or render-time mutation.
Cmux Architecture Rethink ✅ Passed The diff makes local UIKit rendering fixes and adds runtime assertions for clear, non-opaque views; it adds no timing, blocking, state-owner, observer, side-channel, or duplicate wiring paths.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed The PR changes only UIKit accessory-view styling and a test; its Swift diff adds no NSWindow, NSPanel, Window, WindowGroup, or auxiliary close-shortcut routing.
Cmux Source Artifacts ✅ Passed The PR changes only the intentional Swift source and UIKit test files; no logs, caches, build output, temp folders, or other source-control artifacts appear in the diff.
Cmux No Test Or Debug Seam In Production Source ✅ Passed The production diff only changes UIKit transparency and clear-glass styling; it adds no DEBUG guard, test/debug member, accessor, or visibility widening. Existing seams are unchanged.
Cmux No Ambient Global State ✅ Passed Production changes only set UIKit instance properties and clear-glass configurations inside existing TerminalInputTextView; no new file-scope API, mutable global, static namespace, or singleton was...
Title check ✅ Passed The title clearly and concisely summarizes the primary change to the iOS shortcut strip background.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-ios-shortcut-bar-background

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants