{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://autype.com/llm-resources/page-region.schema.json",
  "title": "Autype Page Region",
  "description": "Reusable multi-row, multi-column header or footer region schema.",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_-]{0,63}$",
      "maxLength": 64
    },
    "kind": {
      "type": "string",
      "enum": [
        "header",
        "footer"
      ]
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "box": {
      "type": "object",
      "properties": {
        "width": {
          "type": "string",
          "enum": [
            "content",
            "page"
          ]
        },
        "edgeOffset": {
          "type": "number",
          "minimum": 0,
          "maximum": 2000
        },
        "height": {
          "anyOf": [
            {
              "$ref": "#/properties/box/properties/edgeOffset"
            },
            {
              "type": "string",
              "const": "auto"
            }
          ]
        },
        "offsetLeft": {
          "type": "number",
          "minimum": -2000,
          "maximum": 2000
        },
        "offsetRight": {
          "$ref": "#/properties/box/properties/offsetLeft"
        },
        "minHeight": {
          "$ref": "#/properties/box/properties/edgeOffset"
        },
        "maxHeight": {
          "$ref": "#/properties/box/properties/edgeOffset"
        }
      },
      "required": [
        "width",
        "edgeOffset",
        "height"
      ],
      "additionalProperties": false
    },
    "fill": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "none"
            }
          },
          "required": [
            "type"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "color"
            },
            "color": {
              "type": "string"
            },
            "opacity": {
              "type": "number",
              "minimum": 0,
              "maximum": 1
            }
          },
          "required": [
            "type",
            "color"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "image"
            },
            "src": {
              "type": "string",
              "minLength": 1,
              "maxLength": 2000
            },
            "backgroundColor": {
              "$ref": "#/properties/fill/anyOf/1/properties/color"
            },
            "fit": {
              "type": "string",
              "enum": [
                "contain",
                "cover",
                "fill",
                "none"
              ]
            },
            "positionX": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "positionY": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "opacity": {
              "$ref": "#/properties/fill/anyOf/1/properties/opacity"
            }
          },
          "required": [
            "type",
            "src"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "linearGradient"
            },
            "angle": {
              "type": "number",
              "minimum": -360,
              "maximum": 360
            },
            "stops": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "offset": {
                    "type": "number",
                    "minimum": 0,
                    "maximum": 100
                  },
                  "color": {
                    "$ref": "#/properties/fill/anyOf/1/properties/color"
                  },
                  "opacity": {
                    "$ref": "#/properties/fill/anyOf/1/properties/opacity"
                  }
                },
                "required": [
                  "offset",
                  "color"
                ],
                "additionalProperties": false
              },
              "minItems": 2,
              "maxItems": 20
            },
            "opacity": {
              "$ref": "#/properties/fill/anyOf/1/properties/opacity"
            }
          },
          "required": [
            "type",
            "angle",
            "stops"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "type": {
              "type": "string",
              "const": "radialGradient"
            },
            "centerX": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "centerY": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "stops": {
              "type": "array",
              "items": {
                "$ref": "#/properties/fill/anyOf/3/properties/stops/items"
              },
              "minItems": 2,
              "maxItems": 20
            },
            "opacity": {
              "$ref": "#/properties/fill/anyOf/1/properties/opacity"
            }
          },
          "required": [
            "type",
            "stops"
          ],
          "additionalProperties": false
        }
      ]
    },
    "padding": {
      "type": "object",
      "properties": {
        "top": {
          "$ref": "#/properties/box/properties/edgeOffset"
        },
        "right": {
          "$ref": "#/properties/box/properties/edgeOffset"
        },
        "bottom": {
          "$ref": "#/properties/box/properties/edgeOffset"
        },
        "left": {
          "$ref": "#/properties/box/properties/edgeOffset"
        }
      },
      "additionalProperties": false
    },
    "borders": {
      "type": "object",
      "properties": {
        "top": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "width": {
                  "type": "number",
                  "minimum": 0,
                  "maximum": 50
                },
                "style": {
                  "type": "string",
                  "enum": [
                    "solid",
                    "dashed",
                    "dotted",
                    "double"
                  ]
                },
                "color": {
                  "$ref": "#/properties/fill/anyOf/1/properties/color"
                },
                "opacity": {
                  "$ref": "#/properties/fill/anyOf/1/properties/opacity"
                }
              },
              "required": [
                "width",
                "style",
                "color"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "right": {
          "anyOf": [
            {
              "$ref": "#/properties/borders/properties/top/anyOf/0"
            },
            {
              "type": "null"
            }
          ]
        },
        "bottom": {
          "anyOf": [
            {
              "$ref": "#/properties/borders/properties/top/anyOf/0"
            },
            {
              "type": "null"
            }
          ]
        },
        "left": {
          "anyOf": [
            {
              "$ref": "#/properties/borders/properties/top/anyOf/0"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false
    },
    "grid": {
      "type": "object",
      "properties": {
        "columns": {
          "type": "array",
          "items": {
            "type": "string",
            "pattern": "^(?:auto|(?:\\d+(?:\\.\\d+)?)fr|(?:\\d+(?:\\.\\d+)?)mm|(?:\\d+(?:\\.\\d+)?)%)$"
          },
          "minItems": 1,
          "maxItems": 12
        },
        "rows": {
          "type": "array",
          "items": {
            "$ref": "#/properties/grid/properties/columns/items"
          },
          "minItems": 1,
          "maxItems": 12
        },
        "gapX": {
          "$ref": "#/properties/box/properties/edgeOffset"
        },
        "gapY": {
          "$ref": "#/properties/box/properties/edgeOffset"
        },
        "cells": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "$ref": "#/properties/id"
              },
              "row": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12
              },
              "column": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12
              },
              "rowSpan": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12
              },
              "columnSpan": {
                "type": "integer",
                "minimum": 1,
                "maximum": 12
              },
              "flow": {
                "type": "string",
                "enum": [
                  "row",
                  "column"
                ]
              },
              "gap": {
                "$ref": "#/properties/box/properties/edgeOffset"
              },
              "align": {
                "type": "string",
                "enum": [
                  "start",
                  "center",
                  "end",
                  "stretch"
                ]
              },
              "verticalAlign": {
                "type": "string",
                "enum": [
                  "top",
                  "center",
                  "bottom",
                  "stretch"
                ]
              },
              "padding": {
                "$ref": "#/properties/padding"
              },
              "fill": {
                "$ref": "#/properties/fill"
              },
              "borders": {
                "$ref": "#/properties/borders"
              },
              "blocks": {
                "type": "array",
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "anyOf": [
                            {
                              "type": "number",
                              "exclusiveMinimum": 0,
                              "maximum": 2000
                            },
                            {
                              "type": "string",
                              "enum": [
                                "auto",
                                "fill"
                              ]
                            }
                          ]
                        },
                        "height": {
                          "anyOf": [
                            {
                              "type": "number",
                              "exclusiveMinimum": 0,
                              "maximum": 2000
                            },
                            {
                              "type": "string",
                              "const": "auto"
                            }
                          ]
                        },
                        "alignSelf": {
                          "type": "string",
                          "enum": [
                            "start",
                            "center",
                            "end",
                            "stretch"
                          ]
                        },
                        "visible": {
                          "type": "boolean"
                        },
                        "opacity": {
                          "$ref": "#/properties/fill/anyOf/1/properties/opacity"
                        },
                        "alt": {
                          "type": "string",
                          "maxLength": 500
                        },
                        "fontFamily": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 100
                        },
                        "fontSize": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 500
                        },
                        "fontWeight": {
                          "type": "string",
                          "enum": [
                            "normal",
                            "medium",
                            "semibold",
                            "bold"
                          ]
                        },
                        "fontStyle": {
                          "type": "string",
                          "enum": [
                            "normal",
                            "italic"
                          ]
                        },
                        "color": {
                          "$ref": "#/properties/fill/anyOf/1/properties/color"
                        },
                        "align": {
                          "type": "string",
                          "enum": [
                            "left",
                            "center",
                            "right",
                            "justify"
                          ]
                        },
                        "lineHeight": {
                          "type": "number",
                          "minimum": 0.5,
                          "maximum": 5
                        },
                        "type": {
                          "type": "string",
                          "const": "text"
                        },
                        "text": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 5000
                        },
                        "format": {
                          "type": "string",
                          "enum": [
                            "plain",
                            "markdown"
                          ]
                        },
                        "link": {
                          "type": "string",
                          "format": "uri",
                          "maxLength": 2000
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "text"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/width"
                        },
                        "height": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/height"
                        },
                        "alignSelf": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alignSelf"
                        },
                        "visible": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/visible"
                        },
                        "opacity": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/opacity"
                        },
                        "alt": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alt"
                        },
                        "type": {
                          "type": "string",
                          "const": "image"
                        },
                        "src": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 2000
                        },
                        "fit": {
                          "type": "string",
                          "enum": [
                            "contain",
                            "cover",
                            "fill",
                            "none"
                          ]
                        },
                        "focalPoint": {
                          "type": "object",
                          "properties": {
                            "x": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 100
                            },
                            "y": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 100
                            }
                          },
                          "required": [
                            "x",
                            "y"
                          ],
                          "additionalProperties": false
                        },
                        "link": {
                          "type": "string",
                          "format": "uri",
                          "maxLength": 2000
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "src"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/width"
                        },
                        "height": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/height"
                        },
                        "alignSelf": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alignSelf"
                        },
                        "visible": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/visible"
                        },
                        "opacity": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/opacity"
                        },
                        "alt": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alt"
                        },
                        "fontFamily": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontFamily"
                        },
                        "fontSize": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontSize"
                        },
                        "fontWeight": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontWeight"
                        },
                        "fontStyle": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontStyle"
                        },
                        "color": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/color"
                        },
                        "align": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/align"
                        },
                        "lineHeight": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/lineHeight"
                        },
                        "type": {
                          "type": "string",
                          "const": "field"
                        },
                        "field": {
                          "type": "string",
                          "enum": [
                            "pageNumber",
                            "totalPages",
                            "documentTitle",
                            "documentAuthor",
                            "documentSubject",
                            "sectionTitle",
                            "chapterTitle",
                            "currentDate",
                            "createdDate",
                            "modifiedDate"
                          ]
                        },
                        "prefix": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "suffix": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "format": {
                          "type": "string",
                          "maxLength": 100
                        },
                        "locale": {
                          "type": "string",
                          "maxLength": 35
                        },
                        "fallback": {
                          "type": "string",
                          "maxLength": 500
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "field"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/width"
                        },
                        "height": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/height"
                        },
                        "alignSelf": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alignSelf"
                        },
                        "visible": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/visible"
                        },
                        "opacity": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/opacity"
                        },
                        "alt": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alt"
                        },
                        "fontFamily": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontFamily"
                        },
                        "fontSize": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontSize"
                        },
                        "fontWeight": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontWeight"
                        },
                        "fontStyle": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/fontStyle"
                        },
                        "color": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/color"
                        },
                        "align": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/align"
                        },
                        "lineHeight": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/lineHeight"
                        },
                        "type": {
                          "type": "string",
                          "const": "variable"
                        },
                        "name": {
                          "type": "string",
                          "pattern": "^[A-Za-z][A-Za-z0-9_]*$",
                          "maxLength": 50
                        },
                        "prefix": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "suffix": {
                          "type": "string",
                          "maxLength": 200
                        },
                        "format": {
                          "type": "string",
                          "maxLength": 100
                        },
                        "fallback": {
                          "type": "string",
                          "maxLength": 500
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "name"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/width"
                        },
                        "height": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/height"
                        },
                        "alignSelf": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alignSelf"
                        },
                        "visible": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/visible"
                        },
                        "opacity": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/opacity"
                        },
                        "alt": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alt"
                        },
                        "type": {
                          "type": "string",
                          "const": "rule"
                        },
                        "direction": {
                          "type": "string",
                          "enum": [
                            "horizontal",
                            "vertical"
                          ]
                        },
                        "length": {
                          "anyOf": [
                            {
                              "type": "number",
                              "exclusiveMinimum": 0,
                              "maximum": 2000
                            },
                            {
                              "type": "string",
                              "const": "fill"
                            }
                          ]
                        },
                        "line": {
                          "$ref": "#/properties/borders/properties/top/anyOf/0"
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "direction",
                        "line"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/width"
                        },
                        "height": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/height"
                        },
                        "alignSelf": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alignSelf"
                        },
                        "visible": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/visible"
                        },
                        "opacity": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/opacity"
                        },
                        "alt": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alt"
                        },
                        "type": {
                          "type": "string",
                          "const": "spacer"
                        }
                      },
                      "required": [
                        "id",
                        "type"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/width"
                        },
                        "height": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/height"
                        },
                        "alignSelf": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alignSelf"
                        },
                        "visible": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/visible"
                        },
                        "opacity": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/opacity"
                        },
                        "alt": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alt"
                        },
                        "type": {
                          "type": "string",
                          "const": "qrcode"
                        },
                        "data": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 2000
                        },
                        "errorCorrection": {
                          "type": "string",
                          "enum": [
                            "L",
                            "M",
                            "Q",
                            "H"
                          ]
                        },
                        "foregroundColor": {
                          "$ref": "#/properties/fill/anyOf/1/properties/color"
                        },
                        "backgroundColor": {
                          "$ref": "#/properties/fill/anyOf/1/properties/color"
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "data"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "properties": {
                        "id": {
                          "$ref": "#/properties/id"
                        },
                        "width": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/width"
                        },
                        "height": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/height"
                        },
                        "alignSelf": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alignSelf"
                        },
                        "visible": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/visible"
                        },
                        "opacity": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/opacity"
                        },
                        "alt": {
                          "$ref": "#/properties/grid/properties/cells/items/properties/blocks/items/anyOf/0/properties/alt"
                        },
                        "type": {
                          "type": "string",
                          "const": "shape"
                        },
                        "shape": {
                          "type": "string",
                          "enum": [
                            "rectangle",
                            "roundedRectangle",
                            "ellipse",
                            "triangle",
                            "diamond"
                          ]
                        },
                        "fill": {
                          "$ref": "#/properties/fill"
                        },
                        "borders": {
                          "$ref": "#/properties/borders"
                        },
                        "radius": {
                          "$ref": "#/properties/box/properties/edgeOffset"
                        }
                      },
                      "required": [
                        "id",
                        "type",
                        "shape"
                      ],
                      "additionalProperties": false
                    }
                  ]
                },
                "maxItems": 50
              }
            },
            "required": [
              "id",
              "row",
              "column",
              "blocks"
            ],
            "additionalProperties": false
          },
          "maxItems": 144
        }
      },
      "required": [
        "columns",
        "rows",
        "cells"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "id",
    "kind",
    "box",
    "grid"
  ],
  "additionalProperties": false
}