Skip to main content

Python binding for Facebook Yoga layout engine

Project description

yoga-python

Python bindings for Facebook's Yoga layout engine — a cross-platform implementation of CSS Flexbox.

Yoga computes a layout tree of nodes with flexbox styles and outputs pixel-perfect positions. This package wraps the full C++ engine via pybind11, giving you the same layout behavior you get in React Native, Litho, and other Yoga-backed frameworks — directly from Python.

Installation

pip install yoga-python

Building from source requires a C++20 compiler, CMake 3.15+, and pybind11:

pip install scikit-build-core pybind11
pip install .

Quick start

from yoga import (
    Node, Config, Direction, FlexDirection, Justify,
    Align, Edge, YGValuePoint, YGValuePercent,
)

root = Node()
root.flex_direction = FlexDirection.Row
root.width = YGValuePoint(300)
root.height = YGValuePoint(200)
root.set_padding(Edge.All, 10)

child_a = Node()
child_a.flex_grow = 1
child_a.set_margin(Edge.Right, 10)
root.insert_child(child_a, 0)

child_b = Node()
child_b.flex_grow = 2
root.insert_child(child_b, 1)

root.calculate_layout(300, 200, Direction.LTR)

print(f"child_a: {child_a.layout_left}, {child_a.layout_top}, "
      f"{child_a.layout_width}x{child_a.layout_height}")
# child_a: 10.0, 10.0, 90.0x180.0

print(f"child_b: {child_b.layout_left}, {child_b.layout_top}, "
      f"{child_b.layout_width}x{child_b.layout_height}")
# child_b: 110.0, 10.0, 180.0x180.0

API overview

Node

The primary object. Create nodes, configure their styles, build a tree, then call calculate_layout.

node = Node()           # default config
node = Node(config)     # with explicit config

Style properties (set directly as attributes):

Property Type Example
flex_direction FlexDirection node.flex_direction = FlexDirection.Row
justify_content Justify node.justify_content = Justify.Center
align_items Align node.align_items = Align.Stretch
align_self Align node.align_self = Align.FlexEnd
align_content Align node.align_content = Align.SpaceBetween
flex_wrap Wrap node.flex_wrap = Wrap.Wrap
overflow Overflow node.overflow = Overflow.Hidden
display Display node.display = Display.Flex
position_type PositionType node.position_type = PositionType.Absolute
flex_grow float node.flex_grow = 1.0
flex_shrink float node.flex_shrink = 0.0
flex_basis YGValue node.flex_basis = YGValuePoint(100)
width / height YGValue node.width = YGValuePercent(50)
min_width / max_width YGValue node.min_width = YGValuePoint(80)
min_height / max_height YGValue node.max_height = YGValuePoint(400)
aspect_ratio float node.aspect_ratio = 16 / 9
box_sizing BoxSizing node.box_sizing = BoxSizing.ContentBox
direction Direction node.direction = Direction.LTR

Edge-based properties (margin, padding, border, position):

node.set_margin(Edge.Left, 10)           # points
node.set_margin(Edge.Top, YGValuePercent(5))  # percent
node.set_padding(Edge.All, 20)
node.set_border(Edge.Bottom, 1)
node.set_position(Edge.Left, YGValuePoint(50))

Tree manipulation:

node.insert_child(child, index)
node.remove_child(child)
node.remove_all_children()
node.set_children([child_a, child_b])
node.child_count                     # int
node[index]                          # Node (supports indexing)

Layout:

node.calculate_layout(width, height, Direction.LTR)

node.layout_left       # float
node.layout_top        # float
node.layout_width      # float
node.layout_height     # float
node.layout_direction  # Direction
node.layout_margin(Edge.Left)   # float
node.layout_padding(Edge.Top)   # float
node.layout_border(Edge.Right)  # float

Measure functions for leaf nodes with custom content sizing:

def measure(node, width, width_mode, height, height_mode):
    return {"width": 100, "height": 50}

node.set_measure_func(measure)

Baseline functions for custom baseline alignment:

def baseline(node, width, height):
    return height * 0.8

node.set_baseline_func(baseline)

Config

config = Config()
config.use_web_defaults = True
config.point_scale_factor = 2.0
config.errata = Errata.StretchFlexBasis

Values

YGValuePoint(100)       # 100px
YGValuePercent(50)      # 50%
YGValueAuto             # auto
YGValueUndefined        # undefined

Enums

All Yoga enums are available as Python enum types (pybind11 enums, int-convertible):

