iconmate 1.2.1

CLI to fetch icons and save them into your Vite, NextJS, or similar TypeScript project
Documentation
use crate::app_state::{App, AppFocus};
use crate::utils::popup_area;
use ratatui::Frame;
use ratatui::layout::{Alignment, Constraint};
use ratatui::style::Style;
use ratatui::text::{Line, Span};
use ratatui::widgets::Paragraph;
use tui_textarea::{Input, Key};

impl App {
    pub fn init_help_popup(&mut self) {
        self.app_focus = AppFocus::HelpPopup;
    }

    pub fn handlekeys_help_popup(&mut self, input: Input) {
        match input.key {
            Key::Esc | Key::Char('?') => {
                self.app_focus = AppFocus::Main;
            }
            _ => {}
        }
    }
}

pub fn render_help_popup(f: &mut Frame, app: &App) {
    use ratatui::style::Modifier;

    let area = popup_area(f.area(), 76, 15);
    let body_area = crate::views::theme::render_popup_shell(f, area, "Help");

    let layout = ratatui::layout::Layout::default()
        .direction(ratatui::layout::Direction::Vertical)
        .constraints([
            Constraint::Length(2),
            Constraint::Length(1),
            Constraint::Length(4),
        ])
        .split(body_area);

    let config_lines = vec![
        Line::from(vec![
            Span::styled(
                if app.config.global_config_loaded {
                    "● "
                } else {
                    "○ "
                },
                Style::default().fg(if app.config.global_config_loaded {
                    crate::views::theme::ACCENT
                } else {
                    crate::views::theme::SUBTLE_TEXT
                }),
            ),
            Span::styled(
                "Global config",
                Style::default()
                    .fg(crate::views::theme::TEXT)
                    .add_modifier(Modifier::BOLD),
            ),
        ]),
        Line::from(vec![
            Span::styled(
                if app.config.project_config_loaded {
                    "● "
                } else {
                    "○ "
                },
                Style::default().fg(if app.config.project_config_loaded {
                    crate::views::theme::ACCENT
                } else {
                    crate::views::theme::SUBTLE_TEXT
                }),
            ),
            Span::styled(
                "Local config",
                Style::default()
                    .fg(crate::views::theme::TEXT)
                    .add_modifier(Modifier::BOLD),
            ),
        ]),
    ];
    let config_status = Paragraph::new(config_lines).alignment(Alignment::Left);
    f.render_widget(config_status, layout[0]);

    let svg_viewer_cmd = app.config.svg_viewer_cmd.as_deref().unwrap_or("Not set");
    let status = Paragraph::new(format!(
        "Folder: {}\nPreset: {}\nSVG viewer cmd: {}\nViewer cmd source: {}",
        app.config.folder,
        app.config.preset.as_str(),
        svg_viewer_cmd,
        app.config.svg_viewer_cmd_source
    ))
    .alignment(Alignment::Left)
    .style(Style::default().fg(crate::views::theme::MUTED_TEXT));
    f.render_widget(status, layout[2]);
}