| Crates.io | tessera-ui |
| lib.rs | tessera-ui |
| version | 0.0.0-placeholder |
| created_at | 2025-07-15 14:07:37.131488+00 |
| updated_at | 2026-01-07 05:09:37.079438+00 |
| description | A cross-platform declarative & functional UI library for rust, focused on performance and extensibility. |
| homepage | https://tessera-ui.github.io |
| repository | https://github.com/tessera-ui/tessera |
| max_upload_size | |
| id | 1753412 |
| size | 666,879 |
text_editor, scrollable, and more)Tessera is an experimental framework. If you encounter any issues, please feel free to submit an issue.
Tessera uses a declarative programming paradigm inspired by modern UI frameworks such as React and Compose.
We start by declaring a UI component:
use tessera::tessera;
#[tessera]
fn app() {
// Component logic
}
Then we write its UI logic:
#[tessera]
fn app() {
surface(
SurfaceArgs::default().modifier(Modifier::new().fill_max_size()),
|| {
column(ColumnArgs::default(), |scope| {
scope.child(|| button(ButtonArgs::filled(|| {}), || text("+")));
scope.child(|| text("count: 0"));
scope.child(|| button(ButtonArgs::filled(|| {}), || text("-")));
});
},
);
}
Next, to actually implement the counter we need to use remember to store the counter state:
#[tessera]
fn app() {
surface(
SurfaceArgs::default().modifier(Modifier::new().fill_max_size()),
|| {
let count = remember(|| 0);
column(ColumnArgs::default(), move |scope| {
scope.child(move || {
button(
ButtonArgs::filled(move || count.with_mut(|c| *c += 1)),
|| text("+"),
)
});
scope.child(move || text(format!("Count: {}", count.get())));
scope.child(move || {
button(
ButtonArgs::filled(move || count.with_mut(|c| *c -= 1)),
|| text("-"),
)
});
});
},
);
}
This is a complete counter application! For more details, please refer to the Quick Start Guide.
Please refer to the Quick Start Guide to create your first application with Tessera.
Please read the Contributing Guide to learn how to contribute to the project.
Tessera is dual-licensed under the MIT License or the Apache 2.0 License.