Your first application
Use a stable Rust toolchain. Linux builds also need the system libraries listed in the development setup.
Create the project
cargo new my-app
cd my-app
cargo add teksilo
Open a window
Replace src/main.rs with:
use teksilo::prelude::*; use teksilo::widgets::Button; fn main() { TeksiloAppBuilder::new() .theme(intui::light()) .initial_window( WindowConfig::new() .title("Hello Teksilo") .size(400, 300) .root(|tree, _state| { tree.add( Button::new(lit!("Click Me")) .on_activate_fn(|_ctx| println!("Clicked!")), ) }), ) .run(); }
Run the application:
cargo run
The window contains a button. Activating it prints Clicked! in the terminal.
Add reactive state
Replace src/main.rs with this counter:
use teksilo::prelude::*; use teksilo::widgets::{Button, TextWidget, VStack}; fn main() { TeksiloAppBuilder::new() .theme(intui::light()) .initial_window( WindowConfig::new() .title("Counter") .size(300, 150) .root(|tree, _state| { let count = Signal::new(0_i32); let label = count.map(|n| format!("Count: {n}")); tree.add( VStack::new() .spacing(12.0) .child(TextWidget::new(lit!("")).text(label)) .child( Button::new(lit!("Increment")) .on_activate_fn(move |_| { count.set(count.get() + 1) }), ), ) }), ) .run(); }
Run cargo run again. Each activation increments the count and updates the label.
Signal stores the count; map derives the label from its current value.
Continue with examples and tooling, layout, or events and gestures.