All notable changes to Bonsplit will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
BonsplitConfiguration.Appearance.tabWidthMode(TabWidthMode) to control tab sizing..fixed(default) keeps the historical fixed-width + horizontal-scroll layout unchanged..fillstretches tabs to fill the pane's available tab-bar width, distributing the space equally; a single tab spans the full width. Tabs fall back to fixed sizing and scroll when they would overflow at their natural width.
- Pinned browser tabs (
kind == "browser"withisPinned == true) now collapse to an icon-only chip (favicon only) sized to a compact fixed width, mirroring pinned tabs in macOS browsers. The full title stays available via the tab tooltip and accessibility label. A small corner badge preserves audio / unread / dirty activity signals (the audio badge stays click-to-mute via the existing.toggleAudioMuteroute), and the control-shortcut number hint still appears (crossfading over the favicon on modifier-hold) with its width reserved so the tab never resizes. Pinned terminal (and other non-browser) tabs keep their titled layout.
- Fixed delegate notifications not being sent when closing tabs (#2)
- Tabs now correctly communicate through
BonsplitControllerfor proper delegate callbacks
- Tabs now correctly communicate through
- New public method
closeTab(_ tabId: TabID, inPane paneId: PaneID) -> Boolfor efficient tab closing when pane is known
-
Geometry Query: Query pane layout with pixel coordinates for integration with external programs
layoutSnapshot()- Get flat list of pane geometries with pixel coordinatestreeSnapshot()- Get full tree structure for external consumptionfindSplit(_:)- Check if a split exists by UUID
-
Programmatic Updates: Control divider positions from external sources
setDividerPosition(_:forSplit:fromExternal:)- Set divider position with loop preventionsetContainerFrame(_:)- Update container frame when window moves/resizes
-
Geometry Notifications: Receive callbacks when geometry changes
didChangeGeometrydelegate callback - Notified when any pane geometry changesshouldNotifyDuringDragdelegate callback - Opt-in to real-time notifications during divider drag
LayoutSnapshot- Full tree snapshot with pixel coordinates and timestampPixelRect- Pixel rectangle for external consumption (Codable, Sendable)PaneGeometry- Geometry for a single pane including frame and tab infoExternalTreeNode- Recursive tree representation (enum: pane or split)ExternalPaneNode- Pane node for external consumptionExternalSplitNode- Split node with orientation and divider positionExternalTab- Tab info for external consumption
- Debug window in Example app for testing synchronization features
- Tab bar with drag-and-drop reordering
- Horizontal and vertical split panes
- 120fps animations
- Configurable appearance and behavior
- Delegate callbacks for all tab and pane events
- Keyboard navigation between panes
- Content view lifecycle options (recreateOnSwitch, keepAllAlive)
- Configuration presets (default, singlePane, readOnly)