facett-graph — the graph (node/edge) viewer component, on
[facett_core]. Build a [Scene] from a labelled edge list (the common
shape: a graph query, a dataflow DAG) and draw it. Source-agnostic — the
caller turns its Arrow/Cypher/whatever into edges first.
FC contract (the canonical Elm split, FC-2 / FC-9)
Both facets in this crate — [GraphView] (the 2D node/edge skin) and
[DepGraphView] (the layered dep-DAG) — adopt the [facett_core::Elm] split:
- [
GraphState] / [depgraph::DepGraphState] — the complete observable, serializable, round-trippable interaction state. The bulk graph data (the [Scene] / thenodes+edges) is the input held on the struct —Color32is not serde-round-trippable and it is not the state a headless driver mutates, so it lives OUTSIDE the Model (mirrors how facett-grid keeps its Arrow data on the struct, not in itsGridState). - [
Msg] +update— the single mutation path (FC-2): a host/robot toggles the layout ([GraphView]) or selects/clears a node ([DepGraphView]); a headless driver ([facett_core::harness]) reaches the identical transitions. view— a pure paint (FC-9): reads&self, paints, and returns the [Msg]s the interactions produced; theimpl_facet_via_elm!bridge applies them.- Rich
state_json— the node/edge/label counts (and the dep-graph's column depth) a driver reads are derived from the inputScene/nodes, not the interaction Model, so the macro is invoked in form 3 (custom_state_json) to publish those exact pre-migration keys instead of a plainserde(state()).