diff --git a/src/setup/prompts.rs b/src/setup/prompts.rs index d1a3e08c..ac271cf2 100644 --- a/src/setup/prompts.rs +++ b/src/setup/prompts.rs @@ -284,6 +284,20 @@ pub fn confirm(prompt: &str, default: bool) -> io::Result { }) } +/// Print the IronClaw ASCII art banner in blue. +pub fn print_banner() { + let mut stdout = io::stdout(); + let _ = execute!(stdout, SetForegroundColor(Color::Cyan)); + println!(); + println!(r" ██╗██████╗ ██████╗ ███╗ ██╗ ██████╗██╗ █████╗ ██╗ ██╗"); + println!(r" ██║██╔══██╗██╔═══██╗████╗ ██║██╔════╝██║ ██╔══██╗██║ ██║"); + println!(r" ██║██████╔╝██║ ██║██╔██╗ ██║██║ ██║ ███████║██║ █╗ ██║"); + println!(r" ██║██╔══██╗██║ ██║██║╚██╗██║██║ ██║ ██╔══██║██║███╗██║"); + println!(r" ██║██║ ██║╚██████╔╝██║ ╚████║╚██████╗███████╗██║ ██║╚███╔███╔╝"); + println!(r" ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚══╝╚══╝ "); + let _ = execute!(stdout, ResetColor); +} + /// Print a styled header box. /// /// # Example diff --git a/src/setup/wizard.rs b/src/setup/wizard.rs index 6c7d03cb..38066d25 100644 --- a/src/setup/wizard.rs +++ b/src/setup/wizard.rs @@ -30,8 +30,8 @@ use crate::setup::channels::{ SecretsContext, setup_http, setup_signal, setup_tunnel, setup_wasm_channel, }; use crate::setup::prompts::{ - confirm, input, optional_input, print_error, print_header, print_info, print_step, - print_success, secret_input, select_many, select_one, + confirm, input, optional_input, print_banner, print_error, print_header, print_info, + print_step, print_success, secret_input, select_many, select_one, }; // unused const, keep commented for clarity / future use @@ -141,6 +141,7 @@ impl SetupWizard { /// settings are loaded from the database after Step 1 establishes a /// connection, so users don't have to re-enter everything. pub async fn run(&mut self) -> Result<(), SetupError> { + print_banner(); print_header("IronClaw Setup Wizard"); if self.config.channels_only {