{
  "id": "type-n04",
  "revision": "4cdd2b180633d5108ae599cb6d6fc3e63b86a0da7add2228d541a4d64370499d",
  "regions": [
    {
      "id": "web",
      "label": "Web",
      "parent": null
    },
    {
      "id": "common-logic",
      "label": "Common logic",
      "parent": null
    },
    {
      "id": "server",
      "label": "Server",
      "parent": null
    }
  ],
  "nodes": [
    {
      "id": "scroll",
      "label": "Load-more interaction",
      "kind": "N13",
      "region": "web",
      "ports": [
        {
          "id": "more",
          "profile": "P04",
          "contract": "LoadMoreIntentV1",
          "polarity": "Offer"
        }
      ]
    },
    {
      "id": "loop",
      "label": "Search pagination loop",
      "kind": "N04",
      "region": "common-logic",
      "ports": [
        {
          "id": "more",
          "profile": "P04",
          "contract": "LoadMoreIntentV1",
          "polarity": "Require"
        },
        {
          "id": "fetch",
          "profile": "P02",
          "contract": "SearchPageRequestResponseV2",
          "polarity": "Require"
        },
        {
          "id": "append",
          "profile": "P09",
          "contract": "AppendSearchPageV1",
          "polarity": "Require"
        },
        {
          "id": "cursor",
          "profile": "P01",
          "contract": "NextSearchCursorV1",
          "polarity": "Require"
        },
        {
          "id": "cancel",
          "profile": "P14",
          "contract": "SearchCancellationV1",
          "polarity": "Require"
        }
      ]
    },
    {
      "id": "search",
      "label": "Search service",
      "kind": "N19",
      "region": "server",
      "ports": [
        {
          "id": "page",
          "profile": "P02",
          "contract": "SearchPageRequestResponseV2",
          "polarity": "Offer"
        }
      ]
    },
    {
      "id": "list",
      "label": "Result list state",
      "kind": "N05",
      "region": "common-logic",
      "ports": [
        {
          "id": "append",
          "profile": "P09",
          "contract": "AppendSearchPageV1",
          "polarity": "Offer"
        },
        {
          "id": "cursor",
          "profile": "P01",
          "contract": "NextSearchCursorV1",
          "polarity": "Offer"
        },
        {
          "id": "state",
          "profile": "P08",
          "contract": "SearchListStateV1",
          "polarity": "Offer"
        }
      ]
    },
    {
      "id": "view",
      "label": "Search Surface",
      "kind": "N11",
      "region": "web",
      "ports": [
        {
          "id": "state",
          "profile": "P08",
          "contract": "SearchListStateV1",
          "polarity": "Require"
        },
        {
          "id": "leave",
          "profile": "P14",
          "contract": "SearchCancellationV1",
          "polarity": "Offer"
        }
      ]
    }
  ],
  "relations": [
    {
      "id": "load",
      "kind": "H04",
      "incidences": [
        {
          "node": "scroll",
          "port": "more",
          "role": "publisher",
          "ordinal": 0
        },
        {
          "node": "loop",
          "port": "more",
          "role": "subscriber",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "fetch",
      "kind": "H05",
      "incidences": [
        {
          "node": "loop",
          "port": "fetch",
          "role": "caller",
          "ordinal": 0
        },
        {
          "node": "search",
          "port": "page",
          "role": "callee",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "append",
      "kind": "H05",
      "incidences": [
        {
          "node": "loop",
          "port": "append",
          "role": "caller",
          "ordinal": 0
        },
        {
          "node": "list",
          "port": "append",
          "role": "callee",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "cursor",
      "kind": "H02",
      "incidences": [
        {
          "node": "list",
          "port": "cursor",
          "role": "source",
          "ordinal": 0
        },
        {
          "node": "loop",
          "port": "cursor",
          "role": "target",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "render",
      "kind": "H02",
      "incidences": [
        {
          "node": "list",
          "port": "state",
          "role": "source",
          "ordinal": 0
        },
        {
          "node": "view",
          "port": "state",
          "role": "target",
          "ordinal": 0
        }
      ]
    },
    {
      "id": "cancel",
      "kind": "H03",
      "incidences": [
        {
          "node": "view",
          "port": "leave",
          "role": "source",
          "ordinal": 0
        },
        {
          "node": "loop",
          "port": "cancel",
          "role": "target",
          "ordinal": 0
        }
      ]
    }
  ]
}
