Skip to content

iOS: native soft scroll edge effect under the workspace list chrome - #8575

Merged
azooz2003-bit merged 10 commits into
mainfrom
feat-ios-soft-scroll-edge
Jul 22, 2026
Merged

azooz2003-bit merged 10 commits into
mainfrom
feat-ios-soft-scroll-edge

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jul 21, 2026 •

Copy link
Copy Markdown
Collaborator

The workspace list never rendered a scroll edge effect: rows scrolled under the search bar at full opacity and hard-clipped, instead of soft-fading under the chrome like the App Store list.

Two root causes, one per commit pair:

  1. The table is a UIViewRepresentable UITableView, and SwiftUI only drives bar scroll edge effects for its own scroll views. A new WorkspaceListScrollEdgeCoordinator (same approach as the chat screen's ChatScrollEdgeCoordinator) registers the table as the content scroll view of its enclosing bar controllers via setContentScrollView(_:for:), resolved by walking from the table to the last view controller before the nearest UINavigationController (top) and UITabBarController (bottom), iOS 26-gated. Registration happens in didMoveToWindow with a layoutSubviews retry; unregistration only clears registrations the departing table still owns.

  2. SwiftUI fits a representable inside the safe area, so the table's frame started below the search drawer and ended above the tab bar; content clipped at the table's own bounds and the effect had no covered region to render into. ignoresSafeArea(.container, edges: .vertical) restores the native underlap; the real UIKit bars still contribute safe area, so automatic content-inset adjustment keeps rows and indicators clear of the chrome.

Result: App Store-style progressive soft blur under the toolbar + search bar and behind the floating tab bar, verified in dark and light mode on an isolated iPhone 17 sim (iOS 26.5) with the preview fixture and against a live paired tagged Mac. Red/green commit structure: the registration tests land first and fail, the fix follows.

The DEBUG preview fixture gains CMUX_UITEST_WORKSPACE_LIST_PREVIEW_TABS=1 to wrap the list in a TabView so the tab bar's bottom edge is dogfoodable without Mac pairing (off by default; the App Store screenshot rig keeps its bare chrome).

🤖 Generated with Claude Code


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.

Summary by CodeRabbit

  • New Features
    • Enhanced iOS workspace list scroll-edge behavior to support correct rendering when embedded in navigation and tab bar containers.
    • Added a DEBUG-only option to display an optional tab scaffold in the workspace list layout preview.
  • Bug Fixes
    • Workspace list content now extends under the vertical safe-area chrome for better alignment with surrounding UI.
    • Improved scroll-edge registration/unregistration tied to the view’s window lifecycle, including incremental container attachment and table replacement/overlap handling.
  • Tests
    • Added iOS UI tests covering scroll-edge container registration, cleanup on removal, delayed container assembly, and multi-table replacement scenarios.

cmux reload-cloud and others added 2 commits July 21, 2026 12:40
…effects

The workspace list is a UIViewRepresentable UITableView, so SwiftUI never
registers it as the bars' content scroll view and the .soft top edge style
never renders: rows hard-clip at the search bar's bottom edge instead of
soft-fading under the chrome like the App Store list.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…st chrome

Register the workspace UITableView as the content scroll view of its
enclosing navigation and tab bar controllers (setContentScrollView top /
bottom, iOS 26-gated) from didMoveToWindow, with a layoutSubviews retry
until the controller parent chain is assembled. UIKit then renders the
table's existing .soft top edge effect under the navigation bar + search
drawer and drives the tab bar's bottom edge, matching the App Store's
soft blur instead of hard-clipping rows at the search bar boundary.

Unregistration on window removal only clears registrations this table
still owns, so a replacement table's registration is never clobbered.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds an iOS 26 scroll-edge coordinator for WorkspaceListUITableView, wires registration to window and layout lifecycle events, adds UIKit hosting tests, supports an optional debug tab scaffold, and applies vertical safe-area underlap to the workspace list.

Changes

Workspace list UI integration

Layer / File(s) Summary
Scroll-edge coordinator registration
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListScrollEdgeCoordinator.swift
Resolves enclosing navigation and tab bar controllers, registers the table scroll view for top and bottom edge effects on iOS 26+, and removes only matching registrations.
Table lifecycle wiring and validation
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListUITableView.swift, Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListScrollEdgeEffectTests.swift
Registers during window and layout lifecycle changes and tests hosting, removal, late controller attachment, and replacement-table preservation.
Preview scaffold and safe-area layout
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift, Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift
Adds an environment-controlled debug tab scaffold and applies vertical safe-area underlap to the iOS workspace list.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant SwiftUIHost
  participant WorkspaceListUITableView
  participant WorkspaceListScrollEdgeCoordinator
  participant UINavigationController
  participant UITabBarController
  SwiftUIHost->>WorkspaceListUITableView: Host table view
  WorkspaceListUITableView->>WorkspaceListScrollEdgeCoordinator: Register after window/layout attachment
  WorkspaceListScrollEdgeCoordinator->>UINavigationController: Register table as bottom content scroll view
  WorkspaceListScrollEdgeCoordinator->>UITabBarController: Register table as top content scroll view
  WorkspaceListUITableView->>WorkspaceListScrollEdgeCoordinator: Unregister when leaving window
  WorkspaceListScrollEdgeCoordinator->>UINavigationController: Clear matching registration
  WorkspaceListScrollEdgeCoordinator->>UITabBarController: Clear matching registration
Loading

Possibly related PRs

  • manaflow-ai/cmux#6488: Updates release-build handling around WorkspaceListLayoutPreviewView, which this PR changes for debug tab-scaffold testing.
  • manaflow-ai/cmux#8186: Modifies WorkspaceListUITableView layout behavior that this PR extends with scroll-edge coordinator registration.
🚥 Pre-merge checks | ✅ 24 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 45.45% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (24 passed)
Check name Status Explanation
Title check ✅ Passed Clear and specific; it matches the main iOS scroll-edge change.
Description check ✅ Passed It covers the change rationale, testing, and verification, matching the core template content.
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 New production types are intentionally @MainActor UI code; no new nonisolated models/protocols or background store access was introduced.
Cmux Swift Blocking Runtime ✅ Passed No blocking waits, semaphores, sync dispatch, or locks were introduced; the only sleep is a DEBUG preview loop, not production runtime.
Cmux Browser Automation Off-Main ✅ Passed HEAD only changes iOS workspace list files; no browser socket automation, WebKit waits, or routing-policy code was touched.
Cmux Expensive Synchronous Load ✅ Passed Touched Swift files only add UIKit scroll-edge registration and safe-area layout changes; no agent-history loaders, JSON parsing, or other expensive sync loads appear.
Cmux Cache Substitution Correctness ✅ Passed The cached refs only drive transient UIKit scroll-edge registration; the code re-resolves on layout and clears stale ownership, with no persistence/undo/snapshot consumer.
Cmux No Hacky Sleeps ✅ Passed The diff only changes Swift source/test files; the no-hacky-sleeps rule is out of scope for Swift timing/blocking code.
Cmux Algorithmic Complexity ✅ Passed New work is bounded controller-chain traversal plus DEBUG preview/test scaffolding; no new unbounded collection rescans or hot-path sort/filter loops were introduced.
Cmux Swift Concurrency ✅ Passed The diff adds UIKit/SwiftUI-bound scroll-edge and preview code only; no new DispatchQueue, Combine, completion-handler, or unstructured lifecycle-free Task patterns.
Cmux Swift @Concurrent ✅ Passed No changed Swift file introduces nonisolated async work needing @concurrent; the only new async helper is @MainActor UI-bound preview code with an explicit MainActor hop.
Cmux Swift Package Boundaries ✅ Passed The diff adds iOS UI glue, a package-local coordinator, previews, and tests; no reusable domain logic was left in an app target.
Cmux Swiftpm Lockfiles ✅ Passed Diff only changes source and tests; no Package.swift, Package.resolved, .gitignore, or Xcode project files were modified.
Cmux Swift Logging ✅ Passed PASS: The diff adds no print/debugPrint/dump/NSLog, no ad hoc stdout/file logging, and no new MainActor-scoped Logger constants in the changed Swift files.
Cmux User-Facing Error Privacy ✅ Passed No production user-facing error/alert/recovery copy was added; the touched changes are scroll-edge plumbing, safe-area layout, debug preview scaffolding, and tests.
Cmux Full Internationalization ✅ Passed New copy is confined to a DEBUG-only preview fixture; production UI text still uses existing L10n APIs and no catalog/locales changed.
Cmux Swiftui State Layout ✅ Passed No forbidden SwiftUI state/layout patterns were introduced; the new preview uses @Observable + @State, and the remaining changes are UIKit bridge logic/tests.
Cmux Architecture Rethink ✅ Passed The new scroll-edge bridge is a required UIKit lifecycle owner with clear invariants, no async/timer/lock hacks, and tests cover registration and cleanup.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed Diff only touches iOS UIKit views/tests; no user-visible NSWindow/NSPanel/WindowGroup or cmux identifiers were added or changed.
Cmux Source Artifacts ✅ Passed All changed paths are intentional source/test files under Sources/Tests; no logs, screenshots, temp dirs, caches, or build artifacts were added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed Only DEBUG code is an isolated preview fixture file; no new test/debug accessor or seam was added to production types.
Cmux No Ambient Global State ✅ Passed No file-scope funcs/vars or singleton-style runtime state were added; the new behavior lives in owned view/controller types.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-ios-soft-scroll-edge

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.

@greptile-apps

greptile-apps Bot commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds native iOS 26 scroll-edge effects to the workspace list. The main changes are:

  • Registers the UIKit table with its navigation and tab-bar containers.
  • Extends the table beneath vertical chrome for the soft-fade effect.
  • Retries registration during layout as the controller hierarchy changes.
  • Adds tests for delayed attachment, removal, overlapping tables, and ownership handoff.
  • Adds an optional tab-bar scaffold to the debug preview.

Confidence Score: 5/5

This looks safe to merge.

  • Registration now re-resolves during each layout pass, covering controller hierarchies assembled in stages.
  • Cleanup only clears edges still owned by the departing table.
  • Tests cover the previously failing delayed tab attachment and the main ownership lifecycle cases.
  • No blocking issue remains in the updated code.

Important Files Changed

Filename Overview
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListScrollEdgeCoordinator.swift Adds controller discovery, edge ownership, repeated registration, cleanup, and table handoff.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListUITableView.swift Connects scroll-edge registration to window and layout lifecycle callbacks.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListBarUnderlap.swift Adds the iOS 26 safe-area underlap needed to render content beneath the bars.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift Applies the underlap modifier to the iOS workspace table.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift Adds an opt-in tab scaffold for the debug workspace-list preview.
Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListScrollEdgeEffectTests.swift Covers registration, cleanup, delayed tab attachment, overlapping tables, and handoff.

Reviews (9): Last reviewed commit: "Apply review policy: instance helpers an..." | Re-trigger Greptile

@azooz2003-bit

Copy link
Copy Markdown
Collaborator Author

Verification on isolated sim cmux-sedge-sim (iPhone 17, iOS 26.5):

Red (98dd7c1, tests only): hostedTableDrivesNavigationAndTabBarScrollEdgeEffects and departingTableDoesNotClobberReplacementRegistration fail, contentScrollView(for:) returns nil.
Green (bb3b122, head): all 7 tests pass, the 3 new registration tests plus the existing WorkspaceListScrollUpdateTests suite.

Note: CI's swift-package-tests job runs macOS swift test only, so these iOS-sim package tests do not execute there; the run above was against the package scheme on an iOS 26.5 simulator destination.

Visual before/after with the workspace-list preview fixture (30 seeded rows, scrolled): before, the row under the search bar renders at full opacity and hard-clips at the bar's bottom edge; after, it progressively fades under the toolbar + search chrome, matching the App Store treatment. Also reproduced against a live paired tagged Mac with real workspaces.

…dge effect renders

SwiftUI fits a UIViewRepresentable inside the safe area, so the table's
frame started below the search drawer and ended above the tab bar
(AX-verified frame {0,176,402,664} on a 402x874 screen): rows hard-clipped
at the table's own bounds and the scroll edge effect had no covered region
to render into. ignoresSafeArea(.container, edges: .vertical) restores the
native underlap; the real UIKit bars still contribute safe area, so
automatic content-inset adjustment keeps rows and indicators clear of the
chrome, and the soft edge effect + bar registration now render the App
Store-style progressive blur at both edges.

Also adds CMUX_UITEST_WORKSPACE_LIST_PREVIEW_TABS=1 to the DEBUG preview
fixture, wrapping the list in a TabView so the floating tab bar's bottom
edge can be dogfooded without Mac pairing. Off by default to keep the App
Store screenshot rig's chrome unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@azooz2003-bit

Copy link
Copy Markdown
Collaborator Author

Round 2 (3300379): the registration alone was not enough. The real root cause of the hard edges: SwiftUI fits a UIViewRepresentable inside the safe area, so the table's frame started below the search drawer and ended above the tab bar (AX-verified frame {0,176,402,664} on a 402x874 screen). Content clipped at the table's own bounds, leaving the edge effect no covered region to render into.

Fix: ignoresSafeArea(.container, edges: .vertical) on the table so it extends under the vertical chrome. The real UIKit bars still contribute safe area, so automatic content-inset adjustment keeps rows and scroll indicators clear, and the soft edge effect + bar registration now render the App Store-style progressive blur under the toolbar, search bar, and behind the floating tab bar. Verified in dark and light mode on the sim; all 7 package tests still pass.

Also added CMUX_UITEST_WORKSPACE_LIST_PREVIEW_TABS=1 to the DEBUG fixture (wraps the list in a TabView) so the tab bar's bottom edge is dogfoodable without Mac pairing; off by default to keep the App Store screenshot rig unchanged.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift`:
- Around line 313-325: Update the Tab labels and notification fixture text in
WorkspaceListLayoutPreviewView to use the repository’s localized API instead of
bare string literals. Reuse the existing mobile.workspaces.title catalog key for
“Workspaces” and add catalog-backed keys/default values for the “Notifications”
label and “Notification feed fixture” text, including matching localization
entries.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 5cd0610d-3252-49a8-bbb1-4688928d40a5

📥 Commits

Reviewing files that changed from the base of the PR and between bb3b122 and 3300379.

📒 Files selected for processing (2)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListLayoutPreviewView.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListView.swift

A one-shot registration flag stranded a partially assembled hierarchy:
if the navigation controller hosted the table before joining the tab bar
controller, the top-only registration cleared the retry flag and the
bottom edge never registered (Greptile P1). Re-resolving each layout pass
also covers reparenting that never changes the window (compact stack to
split sidebar); the coordinator's identity guard makes the repeated call
a no-op when nothing changed. Adds a regression test attaching the tab
bar controller after the first registration.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListScrollEdgeCoordinator.swift`:
- Line 34: Update the guard in the workspace scroll-edge coordinator to call
unregister() before returning when both navigationContent and tabContent are
nil. Preserve the existing early-return behavior while clearing stale top/bottom
content-scroll-view bindings after reparenting.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 97a83b70-cf4f-4f52-906f-57cd2d93a22f

📥 Commits

Reviewing files that changed from the base of the PR and between 3300379 and dfc4357.

📒 Files selected for processing (3)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListScrollEdgeCoordinator.swift
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListUITableView.swift
  • Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListScrollEdgeEffectTests.swift

The identity guard trusted the coordinator's cache, so when a transient
replacement table took the registration over and cleared it on departure,
the surviving table saw unchanged targets and never re-registered, leaving
both edges dead until the hierarchy changed. The guard now also compares
the controllers' effective contentScrollView(for:) against this table, so
the next layout pass self-heals the reverse handoff. Regression test
covers replacement mount, takeover, departure, and reclaim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListScrollEdgeCoordinator.swift`:
- Around line 35-50: Update the registration guard in the coordinator’s
layout/update method around topIsCurrent and bottomIsCurrent so a stale
coordinator cannot re-register while either edge is effectively owned by a
different attached scroll view. Treat the effective contentScrollView
registrations as authoritative, defer re-registration while another owner
remains attached, and allow reclaim only after that owner clears its
registration; retain existing coordinator/cache mismatch handling otherwise.

In
`@Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListScrollEdgeEffectTests.swift`:
- Around line 67-76: Extend the replacement handoff test around the existing
top-edge assertions to also verify bottom-edge ownership: assert that
replacement is registered for .bottom before removal, then assert .bottom
returns nil after replacement.removeFromSuperview(). Keep the existing
post-layout assertions confirming fixture.tableView owns both .top and .bottom.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6953be54-0b28-4361-95a3-3d56f4832373

📥 Commits

Reviewing files that changed from the base of the PR and between dfc4357 and 788334d.

📒 Files selected for processing (2)
  • Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/WorkspaceListScrollEdgeCoordinator.swift
  • Packages/iOS/CmuxMobileShellUI/Tests/CmuxMobileShellUITests/WorkspaceListScrollEdgeEffectTests.swift

The previous self-heal re-registered whenever the effective registration
differed from this table, so two live coexisting tables (SwiftUI
transition overlap) stole ownership from each other on every layout pass,
making bar ownership layout-order dependent. An edge is now claimed only
when its registration is nil or held by a detached scroll view; a
different live table keeps ownership, departure clears the edge, and the
survivor reclaims on its next layout pass. Tests pin both the no-steal
coexistence and the reclaim-after-departure handoffs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 21, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

…ercises

UIKit's hierarchy-consistency check forbids re-parenting a controller
whose view stays in a foreign hierarchy (attempting an addChild-based
window-stable variant throws UIViewControllerHierarchyInconsistency), so
a same-window assembly scenario is not constructible in a unit test; real
container attachment always relocates views. The test now documents that
it pins the end state through whichever lifecycle path fires, and points
at survivingTableReclaimsRegistrationAfterOwnerDeparts as the
window-stable layout-retry coverage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 22, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

ignoresSafeArea applied on every supported release while the scroll edge
registration is iOS 26-gated, so iOS 18-25 would scroll full-opacity rows
beneath legacy bars with no edge effect. The underlap now lives in an
availability-gated ViewModifier: iOS 26 gets the App Store treatment,
earlier releases keep the fitted frame they have today.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 22, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

An overlapping successor stands down while the owner is live, and UIKit
does not guarantee it another layout pass when the owner later departs,
so both edge registrations could stay vacant until an unrelated scroll or
resize. Clearing an edge now finds the remaining workspace table under the
same controller and marks it needing layout; its next pass runs the normal
claim arbitration. The reclaim test now only flushes pending window layout
instead of dirtying the survivor by hand, so a missing wake fails it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 22, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot uses usage-based billing for this team and has hit its on-demand spend limit.

A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue.

Converts the coordinator's pure static helpers to instance methods (the
type holds state; statics on it read as namespace members) and moves
WorkspaceListBarUnderlap into its own file per file-organization policy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@azooz2003-bit
azooz2003-bit merged commit 3e66d61 into main Jul 22, 2026
8 checks passed
@azooz2003-bit
azooz2003-bit deleted the feat-ios-soft-scroll-edge branch July 22, 2026 03:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant