# ratatui-spatial-splits
[](https://crates.io/crates/ratatui-spatial-splits)
[](https://opensource.org/license/lgpl-3-0)
[](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)