Skip to content

Fix minimal tab drag window movement - #124

Merged
austinywang merged 12 commits into
mainfrom
issue-4289-minimal-mode-tab-drag
May 19, 2026
Merged

austinywang merged 12 commits into
mainfrom
issue-4289-minimal-mode-tab-drag

Conversation

@austinywang

@austinywang austinywang commented May 18, 2026 •

Copy link
Copy Markdown

Summary\n- Registers real Bonsplit tab frames separately from empty tab-bar chrome.\n- Prevents minimal-mode tab-bar background window dragging when the pointer is inside a real pane tab.\n- Adds coverage that tab frames suppress implicit app-window dragging while empty chrome stays draggable.\n\n## Testing\n- Not run locally; cmux policy runs tests in CI.\n\nNeeded by manaflow-ai/cmux#4290.


Summary by cubic

Fixes accidental window movement in minimal mode by blocking implicit window dragging over real tabs. Also routes tab‑header double‑click zoom through host-owned handling to keep workspace state in sync.

  • Bug Fixes
    • Track real tab areas (including full configured tab width) via BonsplitTabItemHitRegionRegistry/BonsplitTabItemHitRegionProviding and suppress minimal‑mode chrome dragging and double‑click over tabs, even before frame caches populate; hidden or unmounted providers are ignored.
    • Show an open‑hand cursor only over minimal‑mode empty chrome after tabs and before action buttons; cursor rects update as state changes.
    • Let the split‑button lane use trailing whitespace before applying the width cap to avoid overflow.
    • Route tab-header double‑click zoom via BonsplitController.requestTabZoomToggle with optional onTabZoomToggleRequest (@mainactor); single‑click selection stays instant.

Written for commit 02db30f. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • New Features

    • Double-tap on a tab to request zoom; host can intercept zoom-toggle requests via a new controller hook.
  • Bug Fixes

    • More reliable tab hit-testing and hit-region registration to prevent accidental window-dragging over tabs.
    • Split-button lane sizing refined to respect trailing tab content width and avoid overflow.
    • Drag-zone cursor handling improved for minimal-mode behavior.
  • Tests

    • Added coverage for hit-region tracking, minimal-mode cursor/click behavior, layout clipping, and zoom-request delegation.

Review Change Stack

cmux needs tab chrome zoom actions to run the same host-owned reconciliation used by shortcuts and context menus, instead of mutating Bonsplit zoom state directly from the SwiftUI tab item.

Constraint: Tab header gesture ownership lives in Bonsplit while cmux owns portal visibility and focus reconciliation.

Rejected: Toggle splitViewController.zoomedPaneId directly from double-click | it would bypass cmux workspace side effects.

Confidence: medium

Scope-risk: moderate

Directive: Keep tab-chrome zoom requests routed through requestTabZoomToggle when hosts need side-effect ownership.

Tested: git diff --check

Not-tested: Local XCTest per cmux no-local-tests instruction
Tab chrome gestures are UI events and host zoom reconciliation runs on the main actor, so the public callback type now states that isolation explicitly.

Constraint: Greptile review requested explicit confirmation of the Bonsplit-side actor annotation.

Rejected: Rely only on BonsplitController class isolation | less clear at the stored closure boundary.

Confidence: high

Scope-risk: narrow

Tested: git diff --check

Not-tested: Local XCTest per cmux no-local-tests instruction
…ns-clip' into issue-3824-double-click-zoom-pane
@coderabbitai

coderabbitai Bot commented May 18, 2026 •

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f3cc0799-e381-4fb8-9ad2-7ed99dd6ad15

📥 Commits

Reviewing files that changed from the base of the PR and between dc78f5c and 02db30f.

📒 Files selected for processing (2)
  • Sources/Bonsplit/Internal/Views/TabItemView.swift
  • Tests/BonsplitTests/BonsplitTests.swift

📝 Walkthrough

Walkthrough

Adds an AppKit-scoped tab-item hit-region protocol and registry, threads tab-content width into TabBarLayout for split-button sizing, centralizes tab-scroll geometry updates, registers hit-region providers from tab items and background view, updates drag-zone cursor and hit-test behavior, and exposes a controller hook for tab-zoom requests.

Changes

Tab-item hit-region and split-button lane width

