20 unstable releases (3 breaking)

new 0.4.3 Mar 14, 2025
0.4.2 Mar 9, 2025
0.4.0-alpha.0 Feb 26, 2025
0.3.1 Feb 24, 2025
0.1.3 Jun 9, 2024

#58 in Graphics APIs

Download history 1/week @ 2024-12-11 120/week @ 2024-12-25 1/week @ 2025-01-08 95/week @ 2025-02-05 18/week @ 2025-02-12 492/week @ 2025-02-19 484/week @ 2025-02-26 574/week @ 2025-03-05

1,574 downloads per month

MIT/Apache

4MB
5.5K SLoC

Buoyant

Partially working espresso machine UI

Crates.io Documentation

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.

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.

Building views with Buoyant

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

fn toggle_button(is_on: bool) -> impl EmbeddedGraphicsView<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_sized(50, 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.

Dependencies

~4–12MB
~137K SLoC