blaeck 0.4.0

A component-based terminal UI framework for Rust
Documentation
use blaeck::prelude::*;

pub const SUGGESTIONS: &[&str] = &[
    "Rust",
    "Python",
    "JavaScript",
    "TypeScript",
    "Go",
    "Java",
    "C++",
    "C#",
    "Ruby",
    "Swift",
    "Kotlin",
    "Scala",
    "Haskell",
    "Elixir",
    "Clojure",
];

pub fn build_ui_with_state(suggestions: &[&str], state: &AutocompleteState) -> Element {
    let props = AutocompleteProps::new(suggestions.to_vec())
        .input(&state.input)
        .cursor(state.cursor)
        .selected(state.selected)
        .placeholder("Search languages...")
        .filter_mode(FilterMode::Contains)
        .max_suggestions(6)
        .selected_color(Color::Cyan);

    Element::node::<Box>(
        BoxProps {
            flex_direction: FlexDirection::Column,
            padding: 1.0,
            border_style: BorderStyle::Round,
            ..Default::default()
        },
        vec![
            Element::node::<Text>(
                TextProps {
                    content: "Autocomplete Demo".into(),
                    bold: true,
                    color: Some(Color::Cyan),
                    ..Default::default()
                },
                vec![],
            ),
            Element::text(""),
            Element::node::<Text>(
                TextProps {
                    content: "Type to filter programming languages:".into(),
                    dim: true,
                    ..Default::default()
                },
                vec![],
            ),
            Element::text(""),
            Element::node::<Autocomplete>(props, vec![]),
            Element::text(""),
            Element::node::<Divider>(
                DividerProps::new()
                    .width(40)
                    .line_style(DividerStyle::Dashed)
                    .color(Color::DarkGray),
                vec![],
            ),
            Element::node::<Text>(
                TextProps {
                    content: "↑/↓ navigate • Enter/Tab select • Esc quit".into(),
                    dim: true,
                    ..Default::default()
                },
                vec![],
            ),
        ],
    )
}

pub fn build_ui() -> Element {
    let state = AutocompleteState::new();
    build_ui_with_state(SUGGESTIONS, &state)
}