1# Taffy 2 3[](https://github.com/DioxusLabs/taffy/actions/workflows/ci.yml) 4[](https://crates.io/crates/taffy) 5[](https://docs.rs/taffy) 6 7Taffy is a flexible, high-performance, cross-platform UI layout library written in [Rust](https://www.rust-lang.org). 8 9It 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](https://github.com/DioxusLabs/taffy/issues/345). 10 11This crate is a collaborative, cross-team project, and is designed to be used as a dependency for other UI and GUI libraries. 12Right now, it powers: 13 14- [Servo](https://github.com/servo/servo): an alternative web browser 15- [Blitz](https://github.com/DioxusLabs/blitz): a radically modular web engine 16- [Bevy](https://bevyengine.org/): an ergonomic, ECS-first Rust game engine 17- The [Lapce](https://lapce.dev/) text editor via the [Floem](https://github.com/lapce/floem) UI framework 18- The [Zed](https://zed.dev/) text editor via the [GPUI](https://github.com/zed-industries/zed/tree/main/crates/gpui) UI framework 19 20## Usage 21 22```rust 23use taffy::prelude::*; 24 25// First create an instance of TaffyTree 26let mut tree : TaffyTree<()> = TaffyTree::new(); 27 28// Create a tree of nodes using `TaffyTree.new_leaf` and `TaffyTree.new_with_children`. 29// These functions both return a node id which can be used to refer to that node 30// The Style struct is used to specify styling information 31let header_node = tree 32 .new_leaf( 33 Style { 34 size: Size { width: length(800.0), height: length(100.0) }, 35 ..Default::default() 36 }, 37 ).unwrap(); 38 39let body_node = tree 40 .new_leaf( 41 Style { 42 size: Size { width: length(800.0), height: auto() }, 43 flex_grow: 1.0, 44 ..Default::default() 45 }, 46 ).unwrap(); 47 48let root_node = tree 49 .new_with_children( 50 Style { 51 flex_direction: FlexDirection::Column, 52 size: Size { width: length(800.0), height: length(600.0) }, 53 ..Default::default() 54 }, 55 &[header_node, body_node], 56 ) 57 .unwrap(); 58 59// Call compute_layout on the root of your tree to run the layout algorithm 60tree.compute_layout(root_node, Size::MAX_CONTENT).unwrap(); 61 62// Inspect the computed layout using `TaffyTree.layout` 63assert_eq!(tree.layout(root_node).unwrap().size.width, 800.0); 64assert_eq!(tree.layout(root_node).unwrap().size.height, 600.0); 65assert_eq!(tree.layout(header_node).unwrap().size.width, 800.0); 66assert_eq!(tree.layout(header_node).unwrap().size.height, 100.0); 67assert_eq!(tree.layout(body_node).unwrap().size.width, 800.0); 68assert_eq!(tree.layout(body_node).unwrap().size.height, 500.0); // This value was not set explicitly, but was computed by Taffy 69 70``` 71 72## Bindings to other languages 73 74- Python via [stretchable](https://github.com/mortencombat/stretchable) 75- [WIP C bindings](https://github.com/DioxusLabs/taffy/pull/404) 76- [WIP WASM bindings](https://github.com/DioxusLabs/taffy/pull/394) 77 78## Learning Resources 79 80Taffy 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](https://developer.mozilla.org/en-US/docs/Web/CSS/width) on the `width` property). Such pages can usually be found by searching for "MDN property-name" using a search engine. 81 82If you are interested in guide-level documentation on CSS layout, then we recommend the following resources: 83 84### Flexbox 85 86- [Flexbox Froggy](https://flexboxfroggy.com/). This is an interactive tutorial/game that allows you to learn the essential parts of Flexbox in a fun engaging way. 87- [A Complete Guide To Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) by CSS Tricks. This is detailed guide with illustrations and comprehensive written explanation of the different Flexbox properties and how they work. 88 89### CSS Grid 90 91- [CSS Grid Garden](https://cssgridgarden.com/). This is an interactive tutorial/game that allows you to learn the essential parts of CSS Grid in a fun engaging way. 92- [A Complete Guide To CSS Grid](https://css-tricks.com/snippets/css/complete-guide-grid/) by CSS Tricks. This is detailed guide with illustrations and comprehensive written explanation of the different CSS Grid properties and how they work. 93 94## Benchmarks (vs. [Yoga](https://github.com/facebook/yoga)) 95 96- Run on a 2021 MacBook Pro with M1 Pro processor using [criterion](https://github.com/bheisler/criterion.rs) 97- The benchmarks measure layout computation only. They do not measure tree creation. 98- Yoga benchmarks were run via the [yoga](https://github.com/bschwind/yoga-rs) crate (Rust bindings) 99- Most popular websites seem to have between 3,000 and 10,000 nodes (although they also require text layout, which neither yoga nor taffy implement). 100 101Note that the table below contains multiple different units (milliseconds vs. microseconds) 102 103| Benchmark | Node Count | Depth | Yoga ([ba27f9d]) | Taffy ([71027a8]) | 104| --- | --- | --- | --- | --- | 105| yoga 'huge nested' | 1,000 | 3 | 364.60 µs | 329.04 µs | 106| yoga 'huge nested' | 10,000 | 4 | 4.1988 ms | 4.3486 ms | 107| yoga 'huge nested' | 100,000 | 5 | 45.804 ms | 38.559 ms | 108| big trees (wide) | 1,000 | 1 | 737.77 µs | 505.99 µs | 109| big trees (wide) | 10,000 | 1 | 7.1007 ms | 8.3395 ms | 110| big trees (wide) | 100,000 | 1 | 135.78 ms | 247.42 ms | 111| big trees (deep) | 4,000 | 12 | 2.2333 ms | 1.7400 ms | 112| big trees (deep) | 10,000 | 14 | 5.9477 ms | 4.4445 ms | 113| big trees (deep) | 100,000 | 17 | 76.755 ms | 63.778 ms | 114| super deep | 1,000 | 1,000 | 555.32 µs | 472.85 µs | 115 116[ba27f9d]: https://github.com/facebook/yoga/commit/ba27f9d1ecfa7518019845b84b035d3d4a2a6658 117[71027a8]: https://github.com/DioxusLabs/taffy/commit/71027a8de03b343e120852b84bb7dca9fb4651c5 118 119## Contributions 120 121[Contributions welcome](https://github.com/DioxusLabs/taffy/blob/main/CONTRIBUTING.md): 122if you'd like to use, improve or build `taffy`, feel free to join the conversation, open an [issue](https://github.com/DioxusLabs/taffy/issues) or submit a [PR](https://github.com/DioxusLabs/taffy/pulls). 123If you have questions about how to use `taffy`, open a [discussion](https://github.com/DioxusLabs/taffy/discussions) so we can answer your questions in a way that others can find. 124