Constraints API Reference
Rezi supports constraint-driven layout via expr("...") and a helper-first API layer that generates constraint expressions for common patterns.
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.mddocs/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
ConstraintHelperErrorwith 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:
ui.row({}, [
ui.box({ id: "sidebar", width: 24 }, [...]),
ui.box({ id: "main", width: spaceConstraints.remainingWidth({ subtract: [{ id: "sidebar" }], minus: 1 }) }, [...]),
])