<h1 align="center">🔮 Tuyere</h1>
<p align="center">
<strong>A powerful TUI framework based on The Elm Architecture.</strong>
</p>
<p align="center">
<a href="https://crates.io/crates/tuyere"><img src="https://img.shields.io/crates/v/tuyere.svg?style=flat-square&logo=rust" alt="Crates.io"></a>
<a href="https://docs.rs/tuyere"><img src="https://img.shields.io/docsrs/tuyere?style=flat-square&logo=docs.rs" alt="Documentation"></a>
<a href="#license"><img src="https://img.shields.io/badge/license-MIT%2FApache--2.0-blue?style=flat-square" alt="License"></a>
</p>
---
## What is Tuyere?
A **tuyere** is the nozzle that feeds air into a forge, bringing it to life. This crate does the same for your terminal apps—feeding events through the Elm Architecture to create beautiful, reactive TUIs.
```rust
use tuyere::{App, Model, Command, Event, Key};
struct Counter { count: i32 }
enum Msg { Increment, Decrement, Quit }
impl Model for Counter {
type Message = Msg;
fn update(&mut self, msg: Msg) -> Command<Msg> {
match msg {
Msg::Increment => self.count += 1,
Msg::Decrement => self.count -= 1,
Msg::Quit => return Command::quit(),
}
Command::none()
}
fn view(&self) -> String {
format!("Count: {}\n\nPress +/- to change, q to quit", self.count)
}
fn handle_event(&self, event: Event) -> Option<Msg> {
match event {
Event::Key(Key::Char('+')) => Some(Msg::Increment),
Event::Key(Key::Char('-')) => Some(Msg::Decrement),
Event::Key(Key::Char('q')) => Some(Msg::Quit),
_ => None,
}
}
}
fn main() {
App::new(Counter { count: 0 }).run().unwrap();
}
```
---
## Features
- 🏗️ **Elm Architecture** - Model, Message, Update, View
- ⚡ **Simple API** - Just implement `Model` and you're done
- 🖱️ **Input Handling** - Keyboard, mouse, focus events
- 🎨 **Styling** - Works with `glyphs` and `lacquer`
---
## Installation
```bash
cargo add tuyere
```
---
## Ecosystem
Part of the **Molten Labs** open source ecosystem:
| [molten_brand](https://crates.io/crates/molten_brand) | Design tokens & colors |
| [glyphs](https://crates.io/crates/glyphs) | ANSI escape sequences |
| [lacquer](https://crates.io/crates/lacquer) | Terminal styling |
| **tuyere** | TUI framework (you are here) |
| [scoria](https://crates.io/crates/scoria) | TUI components |
| [chant](https://crates.io/crates/chant) | Shell glamour |
| [aglow](https://crates.io/crates/aglow) | Markdown renderer |
| [censer](https://crates.io/crates/censer) | Pretty logging |
---
## License
MIT OR Apache-2.0
<p align="center">
<sub>Built with 🔮 by <a href="https://github.com/moltenlabs">Molten Labs</a></sub>
</p>