{
  "scopeName": "template.blocks.ng",
  "injectionSelector": "L:text.html -comment -expression.ng -meta.tag -source.css -source.js",
  "patterns": [
    {
      "include": "#block"
    }
  ],
  "repository": {
    "transition": {
      "match": "@",
      "name": "keyword.control.block.transition.ng"
    },
    "block": {
      "begin": "(@)(if|else if|else|defer|placeholder|loading|error|switch|case|default|for|empty)(?:\\s*)",
      "beginCaptures": {
        "1": {
          "patterns": [
            {
              "include": "#transition"
            }
          ]
        },
        "2": {
          "name": "keyword.control.block.kind.ng"
        }
      },
      "patterns": [
        {
          "include": "#blockExpression"
        },
        {
          "include": "#blockBody"
        }
      ],
      "name": "control.block.ng",
      "end": "(?<=\\})"
    },
    "blockExpression": {
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "meta.brace.round.ts"
        }
      },
      "contentName": "control.block.expression.ng",
      "patterns": [
        {
          "include": "#blockExpressionOfClause"
        },
        {
          "include": "#blockExpressionLetBinding"
        },
        {
          "include": "#blockExpressionTrackClause"
        },
        {
          "include": "expression.ng"
        }
      ],
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "meta.brace.round.ts"
        }
      }
    },
    "blockExpressionOfClause": {
      "begin": "([_$[:alpha:]][_$[:alnum:]]*)\\s+(of)\\b",
      "beginCaptures": {
        "1": {
          "name": "variable.other.constant.ng"
        },
        "2": {
          "name": "keyword.operator.expression.of.ng"
        }
      },
      "end": "(?=[$)])|(?<=;)",
      "patterns": [
        {
          "include": "expression.ng"
        }
      ]
    },
    "blockExpressionLetBinding": {
      "begin": "\\blet\\b",
      "beginCaptures": {
        "0": {
          "name": "storage.type.ng"
        }
      },
      "end": "(?=[$)])|(?<=;)",
      "patterns": [
        {
          "include": "expression.ng"
        }
      ]
    },
    "blockExpressionTrackClause": {
      "begin": "\\btrack\\b",
      "beginCaptures": {
        "0": {
          "name": "keyword.control.track.ng"
        }
      },
      "end": "(?=[$)])|(?<=;)",
      "patterns": [
        {
          "include": "expression.ng"
        }
      ]
    },
    "blockBody": {
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.block.ts"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.block.ts"
        }
      },
      "contentName": "control.block.body.ng",
      "patterns": [
        {
          "include": "text.html.derivative"
        },
        {
          "include": "template.ng"
        }
      ]
    }
  }
}
