Skip to content

coolbeevip/tui-banner

Repository files navigation

tui-banner

Cinematic ANSI banners for Rust CLI/TUI.

Crates.io Docs.rs License

banner example

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

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 Gradient 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(2, None)?;
    Ok(())
}

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

Light Sweep Animation

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.

Wave Animation

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(())
}

Roll Animation

Gradient Gallery

Vertical Horizontal
Gradient Vertical Gradient Horizontal
Diagonal Apply
Gradient Diagonal Gradient Apply

Full Gallery

Block Half Block
Full Block Full Half Block
Light Shade Char
Full Light Shade Full Char

Dither Gallery

Checker Stipple Coarse Halftone
Dither Checker Stipple Dither Coarse Halftone
Film Grain Sparkle Noise
Dither Film Grain Dither Sparkle Noise

CLI Usage

Install the CLI (binary name: tui-banner):

Download the prebuilt binary from GitHub Releases and place it on your PATH:
https://github.com/coolbeevip/tui-banner/releases
# help
tui-banner

# normal
tui-banner --text "HELLO WORLD"

# style
tui-banner --text "HELLO WORLD" --style neon-cyber

# gradient
tui-banner --text "HELLO WORLD" --gradient diagonal --palette "#00E5FF,#7B5CFF,#FF5AD9"

# frame
tui-banner --text "HELLO WORLD" --frame rounded
tui-banner --text "HELLO WORLD" --frame rounded --frame-gradient horizontal \
    --frame-palette "#00E5FF,#7B5CFF,#FF5AD9"
tui-banner --text "HELLO WORLD" --frame double --frame-color "#F59E0B" --padding 2

# animate sweep
tui-banner --text "HELLO WORLD" --animate-sweep 3 --sweep-highlight "#DCEBFF"
tui-banner --text "HELLO WORLD" --animate-sweep 3 --sweep-highlight "#DCEBFF" --sweep-direction horizontal
tui-banner --text "HELLO WORLD" --animate-sweep 3 \
    --sweep-direction diagonal-up --sweep-width 0.3 --sweep-intensity 0.9 \
    --sweep-softness 2.5 --sweep-center 0.4 --sweep-highlight "#DCEBFF"

# animate wave
tui-banner --text "HELLO WORLD" --animate-wave 3
tui-banner --text "HELLO WORLD" --animate-wave 3 --wave-dim 0.45 --wave-bright 0.3

# animate roll
tui-banner --text "HELLO WORLD" --animate-roll 15

Defaults (CLI):

  • --text is required
  • Gradient: diagonal
  • Palette: #00E5FF, #3A7BFF, #E6F6FF
  • Fill: keep
  • Dither targets: ░▒▓ (when dither enabled)
  • Padding: 1
  • Align: center
  • Trim vertical: enabled (use --no-trim-vertical to keep blank rows)
  • Color mode: truecolor
  • Sweep highlight: white
  • Frame: none

Tip: --animate-wave keeps glyph positions fixed and adds a breathing, scale-like shimmer. You can tune it with --wave-dim (darker lows) and --wave-bright (brighter highs).

About

Cinematic ANSI banners for Rust CLI/TUI.

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published