Yoga API
Most applications should use OpenTUI layout options. Read Layout for the normal Flexbox API.
@opentui/core/yoga is an advanced facade over the native Yoga library. Use it when you need to own a Yoga tree and calculate its layout directly. The entry point works in Bun and supported Node.js releases.
Imports#
The @opentui/core root exports the module as the Yoga namespace. The direct entry point exports the same named values and types.
import { Yoga } from "@opentui/core"
const node = Yoga.Node.create()
node.free()The direct entry point also has a default export named Yoga:
import Yoga, { Config, Direction, Node, type Layout } from "@opentui/core/yoga"The default object contains Config, Node, every enum except YogaStatus, and every uppercase constant on this page. YogaError, YogaStatus, and type-only exports such as Layout are not properties of the default object.
Minimal layout#
import { Direction, Node } from "@opentui/core/yoga"
const node = Node.create()
try {
node.setWidth(80)
node.setHeight(24)
node.calculateLayout(undefined, undefined, Direction.LTR)
console.log(node.getComputedLayout())
} finally {
node.free()
}calculateLayout() accepts a number, "auto", or undefined for each available size. Both "auto" and undefined pass an undefined constraint to Yoga. The direction defaults to Direction.LTR.
Ownership#
Config.create() and each Node factory allocate native objects. The JavaScript garbage collector does not release these objects.
- Call
config.free()orConfig.destroy(config)for each owned config. - Call
node.free()orNode.destroy(node)for one node. - Call
node.freeRecursive()to release a node and its current descendants. - Release a node tree before you release the config that created it.
config.free()throws while nodes from that config remain. removeChild()andremoveAllChildren()detach nodes. They do not free them.free(),freeRecursive(), and both staticdestroy()methods ignore repeated release calls.node.isFreed()reports whether the wrapper released its native node.
node.reset() resets the native node and removes its measure and dirtied callbacks. It throws YogaError while the node has a parent or children. Node release also removes callback registrations. Most methods of a released wrapper do nothing or return a default value. Do not keep using a released wrapper.
Native Yoga calls throw YogaError for invalid arguments, such as an out-of-range child index or an unknown enum value. Its operation property names the call, and its status property holds a YogaStatus value.
Config.ptr and Node.ptr expose binding pointers. They are implementation-looking public properties. Do not use them as a standalone native API.
Config#
| Method | Purpose |
|---|---|
Config.create() |
Allocate a config. |
Config.destroy(config) |
Call config.free(). |
free() |
Release the native config once. |
setUseWebDefaults(value) |
Set Yoga’s web-default mode. |
useWebDefaults() |
Read web-default mode. |
setPointScaleFactor(value) |
Set the layout rounding scale. |
getPointScaleFactor() |
Read the layout rounding scale. |
setErrata(value) |
Set the active Errata flags. |
getErrata() |
Read the active Errata flags. |
setExperimentalFeatureEnabled(feature, enabled) |
Change an experimental feature flag. |
isExperimentalFeatureEnabled(feature) |
Read an experimental feature flag. |
Node#
Factories and tree ownership#
| Methods | Purpose |
|---|---|
Node.create(config?), Node.createDefault() |
Allocate a node. Without a config, the node uses a shared default config. |
Node.createWithConfig(config) |
Allocate a node with the given config. |
Node.createForOpenTUI() |
Allocate a node with OpenTUI’s native defaults. This factory is implementation-specific. |
Node.destroy(node), free(), freeRecursive(), isFreed() |
Release one node or a complete subtree, and read release state. |
reset(), copyStyle(node) |
Reset a node or copy style from another node. |
insertChild(child, index), removeChild(child), removeAllChildren() |
Change child ownership in the Yoga tree. |
getChild(index), getChildCount(), getParent() |
Inspect the Yoga tree. |
Layout state#
| Methods | Purpose |
|---|---|
calculateLayout(width?, height?, direction?) |
Calculate the tree from the available size and direction. |
hasNewLayout(), markLayoutSeen() |
Read and clear the new-layout flag. |
markDirty(), isDirty() |
Change or read dirty state. |
getComputedLayout() |
Return a new Layout snapshot. |
getComputedLeft(), getComputedTop(), getComputedRight(), getComputedBottom() |
Read computed edges. |
getComputedWidth(), getComputedHeight() |
Read computed dimensions. |
getComputedMargin(edge), getComputedPadding(edge), getComputedBorder(edge) |
Read computed edge values. |
Enum styles#
Each setter has the getter shown in the same row.
| Methods | Enum |
|---|---|
setDirection(), getDirection() |
Direction |
setFlexDirection(), getFlexDirection() |
FlexDirection |
setJustifyContent(), getJustifyContent() |
Justify |
setAlignContent(), getAlignContent() |
Align |
setAlignItems(), getAlignItems() |
Align |
setAlignSelf(), getAlignSelf() |
Align |
setPositionType(), getPositionType() |
PositionType |
setFlexWrap(), getFlexWrap() |
Wrap |
setOverflow(), getOverflow() |
Overflow |
setDisplay(), getDisplay() |
Display |
setBoxSizing(), getBoxSizing() |
BoxSizing |
Numeric and value styles#
A numeric value uses Yoga points. A percentage string such as "50%" uses Unit.Percent. undefined clears an optional style value.
The Accepted values column describes setter arguments. Getters do not return undefined. Numeric getters return
numbers. After you clear a numeric style, getFlexGrow() and getFlexShrink() return Yoga’s default of 0. The other
numeric getters return NaN. After you clear a value style, its getter returns a Value with Unit.Undefined and
value: NaN. On a new node, getWidth(), getHeight(), and getFlexBasis() return Unit.Auto. The other value
getters return Unit.Undefined.
| Methods | Accepted values |
|---|---|
setFlex(), getFlex() |
A number or undefined |
setFlexGrow(), getFlexGrow() |
A number or undefined |
setFlexShrink(), getFlexShrink() |
A number or undefined |
setAspectRatio(), getAspectRatio() |
A number or undefined |
setFlexBasis(), setFlexBasisPercent(), setFlexBasisAuto(), getFlexBasis() |
Points, percent, auto, a Value, or undefined |
setWidth(), setWidthPercent(), setWidthAuto(), getWidth() |
Points, percent, auto, a Value, or undefined |
setHeight(), setHeightPercent(), setHeightAuto(), getHeight() |
Points, percent, auto, a Value, or undefined |
setMinWidth(), setMinWidthPercent(), getMinWidth() |
Points, percent, a Value, or undefined |
setMinHeight(), setMinHeightPercent(), getMinHeight() |
Points, percent, a Value, or undefined |
setMaxWidth(), setMaxWidthPercent(), getMaxWidth() |
Points, percent, a Value, or undefined |
setMaxHeight(), setMaxHeightPercent(), getMaxHeight() |
Points, percent, a Value, or undefined |
setMargin(), setMarginPercent(), setMarginAuto(), getMargin() |
An edge plus points, percent, auto, a Value, or undefined |
setPadding(), setPaddingPercent(), getPadding() |
An edge plus points, percent, a Value, or undefined |
setPosition(), setPositionPercent(), setPositionAuto(), getPosition() |
An edge plus points, percent, auto, a Value, or undefined |
setGap(), setGapPercent(), getGap() |
A gutter plus points, percent, a Value, or undefined |
setBorder(), getBorder() |
An edge plus a number or undefined |
Baselines and containing blocks#
| Methods | Purpose |
|---|---|
setIsReferenceBaseline(), isReferenceBaseline() |
Change or read reference-baseline state. |
setAlwaysFormsContainingBlock(), getAlwaysFormsContainingBlock() |
Change or read containing-block state. |
Measure and dirtied callbacks#
MeasureFunction has this shape:
type MeasureFunction = (width: number, widthMode: MeasureMode, height: number, heightMode: MeasureMode) => SizeUse setMeasureFunc(callback) to register it. Use unsetMeasureFunc() or pass null to remove it. hasMeasureFunc() reports whether the node has a measure function.
An undefined size constraint reaches the callback as NaN with MeasureMode.Undefined. The callback returns { width, height }.
A node has one measure function, and a new one replaces the old one. Standalone nodes measure only through JavaScript measure functions.
setDirtiedFunc(callback) registers a DirtiedFunction. Yoga calls it with the matching Node when clean state changes to dirty state. Use unsetDirtiedFunc() or pass null to remove it.
Yoga calls both callbacks synchronously on the JavaScript thread. A callback must not return a Promise. A Promise result throws TypeError. A callback must not change any Yoga node. A change throws. If a callback throws, the Yoga call that ran it, such as calculateLayout(), throws the same error after Yoga returns.
Each Config creates one native measure trampoline and one dirtied trampoline when the first of its nodes registers a callback. config.free() closes them. A trampoline routes each call through the node pointer. Release and reset operations remove the per-node registrations.
Types#
| Type | Shape or purpose |
|---|---|
Layout |
{ left, right, top, bottom, width, height } |
Size |
{ width, height } |
Value |
{ unit: Unit, value: number } |
MeasureFunction |
Receives width and height constraints and returns Size. |
DirtiedFunction |
Receives the Node that became dirty. |
YogaError |
Error class with operation and status properties. |
YogaStatus |
Enum of YogaError.status values: Ok, InvalidArgument, OutOfMemory, Exception, Poisoned, Busy, and DepthLimit. |
Enums and constants#
Each uppercase name is an alias for the matching enum member.
| Purpose | Enum members | Constant aliases |
|---|---|---|
| Alignment | Align.Auto, Align.FlexStart, Align.Center, Align.FlexEnd, Align.Stretch, Align.Baseline, Align.SpaceBetween, Align.SpaceAround, Align.SpaceEvenly |
ALIGN_AUTO, ALIGN_FLEX_START, ALIGN_CENTER, ALIGN_FLEX_END, ALIGN_STRETCH, ALIGN_BASELINE, ALIGN_SPACE_BETWEEN, ALIGN_SPACE_AROUND, ALIGN_SPACE_EVENLY |
| Box sizing | BoxSizing.BorderBox, BoxSizing.ContentBox |
BOX_SIZING_BORDER_BOX, BOX_SIZING_CONTENT_BOX |
| Dimension lookup | Dimension.Width, Dimension.Height |
DIMENSION_WIDTH, DIMENSION_HEIGHT |
| Writing direction | Direction.Inherit, Direction.LTR, Direction.RTL |
DIRECTION_INHERIT, DIRECTION_LTR, DIRECTION_RTL |
| Display | Display.Flex, Display.None, Display.Contents |
DISPLAY_FLEX, DISPLAY_NONE, DISPLAY_CONTENTS |
| Edges | Edge.Left, Edge.Top, Edge.Right, Edge.Bottom, Edge.Start, Edge.End, Edge.Horizontal, Edge.Vertical, Edge.All |
EDGE_LEFT, EDGE_TOP, EDGE_RIGHT, EDGE_BOTTOM, EDGE_START, EDGE_END, EDGE_HORIZONTAL, EDGE_VERTICAL, EDGE_ALL |
| Compatibility errata | Errata.None, Errata.StretchFlexBasis, Errata.AbsolutePositionWithoutInsetsExcludesPadding, Errata.AbsolutePercentAgainstInnerSize, Errata.All, Errata.Classic |
ERRATA_NONE, ERRATA_STRETCH_FLEX_BASIS, ERRATA_ABSOLUTE_POSITION_WITHOUT_INSETS_EXCLUDES_PADDING, ERRATA_ABSOLUTE_PERCENT_AGAINST_INNER_SIZE, ERRATA_ALL, ERRATA_CLASSIC |
| Experimental behavior | ExperimentalFeature.WebFlexBasis |
EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS |
| Flex direction | FlexDirection.Column, FlexDirection.ColumnReverse, FlexDirection.Row, FlexDirection.RowReverse |
FLEX_DIRECTION_COLUMN, FLEX_DIRECTION_COLUMN_REVERSE, FLEX_DIRECTION_ROW, FLEX_DIRECTION_ROW_REVERSE |
| Gaps | Gutter.Column, Gutter.Row, Gutter.All |
GUTTER_COLUMN, GUTTER_ROW, GUTTER_ALL |
| Justification | Justify.FlexStart, Justify.Center, Justify.FlexEnd, Justify.SpaceBetween, Justify.SpaceAround, Justify.SpaceEvenly |
JUSTIFY_FLEX_START, JUSTIFY_CENTER, JUSTIFY_FLEX_END, JUSTIFY_SPACE_BETWEEN, JUSTIFY_SPACE_AROUND, JUSTIFY_SPACE_EVENLY |
| Logging | LogLevel.Error, LogLevel.Warn, LogLevel.Info, LogLevel.Debug, LogLevel.Verbose, LogLevel.Fatal |
LOG_LEVEL_ERROR, LOG_LEVEL_WARN, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_VERBOSE, LOG_LEVEL_FATAL |
| Measurement | MeasureMode.Undefined, MeasureMode.Exactly, MeasureMode.AtMost |
MEASURE_MODE_UNDEFINED, MEASURE_MODE_EXACTLY, MEASURE_MODE_AT_MOST |
| Node classification | NodeType.Default, NodeType.Text |
NODE_TYPE_DEFAULT, NODE_TYPE_TEXT |
| Overflow | Overflow.Visible, Overflow.Hidden, Overflow.Scroll |
OVERFLOW_VISIBLE, OVERFLOW_HIDDEN, OVERFLOW_SCROLL |
| Position | PositionType.Static, PositionType.Relative, PositionType.Absolute |
POSITION_TYPE_STATIC, POSITION_TYPE_RELATIVE, POSITION_TYPE_ABSOLUTE |
| Value units | Unit.Undefined, Unit.Point, Unit.Percent, Unit.Auto |
UNIT_UNDEFINED, UNIT_POINT, UNIT_PERCENT, UNIT_AUTO |
| Wrapping | Wrap.NoWrap, Wrap.Wrap, Wrap.WrapReverse |
WRAP_NO_WRAP, WRAP_WRAP, WRAP_WRAP_REVERSE |
ExperimentalFeature.WebFlexBasis and EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS are experimental. The rest of this entry point is advanced, not experimental.