cliclack 0.5.2

Beautiful, minimal, opinionated CLI prompts inspired by the Clack NPM package.
Documentation
use std::io;

use cliclack::{clear_screen, intro, outro, outro_cancel, spinner};
use console::{style, Key, Term};

fn main() -> std::io::Result<()> {
    ctrlc::set_handler(move || {}).expect("setting Ctrl-C handler");

    clear_screen()?;
    intro(style(" multiline support ").on_cyan().black())?;

    let path: String = cliclack::input("Where should we create your project?\n👇")
        .placeholder("./sparkling-solid")
        .interact()?;

    let _password = cliclack::password("Provide a password\n🔒")
        .mask('')
        .interact()?;

    let _kind = cliclack::select(format!("Pick a project type within '{path}'\n💪"))
        .initial_value("ts")
        .item("ts", "TypeScript", "")
        .item("js", "JavaScript", "")
        .item("coffee", "CoffeeScript", "oh no")
        .interact()?;

    let _tools = cliclack::multiselect("Select additional tools\n🛠️")
        .initial_values(vec!["prettier", "eslint"])
        .item("prettier", "Prettier", "recommended")
        .item("eslint", "ESLint", "recommended")
        .item("stylelint", "Stylelint", "")
        .item("gh-action", "GitHub Action", "")
        .interact()?;

    let spinner = spinner();
    let message = format!(
        "{}\n{}\n\n{}",
        style("Installation").bold(),
        style("Press Esc, Enter, or Ctrl-C").dim(),
        style("Check it out, we're multilining!").magenta().italic()
    );
    spinner.start(message);

    let term = Term::stderr();
    loop {
        match term.read_key() {
            Ok(Key::Escape) => {
                spinner.cancel("Installation");
                outro_cancel("Cancelled")?;
            }
            Ok(Key::Enter) => {
                spinner.stop("Installation");
                outro("Done!")?;
            }
            Err(e) if e.kind() == io::ErrorKind::Interrupted => {
                spinner.error("Installation");
                outro_cancel("Interrupted")?;
            }
            _ => continue,
        }
        break;
    }

    Ok(())
}