ratatui-spatial-splits 0.1.1

Pure geometry engine for spatial split management in ratatui applications
Documentation
# ratatui-spatial-splits

[![Crates.io](https://img.shields.io/crates/v/ratatui-spatial-splits.svg)](https://crates.io/crates/ratatui-spatial-splits)
[![License: LGPL-3.0-or-later](https://img.shields.io/badge/License-LGPL--3.0--or--later-blue.svg)](https://opensource.org/license/lgpl-3-0)
[![Repository](https://img.shields.io/badge/repository-GitHub-black)](https://github.com/jayson-lennon/ratatui-spatial-splits)

Pure geometry engine for spatial split management in [ratatui](https://github.com/ratatui/ratatui) applications.

`ratatui-spatial-splits` provides a `SplitManager` that manages a binary tree of horizontal and vertical splits, computing accurate areas for each leaf. It handles spatial navigation (beam/raycasting), tree mutations (split, close, resize), and area caching with automatic invalidation.

Check out [the docs](https://docs.rs/crate/ratatui-spatial-splits) for more info.

## Usage

Add `ratatui-spatial-splits` to your `Cargo.toml`:

```toml
[dependencies]
ratatui-spatial-splits = "0.1.0"
```

## Split Management

`SplitManager` handles a binary tree of splits — adding, removing, resizing, and navigating between areas:

```rust
use ratatui_spatial_splits::{SplitManager, AreaId, Direction};
use ratatui::layout::Rect;

let mut mgr = SplitManager::new();

// Set the viewport.
mgr.set_viewport(Rect::new(0, 0, 100, 100));

// Split the initial leaf vertically (left/right).
let result = mgr.split_vertical(AreaId(1)).unwrap();
assert_eq!(result.new, AreaId(2));

// Split the right leaf horizontally (top/bottom).
mgr.split_horizontal(AreaId(2)).unwrap();

// Retrieve computed areas for all leaves.
let areas = mgr.areas();
assert_eq!(areas.len(), 3);

// Navigate between areas using spatial raycasting.
let neighbor = mgr.navigate(AreaId(1), Direction::Right);
assert_eq!(neighbor, Some(AreaId(2)));

// Resize a split.
mgr.resize(AreaId(1), Direction::Right, 10);

// Close an area (sibling replaces parent).
let result = mgr.close(AreaId(3)).unwrap();
assert_eq!(result.surviving, AreaId(2));
```

## License

[LGPL-3.0-or-later](https://www.gnu.org/licenses/lgpl-3.0.en.html)