tui-slider
A simple TUI slider component library for ratatui.
Perfect for building music players, audio controls, equalizers, and any terminal UI that needs simple, clean sliders.

✨ Features
- 🎚️ Horizontal and Vertical sliders - Support for both orientations
- 🎨 Border styles - Multiple border style options with customizable symbols
- 🎯 Title alignment - Left, center, and right title positioning
- 📊 Value alignment - Flexible value display positioning
- 🎨 Progress bars - Use as progress indicators without handles
- 🔧 Easy to use - Minimal configuration required
- 📊 State management - Built-in state for value tracking
- ⚡ Lightweight - No complex dependencies
📦 Installation
Add to your Cargo.toml:
[]
= "0.1"
= "0.28"
🚀 Quick Start
use *;
use ;
📖 Examples
Horizontal Sliders

Basic horizontal slider:
use Color;
use ;
let state = new;
let slider = from_state
.orientation
.label
.show_value
.filled_symbol
.empty_symbol
.handle_symbol
.filled_color
.empty_color
.handle_color;
Vertical Sliders

Basic vertical slider:
use Color;
use ;
let state = new;
let slider = from_state
.orientation
.label
.show_value
.filled_symbol
.empty_symbol
.handle_symbol
.filled_color
.empty_color
.handle_color;
Border Styles

Multiple border styles available (Plain, Rounded, Double, Thick, Segmented):
use BorderStyle;
use ;
let block = default
.borders
.border_set
.title;
let slider = from_state.block;
Title Alignment

Control where titles appear on borders:
use ;
use ;
// Left-aligned title
let title = title_left;
let block = default.borders.title;
// Center-aligned title
let title = title_center;
let block = default.borders.title;
// Right-aligned title (use title_right_with_spacing if value is also right-aligned)
let title = title_right_with_spacing;
let block = default.borders.title;
Value Alignment

Control where values appear above/beside the slider:
use Alignment;
// Left-aligned value
let slider = from_state
.show_value
.value_alignment;
// Center-aligned value
let slider = from_state
.show_value
.value_alignment;
// Right-aligned value (default)
let slider = from_state
.show_value
.value_alignment;
Progress Bars

Use sliders as progress indicators by hiding the handle:
let slider = from_state
.filled_symbol
.empty_symbol
.show_handle // Hide handle for progress bar style
.show_value;
Custom Symbols
let slider = from_state
.filled_symbol
.empty_symbol
.handle_symbol
.filled_color
.show_handle;
Toggle Thumb/Handle Visibility
// Show the thumb indicator (default)
let slider = from_state
.show_thumb;
// Hide the thumb for a progress bar style
let slider = from_state
.show_thumb;
// show_handle() is an alias for show_thumb()
let slider = from_state
.show_handle;
🎮 Interactive Usage
use SliderState;
let mut state = new;
// Increase/decrease by a step
state.increase;
state.decrease;
// Set exact value
state.set_value;
// Get current value
let current = state.value;
// Get as percentage (0.0 to 1.0)
let percentage = state.percentage;
🎯 API Overview
Slider Widget
new(value, min, max)- Create a new sliderfrom_state(&state)- Create from a stateorientation(orientation)- Set horizontal or verticallabel(text)- Set label textshow_value(bool)- Show/hide value displayshow_handle(bool)- Show/hide handlefilled_symbol(symbol)- Set filled bar symbolempty_symbol(symbol)- Set empty bar symbolhandle_symbol(symbol)- Set handle symbolfilled_color(color)- Set filled bar colorempty_color(color)- Set empty bar colorhandle_color(color)- Set handle colorshow_handle(bool)- Show/hide thumb indicatorshow_thumb(bool)- Alias for show_handleblock(block)- Add border block
SliderState
new(value, min, max)- Create new statevalue()- Get current valueset_value(value)- Set valueincrease(step)- Increase by stepdecrease(step)- Decrease by stepmin()/max()- Get boundsset_min(min)/set_max(max)- Set boundspercentage()- Get value as percentage (0.0-1.0)set_percentage(percentage)- Set from percentage
🎨 Demos
Run the examples to see the sliders in action:
# Horizontal sliders with different styles
# Vertical sliders (equalizer style)
# Border styles demonstration
# Title alignment examples
# Value alignment examples
# Progress bar styles
# Custom slider configurations
# Toggle thumb/handle visibility
🏗️ Architecture
The library consists of three main components:
- Slider - The widget that renders the slider
- SliderState - Manages value, bounds, and state
- SliderOrientation - Horizontal or Vertical orientation
🛠️ Development
This project uses just as a command runner for common development tasks.
Quick Setup
Run the interactive setup script to install just and configure your environment:
This script will:
- Install
justcommand runner (if not already installed) - Install optional tools like
git-clifffor changelog generation - Set up shell completion
- Offer to add useful commands to your justfile
Manual Setup
If you prefer manual installation:
# Install just
# Install git-cliff (optional, for changelogs)
# View available commands
Common Commands
For a complete list of available commands, run just --list or see the justfile.
Justfile Patterns
This project follows the "fail early" pattern for version bumps and releases:
just bump <version>runs all checks (fmt, clippy, test) before bumpingjust release <version>depends onbump, ensuring quality before release- All destructive operations have quality gates
See Justfile Best Practices & Patterns for detailed documentation.
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- Built with ratatui
- Inspired by various TUI music players and audio applications
📝 Changelog
See CHANGELOG.md for a list of changes.