Layer / File(s) Summary
Hit-region protocol and registry
Sources/Bonsplit/Internal/Views/TabBarView.swift
Defines BonsplitTabItemHitRegionProviding and BonsplitTabItemHitRegionRegistry and adds TabItemHitRegionView which registers/unregisters provider views and answers local-point containment for window-point queries.
TabBarLayout split-button lane width computation
Sources/Bonsplit/Internal/Views/TabBarView.swift
Adds optional tabContentWidthExcludingSplitButtonLane, clamps initializer input, computes trailingWhitespaceBeforeSplitButtonLane, and constrains maximumSplitButtonLaneWidth using both a fractional cap and available trailing whitespace.
TabBarView scroll-content state and geometry updates
Sources/Bonsplit/Internal/Views/TabBarView.swift
Adds @State tabContentWidthExcludingSplitButtonLane, threads it into TabBarLayout, refactors scroll geometry updates into updateTabScrollContent(frame:), and forwards tabFrames to the drag/hover background view.
Tab items and background register hit-region providers
Sources/Bonsplit/Internal/Views/TabBarView.swift
Each TabItemView includes a hidden TabItemHitRegionView() background so tab-item frames register with the hit-region registry; TabBarBackgroundNSView stores tabFrames, conforms to the provider protocol, registers/unregisters on lifecycle changes, and answers padded-frame containment.
Drag-zone cursor rects and hitTest deferral
Sources/Bonsplit/Internal/Views/TabBarView.swift
DragNSView invalidates cursor rects when hit-region or minimal-mode state changes, sets open-hand cursor rects in resetCursorRects, computes/invalidate window drag cursor rects for minimal/trailing-empty-chrome states, and defers hit capture when BonsplitTabItemHitRegionRegistry.containsWindowPoint reports a tab-item hit.
TabItem sizing, double-tap, and controller hook
Sources/Bonsplit/Internal/Views/TabItemView.swift, Sources/Bonsplit/Public/BonsplitController.swift
Adds TabItemStyling.tabWidthRange and uses it for TabItemView width constraints, adds a double-tap gesture to call onZoomToggle, rewires tab zoom toggle to use controller.requestTabZoomToggle(for:inPane:), and introduces BonsplitController.onTabZoomToggleRequest with requestTabZoomToggle(for:inPane:).
Tests: hit-region doubles and layout/behavior tests
Tests/BonsplitTests/BonsplitTests.swift
Adds FakeTabItemHitRegionView test double, TabBarLayout trailing-whitespace test, registry hit-testing tests (real frames vs hidden providers), trailing-empty-chrome deferral test, controller delegation tests for requestTabZoomToggle, hit-testing regression for short tabs, and several rendering/ cursor-test updates.

Sequence Diagram

sequenceDiagram
  participant Window
  participant BonsplitTabItemHitRegionRegistry
  participant TabBarBackgroundNSView
  Window->>BonsplitTabItemHitRegionRegistry: containsWindowPoint(windowPoint, window)
  BonsplitTabItemHitRegionRegistry->>TabBarBackgroundNSView: convertPointToLocal(windowPoint)
  TabBarBackgroundNSView->>BonsplitTabItemHitRegionRegistry: containsBonsplitTabItemHit(localPoint) (Bool)
  BonsplitTabItemHitRegionRegistry-->>Window: Bool (any provider hit)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A rabbit peeks where clicks should land,

hidden bounds traced by a careful hand.
Tabs hold their pixels, whitespace keeps room,
cursors step back and double-taps bloom. 🥕

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.26% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Fix minimal tab drag window movement' accurately summarizes the main change: preventing minimal-mode tab-bar background window dragging when the pointer is inside a real pane tab, while maintaining draggability of empty chrome areas.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-4289-minimal-mode-tab-drag

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 and usage tips.

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

🧹 Nitpick comments (3)
Sources/Bonsplit/Internal/Views/TabBarView.swift (2)

54-98: 💤 Low value

Consider extracting shared registry logic.

BonsplitTabItemHitRegionRegistry duplicates nearly all of BonsplitTabBarHitRegionRegistry (lines 5-48): register, unregister, snapshot, isVisibleInHierarchy, and the locking pattern. A generic base or shared helper could reduce this duplication.

Given the localized scope and low immediate risk, this can be deferred.

🤖 Prompt for 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.

In `@Sources/Bonsplit/Internal/Views/TabBarView.swift` around lines 54 - 98,
BonsplitTabItemHitRegionRegistry duplicates the
locking/registry/snapshot/isVisibleInHierarchy logic found in
BonsplitTabBarHitRegionRegistry; extract a shared helper (e.g., a
BonsplitHitRegionRegistry type or protocol + concrete class) that owns the
NSLock, NSHashTable<NSView>, and methods register(_:), unregister(_:),
snapshot(), and isVisibleInHierarchy(_:), then replace the duplicated
implementations in BonsplitTabItemHitRegionRegistry and
BonsplitTabBarHitRegionRegistry to delegate to that shared helper (keep public
containsWindowPoint(_:in:) behavior in each enum and cast to
BonsplitTabItemHitRegionProviding / the bar equivalent as currently done).

