A minimal reusable Text-based User Interface (TUI) toolkit for Bash scripting. Build beautiful CLI interfaces with color, menus, input validation, progress bars, and confirmations.
- ✅ Colorized text output (info, success, error)
- 🔄 Dynamic, argument-driven menu system
- 🟩 Relative progress bar
- 📝 Input with required/regex validation
- ❓ Yes/No confirmation prompt
⚠️ Emoji/Nerd Font/plain text support- 🌐 Installable via
curl
bash -c "$(curl -fsSL https://raw.githubusercontent.com/calahil/cal-tui/main/install.sh)"
source $HOME/.local/bin/cal-tui.shOr manually:
curl -fsSL https://raw.githubusercontent.com/calahil/cal-tui/main/cal-tui.sh -o $HOME/.local/bin/cal-tui.sh
source $HOME/.local/bin/cal-tui.shcal-tui/
├── cal-tui.sh # The TUI library
├── example.sh # Demo script
├── install.sh # Curl-installable setup
├── .gitlab-ci.yml # GitLab CI runners
├── .github/workflows/ # GitHub Actions CI
│ └── main.yml
├── README.md # Docs (this file)
└── LICENSE # MIT License
source $HOME/.local/bin/cal-tui.sh
my_func() {
cal-tui::print_info "This is a menu option."
}
my_func_with_args() {
local temp="$1"
echo "$temp"
}
main() {
cal-tui::init_icons "nerd"
local -a options=("My Function" "Print Args" "Exit")
local -a icons=("$(cal-tui::get_icon SUCCESS)" "$(cal-tui::get_icon COPY)" "$(cal-tui::get_icon EXIT)")
local -a commands=("my_func" "$(cal-tui::build_string "my_func_with_args" "Hello World")" "cal-tui::exit")
local -a callbacks=("main" "main" "")
cal-tui::menu "Main Menu" options icons commands callbacks
}name=$(cal-tui::input_prompt "Enter your name:" true '^[A-Za-z]+$' "Letters only!")for i in {1..10}; do
sleep 0.1
cal-tui::progress_bar $i 10
doneif cal-tui::confirm_prompt "Continue with installation?" "n"; then
cal-tui::print_success "Proceeding."
else
cal-tui::print_info "Canceled."
fical-tui::init_icons "nerd"
$(cal-tui::get_icon SUCCESS)MIT License. See LICENSE file for full text.
- Colorized output
- Progress bar
- Input validation
- Yes/No prompt
- Dynamic menu
- Install via curl
- Icon support
- Pass commands and arguments to menu options
- Remove all instances of eval
- Tables
- Multi-field form input
- Popup/dialog UI
- Animated spinners
Fork, PR, or open an issue to suggest features or improvements.
Made with ❤️ in Bash.