dev.club — where best developers and top companies connect.

dev.club — where best developers and top companies connect.Invite only

Request invite

Taffy

GitHub CI crates.io docs.rs Crates.io MSRV

Taffy is a flexible, high-performance, cross-platform UI layout library written in Rust.

It currently implements the CSS Block, Flexbox and CSS Grid layout algorithms. Support for other paradigms is planned. For more information on this and other future development plans see the roadmap issue.

This crate is a collaborative, cross-team project, and is designed to be used as a dependency for other UI and GUI libraries. Right now, it powers:

Usage

use taffy::prelude::*;

// First create an instance of TaffyTree
let mut tree : TaffyTree<()> = TaffyTree::new();

// Create a tree of nodes using `TaffyTree.new_leaf` and `TaffyTree.new_with_children`.
// These functions both return a node id which can be used to refer to that node
// The Style struct is used to specify styling information
let header_node = tree
    .new_leaf(
        Style {
            size: Size { width: length(800.0), height: length(100.0) },
            ..Default::default()
        },
    ).unwrap();

let body_node = tree
    .new_leaf(
        Style {
            size: Size { width: length(800.0), height: auto() },
            flex_grow: 1.0,
            ..Default::default()
        },
    ).unwrap();

let root_node = tree
    .new_with_children(
        Style {
            flex_direction: FlexDirection::Column,
            size: Size { width: length(800.0), height: length(600.0) },
            ..Default::default()
        },
        &[header_node, body_node],
    )
    .unwrap();

// Call compute_layout on the root of your tree to run the layout algorithm
tree.compute_layout(root_node, Size::MAX_CONTENT).unwrap();

// Inspect the computed layout using `TaffyTree.layout`
assert_eq!(tree.layout(root_node).unwrap().size.width, 800.0);
assert_eq!(tree.layout(root_node).unwrap().size.height, 600.0);
assert_eq!(tree.layout(header_node).unwrap().size.width, 800.0);
assert_eq!(tree.layout(header_node).unwrap().size.height, 100.0);
assert_eq!(tree.layout(body_node).unwrap().size.width, 800.0);
assert_eq!(tree.layout(body_node).unwrap().size.height, 500.0); // This value was not set explicitly, but was computed by Taffy

Bindings to other languages

Learning Resources

Taffy implements the Flexbox and CSS Grid specifications faithfully, so documentation designed for the web should translate cleanly to Taffy's implementation. For reference documentation on individual style properties we recommend the MDN documentation (for example this page on the width property). Such pages can usually be found by searching for "MDN property-name" using a search engine.

If you are interested in guide-level documentation on CSS layout, then we recommend the following resources:

Flexbox

CSS Grid

Benchmarks (vs. Yoga)

Note that the table below contains multiple different units (seconds vs. milliseconds vs. microseconds)

Benchmark Node Count Depth Yoga (v3.2.1) Taffy (e747f6e)
yoga 'huge nested' 1,000 3 328.24 µs 250.23 µs
yoga 'huge nested' 10,000 4 3.2892 ms 2.6947 ms
yoga 'huge nested' 100,000 5 41.686 ms 32.871 ms
big trees (wide) 1,000 2 468.66 µs 471.14 µs
big trees (wide) 10,000 2 4.8667 ms 4.8032 ms
big trees (wide) 100,000 2 63.304 ms 58.111 ms
absolutely positioned leaves 1,000 2 408.51 µs 259.91 µs
absolutely positioned leaves 10,000 2 4.3898 ms 2.7890 ms
absolutely positioned leaves 100,000 2 56.490 ms 41.270 ms
big trees (deep, random size) 4,000 12 1.7937 ms 1.8160 ms
big trees (deep, random size) 10,000 14 4.4436 ms 4.5843 ms
big trees (deep, random size) 100,000 17 63.555 ms 69.952 ms
big trees (deep, auto size) 4,000 12 32.872 ms 4.7357 ms
big trees (deep, auto size) 10,000 14 103.19 ms 11.894 ms
big trees (deep, auto size) 100,000 17 2.3502 s 164.24 ms
super deep 150 50 61.132 ms 179.02 µs
super deep 300 100 did not finish (>9min) 366.89 µs

Contributions

Contributions welcome: if you'd like to use, improve or build taffy, feel free to join the conversation, open an issue or submit a PR. If you have questions about how to use taffy, open a discussion so we can answer your questions in a way that others can find.

Join libs.tech

...and unlock some superpowers

GitHub

We won't share your data with anyone else.