Skip to content

Latest commit

 

History

History
74 lines (58 loc) · 3.51 KB

File metadata and controls

74 lines (58 loc) · 3.51 KB

Changelog

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.

[Unreleased]

Added

  • BonsplitConfiguration.Appearance.tabWidthMode (TabWidthMode) to control tab sizing.
    • .fixed (default) keeps the historical fixed-width + horizontal-scroll layout unchanged.
    • .fill stretches 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" with isPinned == 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 .toggleAudioMute route), 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.

[1.1.1] - 2025-01-29

Fixed

  • Fixed delegate notifications not being sent when closing tabs (#2)
    • Tabs now correctly communicate through BonsplitController for proper delegate callbacks

Added

  • New public method closeTab(_ tabId: TabID, inPane paneId: PaneID) -> Bool for efficient tab closing when pane is known

[1.1.0] - 2025-01-26

Added

Two-Way Synchronization API

  • Geometry Query: Query pane layout with pixel coordinates for integration with external programs

    • layoutSnapshot() - Get flat list of pane geometries with pixel coordinates
    • treeSnapshot() - Get full tree structure for external consumption
    • findSplit(_:) - Check if a split exists by UUID
  • Programmatic Updates: Control divider positions from external sources

    • setDividerPosition(_:forSplit:fromExternal:) - Set divider position with loop prevention
    • setContainerFrame(_:) - Update container frame when window moves/resizes
  • Geometry Notifications: Receive callbacks when geometry changes

    • didChangeGeometry delegate callback - Notified when any pane geometry changes
    • shouldNotifyDuringDrag delegate callback - Opt-in to real-time notifications during divider drag

New Types

  • LayoutSnapshot - Full tree snapshot with pixel coordinates and timestamp
  • PixelRect - Pixel rectangle for external consumption (Codable, Sendable)
  • PaneGeometry - Geometry for a single pane including frame and tab info
  • ExternalTreeNode - Recursive tree representation (enum: pane or split)
  • ExternalPaneNode - Pane node for external consumption
  • ExternalSplitNode - Split node with orientation and divider position
  • ExternalTab - Tab info for external consumption

Debug Tools

  • Debug window in Example app for testing synchronization features

[1.0.0] - Initial Release

Added

  • 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)