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

Uploaded CPython 3.13Windows x86-64

yoga_python-0.1.5-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.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (181.7 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

yoga_python-0.1.5-cp313-cp313-macosx_10_13_x86_64.whl (159.0 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

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

Uploaded CPython 3.12Windows x86-64

yoga_python-0.1.5-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.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl (181.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ ARM64manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

yoga_python-0.1.5-cp312-cp312-macosx_10_13_x86_64.whl (159.1 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

File details

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

File metadata

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

File hashes

Hashes for yoga_python-0.1.5.tar.gz
Algorithm Hash digest
SHA256 e4d46061d7d50edfc249370b2b006f3bd926e4ed09f8fb8d453b54c4690eaa7f
MD5 0aecb68b87933a1a5af975fb08a9b7f6
BLAKE2b-256 816d4504e0d97154b25b67a422d6c299e4b05f4b9669bdb2831b8f8caee30dc5

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: yoga_python-0.1.5-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.12

File hashes

Hashes for yoga_python-0.1.5-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 0e6fbccf622a3e81b15cd306ef9838ffbcd5f7109a0875f277a54ada64abf792
MD5 fe096ec26c69aefbfa26448062105690
BLAKE2b-256 be995d9dc4fb16d542acfe2777300db63f53021420e209a24ee65c1cf7430286

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 de680c7e60f43549193b23d6e9d9f9db18425ebfd9786b06534e32b4b1f719dc
MD5 b1f1285771cccee400545b9b8938895a
BLAKE2b-256 8dd0cdd84b2e05eafa9e9a705ba3075b3ecdfe87db844ca7d2c6a4b7e3cde221

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.5-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.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e0186adce95781a068b42ad7514273865db56cf5b55481b055b3334fd4e6c722
MD5 cc783e117093ec5e2bb68a7ab1c5e679
BLAKE2b-256 40aa6cf1cb78f36a04303d959fdcb04f1ab83568f66e0f5626a98433f45b34d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.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.5-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5300efadb191a964bea53fff98bf278a1c2ee8132cc38445ffaf02a4c194f87a
MD5 f638864cb9e622551d3b633c320df9cf
BLAKE2b-256 3b3a4d743e1f3244a66951755604c563b35683e67f7f68a1d73697b795a956c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.5-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.5-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 258d75cee54f5110ff48764b5f50f8f309afd79c5fa12121051d8eba0ca80b6a
MD5 8eae4052f87003e5b3144764f2956ed4
BLAKE2b-256 5bfb25abd12fadaa8b63abaa91e56f27a596c28e746e0a7f23f3ffaa20e93d3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.5-cp313-cp313-macosx_10_13_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.5-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: yoga_python-0.1.5-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.12

File hashes

Hashes for yoga_python-0.1.5-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 e51297db6122239e883dddfd97180eea9c6338cf523b1ba648b1aee64fd7e941
MD5 151ade42259012c4ff8dc5f2757f599e
BLAKE2b-256 c261f79aa36b92f35cd96d83032d12b1ac9a001a79f9c53b0d6b4b6723ace063

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 aa25b1b0b30aa7148d4f64ada9b11bf2c1deb62a490ecf6904d224a1b5fa452c
MD5 30a4484e2207074667a86bbaf2b302df
BLAKE2b-256 0f2a0ddd81bc5894a166a09a3dd528ff8f17219abe1e6d9c5e6c3ae98f7a2878

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.5-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.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f01d3bc587ffceb80899be79e5fec7abae20124e065c4fa9cbad718d5c40a3e3
MD5 7c335906b2e330351e60766731ae7487
BLAKE2b-256 8a9529e2907b35f324a6bd7fd8ee44e715f882e58dff0baf714538ac1d339ecb

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.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.5-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b5f486449c98aa314add830df0820b640dd6c6444ea407edad7cd5238f0ad32c
MD5 b8c1008d21968648f610c76810c79b7a
BLAKE2b-256 0ba42b3da75f2277d814db6e45cfea9d437a040960a4c07533ced6fbc31e41b7

See more details on using hashes here.

Provenance

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

File details

Details for the file yoga_python-0.1.5-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for yoga_python-0.1.5-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 7de261538ff693ddbd8f884e699ab3c783813e6bf2765d28cf75fd00e75c4484
MD5 48e06a4e09202268237512fe12db299b
BLAKE2b-256 991210ff8359dbdf415328d566f075726abf877fc72358ff5e4643eead3ae55f

See more details on using hashes here.

Provenance

The following attestation bundles were made for yoga_python-0.1.5-cp312-cp312-macosx_10_13_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.

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