Thanks to visit codestin.com
Credit goes to lib.rs

9 releases

Uses new Rust 2024

0.2.3 Dec 24, 2025
0.2.2 Dec 23, 2025
0.1.4 Dec 20, 2025

#195 in Command-line interface

Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App Codestin Search App

200 downloads per month
Used in term39

Apache-2.0

105KB
1.5K SLoC

tui-banner

Cinematic ANSI banners for Rust CLI/TUI.

Features

  • Grid-first rendering pipeline
  • Bundled DOS Rebel (Figlet) font + load any .flf
  • Truecolor / 256-color / no-color output with auto-detect
  • Gradients, pixel fill, dithering, shadows, edge shading, light sweeps, frames/borders
  • Named style and palette presets
  • Fluent builder API

CLI note: download the tui-banner binary from GitHub Releases and place it on your PATH. CLI default: trims blank rows at the top/bottom; use --no-trim-vertical to keep them.

https://github.com/coolbeevip/tui-banner/releases

Quick Start

[dependencies]
tui-banner = "0.1.4"
use tui_banner::{Align, Banner, Style};

fn main() -> Result<(), tui_banner::BannerError> {
    let banner = Banner::new("RUST CLI")?
        .style(Style::NeonCyber)
        .render();

    println!("{banner}");
    Ok(())
}

Custom Example

use tui_banner::{Align, Banner, ColorMode, Fill, Gradient, Palette};

fn main() -> Result<(), tui_banner::BannerError> {
    let banner = Banner::new("RUST CLI")?
        .color_mode(ColorMode::TrueColor)
        .gradient(Gradient::vertical(Palette::from_hex(&[
            "#00E5FF", // cyan
            "#3A7BFF", // blue
            "#E6F6FF", // ice
        ])))
        .fill(Fill::Keep)
        .dither()
        .targets("░▒▓")
        .checker(3)
        .align(Align::Center)
        .padding(1)
        .render();

    println!("{banner}");
    Ok(())
}

Frames & Borders

use tui_banner::{Align, Banner, Frame, FrameStyle, Gradient, Palette, Style};

fn main() -> Result<(), tui_banner::BannerError> {
    let frame = Frame::new(FrameStyle::Rounded).gradient(Gradient::horizontal(
        Palette::from_hex(&["#00E5FF", "#7B5CFF", "#FF5AD9"]),
    ));

    let banner = Banner::new("RUST CLI")?
        .style(Style::NeonCyber)
        .align(Align::Center)
        .padding(1)
        .frame(frame)
        .render();

    println!("{banner}");
    Ok(())
}

Light Sweep Animation

use tui_banner::{Align, Banner, Fill, Gradient, Palette};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let banner = Banner::new("RUST CLI")?
        .gradient(Gradient::diagonal(Palette::from_hex(&[
            "#00E5FF", "#7B5CFF", "#FF5AD9",
        ])))
        .fill(Fill::Keep)
        .align(Align::Center)
        .padding(1);

    banner.animate_sweep(5, None)?;
    Ok(())
}

Tip: pass Some(Color::Rgb(...)) as the second argument to tint the sweep.

Wave Animation

use tui_banner::{Align, Banner, Fill, Gradient, Palette};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let banner = Banner::new("RUST CLI")?
        .gradient(Gradient::diagonal(Palette::from_hex(&[
            "#00E5FF", "#7B5CFF", "#FF5AD9",
        ])))
        .fill(Fill::Keep)
        .align(Align::Center)
        .padding(1);

    banner.animate_wave(5, None, None)?;
    Ok(())
}

Tip: pass Some(0.45) and Some(0.3) as the last two arguments to tune wave dim/bright strength.

Roll Animation

use tui_banner::{Align, Banner, Fill, Gradient, Palette};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let banner = Banner::new("RUST CLI")?
        .gradient(Gradient::diagonal(Palette::from_hex(&[
            "#00E5FF", "#7B5CFF", "#FF5AD9",
        ])))
        .fill(Fill::Keep)
        .align(Align::Center)
        .padding(1);

    banner.animate_roll(4)?;
    Ok(())
}

Tip: the roll pushes a bright crest forward with a trailing shadow for a unified, forceful sweep.

No runtime deps