static BANNER: &str = " ██╗ ██╗██╗ ███████╗██████╗ ██████╗ ███╗ ███╗ ███████╗███████╗██╗ ██╗ ██╗ ██╗██╗ ██║ ██║██║ ██╔════╝██╔══██╗██╔═══██╗████╗ ████║ ╚══███╔╝██╔════╝██║ ██║ ██║ ██║██║ ███████║██║ █████╗ ██████╔╝██║ ██║██╔████╔██║ ███╔╝ █████╗ ██║ ██║ ██║ ██║██║ ██╔══██║██║ ██╔══╝ ██╔══██╗██║ ██║██║╚██╔╝██║ ███╔╝ ██╔══╝ ██║ ██║ ██║██ ██║╚═╝ ██║ ██║██║ ██║ ██║ ██║╚██████╔╝██║ ╚═╝ ██║ ███████╗███████╗███████╗███████╗██║╚█████╔╝██╗ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚══════╝╚══════╝╚═╝ ╚════╝ ╚═╝ "; static SMALL_BANNER: &str = " ██╗ ██╗██╗ ██╗ ██║ ██║██║ ██║ ███████║██║ ██║ ██╔══██║██║ ╚═╝ ██║ ██║██║ ██╗ ╚═╝ ╚═╝╚═╝ ╚═╝ "; static MEDIUM_BANNER: &str = " ██╗ ██╗██╗ ████████╗██╗ ██╗███████╗██████╗ ███████╗ ██╗ ██║ ██║██║ ╚══██╔══╝██║ ██║██╔════╝██╔══██╗██╔════╝ ██║ ███████║██║ ██║ ███████║█████╗ ██████╔╝█████╗ ██║ ██╔══██║██║ ██║ ██╔══██║██╔══╝ ██╔══██╗██╔══╝ ╚═╝ ██║ ██║██║ ██║ ██║ ██║███████╗██║ ██║███████╗ ██╗ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ "; pub fn render_banner(x: usize, y: usize, rows: usize, cols: usize) { if rows >= 8 { if cols > 100 { println!("\u{1b}[{}H", y + rows.saturating_sub(8) / 2); for line in BANNER.lines() { println!("\u{1b}[{}C{}", x.saturating_sub(1), line); } } else if cols > 63 { println!("\u{1b}[{}H", y + rows.saturating_sub(8) / 2); let x = (cols.saturating_sub(63) as f64 / 2.0) as usize; for line in MEDIUM_BANNER.lines() { println!("\u{1b}[{}C{}", x, line); } } else { println!("\u{1b}[{}H", y + rows.saturating_sub(8) / 2); let x = (cols.saturating_sub(18) as f64 / 2.0) as usize; for line in SMALL_BANNER.lines() { println!("\u{1b}[{}C{}", x, line); } } } else if rows > 2 { println!( "\u{1b}[{};{}H\u{1b}[1mHi from Zellij!", (y + rows / 2) + 1, (x + cols.saturating_sub(15) / 2).saturating_sub(1) ); } } pub fn render_welcome_boundaries(rows: usize, cols: usize) { let width_of_main_menu = std::cmp::min(cols, 101); let has_room_for_logos = cols.saturating_sub(width_of_main_menu) > 100; let left_boundary_x = (cols.saturating_sub(width_of_main_menu) as f64 / 2.0).floor() as usize; let right_boundary_x = left_boundary_x + width_of_main_menu; let y_starting_point = rows.saturating_sub(15) / 2; let middle_row = (y_starting_point + rows.saturating_sub(y_starting_point) / 2).saturating_sub(1); for i in y_starting_point..rows { if i == middle_row { if has_room_for_logos { print!("\u{1b}[{};{}H┤", i + 1, left_boundary_x + 1); print!( "\u{1b}[m\u{1b}[{};{}H├\u{1b}[K", i + 1, right_boundary_x + 1 ); print!("\u{1b}[{};{}H", i + 1, left_boundary_x.saturating_sub(9)); for _ in 0..10 { print!("─"); } print!("\u{1b}[{};{}H", i + 1, right_boundary_x + 2); for _ in 0..10 { print!("─"); } } else { print!("\u{1b}[{};{}H│", i + 1, left_boundary_x + 1); print!( "\u{1b}[m\u{1b}[{};{}H│\u{1b}[K", i + 1, right_boundary_x + 1 ); } } else { if i == y_starting_point { print!("\u{1b}[{};{}H┌", i + 1, left_boundary_x + 1); print!( "\u{1b}[m\u{1b}[{};{}H┐\u{1b}[K", i + 1, right_boundary_x + 1 ); } else if i == rows.saturating_sub(1) { print!("\u{1b}[{};{}H└", i + 1, left_boundary_x + 1); print!( "\u{1b}[m\u{1b}[{};{}H┘\u{1b}[K", i + 1, right_boundary_x + 1 ); } else { print!("\u{1b}[{};{}H│", i + 1, left_boundary_x + 1); print!( "\u{1b}[m\u{1b}[{};{}H│\u{1b}[K", i + 1, right_boundary_x + 1 ); // this includes some // ANSI magic to delete // everything after this // boundary in order to // fix some rendering // bugs in the legacy // components of this // plugin } } } if rows.saturating_sub(y_starting_point) > 25 && has_room_for_logos { for (i, line) in LOGO.lines().enumerate() { print!( "\u{1b}[{};{}H{}", middle_row.saturating_sub(12) + i, 0, line ); } for (i, line) in LOGO.lines().enumerate() { print!( "\u{1b}[{};{}H{}", middle_row.saturating_sub(12) + i, cols.saturating_sub(47), line ); } } } static LOGO: &str = r#"    _y$ y@g_  ya@@@@L4@@@@gy_  u@@@@@@F "@@@@@@@@y_  _a@@, @@@P~` __ ~T@@@@@@@@g  _yg@@@@@$ "~ _yg@@@@gy `~PR@F~_yggy_  y$@@@@@@PF _y$@@@@@@@@@@gy_ 4@@@@@@@y_  g@@@@@F~ _yg@@@@@@@@@@@@@@@@@@g_ ~F@@@@@@  $@@@F yg@@@@@@@@@@@@@@@@@@@@@@@@gy 9@@F"  $@@@$ 4@@@@@@~@@@@@@@@@@@@@@@@@@@@@ "_yg$  $@@@$ 4@@@@@ ~@@@@@@@@@@@@@@@@@@@ g@@@@  $@@@$ 4@@@@@@y ~@@@@@@@@@@@@@@@@@ $@@@F  $@@@$ 4@@@@@@@@y ~@@@@@@@@@@@@@@@ `~_y_  $@@@$ 4@@@@@@@P` _g@@@@@@@@@@@@@@@ y@@@@  $@@@$ 4@@@@@P` _y@@@@@@@@@@@@@@@@@ 4@@@@  $@@@$ 4@@@@$_ y@@@@@ $@@@@ 4@@@@  $@@@$ 4@@@@@@g@@@@@@@@@@@@@@@@@@@@@ ~@@@  $@@P 7R@@@@@@@@@@@@@@@@@@@@@@@@P~ _@g_7@  ~~_yg@gy_ ~5@@@@@@@@@@@@@@@@@@F~ _yg@@@@y  R@@@@@@@ ~~@@@@@@@@@@@P~` ya@@@@@@@@F  ~5@@@@ 4@gy `~4@@@@F~ y@@@@@@@P~`  `~P 4@@@@gy_ `` _yr a@@@@@F~  5@@@@@@@gg@@~_g@@@~`  ~~@@@@@@@^y@F~  `~4@F ~   "#;