2340-2340: 💤 Low value

nonisolated(unsafe) on tabFrames relies on main-thread access pattern.

This annotation bypasses Swift's isolation checking. The property is written from updateNSView (main thread) and read from containsBonsplitTabItemHit (also main thread via AppKit event handling). The pattern is safe in practice, but if the registry's containsWindowPoint were ever called from a background thread, this would race.

Current usage appears correct.

🤖 Prompt for 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.

In `@Sources/Bonsplit/Internal/Views/TabBarView.swift` at line 2340, The use of
nonisolated(unsafe) on tabFrames bypasses Swift concurrency checks and can race
if accessed off the main thread; instead mark the property to enforce
main-thread access (e.g., change the declaration to an `@MainActor` var tabFrames:
[CGRect] = []) and remove nonisolated(unsafe), and ensure updateNSView and
containsBonsplitTabItemHit (and any callers like registry.containsWindowPoint)
access tabFrames on the main actor so reads/writes are serialized to the main
thread.
Tests/BonsplitTests/BonsplitTests.swift (1)

29-55: 💤 Low value

Consider immutability or document concurrency safety for the test double.

The nonisolated(unsafe) annotation on tabFrames (line 31) allows concurrent access without synchronization. While this is required because containsBonsplitTabItemHit is nonisolated, the mutable array creates a potential data race if tabFrames is modified while hit-testing runs concurrently.

For test code with controlled access patterns this is acceptable, but consider either:

  • Making tabFrames effectively immutable after initial setup (though this would require restructuring test setup)
  • Adding a comment documenting that tests must not mutate tabFrames after the view is registered
  • Using a thread-safe collection if concurrent access becomes necessary
🤖 Prompt for 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.

In `@Tests/BonsplitTests/BonsplitTests.swift` around lines 29 - 55, The test
double FakeTabItemHitRegionView exposes a mutable nonisolated(unsafe) var
tabFrames which can cause data races when containsBonsplitTabItemHit is called
concurrently; change tabFrames to be immutable after setup (e.g., make it a let
set once via initializer or a private(set) var that is only mutated before
registering with BonsplitTabItemHitRegionRegistry) or add an explicit
comment/documentation on FakeTabItemHitRegionView near tabFrames and in any test
setup stating that tabFrames must not be mutated after the view is registered,
so callers know the concurrency contract; ensure references to
containsBonsplitTabItemHit and register/unregister usage remain consistent.
🤖 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.

Nitpick comments:
In `@Sources/Bonsplit/Internal/Views/TabBarView.swift`:
- Around line 54-98: BonsplitTabItemHitRegionRegistry duplicates the
locking/registry/snapshot/isVisibleInHierarchy logic found in
BonsplitTabBarHitRegionRegistry; extract a shared helper (e.g., a
BonsplitHitRegionRegistry type or protocol + concrete class) that owns the
NSLock, NSHashTable<NSView>, and methods register(_:), unregister(_:),
snapshot(), and isVisibleInHierarchy(_:), then replace the duplicated
implementations in BonsplitTabItemHitRegionRegistry and
BonsplitTabBarHitRegionRegistry to delegate to that shared helper (keep public
containsWindowPoint(_:in:) behavior in each enum and cast to
BonsplitTabItemHitRegionProviding / the bar equivalent as currently done).
- Line 2340: The use of nonisolated(unsafe) on tabFrames bypasses Swift
concurrency checks and can race if accessed off the main thread; instead mark
the property to enforce main-thread access (e.g., change the declaration to an
`@MainActor` var tabFrames: [CGRect] = []) and remove nonisolated(unsafe), and
ensure updateNSView and containsBonsplitTabItemHit (and any callers like
registry.containsWindowPoint) access tabFrames on the main actor so reads/writes
are serialized to the main thread.

In `@Tests/BonsplitTests/BonsplitTests.swift`:
- Around line 29-55: The test double FakeTabItemHitRegionView exposes a mutable
nonisolated(unsafe) var tabFrames which can cause data races when
containsBonsplitTabItemHit is called concurrently; change tabFrames to be
immutable after setup (e.g., make it a let set once via initializer or a
private(set) var that is only mutated before registering with
BonsplitTabItemHitRegionRegistry) or add an explicit comment/documentation on
FakeTabItemHitRegionView near tabFrames and in any test setup stating that
tabFrames must not be mutated after the view is registered, so callers know the
concurrency contract; ensure references to containsBonsplitTabItemHit and
register/unregister usage remain consistent.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bc432a94-fc25-4e17-8ea0-cfc4157cf237

