# `AshUi.Render`
[🔗](https://github.com/hyperbob-labs/ash_ui/blob/main/lib/ash_ui/render.ex#L1)

Builds `%AshUi.Rendered{}` structures straight from a compiled
patch table — statics from the table's skeleton, dynamics from evaluator
closures over the CURRENT record. The neutral differential contract uses
nil-based change tracking: a dynamic whose address is not in the
changed set (`AshUi.Patch.Runtime.changed_addresses/3`) returns
`nil`, and the `AshUi.Diff` kernel decides the minimal keyed patch.
This is the ONE runtime emission path —
transports convert or diff its output, never re-emit.

Keyed lists use the core render algebra's keyed comprehensions. Entry keys implement
Ash resource identity (`AshUi.Patch.Keys` — authored `key:`
expression, else the FULL primary key). Entry vars carry the item, the
ordinal position when the template declares an index, and the parent
record fields the item template reads (`:__parent__`) — the kernel's
retained-variable comparison invalidates exactly the rows a move, item change,
or parent-field change touches.

Event binding keys thread through scopes as `:__bp_binding_chain__` in
scope context: item boundaries append the entry key component, child
boundaries append the child address component — producing exactly the
keys `AshUi.Patch.Bindings.resolve/3` accepts.

# `build`

```elixir
@spec build(struct(), :all | MapSet.t(), keyword()) :: AshUi.Rendered.t() | struct()
```

Build the root `Rendered` for `record` from its resource's patch table.

`changed` is `:all` (mount / unknown before-image) or the address set
from `AshUi.Patch.Runtime.changed_addresses/3`.

Options: `:actor`, `:tenant`, `:params` (scope inputs — the staged
evaluation of the view calculation runs under the same scope the
calculation would), `:view`.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
