rustact 0.1.0

Async terminal UI framework inspired by React, built on top of ratatui and tokio.
Documentation
use ratatui::Frame;
use ratatui::layout::{Constraint, Direction, Layout, Rect};

use crate::runtime::{FlexDirection, FlexView};

use super::RenderFn;

pub fn render_flex(frame: &mut Frame<'_>, area: Rect, view: &FlexView, render_child: RenderFn) {
    if view.children.is_empty() {
        return;
    }

    let chunk_count = view.children.len();
    let constraints = vec![Constraint::Ratio(1, chunk_count as u32); chunk_count];
    let layout = Layout::default()
        .direction(Direction::from(view.direction))
        .constraints(constraints);
    let chunks = layout.split(area);
    for (child, rect) in view.children.iter().zip(chunks.iter()) {
        render_child(frame, *rect, child);
    }
}

impl From<FlexDirection> for Direction {
    fn from(value: FlexDirection) -> Self {
        match value {
            FlexDirection::Row => Direction::Horizontal,
            FlexDirection::Column => Direction::Vertical,
        }
    }
}