tela-engine 0.1.0

Runtime engine for Tela — React Native for terminals. QuickJS bridge, native APIs, and ratatui renderer.
Documentation
use ratatui::layout::Rect;
use ratatui::text::Line;
use ratatui::widgets::{List, ListDirection, ListItem, ListState};
use ratatui::Frame;

use super::{collect_element_children, collect_text_content, parse_highlight_style};
use crate::elements::Element;

pub fn render(frame: &mut Frame, area: Rect, element: &Element) {
    let children = collect_element_children(element);
    let items: Vec<ListItem> = children
        .iter()
        .map(|child| ListItem::new(Line::from(collect_text_content(child))))
        .collect();

    let highlight_symbol = element
        .props
        .get("highlight_symbol")
        .and_then(|v| v.as_str())
        .unwrap_or("\u{25b6} ");

    let highlight_style = parse_highlight_style(element);

    let mut list = List::new(items)
        .highlight_style(highlight_style)
        .highlight_symbol(highlight_symbol);

    match element.props.get("direction").and_then(|v| v.as_str()) {
        Some("horizontal") => {
            list = list.direction(ListDirection::BottomToTop);
        }
        _ => {}
    }

    if let Some(selected) = element.props.get("selected").and_then(|v| v.as_u64()) {
        let mut state = ListState::default();
        state.select(Some(selected as usize));
        frame.render_stateful_widget(list, area, &mut state);
    } else {
        frame.render_widget(list, area);
    }
}