Constraints API Reference¶
Rezi supports constraint-driven layout via expr("...") and a helper-first API layer that generates constraint expressions for common patterns.
This page documents the public helper layer exported from:
@rezi-ui/core@rezi-ui/jsx(re-exports for parity)
See also:
- docs/guide/constraints.md
- docs/reference/constraint-expressions.md
expr(source)¶
expr("...") parses a constraint DSL string and returns a frozen ConstraintExpr object.
Use it when: - You need a layout relationship that isn’t covered by helpers - You’re prototyping, or translating an existing expression from docs/tests
Prefer helpers for day-to-day usage so app code reads like layout intent.
Helper namespaces¶
All helpers:
- Return ConstraintExpr
- Validate arguments and throw ConstraintHelperError with a clear message
- Preserve solver semantics by compiling to expr("...") (no implicit fallbacks)
visibilityConstraints.*¶
For display: ... rules (layout/viewport-driven visibility).
viewportWidthAtLeast(cols: number)viewportWidthBelow(cols: number)viewportHeightAtLeast(rows: number)viewportHeightBelow(rows: number)viewportAtLeast(options: { width?: number; height?: number })
Examples:
ui.box({ display: visibilityConstraints.viewportWidthAtLeast(80) }, [...])
ui.box({ display: visibilityConstraints.viewportAtLeast({ width: 110, height: 28 }) }, [...])
conditionalConstraints.*¶
Intent wrapper for conditional sizing.
ifThenElse(cond: number | ConstraintExpr, thenValue: number | ConstraintExpr, elseValue: number | ConstraintExpr)
Example:
width: conditionalConstraints.ifThenElse(
visibilityConstraints.viewportWidthAtLeast(120),
60,
100,
)
widthConstraints.*¶
Common width sizing patterns.
percentOfParent(ratio: number)→parent.w * ratiopercentOfViewport(ratio: number)→viewport.w * ratioclampedPercentOfParent({ ratio, min, max })→clamp(min, parent.w * ratio, max)clampedViewportMinus({ minus, min, max })→clamp(min, viewport.w - minus, max)minViewportPercent({ ratio, min })→max(min, viewport.w * ratio)stepsByViewportWidth({ steps })→steps(viewport.w, t1: v1, t2: v2, ...)clampedIntrinsicPlus({ pad, min, max?: number | "parent" })→clamp(min, intrinsic.w + pad, parent.w|max)
heightConstraints.*¶
Height analogs of widthConstraints.
percentOfParent(ratio: number)percentOfViewport(ratio: number)minViewportPercent({ ratio, min })→max(min, viewport.h * ratio)clampedPercentOfParent({ ratio, min, max })clampedPercentOfViewport({ ratio, min, max })clampedViewportMinus({ minus, min, max })stepsByViewportHeight({ steps })→steps(viewport.h, t1: v1, t2: v2, ...)clampedIntrinsicPlus({ pad, min, max?: number | "parent" })
groupConstraints.*¶
Sibling aggregation wrappers (equalization / totals).
These are most useful when multiple siblings under the same parent share the same non-interactive id (for example repeated label widgets), and you want a max/sum across that local group.
maxSiblingWidth(id: string)→max_sibling(#id.w)maxSiblingHeight(id: string)→max_sibling(#id.h)maxSiblingMinWidth(id: string)→max_sibling(#id.min_w)maxSiblingMinHeight(id: string)→max_sibling(#id.min_h)sumSiblingWidth(id: string)→sum_sibling(#id.w)sumSiblingHeight(id: string)→sum_sibling(#id.h)sumSiblingMinWidth(id: string)→sum_sibling(#id.min_w)sumSiblingMinHeight(id: string)→sum_sibling(#id.min_h)
Example:
ui.row({ gap: 2 }, [
ui.box(
{ id: "kv-key", width: groupConstraints.maxSiblingMinWidth("kv-key"), border: "none", p: 0 },
[ui.text("Latency", { dim: true })],
),
ui.text("12ms"),
])
spaceConstraints.*¶
“Derived remaining space” helpers (make intent explicit, avoid manual math).
remainingWidth({ subtract, minus?, clampMin? })remainingHeight({ subtract, minus?, clampMin? })
subtract terms:
type SpaceTerm = { id: string; metric?: "width" | "height" | "minWidth" | "minHeight"; aggregation?: "none" | "max" | "sum" }
Example: