Skip to main content

Python bindings for Facebook Yoga layout engine (CSS Flexbox)

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 nanobind, 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 nanobind:

pip install scikit-build-core nanobind
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 (nanobind 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.2.tar.gz (99.0 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.2-cp313-cp313-win_amd64.whl (150.2 kB view details)

Uploaded CPython 3.13Windows x86-64

yoga_python-0.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (183.0 kB view details)

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

yoga_python-0.1.2-cp313-cp313-macosx_11_0_arm64.whl (126.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

yoga_python-0.1.2-cp312-cp312-win_amd64.whl (150.2 kB view details)

Uploaded CPython 3.12Windows x86-64

yoga_python-0.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (183.1 kB view details)

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

yoga_python-0.1.2-cp312-cp312-macosx_11_0_arm64.whl (126.9 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: yoga_python-0.1.2.tar.gz
  • Upload date:
  • Size: 99.0 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.2.tar.gz
Algorithm Hash digest
SHA256 53481483899508316c1bbc7f5901570b258804af03cb4920b9d477edb2e0b968
MD5 2fe38fef19ca612a4a0653e41dbb3950
BLAKE2b-256 c29e6784ff8e87bc0eb5102b6393fa7d252ec2662c82564276606db87fc04933

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.2.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.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e954fd7d735b180402e903a93d3e2615bcfbcc69b20c56d503e107c5f48b9910
MD5 51eec18cf9ccc4838d2c468dde67c55f
BLAKE2b-256 57ad92e97b4fa0871fb3efc819002d5f33fe48b2f0a211638e84bf3096e3f282

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.2-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.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 90e6f5e262b8a7a5491262c68a05f3e4212c254ea2744d0df354e7b9b57f4c17
MD5 a9af3f30a7fae2c7ef584984e7031e9a
BLAKE2b-256 257e528b8517db5643c718ea861762d6708c438c99c8e2cc1e288183f9ee0358

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.2-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.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4344be79d1d31fe50ad1183c5ca2ff78d7cde734d2671a79261bbca9e8d773f3
MD5 181319cb3c0561a03e39b8446027dd87
BLAKE2b-256 b3318c22bb27e2b11b209c393c4ff4b1de7161babae87662f35df9cb6dde9303

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.2-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.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 46fdcaf82d1366de64558ca681dc701020a167bd8d1aad9420d0ab0b5484225c
MD5 4597b353816bc4aee8399aa9ce9a8436
BLAKE2b-256 5f460a8731198720d1f4cbe8a3b16f6af12e460ecb6c28eefd7d43fc438a0900

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.2-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.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e1018478e716db3278d6f1992ab534e42878b16822e2783542bd285ca1aff1b7
MD5 58c15f79cb2daa34654cf1965d414799
BLAKE2b-256 ac515fa1660be519164e49a2b33079f1ee349c7c43b4afe848585ca93ff09133

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.2-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.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4181597095a8156aa1bbdd1d9fe1aff2e371de9281c1b84c22d06446aea17786
MD5 6896130ea9f5ecd4903cba2e9f0fc6c9
BLAKE2b-256 339c45002e5027e029db61420896d049890aa424027d3e0a8c0fb61af7402d19

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.2-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