# `MingaEditor.Renderer.TextPresentation`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga_editor/renderer/text_presentation.ex#L1)

Immutable source correspondence retained for frontend text-pointer input.

# `rows`

```elixir
@type rows() ::
  {:resident, MingaEditor.RenderModel.Window.ResidentStore.t()}
  | {:windowed, tuple()}
```

# `t`

```elixir
@type t() :: %MingaEditor.Renderer.TextPresentation{
  buffer: pid(),
  identity: term(),
  presentation_id: pos_integer(),
  rows: rows(),
  source_version: non_neg_integer(),
  window_id: MingaEditor.Window.id()
}
```

# `new`

```elixir
@spec new(MingaEditor.Window.id(), pid(), non_neg_integer(), term(), rows()) :: t()
```

# `resolve`

```elixir
@spec resolve(t(), non_neg_integer(), non_neg_integer(), non_neg_integer()) ::
  {:ok, MingaEditor.Mouse.Target.Text.t()}
  | {:error, :row_not_found | :row_id_mismatch | :not_source_backed}
```

Resolves one rank-addressed row after verifying its durable row id.

# `resolve_row`

```elixir
@spec resolve_row(
  MingaEditor.Window.id(),
  pid(),
  non_neg_integer(),
  MingaEditor.RenderModel.Window.VisualRow.t(),
  non_neg_integer(),
  non_neg_integer()
) ::
  {:ok, MingaEditor.Mouse.Target.Text.t()}
  | {:error, :row_id_mismatch | :not_source_backed}
```

Resolves one already-located visual row through the shared source mapping.

# `retain`

```elixir
@spec retain(
  t() | nil,
  MingaEditor.Window.id(),
  pid(),
  non_neg_integer(),
  term(),
  rows()
) :: t()
```

Reuses the prior presentation only when its immutable interaction identity matches.

---

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