Direction, FlexDirection, Justify, Align, PositionType, Wrap, Overflow, Display, Edge, Unit, MeasureMode, Dimension, BoxSizing, Gutter, Errata, NodeType, LogLevel, ExperimentalFeature

Development

git clone https://github.com/banditburai/yoga-python.git
cd yoga-python
uv sync --dev

# Run tests
uv run pytest tests/ -v

# Lint & type checking
uv run ruff check
uv run ruff format --check
uv run pyright

Test coverage

The test suite is a 1:1 port of the Yoga C++ test suite — 822 tests covering all layout modes, edge cases, and behaviors. Tests that the C++ suite itself skips (GTEST_SKIP) are also skipped in Python.

License

MIT — same as Yoga.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yoga_python-0.1.1.tar.gz (97.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

yoga_python-0.1.1-cp313-cp313-win_amd64.whl (217.9 kB view details)

Uploaded CPython 3.13Windows x86-64

yoga_python-0.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (297.6 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

yoga_python-0.1.1-cp313-cp313-macosx_11_0_arm64.whl (233.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

yoga_python-0.1.1-cp312-cp312-win_amd64.whl (217.9 kB view details)

Uploaded CPython 3.12Windows x86-64

yoga_python-0.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (297.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

yoga_python-0.1.1-cp312-cp312-macosx_11_0_arm64.whl (233.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

Details for the file yoga_python-0.1.1.tar.gz.

File metadata

  • Download URL: yoga_python-0.1.1.tar.gz
  • Upload date:
  • Size: 97.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for yoga_python-0.1.1.tar.gz
Algorithm Hash digest
SHA256 8376fdad44b351e8c7a7a7c6ce49e6ee94f40ad68249f0ced3f56b3b8fcf4d44
MD5 7c89b70aa5d517e4d99fae8561927a17
BLAKE2b-256 9578dcba00185cb95c8d6906c04810c6b40850e344a338eb175bd1d13d0dfa7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.1.tar.gz:

Publisher: release.yml on banditburai/yoga-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yoga_python-0.1.1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 39557b9bd0f6b6d4d11fac4d2d431d09a47d8272e85a427a45c51be0693313ba
MD5 c0feb58d0992499f3456af9d624bf17c
BLAKE2b-256 8e86a5d86fc0019c8f2a2cdcca0708c264060af3d40d01ff1b9b746802d754fd

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.1-cp313-cp313-win_amd64.whl:

Publisher: release.yml on banditburai/yoga-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yoga_python-0.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2032bf7f58b37a9526aba31fe3a947e89a0a13f0bc61a375fca21962ea7f81d8
MD5 7c67af6d8c10a1e74aedc95fbb401229
BLAKE2b-256 fbd4430c6cab0bdf07dff96c91bf49fd2b76f5b5e46cb84ccf425b6cd5049770

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on banditburai/yoga-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yoga_python-0.1.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b15bba8fff9980d3508f3fb8b68bdcb02fd1f8dcc7494053bd1cfedf6db2fa92
MD5 6a9ab715fcefe6e78abd0eff8cd6b144
BLAKE2b-256 8b0721afd5de5c707f6499ea61379ce0756df1dc8371087b1234fa21f2db0588

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.1-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on banditburai/yoga-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yoga_python-0.1.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ee696e1175f50cfd5e5ce0d3e9cda80ed84acc901a85da95bdda52d93277fb87
MD5 5efc3c11460af5b5ae2add44343d010e
BLAKE2b-256 6d05409661f950578b1d4bf8fae2a6188b0c97716973573ae7666c20ddd3c086

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.1-cp312-cp312-win_amd64.whl:

Publisher: release.yml on banditburai/yoga-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yoga_python-0.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 c6c4208865f057ff7346cdc237ac4f160c502b55a717a50487a86fe2284e90c2
MD5 2532136ac192ca1ffee447f0610e9ed7
BLAKE2b-256 d415bc9cdcca8336d0632dfba57492c167a2d67ca1ba14af67966e49cd1c3636

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: release.yml on banditburai/yoga-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file yoga_python-0.1.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e333ce55ab90ff5c3d11a751c0434622075510fa8fef355cdd030827d5365a6a
MD5 af11c2d1812aebb60648108daaede0ec
BLAKE2b-256 74e6680dcda20f06119453122f001054fac8c2b6406ec75db693ba2e7a35c036

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: release.yml on banditburai/yoga-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page