{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "vscode-css-customdata",
  "version": 1.1,
  "title": "VS Code CSS Custom Data format",
  "description": "Format for loading Custom Data in VS Code's CSS support",
  "type": "object",
  "required": ["version"],
  "definitions": {
    "references": {
      "type": "object",
      "required": ["name", "url"],
      "properties": {
        "name": {
          "type": "string",
          "description": "The name of the reference."
        },
        "url": {
          "type": "string",
          "description": "The URL of the reference.",
          "pattern": "https?:\/\/",
          "patternErrorMessage": "URL should start with http:// or https://"
        }
      }
    },
    "markupDescription": {
      "type": "object",
      "required": ["kind", "value"],
      "properties": {
        "kind": {
          "type": "string",
          "description": "Whether `description.value` should be rendered as plaintext or markdown",
          "enum": ["plaintext", "markdown"]
        },
        "value": {
          "type": "string",
          "description": "Description shown in completion and hover"
        }
      }
    }
  },
  "properties": {
    "version": {
      "const": 1.1,
      "description": "The custom data version",
      "type": "number"
    },
    "properties": {
      "description": "Custom CSS properties",
      "type": "array",
      "items": {
        "type": "object",
        "required": ["name"],
        "defaultSnippets": [
          {
            "body": {
              "name": "$1",
              "description": ""
            }
          }
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of property"
          },
          "description": {
            "description": "Description of property shown in completion and hover",
            "anyOf": [
              {
                "type": "string"
              },
              { "$ref": "#/definitions/markupDescription" }
            ]
          },
          "status": {
            "type": "string",
            "description": "Browser status",
            "enum": ["standard", "experimental", "nonstandard", "obsolete"]
          },
          "browsers": {
            "type": "array",
            "description": "Supported browsers",
            "items": {
              "type": "string",
              "pattern": "(E|FF|S|C|IE|O)([\\d|\\.]+)?",
              "patternErrorMessage": "Browser item must follow the format of `${browser}${version}`. `browser` is one of:\n- E: Edge\n- FF: Firefox\n- S: Safari\n- C: Chrome\n- IE: Internet Explorer\n- O: Opera"
            }
          },
          "references": {
            "type": "array",
            "description": "A list of references for the property shown in completion and hover",
            "items": {
              "$ref": "#/definitions/references"
            }
          }
        }
      }
    },
    "atDirectives": {
      "description": "Custom CSS at directives",
      "type": "array",
      "items": {
        "type": "object",
        "required": ["name"],
        "defaultSnippets": [
          {
            "body": {
              "name": "@$1",
              "description": ""
            }
          }
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of at directive",
            "pattern": "^@.+",
            "patternErrorMessage": "Pseudo class must start with `@`"
          },
          "description": {
            "description": "Description of at directive shown in completion and hover",
            "anyOf": [
              {
                "type": "string"
              },
              { "$ref": "#/definitions/markupDescription" }
            ]
          },
          "status": {
            "$ref": "#/properties/properties/items/properties/status"
          },
          "browsers": {
            "$ref": "#/properties/properties/items/properties/browsers"
          },
          "references": {
            "type": "array",
            "description": "A list of references for the at-directive shown in completion and hover",
            "items": {
              "$ref": "#/definitions/references"
            }
          }
        }
      }
    },
    "pseudoClasses": {
      "description": "Custom CSS pseudo classes",
      "type": "array",
      "items": {
        "type": "object",
        "required": ["name"],
        "defaultSnippets": [
          {
            "body": {
              "name": ":$1",
              "description": ""
            }
          }
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of pseudo class",
            "pattern": "^:.+",
            "patternErrorMessage": "Pseudo class must start with `:`"
          },
          "description": {
            "description": "Description of pseudo class shown in completion and hover",
            "anyOf": [
              {
                "type": "string"
              },
              { "$ref": "#/definitions/markupDescription" }
            ]
          },
          "status": {
            "$ref": "#/properties/properties/items/properties/status"
          },
          "browsers": {
            "$ref": "#/properties/properties/items/properties/browsers"
          },
          "references": {
            "type": "array",
            "description": "A list of references for the pseudo-class shown in completion and hover",
            "items": {
              "$ref": "#/definitions/references"
            }
          }
        }
      }
    },
    "pseudoElements": {
      "description": "Custom CSS pseudo elements",
      "type": "array",
      "items": {
        "type": "object",
        "required": ["name"],
        "defaultSnippets": [
          {
            "body": {
              "name": "::$1",
              "description": ""
            }
          }
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of pseudo element",
            "pattern": "^::.+",
            "patternErrorMessage": "Pseudo class must start with `::`"
          },
          "description": {
            "description": "Description of pseudo element shown in completion and hover",
            "anyOf": [
              {
                "type": "string"
              },
              { "$ref": "#/definitions/markupDescription" }
            ]
          },
          "status": {
            "$ref": "#/properties/properties/items/properties/status"
          },
          "browsers": {
            "$ref": "#/properties/properties/items/properties/browsers"
          },
          "references": {
            "type": "array",
            "description": "A list of references for the pseudo-element shown in completion and hover",
            "items": {
              "$ref": "#/definitions/references"
            }
          }
        }
      }
    }
  }
}
