ratkit 0.2.14

A comprehensive collection of reusable TUI components for ratatui including resizable splits, tree views, markdown rendering, toast notifications, dialogs, and terminal embedding
Documentation
use ratatui::{
    text::Line,
    widgets::{Block, Borders, Paragraph},
    Frame,
};
use ratkit::widgets::theme_picker::{ThemePicker, ThemePickerEvent};
use ratkit::{
    run_with_diagnostics, CoordinatorAction, CoordinatorApp, CoordinatorEvent, RunnerConfig,
};

struct ThemePickerDemo {
    picker: ThemePicker,
    last_event: String,
}

impl ThemePickerDemo {
    fn new() -> Self {
        let mut picker = ThemePicker::new();
        picker.show();
        Self {
            picker,
            last_event: "Previewing themes".to_string(),
        }
    }
}

impl CoordinatorApp for ThemePickerDemo {
    fn on_event(&mut self, event: CoordinatorEvent) -> ratkit::LayoutResult<CoordinatorAction> {
        match event {
            CoordinatorEvent::Keyboard(keyboard) if keyboard.is_key_down() => {
                use crossterm::event::KeyCode;

                if keyboard.key_code == KeyCode::Char('q') {
                    return Ok(CoordinatorAction::Quit);
                }

                if keyboard.key_code == KeyCode::Char('t') {
                    if self.picker.is_visible() {
                        self.picker.hide();
                    } else {
                        self.picker.show();
                    }
                    return Ok(CoordinatorAction::Redraw);
                }

                if let Some(event) = self.picker.handle_key(&keyboard.key_code) {
                    self.last_event = match event {
                        ThemePickerEvent::Selected(name) => format!("Selected: {}", name),
                        ThemePickerEvent::Cancelled => "Cancelled".to_string(),
                        ThemePickerEvent::PreviewChanged(name) => {
                            format!("Preview: {}", name)
                        }
                    };
                }
                Ok(CoordinatorAction::Redraw)
            }
            _ => Ok(CoordinatorAction::Continue),
        }
    }

    fn on_draw(&mut self, frame: &mut Frame) {
        let area = frame.area();
        let body = Paragraph::new(vec![
            Line::from("t: toggle picker"),
            Line::from("q: quit"),
            Line::from(self.last_event.clone()),
        ])
        .block(
            Block::default()
                .borders(Borders::ALL)
                .title(" Theme Picker "),
        );
        frame.render_widget(body, area);
        self.picker.render(frame, area);
    }
}

fn main() -> std::io::Result<()> {
    let app = ThemePickerDemo::new();
    run_with_diagnostics(app, RunnerConfig::default())
}