#layout #facebook #yoga #flexbox #engine #node #prelude

polyhorn-yoga

Rust bindings for Facebook's Yoga, a Flexbox layout engine

3 releases

0.3.4 Dec 7, 2020
0.3.3 Oct 23, 2020
0.3.2 Sep 25, 2020

#2 in #yoga

Download history 14/week @ 2023-12-18 10/week @ 2023-12-25 19/week @ 2024-01-08 3/week @ 2024-01-15 6/week @ 2024-01-22 18/week @ 2024-02-05 14/week @ 2024-02-12 22/week @ 2024-02-19 65/week @ 2024-02-26 39/week @ 2024-03-04 24/week @ 2024-03-11 23/week @ 2024-03-18 41/week @ 2024-03-25 95/week @ 2024-04-01

191 downloads per month
Used in 2 crates

MIT license

6.5MB
124K SLoC

C++ 56K SLoC // 0.2% comments JavaScript 19K SLoC // 0.0% comments C# 17K SLoC // 0.0% comments Java 16K SLoC // 0.0% comments Python 7.5K SLoC // 0.3% comments Visual Studio Project 3K SLoC Rust 1.5K SLoC // 0.0% comments Objective-C 1K SLoC // 0.0% comments Visual Studio Solution 1K SLoC Automake 385 SLoC // 0.2% comments Swift 294 SLoC // 0.2% comments M4 255 SLoC // 0.4% comments Shell 238 SLoC // 0.3% comments Bazel 154 SLoC // 0.1% comments C 139 SLoC // 0.0% comments Ruby 85 SLoC // 0.0% comments Xcode Config 33 SLoC // 0.7% comments Prolog 9 SLoC NuGet Config 8 SLoC Batch 2 SLoC

Contains (JAR file, 1.5MB) android-support-v4.jar, (Zip file, 1MB) appcompat-v7-24.2.1.aar, (JAR file, 315KB) src/yoga/lib/junit/junit-4.12.jar, (JAR file, 55KB) gradle-wrapper.jar, (Zip file, 59KB) src/yoga/lib/soloader/soloader-0.5.1.aar, (JAR file, 32KB) src/yoga/lib/jsr-305/jsr305.jar and 3 more.

Yoga-rs

Build Status

A Rust wrapper for Facebook's Yoga layout library.

You may also want to check out stretch as it is a pure Rust implementation.

Dependencies

  • cargo
  • rustc

Build

$ cargo build --release

Run Example

$ cargo run --release --example layout

Example Code

#[macro_use]
extern crate yoga;

use yoga::prelude::*;
use yoga::Node;
use yoga::StyleUnit::{Auto, UndefinedValue};

fn main() {
	let mut node = Node::new();

	let mut child = Node::new();
	let mut other_child = Node::new();

	node.insert_child(&mut child, 0);
	node.insert_child(&mut other_child, 1);

	style!(node,
		Margin(10 pt),
		MarginLeft(Auto),
		PaddingHorizontal(4 pt),
		Left(16 %),
		Bottom(UndefinedValue)
	);

	let child_styles = make_styles!(
		Width(32 pt),
		Height(32 pt),
		FlexGrow(1.0),
		Margin(Auto)
	);

	child.apply_styles(&child_styles);
	other_child.apply_styles(&child_styles);

	node.calculate_layout(512.0, 512.0, yoga::Direction::LTR);

	println!("Layout is {:#?}", child.get_layout());
}

Testing

The unit tests are automatically generated based on upstream fixtures and should not be edited manually.

$ cargo test

To generate the test cases: Download the ChromeDriver binary and put it somewhere in your $PATH. Linux/MacOS example:

$ cp chromedriver /usr/local/bin

Install the required Ruby gem.

$ sudo gem install watir

Generate the tests.

$ ruby gentest/gentest.rb

Dependencies