📥 Commits

Reviewing files that changed from the base of the PR and between 0fc0117 and e1a9e76.

📒 Files selected for processing (2)
  • Sources/Bonsplit/Internal/Views/TabBarView.swift
  • Tests/BonsplitTests/BonsplitTests.swift

@cubic-dev-ai cubic-dev-ai 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.

No issues found across 2 files

Re-trigger cubic

@greptile-apps

greptile-apps Bot commented May 18, 2026

Copy link
Copy Markdown

Greptile Summary

This PR fixes the bug where clicking inside a real tab in minimal-mode windows would trigger implicit app-window dragging. It does so by introducing BonsplitTabItemHitRegionRegistry — a parallel to the existing BonsplitTabBarHitRegionRegistry — that lets TabBarBackgroundNSView report whether a click lands on an actual tab frame and, if so, skip the window.performDrag(with:) path. The PR also adds a tabContentWidthExcludingSplitButtonLane field to TabBarLayout so the split-button lane can expand to fill trailing whitespace rather than being capped solely by a fraction of the available width.

  • New registry (BonsplitTabItemHitRegionRegistry): TabBarBackgroundNSView registers itself, stores the array of tab frames (in the \"tabBar\" coordinate space), and implements containsBonsplitTabItemHit with a 2 pt outset tolerance. In mouseDown, the check now precedes the performDrag call so clicks on real tabs pass straight through to super.
  • TabBarLayout.tabContentWidthExcludingSplitButtonLane: Computed via updateTabScrollContent from the scroll-content geometry; feeds trailingWhitespaceBeforeSplitButtonLane so maximumSplitButtonLaneWidth is the larger of the fraction cap and the available trailing space.
  • Tests: Three new test cases verify the registry suppresses dragging for tab points, respects hidden providers, and confirm the new layout math; plus a minor fix to the existing screenshot test (8 tabs instead of 1) to better exercise the split-button overflow path.

Confidence Score: 4/5

The core drag-suppression logic is correct and well-tested; the only concerns are concurrency annotations that mirror the pre-existing registry pattern.

The functional change — checking tab frames before calling window.performDrag — is straightforward and the tests verify both the happy path and the hidden-provider edge case. The two concurrency observations (nonisolated(unsafe) on tabFrames and no @mainactor on containsWindowPoint) are real gaps but are consistent with how the existing BonsplitTabBarHitRegionRegistry is written; in practice all callers are AppKit event handlers on the main thread.

Sources/Bonsplit/Internal/Views/TabBarView.swift — specifically BonsplitTabItemHitRegionRegistry.containsWindowPoint and TabBarBackgroundNSView.tabFrames regarding actor-isolation annotations.

Important Files Changed

Filename Overview
Sources/Bonsplit/Internal/Views/TabBarView.swift Adds BonsplitTabItemHitRegionRegistry and wires TabBarBackgroundNSView to suppress window-drag in minimal mode when pointer is over a real tab frame; also adds tabContentWidthExcludingSplitButtonLane to TabBarLayout to improve split-button lane sizing. Two concurrency annotations (nonisolated(unsafe) on tabFrames, no @mainactor on containsWindowPoint) are technically unsafe but mirror the pre-existing BonsplitTabBarHitRegionRegistry pattern.
Tests/BonsplitTests/BonsplitTests.swift Adds FakeTabItemHitRegionView helper and three new test cases covering the tab-item hit registry (real-tab vs. empty chrome, hidden-provider suppression) and the new trailing-whitespace layout calculation. Tests are well-structured and use window coordinates correctly via the round-trip convert approach.

Sequence Diagram

sequenceDiagram
    participant SwiftUI as TabBarView (SwiftUI)
    participant BG as TabBarBackgroundNSView
    participant Reg as BonsplitTabItemHitRegionRegistry
    participant Win as NSWindow

    SwiftUI->>BG: updateNSView(tabFrames: [...])
    Note over BG: tabFrames stored (nonisolated unsafe)

    SwiftUI->>BG: viewDidMoveToWindow
    BG->>Reg: register(self)

    Win->>BG: mouseDown(event)
    BG->>BG: convert(event.locationInWindow, from: nil) → localPoint
    BG->>BG: containsBonsplitTabItemHit(localPoint)
    alt localPoint inside a tab frame
        BG->>BG: super.mouseDown(event) [no drag]
    else empty chrome
        BG->>Win: performDrag(with: event) [window drag]
    end

    Note over Reg: containsWindowPoint called by cmux
    Reg->>BG: containsBonsplitTabItemHit(localPoint)
    BG-->>Reg: true / false
Loading

Reviews (1): Last reviewed commit: "Fix minimal tab drag window movement" | Re-trigger Greptile

Comment on lines +86 to +97
public static func containsWindowPoint(_ windowPoint: CGPoint, in window: NSWindow) -> Bool {
for view in snapshot() {
guard view.window === window,
isVisibleInHierarchy(view),
let provider = view as? BonsplitTabItemHitRegionProviding else { continue }
let localPoint = view.convert(windowPoint, from: nil)
if provider.containsBonsplitTabItemHit(localPoint: localPoint) {
return true
}
}
return false
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 containsWindowPoint accesses @MainActor APIs without actor annotation

isVisibleInHierarchy and containsWindowPoint read view.window, view.superview, view.isHidden, view.alphaValue, and call view.convert(_:from:) — all @MainActor-isolated AppKit properties. The method carries no @MainActor annotation and is public, so callers in cmux or other consumers can invoke it from a non-main-actor context without a compiler warning. Combined with tabFrames being nonisolated(unsafe), a concurrent write during a background-thread call to containsWindowPoint would be an undetected data race. Adding @MainActor to the method (and to the parallel BonsplitTabBarHitRegionRegistry.containsWindowPoint) would close the gap without any behavioural change for existing callers, which are all AppKit event handlers.

final class TabBarBackgroundNSView: NSView {
final class TabBarBackgroundNSView: NSView, BonsplitTabItemHitRegionProviding {
var isMinimalMode = false
nonisolated(unsafe) var tabFrames: [CGRect] = []

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 nonisolated(unsafe) bypasses Swift concurrency safety for tabFrames

tabFrames is written from the main actor (via updateNSView, which runs on @MainActor) and read from nonisolated func containsBonsplitTabItemHit. The nonisolated(unsafe) annotation makes the Swift compiler accept this but provides no runtime protection. Since BonsplitTabItemHitRegionRegistry.containsWindowPoint is not @MainActor-constrained, a caller on a background actor could trigger a read while the main actor is updating tabFrames, producing a data race. Restricting containsWindowPoint to @MainActor (see sibling comment) would make this field safely accessible without the unsafe escape hatch.

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

🧹 Nitpick comments (1)
Sources/Bonsplit/Internal/Views/TabBarView.swift (1)

107-109: 💤 Low value

Consider documenting the thread-safety assumption for hitBounds.

The nonisolated(unsafe) annotation on hitBounds relies on the assumption that containsBonsplitTabItemHit is only called from the main thread (via AppKit's hit testing). Consider adding a brief comment explaining this invariant for future maintainers.

🤖 Prompt for 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.

In `@Sources/Bonsplit/Internal/Views/TabBarView.swift` around lines 107 - 109, The
field hitBounds in RegionNSView is marked nonisolated(unsafe) which assumes
containsBonsplitTabItemHit is only invoked on the main/AppKit thread; add a
concise comment above the declaration of nonisolated(unsafe) private var
hitBounds explaining this thread-safety invariant (that hitBounds is accessed
only from the main thread via AppKit hit testing) and note any consequences or
required call-site guarantees so future maintainers understand why the unsafe
annotation is safe; reference RegionNSView, hitBounds, and
containsBonsplitTabItemHit in the comment.
🤖 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.

Nitpick comments:
In `@Sources/Bonsplit/Internal/Views/TabBarView.swift`:
- Around line 107-109: The field hitBounds in RegionNSView is marked
nonisolated(unsafe) which assumes containsBonsplitTabItemHit is only invoked on
the main/AppKit thread; add a concise comment above the declaration of
nonisolated(unsafe) private var hitBounds explaining this thread-safety
invariant (that hitBounds is accessed only from the main thread via AppKit hit
testing) and note any consequences or required call-site guarantees so future
maintainers understand why the unsafe annotation is safe; reference
RegionNSView, hitBounds, and containsBonsplitTabItemHit in the comment.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 93dd0149-8c7b-47d5-abef-caf1e8a23f22

📥 Commits

Reviewing files that changed from the base of the PR and between e1a9e76 and ba80421.

📒 Files selected for processing (2)
  • Sources/Bonsplit/Internal/Views/TabBarView.swift
  • Tests/BonsplitTests/BonsplitTests.swift

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