buoyant 0.3.0

SwiftUI-like UIs in Rust for embedded devices
Documentation

Buoyant

Crates.io Documentation

Partially working espresso machine UI

Buoyant is a library for writing and rendering SwiftUI-like views in Rust, primarily intended for use on no_std memory-constrained embedded systems.

Floating point math is aggressively avoided.

Nightly is required.

Available render targets

  • DrawTarget: embedded-graphics displays.
  • TextBuffer: A basic fixed-size char buffer. Does not respect graphemes. This is primarily useful for testing and debugging.
  • CrossTerm: Renders colored character-pixels to a terminal using the crossterm crate.

A Quick Example

Here's what an Apple-like toggle button component would look like, implemented with Buoyant:

fn toggle_button(is_on: bool) -> impl Renderable<Rgb565, Renderables: EmbeddedGraphicsRender<Rgb565>> {
    let alignment = if is_on {
        HorizontalAlignment::Trailing
    } else {
        HorizontalAlignment::Leading
    };

    let color = if is_on { Rgb565::GREEN } else { Rgb565::RED };

    ZStack::new((
        Capsule.foreground_color(color),
        Circle.foreground_color(Rgb565::WHITE).padding(2),
    ))
    .with_horizontal_alignment(alignment)
    .frame()
    .with_width(50)
    .with_height(25)
    .animated(Animation::Linear(Duration::from_millis(200)), is_on)
}

Feature progress

Layout and Rendering

  • Fixed-size Stacks with hetereogeneos children (VStack, HStack, ZStack)
  • Stacks with homogeneous children (ForEach) - partial, vertical only
  • Common SwiftUI primitives (Spacer, Divider)
  • Conditional views - partial, no unwrapping
  • Text, basic line breaking
  • Text, Unicode line breaking
  • Text, monospaced fonts
  • Text, arbitrary fonts
  • Animation
  • Transition
  • Common embedded-graphics shape primitives
  • Canvas for arbitrary path/shape/raster drawing
  • Shape stroke/fill
  • Shape styles (gradients, fragment shaders)
  • Images
  • Alpha rendering
  • Adaptive antialiasing

Interactivity

  • State management
  • Click/tap routing
  • Focus management + keyboard input (Text input view)

Who should use this?

This project should not be used in production...yet. For hobby projects it's lightyears better than dealing with raw embedded-graphics. If you're familiar with SwiftUI, you should feel especially at home.

License

Licensed under either of

at your option.

Contribution

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.