# `Choreo.Viewable`
[🔗](https://github.com/code-shoily/choreo/blob/v0.14.1/lib/choreo/viewable.ex#L1)

Protocol for graph lens transforms (focus, zoom, filter, collapse) on Choreo diagrams.

Each diagram module that supports `Choreo.View` must implement this protocol
to define:

  * How to rebuild the struct after graph mutation (pruning edge_meta,
    resolving root, etc.)
  * Which nodes are visible at each zoom level
  * How virtual edges (created by transitive filtering) are styled

## Implementing the protocol

    defimpl Choreo.Viewable, for: MyModule do
      def rebuild(diagram, new_graph) do
        # Prune edge_meta, resolve root, return new struct
      end

      def zoom_predicate(_diagram, 0), do: fn _id, data -> data[:node_type] == :root end
      def zoom_predicate(_diagram, 1), do: fn _id, data -> data[:node_type] in [:root, :topic] end
      def zoom_predicate(_diagram, _level), do: fn _id, _data -> true end

      def virtual_edge_meta(_diagram), do: %{edge_type: :virtual}
    end

# `t`

```elixir
@type t() :: term()
```

All the types that implement this protocol.

# `rebuild`

Rebuild the diagram after a graph transformation.

Responsible for pruning `edge_meta` to only include edges that still exist
in `new_graph`, adding virtual edge metadata for any graph edges that lack
it, and resolving any root/cluster references that may have been removed.

# `virtual_edge_meta`

Return metadata for virtual edges created during transitive filtering.

Virtual edges connect remaining nodes that were previously linked through
removed intermediate nodes.

# `zoom_predicate`

Return a predicate for `Yog.filter_nodes/2` at the given zoom level.

The predicate receives `(id, data)` and returns a boolean.
Return `fn _id, _data -> true end` for "show everything".

---

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