{
  "$id": "https://tokencss.com/schema@0.0.1",
  "$schema": "https://json-schema.org/draft-07/schema",
  "title": "Token Config",
  "type": "object",
  "properties": {
    "extends": { "$ref": "#/definitions/values/extends" },
    "color": { "$ref": "#/definitions/wrappers/color" },
    "space": { "$ref": "#/definitions/wrappers/dimension" },
    "size": { "$ref": "#/definitions/wrappers/dimension" },
    "width": { "$ref": "#/definitions/wrappers/dimension" },
    "height": { "$ref": "#/definitions/wrappers/dimension" },
    "radius": { "$ref": "#/definitions/wrappers/dimension" },
    "shadow": { "$ref": "#/definitions/wrappers/shadow" },
    "font": { "$ref": "#/definitions/wrappers/font" },
    "font-size": { "$ref": "#/definitions/wrappers/dimension" },
    "font-weight": { "$ref": "#/definitions/wrappers/number" },
    "line-height": { "$ref": "#/definitions/wrappers/number" },
    "letter-spacing": {
      "$ref": "#/definitions/wrappers/dimension"
    },
    "easing": { "$ref": "#/definitions/wrappers/cubic-bezier" },
    "media": { "$ref": "#/definitions/wrappers/media" }
  },
  "definitions": {
    "wrappers": {
      "media": {
        "$id": "#/definitions/wrappers/media",
        "allOf": [
          {
            "if": {
              "type": "object",
              "required": ["value"],
              "properties": {
                "value": true
              }
            },
            "then": {
              "$ref": "#/definitions/tokens/media"
            },
            "else": {
              "type": "object",
              "properties": {
                "type": { "const": "media" },
                "extensions": { "type": "object" },
                "value": false
              },
              "additionalProperties": {
                "$ref": "#/definitions/wrappers/media"
              }
            }
          }
        ]
      },
      "cubic-bezier": {
        "$id": "#/definitions/wrappers/cubic-bezier",
        "allOf": [
          {
            "if": {
              "type": "object",
              "required": ["value"],
              "properties": {
                "value": true
              }
            },
            "then": {
              "$ref": "#/definitions/tokens/cubic-bezier"
            },
            "else": {
              "type": "object",
              "properties": {
                "type": { "const": "cubic-bezier" },
                "extensions": { "type": "object" },
                "value": false
              },
              "additionalProperties": {
                "$ref": "#/definitions/wrappers/cubic-bezier"
              }
            }
          }
        ]
      },
      "shadow": {
        "$id": "#/definitions/wrappers/shadow",
        "allOf": [
          {
            "if": {
              "type": "object",
              "required": ["value"],
              "properties": {
                "value": true
              }
            },
            "then": {
              "$ref": "#/definitions/tokens/shadow"
            },
            "else": {
              "type": "object",
              "properties": {
                "type": { "const": "shadow" },
                "extensions": { "type": "object" },
                "value": false
              },
              "additionalProperties": {
                "$ref": "#/definitions/wrappers/shadow"
              }
            }
          }
        ]
      },
      "color": {
        "$id": "#/definitions/wrappers/color",
        "allOf": [
          {
            "if": {
              "type": "object",
              "required": ["value"],
              "properties": {
                "value": true
              }
            },
            "then": {
              "$ref": "#/definitions/tokens/color"
            },
            "else": {
              "type": "object",
              "properties": {
                "type": { "const": "color" },
                "extensions": { "type": "object" },
                "value": false
              },
              "additionalProperties": { "$ref": "#/definitions/wrappers/color" }
            }
          }
        ]
      },
      "dimension": {
        "$id": "#/definitions/wrappers/dimension",
        "allOf": [
          {
            "if": {
              "type": "object",
              "required": ["value"],
              "properties": {
                "value": { "type": "string" }
              }
            },
            "then": {
              "$ref": "#/definitions/tokens/dimension"
            },
            "else": {
              "type": "object",
              "properties": {
                "type": { "const": "dimension" },
                "extensions": { "$ref": "#/definitions/values/extensions" },
                "value": false
              },
              "additionalProperties": {
                "$ref": "#/definitions/wrappers/dimension"
              }
            }
          }
        ]
      },
      "font": {
        "$id": "#/definitions/wrappers/font",
        "allOf": [
          {
            "if": {
              "type": "object",
              "required": ["value"],
              "properties": {
                "value": true
              }
            },
            "then": {
              "$ref": "#/definitions/tokens/font"
            },
            "else": {
              "type": "object",
              "properties": {
                "type": { "const": "font" },
                "extensions": { "$ref": "#/definitions/values/extensions" },
                "value": false
              },
              "additionalProperties": { "$ref": "#/definitions/wrappers/font" }
            }
          }
        ]
      },
      "number": {
        "$id": "#/definitions/wrappers/number",
        "allOf": [
          {
            "if": {
              "type": "object",
              "required": ["value"],
              "properties": {
                "value": true
              }
            },
            "then": {
              "$ref": "#/definitions/tokens/number"
            },
            "else": {
              "type": "object",
              "properties": {
                "type": { "const": "number" },
                "extensions": { "$ref": "#/definitions/values/extensions" },
                "value": false
              },
              "additionalProperties": {
                "$ref": "#/definitions/wrappers/number"
              }
            }
          }
        ]
      }
    },
    "values": {
      "extends": {
        "$id": "#/definitions/values/extends",
        "type": "array",
        "items": { "type": "string" }
      },
      "extensions": {
        "$id": "#/definitions/values/extensions",
        "title": "The extensions value",
        "type": "object",
        "properties": {
          "com.tokencss.fluid": {
            "type": "object",
            "properties": {
              "min": { "$ref": "#/definitions/values/dimension" },
              "max": { "$ref": "#/definitions/values/dimension" },
              "easing": { "$ref": "#/definitions/values/cubic-bezier" }
            },
            "additionalProperties": false
          },
          "com.tokencss.scale": {
            "enum": [
              "space",
              "size",
              "width",
              "height",
              "radius",
              "font-size",
              "font-weight",
              "line-height",
              "letter-spacing"
            ]
          }
        }
      },
      "font": {
        "$id": "#/definitions/values/font",
        "title": "The font value",
        "type": "array",
        "items": {
          "type": "string"
        },
        "minItems": 1,
        "uniqueItems": true
      },
      "media": {
        "$id": "#/definitions/values/media",
        "title": "A media query value",
        "pattern": "(^\\(.*\\)$|^\\{.*\\}$)"
      },
      "shadow": {
        "$id": "#/definitions/values/shadow",
        "title": "The shadow value",
        "type": "object",
        "required": ["offset-x", "offset-y", "blur", "color"],
        "properties": {
          "offset-x": { "$ref": "#/definitions/values/dimension" },
          "offset-y": { "$ref": "#/definitions/values/dimension" },
          "blur": { "$ref": "#/definitions/values/dimension" },
          "spread": { "$ref": "#/definitions/values/dimension" },
          "color": { "$ref": "#/definitions/values/color" },
          "opacity": { "$ref": "#/definitions/values/numberClamped" }
        },
        "additionalProperties": false
      },
      "dimension": {
        "$id": "#/definitions/values/dimension",
        "title": "The dimension value",
        "type": "string",
        "pattern": "((px|r?em|v[wh]|%|ch)$|^\\{.*\\})$"
      },
      "color": {
        "$id": "#/definitions/values/color",
        "description": "The value must be a string containing a hex triplet/quartet including the preceding # character",
        "title": "The color value",
        "pattern": "(^#[0-9a-fA-F]{3,6}|^\\{.*\\}$)"
      },
      "cubic-bezier": {
        "$id": "#/definitions/values/cubic-bezier",
        "type": ["string", "array"],
        "title": "The cubic-bezier value",
        "allOf": [
          {
            "if": { "type": "string" },
            "then": {
              "type": "string",
              "pattern": "^\\{.*\\}$"
            },
            "else": {
              "type": "array",
              "minItems": 4,
              "maxItems": 4,
              "items": {
                "$ref": "#/definitions/values/number"
              }   
            }
          }
        ]
      },
      "number": {
        "$id": "#/definitions/values/number",
        "title": "The number value",
        "type": "number"
      },
      "numberClamped": {
        "$id": "#/definitions/values/numberClamped",
        "title": "The number value",
        "type": "number",
        "minimum": 0,
        "maximum": 1
      }
    },
    "tokens": {
      "token": {
        "$id": "#/definitions/tokens/token",
        "type": "object",
        "required": ["value"],
        "oneOf": [
          { "$ref": "#/definitions/tokens/media" },
          { "$ref": "#/definitions/tokens/font" },
          { "$ref": "#/definitions/tokens/color" },
          { "$ref": "#/definitions/tokens/dimension" },
          { "$ref": "#/definitions/tokens/shadow" },
          { "$ref": "#/definitions/tokens/cubic-bezier" },
          { "$ref": "#/definitions/tokens/number" }
        ]
      },
      "media": {
        "$id": "#/definitions/tokens/media",
        "type": "object",
        "required": ["value"],
        "properties": {
          "type": { "const": "media" },
          "value": { "$ref": "#/definitions/values/media" },
          "extensions": { "type": "object" }
        },
        "additionalProperties": false
      },
      "font": {
        "$id": "#/definitions/tokens/font",
        "type": "object",
        "required": ["value"],
        "properties": {
          "type": { "const": "font" },
          "value": { "$ref": "#/definitions/values/font" },
          "extensions": { "type": "object" }
        },
        "additionalProperties": false
      },
      "color": {
        "$id": "#/definitions/tokens/color",
        "type": "object",
        "required": ["value"],
        "properties": {
          "type": { "consts": "color" },
          "value": { "$ref": "#/definitions/values/color" },
          "extensions": { "type": "object" }
        },
        "additionalProperties": false
      },
      "dimension": {
        "$id": "#/definitions/tokens/dimension",
        "type": "object",
        "required": ["value"],
        "properties": {
          "type": { "const": "dimension" },
          "value": { "$ref": "#/definitions/values/dimension" },
          "extensions": { "$ref": "#/definitions/values/extensions" }
        },
        "additionalProperties": false
      },
      "shadow": {
        "$id": "#/definitions/tokens/shadow",
        "type": "object",
        "required": ["value"],
        "properties": {
          "type": { "const": "shadow" },
          "value": {
            "oneOf": [
              { "$ref": "#/definitions/values/shadow" },
              {
                "type": "array",
                "items": { "$ref": "#/definitions/values/shadow" },
                "minItems": 1,
                "additionalItems": false
              }
            ]
          },
          "extensions": { "type": "object" }
        },
        "additionalProperties": false
      },
      "cubic-bezier": {
        "$id": "#/definitions/tokens/cubic-bezier",
        "type": "object",
        "required": ["value"],
        "properties": {
          "type": { "const": "cubic-bezier" },
          "value": { "$ref": "#/definitions/values/cubic-bezier" },
          "extensions": { "type": "object" }
        }
      },
      "number": {
        "$id": "#/definitions/tokens/number",
        "type": "object",
        "required": ["value"],
        "properties": {
          "value": { "$ref": "#/definitions/values/number" },
          "extensions": { "$ref": "#/definitions/values/extensions" }
        }
      }
    }
  }
}
