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), (134, 51, 255),
61 (139, 102, 255),
62 (144, 153, 255),
63 (149, 204, 255), ];
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), (106, 90, 205), (138, 43, 226), (148, 0, 211), (153, 50, 204), ];
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}