git_iris/
ui.rs

1use colored::Colorize;
2use console::Term;
3use indicatif::{ProgressBar, ProgressStyle};
4use ratatui::style::Color;
5use std::fmt::Write;
6use std::time::Duration;
7
8pub const STARLIGHT: Color = Color::Rgb(255, 255, 240);
9pub const NEBULA_PURPLE: Color = Color::Rgb(167, 132, 239);
10pub const CELESTIAL_BLUE: Color = Color::Rgb(75, 115, 235);
11pub const SOLAR_YELLOW: Color = Color::Rgb(255, 225, 100);
12pub const AURORA_GREEN: Color = Color::Rgb(140, 255, 170);
13pub const PLASMA_CYAN: Color = Color::Rgb(20, 255, 255);
14pub const METEOR_RED: Color = Color::Rgb(255, 89, 70);
15pub const GALAXY_PINK: Color = Color::Rgb(255, 162, 213);
16pub const COMET_ORANGE: Color = Color::Rgb(255, 165, 0);
17pub const BLACK_HOLE: Color = Color::Rgb(0, 0, 0);
18
19pub fn create_spinner(message: &str) -> ProgressBar {
20    let pb = ProgressBar::new_spinner();
21    pb.set_style(
22        ProgressStyle::default_spinner()
23            .tick_chars("✦✧✶✷✸✹✺✻✼✽")
24            .template("{spinner} {msg}")
25            .expect("Could not set spinner style"),
26    );
27    pb.set_message(message.to_string());
28    pb.enable_steady_tick(Duration::from_millis(100));
29    pb
30}
31
32pub fn print_info(message: &str) {
33    println!("{}", message.cyan().bold());
34}
35
36pub fn print_warning(message: &str) {
37    println!("{}", message.yellow().bold());
38}
39
40pub fn print_error(message: &str) {
41    eprintln!("{}", message.red().bold());
42}
43
44pub fn print_success(message: &str) {
45    println!("{}", message.green().bold());
46}
47
48pub fn print_version(version: &str) {
49    println!(
50        "{} {} {}",
51        "🔮 Git-Iris".magenta().bold(),
52        "version".cyan(),
53        version.green()
54    );
55}
56
57pub fn create_gradient_text(text: &str) -> String {
58    let gradient = vec![
59        (129, 0, 255), // Deep purple
60        (134, 51, 255),
61        (139, 102, 255),
62        (144, 153, 255),
63        (149, 204, 255), // Light cyan
64    ];
65
66    apply_gradient(text, &gradient)
67}
68
69pub fn create_secondary_gradient_text(text: &str) -> String {
70    let gradient = vec![
71        (75, 0, 130),   // Indigo
72        (106, 90, 205), // Slate blue
73        (138, 43, 226), // Blue violet
74        (148, 0, 211),  // Dark violet
75        (153, 50, 204), // Dark orchid
76    ];
77
78    apply_gradient(text, &gradient)
79}
80
81fn apply_gradient(text: &str, gradient: &[(u8, u8, u8)]) -> String {
82    let chars: Vec<char> = text.chars().collect();
83    let chars_len = chars.len();
84    let gradient_len = gradient.len();
85
86    let mut result = String::new();
87
88    if chars_len == 0 || gradient_len == 0 {
89        return result;
90    }
91
92    chars.iter().enumerate().fold(&mut result, |acc, (i, &c)| {
93        let index = if chars_len == 1 {
94            0
95        } else {
96            i * (gradient_len - 1) / (chars_len - 1)
97        };
98        let (r, g, b) = gradient[index];
99        write!(acc, "{}", c.to_string().truecolor(r, g, b)).unwrap();
100        acc
101    });
102
103    result
104}
105
106pub fn write_gradient_text(
107    term: &Term,
108    text: &str,
109    gradient: &[(u8, u8, u8)],
110) -> std::io::Result<()> {
111    let gradient_text = apply_gradient(text, gradient);
112    term.write_line(&gradient_text)
113}
114
115pub fn write_colored_text(term: &Term, text: &str, color: (u8, u8, u8)) -> std::io::Result<()> {
116    let colored_text = text.truecolor(color.0, color.1, color.2);
117    term.write_line(&colored_text)
118}
119
120pub fn write_bold_text(term: &Term, text: &str) -> std::io::Result<()> {
121    term.write_line(&text.bold())
122}