# `LivePanels.Canvas.Layout.Context`
[🔗](https://github.com/livepanels/livepanels/blob/v0.1.0/lib/livepanels/canvas/layout/context.ex#L1)

Headless planning context passed to canvas layout strategies.

The context is derived from canonical canvas state plus the requesting actor.
Strategies receive already-scoped items, viewport geometry, reservation-aware
usable bounds, blocking rectangles, z-order metadata, current selection, and
normalized options. They return placement data; reducers and persistence stay
in LivePanels.

# `scope`

```elixir
@type scope() :: :visible | :all | :selection | {:items, [String.t()]}
```

# `t`

```elixir
@type t() :: %LivePanels.Canvas.Layout.Context{
  actor: map() | nil,
  blocked_rects: [map()],
  items: [LivePanels.Item.t()],
  options: map(),
  scope: scope(),
  selected_item_ids: MapSet.t(String.t()),
  selection: LivePanels.Canvas.Selection.t(),
  state: LivePanels.Canvas.State.t(),
  usable_bounds: LivePanels.Canvas.Layout.Bounds.t(),
  usable_viewport: map(),
  viewport: map(),
  viewport_bounds: LivePanels.Canvas.Layout.Bounds.t(),
  z_order: [String.t()],
  z_positions: %{optional(String.t()) =&gt; non_neg_integer()}
}
```

---

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