4e88ea5677701930b0938ff932a723fb908b3b17
Previous attempts to poll keyboard events in the render loop were failing. Now using a dedicated background thread that continuously monitors for exit keys and communicates with the render loop via an atomic boolean flag. This ensures keyboard events are never missed, even during heavy rendering operations. Exit: Press 'q', ESC, or Ctrl+C 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
🐷 Piglet
✨ Features
- 🎨 Rich Color Support: CSS4 colors, hex codes, and smooth gradients
- 🎬 20+ Motion Effects: Fade, slide, scale, typewriter, wave, bounce, and more
- ⚡ 18+ Easing Functions: Linear, quad, cubic, elastic, back, bounce variations
- 🖼️ Figlet Integration: Full support for figlet fonts and options
- 🔄 Looping Animations: Infinite or single-run modes
- 🎯 High Performance: Async rendering with configurable FPS
- 🌈 Gradient Engine: Parse and apply CSS-style gradients
- 📦 Cross-Platform: Linux, macOS, and Windows support
📦 Installation
From Source
git clone https://github.com/valknarthing/piglet.git
cd piglet
cargo build --release
The binary will be available at target/release/piglet.
Prerequisites
Piglet requires figlet to be installed on your system:
# Ubuntu/Debian
sudo apt-get install figlet
# macOS
brew install figlet
# Windows
choco install figlet -y
🚀 Quick Start
# Simple color palette animation
piglet "Hello World" -p "#FF5733,#33FF57,#3357FF"
# Gradient with fade-in effect
piglet "Rainbow" -g "linear-gradient(90deg, red, orange, yellow, green, blue, purple)" -e fade-in
# Typewriter effect with custom timing
piglet "Type It Out" -e typewriter -d 3s -i ease-out
# Bouncing text with loop
piglet "Bounce!" -e bounce-in -l
📖 Usage
piglet [TEXT] [OPTIONS]
Arguments:
<TEXT> Text to render with figlet
Options:
-d, --duration <DURATION> Duration of animation [default: 3s]
Formats: 3000ms, 0.3s, 5m, 0.5h
-p, --color-palette <COLORS> Color palette (comma-separated)
Example: "#FF5733,#33FF57,blue,red"
-g, --color-gradient <GRADIENT> CSS gradient definition
Example: "linear-gradient(90deg, red, blue)"
-e, --motion-effect <EFFECT> Motion effect to apply [default: fade-in]
-i, --motion-ease <EASING> Easing function [default: ease-in-out]
-f, --font <FONT> Figlet font to use
-l, --loop Loop animation infinitely
--fps <FPS> Frame rate [default: 30]
--list-effects List all available effects
--list-easing List all available easing functions
--list-colors List all CSS4 color names
-- <FIGLET_ARGS>... Additional figlet options
Example: -- -w 200 -c
-h, --help Print help
-V, --version Print version
🎬 Motion Effects
| Effect | Description | Effect | Description |
|---|---|---|---|
fade-in |
Fade from transparent | fade-out |
Fade to transparent |
fade-in-out |
Fade in then out | slide-in-top |
Slide from top |
slide-in-bottom |
Slide from bottom | slide-in-left |
Slide from left |
slide-in-right |
Slide from right | scale-up |
Scale from small |
scale-down |
Scale from large | pulse |
Pulsing effect |
bounce-in |
Bounce into view | bounce-out |
Bounce out of view |
typewriter |
Type character by character | typewriter-reverse |
Untype backwards |
wave |
Wave motion | jello |
Jello wobble |
color-cycle |
Cycle through colors | rainbow |
Rainbow effect |
gradient-flow |
Flowing gradient | rotate-in |
Rotate into view |
rotate-out |
Rotate out of view |
⚡ Easing Functions
| Category | Functions |
|---|---|
| Linear | linear |
| Basic | ease-in, ease-out, ease-in-out |
| Quadratic | ease-in-quad, ease-out-quad, ease-in-out-quad |
| Cubic | ease-in-cubic, ease-out-cubic, ease-in-out-cubic |
| Back | ease-in-back, ease-out-back, ease-in-out-back |
| Elastic | ease-in-elastic, ease-out-elastic, ease-in-out-elastic |
| Bounce | ease-in-bounce, ease-out-bounce, ease-in-out-bounce |
🎨 Color Options
Palette Mode
Provide a comma-separated list of colors:
piglet "Text" -p "red,blue,green"
piglet "Text" -p "#FF5733,#33FF57,#3357FF"
piglet "Text" -p "crimson,gold,navy"
Gradient Mode
Use CSS gradient syntax:
piglet "Text" -g "linear-gradient(90deg, red, blue)"
piglet "Text" -g "linear-gradient(to right, #FF5733 0%, #33FF57 50%, #3357FF 100%)"
Supports:
- Hex colors (
#FF5733) - CSS4 color names (
red,blue,crimson, etc.) - Position percentages (
0%,50%,100%) - Angle notation (
90deg,180deg,to right,to bottom)
💡 Examples
Basic Animation
piglet "Welcome" -e fade-in -d 2s
Rainbow Gradient with Typewriter
piglet "Rainbow Text" \
-g "linear-gradient(90deg, red, orange, yellow, green, blue, indigo, violet)" \
-e typewriter \
-d 4s \
-i ease-in-out
Bouncing Logo with Custom Font
piglet "LOGO" \
-f slant \
-e bounce-in \
-p "#FF6B6B,#4ECDC4,#45B7D1" \
-i ease-out-bounce \
-l
Infinite Wave with Gradient Flow
piglet "Ocean Waves" \
-g "linear-gradient(180deg, #0077be, #00c9ff, #0077be)" \
-e wave \
-l
Custom Figlet Options
# Center text with width 200
piglet "Centered" -- -w 200 -c
# Use specific font with kerning
piglet "Custom" -f banner -- -k
🏗️ Architecture
CLI Input → Figlet Wrapper → Parser (duration/colors/gradients)
↓
Color Engine (palette/gradient interpolation)
↓
Animation Engine (effects + easing)
↓
Terminal Manager → Render Loop → Output
Key Components
- FigletWrapper: Executes figlet and captures ASCII output
- Parser: Converts CLI strings to structured data (duration, colors, gradients)
- ColorEngine: Manages color palettes and gradient interpolation
- AnimationEngine: Applies motion effects with easing functions
- TerminalManager: Handles terminal setup/cleanup and frame rendering
🔧 Development
Build
cargo build
Test
cargo test --all-features
Lint
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
Documentation
cargo doc --no-deps --all-features
🎯 Cross-Platform Support
Piglet builds on:
- Linux:
x86_64-unknown-linux-gnu,x86_64-unknown-linux-musl - macOS:
x86_64-apple-darwin,aarch64-apple-darwin - Windows:
x86_64-pc-windows-msvc
# Build for specific target
cargo build --release --target x86_64-unknown-linux-musl
🤝 Contributing
Contributions are welcome! Please feel free to submit issues or pull requests.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-effect) - Commit your changes (
git commit -m 'Add amazing effect') - Push to the branch (
git push origin feature/amazing-effect) - Open a Pull Request
📝 License
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 Acknowledgments
- figlet - The original ASCII art generator
- crossterm - Terminal manipulation
- palette - Color space conversions
- scirs2-interpolate - Easing functions
📊 Project Stats
Made with ❤️ and Rust
Description
Languages
Rust
100%