Buoyant is a library for writing and rendering SwiftUI-like views in Rust,
primarily intended for use on no_std memory-constrained embedded systems.
Get started with the Book.
While this crate is primarily intended for use with embedded-graphics DrawTargets, it
can also be used to layout and render views to the terminal.
DrawTarget:embedded-graphicsdisplays.TextBuffer: A basic fixed-sizecharbuffer. Does not respect graphemes. This is primarily useful for testing and debugging.CrossTerm: Renders colored character-pixels to a terminal using thecrosstermcrate.
Here's an animated toggle component, implemented with Buoyant:
fn toggle_button(is_on: bool) -> impl View<Rgb565, bool> {
let alignment = if is_on { Alignment::Trailing } else { Alignment::Leading };
let color = if is_on { Rgb565::GREEN } else { Rgb565::RED };
Button::new(
|is_on: &mut bool| *is_on = !*is_on,
|_| {
Capsule.foreground_color(color)
.overlay(
alignment,
Circle
.foreground_color(Rgb565::WHITE)
.padding(Edges::All, 2)
)
.frame_sized(50, 25)
.animated(Animation::ease_in_out(Duration::from_millis(500)), is_on)
.geometry_group()
}
)
}Static layout and animation between layouts are relatively feature-complete, aside from transitions. You should be able to construct most desired layouts and animations.
- β Stacks of heterogeneous views (VStack, HStack, ZStack)
- π§ Stacks of homogeneous views (ForEach) - partial, vertical only
- β Common SwiftUI-like primitives (Spacer, Divider, ...)
- β Common SwiftUI-like modifiers (.frame, .padding, ...)
- β Conditional views, with match variable binding
- β Text (embedded-graphics Monospace and u8g2 fonts)
- β Images (fixed size)
- β Interruptible Animations + Curves
- π§ Transitions (partially implemented)
- β Shape stroke+fill
- β Common embedded-graphics shape primitives
- β Custom sizing with GeometryView
- π€ Charts
- π€ Canvas for arbitrary path/shape/raster drawing
- π€ Simulated alpha and antialiasing
- π€ Shape styles (e.g. gradients)
Interactivity is under active development, and is not yet feature-complete.
- β State management
- π§ Click/tap routing
- β Button
- π§ ScrollView
- π€ Focus management + keyboard input
- π€ TextField
This project could be used in production by the brave, but is probably better suited for hobby projects at this point. It's significantly better than dealing with raw embedded-graphics. If you're familiar with SwiftUI, you should feel especially at home.
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.