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.4.tar.gz (105.8 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.4-cp313-cp313-win_amd64.whl (168.7 kB view details)

Uploaded CPython 3.13Windows x86-64

yoga_python-0.1.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (201.5 kB view details)

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

yoga_python-0.1.4-cp313-cp313-macosx_11_0_arm64.whl (143.4 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

yoga_python-0.1.4-cp312-cp312-win_amd64.whl (168.8 kB view details)

Uploaded CPython 3.12Windows x86-64

yoga_python-0.1.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (201.5 kB view details)

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

yoga_python-0.1.4-cp312-cp312-macosx_11_0_arm64.whl (143.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: yoga_python-0.1.4.tar.gz
  • Upload date:
  • Size: 105.8 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.4.tar.gz
Algorithm Hash digest
SHA256 b8deaca4b2c3e9e1b2dc5ef64ad07898c0b45ae6cb5c6a9c9eff1cd558c97ba1
MD5 dd7aea2b057cf9b973958f83f0fb9d0d
BLAKE2b-256 d0b094e7183712275a813e77d68dd424b864f7fa94c5da936b0883fddc755af4

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: yoga_python-0.1.4-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 168.7 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for yoga_python-0.1.4-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 2caa1d39ef242d8ce5a4e9fefd86962cb6ffb0ee9bb2b18628bf0f7adfd9b3eb
MD5 5ab5eda37c974a444b94cf837eb1b7ae
BLAKE2b-256 387664d41676934d676bec2dd372964e2dd0d6552efa5cdb08b80acd0ea32978

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for yoga_python-0.1.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 29c91b6445b0b267f44545c9e92656f52b6e383c08ddb1f9884dffed876f1fb2
MD5 64e85a42a79ec49c1629b17a55efc5be
BLAKE2b-256 aa703e4a1d5d9a58b2296ed3f3ef63881a9d3b1a9e96c9a0fe0c9fe18c093adc

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for yoga_python-0.1.4-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2f5afb094c268d83bcebfa71d8511dfd098c1a58cd9a832bfe236d88fabb3aa
MD5 ce8b1c00b1195da4c33986ca57f85de2
BLAKE2b-256 40a24902015c65eea81110603448ba610cb4c79bd6336f14eae2bcc9ecc7ff4a

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: yoga_python-0.1.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 168.8 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for yoga_python-0.1.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 bcbe5ba98a158b04e10ee416f6efca62256fcdc5e47e6e17601a37e4676f8760
MD5 876941dde3489d4a58cbcc981818897f
BLAKE2b-256 b0277939ddaaf6b5069bc032aa56bf9b462671c32619d5afc3ac000f0a612721

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for yoga_python-0.1.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b77e094a44ddf503bfcf2fd2d0e55404594a72b30943efabbf4b3688430da99a
MD5 bcab8cc0e2088af1f790965aa8dac675
BLAKE2b-256 3e3a65f8c4b4c23f5a86a7b74492ecc49185f43be7a205d3aa1b5700e95e0da0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for yoga_python-0.1.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0de63ff4d9813fdf760f3f0a7ecca90d921ad7bbf6c39f181b9da2146d0ab086
MD5 07c6064407e135110977f8eab6d779f2
BLAKE2b-256 fa5d094514101e808f8ae64d8661befc131b5ace7108afaca7464bddc6d334c8

See more details on using hashes here.

Provenance

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