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.
Summary
Types
@type scope() :: :visible | :all | :selection | {:items, [String.t()]}
@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()) => non_neg_integer()} }