{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/cloudcannon-configuration-snippets/latest.json",
  "title": "",
  "x-lintel": {
    "source": "https://github.com/cloudcannon/configuration-types/releases/latest/download/cloudcannon-snippets.schema.json",
    "sourceSha256": "a810cae66d2f4f7afc18b442975397f8bc5a5b904f9a42417d53dcc8581aed56",
    "fileMatch": [
      "cloudcannon.snippets.yml",
      "cloudcannon.snippets.yaml",
      "cloudcannon.snippets.json",
      "*.cloudcannon.snippets.yml",
      "*.cloudcannon.snippets.yaml",
      "*.cloudcannon.snippets.json"
    ],
    "parsers": [
      "json",
      "yaml"
    ]
  },
  "type": "object",
  "documented": false,
  "additionalProperties": {
    "$ref": "#/$defs/type.snippet"
  },
  "propertyNames": {
    "type": "string"
  },
  "$defs": {
    "type.snippet": {
      "type": "object",
      "properties": {
        "_inputs": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs"
            }
          ],
          "documented": false,
          "title": "_inputs"
        },
        "_inputs_from_glob": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs_from_glob"
            }
          ],
          "documented": false,
          "title": "_inputs_from_glob"
        },
        "_select_data": {
          "allOf": [
            {
              "$ref": "#/$defs/type._select_data"
            }
          ],
          "documented": false,
          "title": "_select_data"
        },
        "_structures": {
          "allOf": [
            {
              "$ref": "#/$defs/type._structures"
            }
          ],
          "documented": false,
          "title": "_structures"
        },
        "_structures_from_glob": {
          "allOf": [
            {
              "$ref": "#/$defs/type._structures_from_glob"
            }
          ],
          "documented": false,
          "title": "_structures_from_glob"
        },
        "preview": {
          "allOf": [
            {
              "$ref": "#/$defs/type.preview"
            }
          ],
          "documented": false,
          "title": "preview"
        },
        "picker_preview": {
          "allOf": [
            {
              "$ref": "#/$defs/type.picker_preview"
            }
          ],
          "documented": false,
          "title": "picker_preview"
        },
        "snippet": {
          "description": "This key defines the snippet string that contains the text to match for your snippet, with any dynamic sections represented using a placeholder in double square brackets.\n\n## Examples\n\nIn this example, we have configured a snippet string for a custom button snippet.\n\n```yaml\n_snippets_definitions:\n  custom_button:\n    snippet: \"[[text]]\"\n    template: button\n```",
          "type": "string",
          "documented": true,
          "title": "snippet",
          "markdownDescription": "This key defines the snippet string that contains the text to match for your snippet, with any dynamic sections represented using a placeholder in double square brackets.\n\n## Examples\n\nIn this example, we have configured a snippet string for a custom button snippet.\n\n```yaml\n_snippets_definitions:\n  custom_button:\n    snippet: \"[[text]]\"\n    template: button\n```"
        },
        "template": {
          "description": "This key defines the template that this snippet should inherit, out of the available Snippet Templates.\n\n## Examples\n\nIn this example, we have configured a snippet to use the `button` template.\n\n```yaml\n_snippets_definitions:\n  custom_button:\n    template: button\n```",
          "type": "string",
          "documented": true,
          "title": "template",
          "markdownDescription": "This key defines the template that this snippet should inherit, out of the available Snippet Templates.\n\n## Examples\n\nIn this example, we have configured a snippet to use the `button` template.\n\n```yaml\n_snippets_definitions:\n  custom_button:\n    template: button\n```"
        },
        "inline": {
          "description": "This key toggles whether this snippet can appear inline (within a sentence).\n\nSetting this key to `true` will allow this snippet to appear inline (within a sentence).\n\nBy default, this key is `false` (i.e., this snippet is treated as a block-level element in the content editor).",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "inline",
          "markdownDescription": "This key toggles whether this snippet can appear inline (within a sentence).\n\nSetting this key to `true` will allow this snippet to appear inline (within a sentence).\n\nBy default, this key is `false` (i.e., this snippet is treated as a block-level element in the content editor)."
        },
        "view": {
          "description": "This key defines how selected items are rendered.\n\nDefaults to 'card', or 'inline' if `inline` is true.",
          "type": "string",
          "enum": [
            "card",
            "inline",
            "gallery"
          ],
          "documented": true,
          "title": "view",
          "markdownDescription": "This key defines how selected items are rendered.\n\nDefaults to 'card', or 'inline' if `inline` is true."
        },
        "strict_whitespace": {
          "description": "This key toggles whether this snippet treats whitespace as-is or not.\n\nSetting this key to `true` will make the snippet treat whitespace as-is.\n\nBy default, this key is `false` (i.e., whitespace is normalized).",
          "type": "boolean",
          "documented": true,
          "title": "strict_whitespace",
          "markdownDescription": "This key toggles whether this snippet treats whitespace as-is or not.\n\nSetting this key to `true` will make the snippet treat whitespace as-is.\n\nBy default, this key is `false` (i.e., whitespace is normalized)."
        },
        "definitions": {
          "description": "This key defines the variables required for the selected template.\n\n## Examples\n\nIn this example, we have configured snippet definitions for a custom snippet template.\n\n```yaml\n_snippets_definitions:\n  custom_button:\n    template: button\n    definitions:\n      text: Button Text\n      url: Button URL\n```",
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "markdownDescription": "This key defines the variables required for the selected template.\n\n## Examples\n\nIn this example, we have configured snippet definitions for a custom snippet template.\n\n```yaml\n_snippets_definitions:\n  custom_button:\n    template: button\n    definitions:\n      text: Button Text\n      url: Button URL\n```",
          "documented": true,
          "title": "definitions",
          "additionalProperties": {}
        },
        "alternate_formats": {
          "$ref": "#/$defs/SnippetAlternateFormats"
        },
        "params": {
          "title": "Parser Config",
          "description": "This key defines the parameters of this snippet.",
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "markdownDescription": "This key defines the parameters of this snippet.",
          "documented": true,
          "additionalProperties": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "argument_list",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for argument list parser configurations.\n\nThe value must be `argument_list`. This specifies that the parameter uses the argument list parser, which parses multiple argument values.\n\n## Examples\n\nIn this example, we have configured an argument list parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param1]] [[param2]]>>\"\n    params:\n      params:\n        parser: argument_list\n        options:\n          models:\n            - editor_key: param1\n            - editor_key: param2\n```",
                    "markdownDescription": "This key defines the parser type for argument list parser configurations.\n\nThe value must be `argument_list`. This specifies that the parameter uses the argument list parser, which parses multiple argument values.\n\n## Examples\n\nIn this example, we have configured an argument list parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param1]] [[param2]]>>\"\n    params:\n      params:\n        parser: argument_list\n        options:\n          models:\n            - editor_key: param1\n            - editor_key: param2\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "models": {
                        "type": "array",
                        "items": {
                          "$ref": "#/$defs/type.snippet-model"
                        },
                        "documented": true,
                        "title": "models",
                        "description": "This key defines the parsing configurations for each argument.\n\nMatches the `model` options from the argument parser.",
                        "markdownDescription": "This key defines the parsing configurations for each argument.\n\nMatches the `model` options from the argument parser."
                      },
                      "format": {
                        "$ref": "#/$defs/type.snippet-format"
                      }
                    },
                    "markdownDescription": "This key defines configuration options for argument list parser configurations.\n\nThe value is an object that can contain `models` and `format` properties. These options control how multiple argument values are parsed and validated.\n\n## Examples\n\nIn this example, we have configured argument list parser options with multiple models.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param1]] [[param2]]>>\"\n    params:\n      params:\n        parser: argument_list\n        options:\n          models:\n            - editor_key: param1\n            - editor_key: param2\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for argument list parser configurations.\n\nThe value is an object that can contain `models` and `format` properties. These options control how multiple argument values are parsed and validated.\n\n## Examples\n\nIn this example, we have configured argument list parser options with multiple models.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param1]] [[param2]]>>\"\n    params:\n      params:\n        parser: argument_list\n        options:\n          models:\n            - editor_key: param1\n            - editor_key: param2\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key defines a parser configuration that parses a list of distinct positional arguments based on their position.\n\n## Examples\n\nIn this example, we have configured an argument list parser to parse distinct positional arguments based on their position.\n\n```markdown\n{{<figure \"image.png\" \"My image title\">}}\n          └──────────────────────────┘\n```",
                "title": "Argument List Parser Configuration",
                "documented": true,
                "description": "This key defines a parser configuration that parses a list of distinct positional arguments based on their position.\n\n## Examples\n\nIn this example, we have configured an argument list parser to parse distinct positional arguments based on their position.\n\n```markdown\n{{<figure \"image.png\" \"My image title\">}}\n          └──────────────────────────┘\n```",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "argument",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for argument parser configurations.\n\nThe value must be `argument`. This specifies that the parameter uses the argument parser, which parses a single argument value.\n\n## Examples\n\nIn this example, we have configured an argument parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            editor_key: example_id\n```",
                    "markdownDescription": "This key defines the parser type for argument parser configurations.\n\nThe value must be `argument`. This specifies that the parameter uses the argument parser, which parses a single argument value.\n\n## Examples\n\nIn this example, we have configured an argument parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            editor_key: example_id\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "model": {
                        "$ref": "#/$defs/type.snippet-model"
                      },
                      "format": {
                        "$ref": "#/$defs/type.snippet-format"
                      }
                    },
                    "markdownDescription": "This key defines configuration options for argument parser configurations.\n\nThe value is an object that can contain `model` and `format` properties. These options control how a single argument value is parsed and validated.\n\n## Examples\n\nIn this example, we have configured argument parser options with a model and format.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            editor_key: example_id\n          format:\n            string_boundary:\n              - '\"'\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for argument parser configurations.\n\nThe value is an object that can contain `model` and `format` properties. These options control how a single argument value is parsed and validated.\n\n## Examples\n\nIn this example, we have configured argument parser options with a model and format.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            editor_key: example_id\n          format:\n            string_boundary:\n              - '\"'\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key defines a parser configuration that parses a single argument, optionally delimited by characters.\n\nUseful for matching a single positional argument.\n\nThe argument parser is also used to parse a list of repeating arguments.\n\n## Examples\n\nIn this example, we have configured an argument parser to parse a single positional argument.\n\n```markdown\n{{<figure image.png>}}\n          └───────┘\n```\n\nIn this example, we have configured an argument parser to parse a list of repeating arguments.\n\n```markdown\n{{<images image1.png image2.png image3.png>}}\n          └──────────────────────────────┘\n```",
                "title": "Argument Parser Configuration",
                "documented": true,
                "description": "This key defines a parser configuration that parses a single argument, optionally delimited by characters.\n\nUseful for matching a single positional argument.\n\nThe argument parser is also used to parse a list of repeating arguments.\n\n## Examples\n\nIn this example, we have configured an argument parser to parse a single positional argument.\n\n```markdown\n{{<figure image.png>}}\n          └───────┘\n```\n\nIn this example, we have configured an argument parser to parse a list of repeating arguments.\n\n```markdown\n{{<images image1.png image2.png image3.png>}}\n          └──────────────────────────────┘\n```",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "content",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for content parser configurations.\n\nThe value must be `content`. This specifies that the parameter uses the content parser, which parses content between snippet boundaries.\n\n## Examples\n\nIn this example, we have configured a content parser for a snippet parameter.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n```",
                    "markdownDescription": "This key defines the parser type for content parser configurations.\n\nThe value must be `content`. This specifies that the parameter uses the content parser, which parses content between snippet boundaries.\n\n## Examples\n\nIn this example, we have configured a content parser for a snippet parameter.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "editor_key": {
                        "type": "string",
                        "documented": true,
                        "title": "editor_key",
                        "description": "This key defines the key that a user in CloudCannon will see to edit this value.\n\nThe value returned by this parser is a number input that can be edited to change how many literals are output by the parser.\n\n## Examples\n\n```yaml\n_snippets:\n  custom_title:\n    snippet: \"[[hashes]] [[title]]\"\n    params:\n      hashes:\n        parser: repeating_literal\n        options:\n          literal: '#'\n          minimum: 1\n          editor_key: heading_level\n      title:\n        parser: \"content\"\n        options:\n          editor_key: title\n          forbidden_tokens: [\"\\n\"]\n```\n\nExample usage:\n\n```markdown\n# My blog post <!--1-->\n\nAenean lacinia bibendum nulla sed consectetur.\n\n## My heading <!--1-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
                        "markdownDescription": "This key defines the key that a user in CloudCannon will see to edit this value.\n\nThe value returned by this parser is a number input that can be edited to change how many literals are output by the parser.\n\n## Examples\n\n```yaml\n_snippets:\n  custom_title:\n    snippet: \"[[hashes]] [[title]]\"\n    params:\n      hashes:\n        parser: repeating_literal\n        options:\n          literal: '#'\n          minimum: 1\n          editor_key: heading_level\n      title:\n        parser: \"content\"\n        options:\n          editor_key: title\n          forbidden_tokens: [\"\\n\"]\n```\n\nExample usage:\n\n```markdown\n# My blog post <!--1-->\n\nAenean lacinia bibendum nulla sed consectetur.\n\n## My heading <!--1-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
                      },
                      "indented_by": {
                        "type": "string",
                        "documented": true,
                        "title": "indented_by",
                        "description": "This key defines the whitespace indentation required when parsing content.\n\nConfigures the content parser to require whitespace indentation when parsing. Used when a snippet continues for as long as content is indented.\n\nThis option should only be used if required, since it prevents your Snippet from parsing if the whitespace does not match.\n\nIf you want parsing to be flexible, but the output to be formatted, use the Style options instead.\n\n## Examples\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>>\\n[[inner]]\\n<</highlight>>\"\n    params:\n      inner:\n        parser: \"content\"\n        options:\n          editor_key: highlighted_text\n          indented_by___0___: \"  \"\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted content!   <!--1-->\n<</highlight>>\n\n<<highlight>>\n    My highlighted content! <!--2-->\n<</highlight>>\n\n<<highlight>>\nMy highlighted content!     <!--3-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
                        "markdownDescription": "This key defines the whitespace indentation required when parsing content.\n\nConfigures the content parser to require whitespace indentation when parsing. Used when a snippet continues for as long as content is indented.\n\nThis option should only be used if required, since it prevents your Snippet from parsing if the whitespace does not match.\n\nIf you want parsing to be flexible, but the output to be formatted, use the Style options instead.\n\n## Examples\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>>\\n[[inner]]\\n<</highlight>>\"\n    params:\n      inner:\n        parser: \"content\"\n        options:\n          editor_key: highlighted_text\n          indented_by___0___: \"  \"\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted content!   <!--1-->\n<</highlight>>\n\n<<highlight>>\n    My highlighted content! <!--2-->\n<</highlight>>\n\n<<highlight>>\nMy highlighted content!     <!--3-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
                      },
                      "default": {
                        "type": "string",
                        "documented": true,
                        "title": "default",
                        "description": "This key defines the default number of literals, which is used when adding a new snippet to a page in CloudCannon.",
                        "markdownDescription": "This key defines the default number of literals, which is used when adding a new snippet to a page in CloudCannon."
                      },
                      "trim_text": {
                        "type": "boolean",
                        "documented": true,
                        "title": "trim_text",
                        "description": "This key toggles whether all whitespace and newlines will be trimmed from the start and end of the content before it is presented to an editor in CloudCannon.\n\nSetting this key to `true` will trim all whitespace and newlines from the start and end of the content.\n\nBy default, this key is `false` (i.e., whitespace and newlines are not trimmed).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  trim_text: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted content!   <!--1-->\n<</highlight>>\n\n<<highlight>>  My highlighted content!  <</highlight>> <!--1-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
                        "markdownDescription": "This key toggles whether all whitespace and newlines will be trimmed from the start and end of the content before it is presented to an editor in CloudCannon.\n\nSetting this key to `true` will trim all whitespace and newlines from the start and end of the content.\n\nBy default, this key is `false` (i.e., whitespace and newlines are not trimmed).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  trim_text: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted content!   <!--1-->\n<</highlight>>\n\n<<highlight>>  My highlighted content!  <</highlight>> <!--1-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
                      },
                      "allow_nested": {
                        "type": "boolean",
                        "documented": true,
                        "title": "allow_nested",
                        "description": "This key toggles whether nested snippets will be parsed and returned.\n\nSetting this key to `true` will parse and return nested snippets.\n\nBy default, this key is `false` (i.e., nested snippets are not parsed and returned).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  allow_nested: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted <<highlight>>content!<</highlight>>   <!--1-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
                        "markdownDescription": "This key toggles whether nested snippets will be parsed and returned.\n\nSetting this key to `true` will parse and return nested snippets.\n\nBy default, this key is `false` (i.e., nested snippets are not parsed and returned).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  allow_nested: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted <<highlight>>content!<</highlight>>   <!--1-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
                      },
                      "raw": {
                        "type": "boolean",
                        "documented": true,
                        "title": "raw",
                        "description": "This key toggles whether the parser performs no parsing of the inner text.\n\nSetting this key to `true` will perform no parsing of the inner text. This is a stricter version of `allow_nested: false`. Useful to improve the performance of the content parser, but can misbehave.\n\nBy default, this key is `false` (i.e., inner text is parsed).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  raw: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted <<highlight>>content!<</highlight>>   <!--1-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
                        "markdownDescription": "This key toggles whether the parser performs no parsing of the inner text.\n\nSetting this key to `true` will perform no parsing of the inner text. This is a stricter version of `allow_nested: false`. Useful to improve the performance of the content parser, but can misbehave.\n\nBy default, this key is `false` (i.e., inner text is parsed).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  raw: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted <<highlight>>content!<</highlight>>   <!--1-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
                      },
                      "forbidden_tokens": {
                        "type": "array",
                        "items": {
                          "type": "string",
                          "documented": true,
                          "title": "forbidden_tokens[*]",
                          "description": "This key represents an individual forbidden token string in the `params.*(content-parser-config).options.forbidden_tokens` array.\n\nThe value is a string that specifies a token that will stop parsing content when encountered. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured a forbidden token to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          forbidden_tokens:\n            - '<'\n```",
                          "markdownDescription": "This key represents an individual forbidden token string in the `params.*(content-parser-config).options.forbidden_tokens` array.\n\nThe value is a string that specifies a token that will stop parsing content when encountered. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured a forbidden token to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          forbidden_tokens:\n            - '<'\n```"
                        },
                        "documented": true,
                        "title": "forbidden_tokens",
                        "description": "This key defines tokens that stop parsing content when encountered in content parser configurations.\n\nThe value is an array of strings, where each string specifies a forbidden token. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured forbidden tokens to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          forbidden_tokens:\n            - '<'\n```",
                        "markdownDescription": "This key defines tokens that stop parsing content when encountered in content parser configurations.\n\nThe value is an array of strings, where each string specifies a forbidden token. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured forbidden tokens to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          forbidden_tokens:\n            - '<'\n```"
                      },
                      "optional": {
                        "type": "boolean",
                        "documented": true,
                        "title": "optional",
                        "description": "This key toggles whether CloudCannon will treat content as optional when parsing snippet parameters.\n\nSetting this key to `true` will make the content parameter optional, allowing snippets to match even when the content is missing.\n\nBy default, this key is `false` (i.e., content is required).\n\n## Examples\n\nIn this example, we have configured content parser to treat content as optional.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          optional: true\n```",
                        "markdownDescription": "This key toggles whether CloudCannon will treat content as optional when parsing snippet parameters.\n\nSetting this key to `true` will make the content parameter optional, allowing snippets to match even when the content is missing.\n\nBy default, this key is `false` (i.e., content is required).\n\n## Examples\n\nIn this example, we have configured content parser to treat content as optional.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          optional: true\n```"
                      },
                      "allow_leading": {
                        "type": "boolean",
                        "documented": true,
                        "title": "allow_leading",
                        "description": "This key toggles whether the first line of the content needs to be indented when an `indented_by` value is set.\n\nSetting this key to `true` will allow the first line of the content to not be indented, but subsequent lines must be indented.\n\nBy default, this key is `false` (i.e., all lines including the first must be indented).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  indented_by: \"  \"\n  allow_leading: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted content!   <!--1-->\n<</highlight>>\n\n<<highlight>>Some initial content\n    More highlighted content!   <!--2-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
                        "markdownDescription": "This key toggles whether the first line of the content needs to be indented when an `indented_by` value is set.\n\nSetting this key to `true` will allow the first line of the content to not be indented, but subsequent lines must be indented.\n\nBy default, this key is `false` (i.e., all lines including the first must be indented).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  editor_key: highlighted_text\n  indented_by: \"  \"\n  allow_leading: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>>\n  My highlighted content!   <!--1-->\n<</highlight>>\n\n<<highlight>>Some initial content\n    More highlighted content!   <!--2-->\n<</highlight>>\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
                      },
                      "escape_indented_blocks": {
                        "default": false,
                        "type": "boolean",
                        "documented": true,
                        "title": "escape_indented_blocks",
                        "description": "This key toggles whether CloudCannon will escape indented code blocks (4 spaces) when parsing content.\n\nSetting this key to `true` will escape indented code blocks in the content, preventing them from being interpreted as code blocks.\n\nBy default, this key is `false` (i.e., indented code blocks are not escaped).\n\n## Examples\n\nIn this example, we have configured content parser to escape indented code blocks.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          escape_indented_blocks: true\n```",
                        "markdownDescription": "This key toggles whether CloudCannon will escape indented code blocks (4 spaces) when parsing content.\n\nSetting this key to `true` will escape indented code blocks in the content, preventing them from being interpreted as code blocks.\n\nBy default, this key is `false` (i.e., indented code blocks are not escaped).\n\n## Examples\n\nIn this example, we have configured content parser to escape indented code blocks.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          escape_indented_blocks: true\n```"
                      },
                      "parse_newline_character": {
                        "default": false,
                        "type": "boolean",
                        "documented": true,
                        "title": "parse_newline_character",
                        "description": "This key toggles whether the parser treats `\\n` as line breaks instead of literal characters.\n\nSetting this key to `true` will treat `\\n` as line breaks instead of literal characters. This is useful if you are editing your content in a multiline editing interface.\n\nBy default, this key is `false` (i.e., `\\n` is treated as literal characters).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  parse_newline_character: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>> Line One\\nLine Two <</highlight>> <!--1-->\n```",
                        "markdownDescription": "This key toggles whether the parser treats `\\n` as line breaks instead of literal characters.\n\nSetting this key to `true` will treat `\\n` as line breaks instead of literal characters. This is useful if you are editing your content in a multiline editing interface.\n\nBy default, this key is `false` (i.e., `\\n` is treated as literal characters).\n\n## Examples\n\n```yaml\nparser: \"content\"\noptions:\n  parse_newline_character: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<highlight>> Line One\\nLine Two <</highlight>> <!--1-->\n```"
                      },
                      "ignore_unpaired_backticks": {
                        "default": true,
                        "type": "boolean",
                        "documented": true,
                        "title": "ignore_unpaired_backticks",
                        "description": "This key toggles whether CloudCannon will ignore unpaired backticks when parsing content.\n\nSetting this key to `false` will cause CloudCannon to treat unpaired backticks as parsing errors.\n\nBy default, this key is `true` (i.e., unpaired backticks are ignored).\n\n## Examples\n\nIn this example, we have configured content parser to ignore unpaired backticks.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          ignore_unpaired_backticks: true\n```",
                        "markdownDescription": "This key toggles whether CloudCannon will ignore unpaired backticks when parsing content.\n\nSetting this key to `false` will cause CloudCannon to treat unpaired backticks as parsing errors.\n\nBy default, this key is `true` (i.e., unpaired backticks are ignored).\n\n## Examples\n\nIn this example, we have configured content parser to ignore unpaired backticks.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          ignore_unpaired_backticks: true\n```"
                      },
                      "escape_fenced_blocks": {
                        "default": false,
                        "type": "boolean",
                        "documented": true,
                        "title": "escape_fenced_blocks",
                        "description": "This key toggles whether CloudCannon will escape fenced code blocks (triple backticks) when parsing content.\n\nSetting this key to `true` will escape fenced code blocks in the content, preventing them from being interpreted as code blocks.\n\nBy default, this key is `false` (i.e., fenced code blocks are not escaped).\n\n## Examples\n\nIn this example, we have configured content parser to escape fenced code blocks.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          escape_fenced_blocks: true\n```",
                        "markdownDescription": "This key toggles whether CloudCannon will escape fenced code blocks (triple backticks) when parsing content.\n\nSetting this key to `true` will escape fenced code blocks in the content, preventing them from being interpreted as code blocks.\n\nBy default, this key is `false` (i.e., fenced code blocks are not escaped).\n\n## Examples\n\nIn this example, we have configured content parser to escape fenced code blocks.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          escape_fenced_blocks: true\n```"
                      },
                      "style": {
                        "$ref": "#/$defs/type.snippet-style"
                      }
                    },
                    "markdownDescription": "This key defines configuration options for content parser configurations.\n\nThe value is an object that can contain `editor_key`, `indented_by`, `default`, `trim_text`, `allow_nested`, `raw`, `forbidden_tokens`, `optional`, `allow_leading`, `escape_indented_blocks`, `parse_newline_character`, `ignore_unpaired_backticks`, `escape_fenced_blocks`, and `style` properties. These options control how content between snippet boundaries is parsed.\n\n## Examples\n\nIn this example, we have configured content parser options with an editor key and forbidden tokens.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          forbidden_tokens:\n            - '<'\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for content parser configurations.\n\nThe value is an object that can contain `editor_key`, `indented_by`, `default`, `trim_text`, `allow_nested`, `raw`, `forbidden_tokens`, `optional`, `allow_leading`, `escape_indented_blocks`, `parse_newline_character`, `ignore_unpaired_backticks`, `escape_fenced_blocks`, and `style` properties. These options control how content between snippet boundaries is parsed.\n\n## Examples\n\nIn this example, we have configured content parser options with an editor key and forbidden tokens.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          forbidden_tokens:\n            - '<'\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key defines a parser configuration that parses rich multiline content, such as the content between paired tags. Can be configured to parse nested snippets within.\n\n## Examples\n\nIn this example, we have configured a content parser to parse rich multiline content between paired tags.\n\n```liquid\n{% highlight \"js\" %} let a = b; {% endhighlight %}\n                    └──────────┘\n```",
                "title": "Content Parser Configuration",
                "documented": true,
                "description": "This key defines a parser configuration that parses rich multiline content, such as the content between paired tags. Can be configured to parse nested snippets within.\n\n## Examples\n\nIn this example, we have configured a content parser to parse rich multiline content between paired tags.\n\n```liquid\n{% highlight \"js\" %} let a = b; {% endhighlight %}\n                    └──────────┘\n```",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "key_values",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for key-value list parser configurations.\n\nThe value must be `key_values`. This specifies that the parameter uses the key-value list parser, which parses multiple key-value pairs.\n\n## Examples\n\nIn this example, we have configured a key-value list parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example key1=value1 key2=value2>>\"\n    params:\n      params:\n        parser: key_values\n        options:\n          models:\n            key1:\n              editor_key: value1_input\n            key2:\n              editor_key: value2_input\n```",
                    "markdownDescription": "This key defines the parser type for key-value list parser configurations.\n\nThe value must be `key_values`. This specifies that the parameter uses the key-value list parser, which parses multiple key-value pairs.\n\n## Examples\n\nIn this example, we have configured a key-value list parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example key1=value1 key2=value2>>\"\n    params:\n      params:\n        parser: key_values\n        options:\n          models:\n            key1:\n              editor_key: value1_input\n            key2:\n              editor_key: value2_input\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "models": {
                        "type": "array",
                        "items": {
                          "$ref": "#/$defs/type.snippet-model"
                        },
                        "documented": true,
                        "title": "models",
                        "description": "This key defines the models for each key in key-value list parser configurations.\n\nThe value is an object where each property key is a key name and each property value is a model configuration object. These models define how each key-value pair is parsed and validated.\n\n## Examples\n\nIn this example, we have configured models for key-value pairs in a key-value list parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example key1=value1 key2=value2>>\"\n    params:\n      params:\n        parser: key_values\n        options:\n          models:\n            key1:\n              editor_key: value1_input\n            key2:\n              editor_key: value2_input\n```",
                        "markdownDescription": "This key defines the models for each key in key-value list parser configurations.\n\nThe value is an object where each property key is a key name and each property value is a model configuration object. These models define how each key-value pair is parsed and validated.\n\n## Examples\n\nIn this example, we have configured models for key-value pairs in a key-value list parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example key1=value1 key2=value2>>\"\n    params:\n      params:\n        parser: key_values\n        options:\n          models:\n            key1:\n              editor_key: value1_input\n            key2:\n              editor_key: value2_input\n```"
                      },
                      "format": {
                        "$ref": "#/$defs/type.snippet-format"
                      },
                      "style": {
                        "$ref": "#/$defs/type.snippet-style"
                      }
                    },
                    "required": [
                      "models"
                    ],
                    "markdownDescription": "This key defines configuration options for key-value list parser configurations.\n\nThe value is an object that can contain `models`, `format`, and `style` properties. These options control how multiple key-value pairs are parsed and validated.\n\n## Examples\n\nIn this example, we have configured key-value list parser options with models.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example key1=value1 key2=value2>>\"\n    params:\n      params:\n        parser: key_values\n        options:\n          models:\n            key1:\n              editor_key: value1_input\n            key2:\n              editor_key: value2_input\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for key-value list parser configurations.\n\nThe value is an object that can contain `models`, `format`, and `style` properties. These options control how multiple key-value pairs are parsed and validated.\n\n## Examples\n\nIn this example, we have configured key-value list parser options with models.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example key1=value1 key2=value2>>\"\n    params:\n      params:\n        parser: key_values\n        options:\n          models:\n            key1:\n              editor_key: value1_input\n            key2:\n              editor_key: value2_input\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser"
                ],
                "markdownDescription": "This key defines a parser configuration that parses repeating pairs of keys and values.\n\nUseful for most SSG snippets that take properties.\n\nCan be configured to handle most syntax forms of key value pairs.\n\n## Examples\n\nIn this example, we have configured a key-value list parser to parse repeating pairs of keys and values in Liquid syntax.\n\n```liquid\n{% include \"image.html\" image: \"tree.png\" alt: \"Image of a tree\" %}\n                        └──────────────────────────────────────┘\n```\n\nIn this example, we have configured a key-value list parser to parse repeating pairs of keys and values in Markdown syntax.\n\n```markdown\n<Link href=\"/about/\" new_tab={true}/>\n      └───────────────────────────┘\n```",
                "title": "Key Value List Parser Configuration",
                "documented": true,
                "description": "This key defines a parser configuration that parses repeating pairs of keys and values.\n\nUseful for most SSG snippets that take properties.\n\nCan be configured to handle most syntax forms of key value pairs.\n\n## Examples\n\nIn this example, we have configured a key-value list parser to parse repeating pairs of keys and values in Liquid syntax.\n\n```liquid\n{% include \"image.html\" image: \"tree.png\" alt: \"Image of a tree\" %}\n                        └──────────────────────────────────────┘\n```\n\nIn this example, we have configured a key-value list parser to parse repeating pairs of keys and values in Markdown syntax.\n\n```markdown\n<Link href=\"/about/\" new_tab={true}/>\n      └───────────────────────────┘\n```",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "literal",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for literal parser configurations.\n\nThe value must be `literal`. This specifies that the parameter uses the literal parser, which matches a specific literal string value.\n\n## Examples\n\nIn this example, we have configured a literal parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n```",
                    "markdownDescription": "This key defines the parser type for literal parser configurations.\n\nThe value must be `literal`. This specifies that the parameter uses the literal parser, which matches a specific literal string value.\n\n## Examples\n\nIn this example, we have configured a literal parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "literal": {
                        "type": "string",
                        "documented": true,
                        "title": "literal",
                        "description": "This key defines the literal string value that must be matched for literal parser configurations.\n\nThe value is a string that specifies the exact text that must appear in the snippet for the parameter to match.\n\n## Examples\n\nIn this example, we have configured a literal value that must be matched.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n```",
                        "markdownDescription": "This key defines the literal string value that must be matched for literal parser configurations.\n\nThe value is a string that specifies the exact text that must appear in the snippet for the parameter to match.\n\n## Examples\n\nIn this example, we have configured a literal value that must be matched.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n```"
                      },
                      "format": {
                        "type": "object",
                        "properties": {
                          "string_boundary": {
                            "type": "array",
                            "items": {
                              "type": "string",
                              "documented": true,
                              "title": "string_boundary[*]",
                              "description": "This key represents an individual string boundary token in the `params.*(literal-parser-config).options.format.string_boundary` array.\n\nThe value is a string that specifies a valid boundary token for strings. The parser will ensure the matched end token is the same as the start token.\n\n## Examples\n\nIn this example, we have configured a string boundary to use double quotes for literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n          format:\n            string_boundary:\n              - '\"'\n```",
                              "markdownDescription": "This key represents an individual string boundary token in the `params.*(literal-parser-config).options.format.string_boundary` array.\n\nThe value is a string that specifies a valid boundary token for strings. The parser will ensure the matched end token is the same as the start token.\n\n## Examples\n\nIn this example, we have configured a string boundary to use double quotes for literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n          format:\n            string_boundary:\n              - '\"'\n```"
                            },
                            "documented": true,
                            "title": "string_boundary",
                            "description": "This key defines the valid tokens that can bound a string when parsing literal values.\n\nThe value is an array of strings, where each string specifies a valid boundary token. The parser will ensure the matched end token is the same as the start token. To handle common strings with either single or double quotes, this would usually be `[\"'\", \"\\\"\"]`.\n\n## Examples\n\nIn this example, we have configured string boundaries to allow single and double quotes for literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n          format:\n            string_boundary:\n              - '\"'\n              - \"'\"\n```",
                            "markdownDescription": "This key defines the valid tokens that can bound a string when parsing literal values.\n\nThe value is an array of strings, where each string specifies a valid boundary token. The parser will ensure the matched end token is the same as the start token. To handle common strings with either single or double quotes, this would usually be `[\"'\", \"\\\"\"]`.\n\n## Examples\n\nIn this example, we have configured string boundaries to allow single and double quotes for literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n          format:\n            string_boundary:\n              - '\"'\n              - \"'\"\n```"
                          }
                        },
                        "markdownDescription": "This key defines formatting options for literal parser configurations.\n\nThe value is an object that can contain `string_boundary` properties. These options control how the literal value is parsed and matched.\n\n## Examples\n\nIn this example, we have configured literal parser format options with string boundaries.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n          format:\n            string_boundary:\n              - '\"'\n```",
                        "documented": true,
                        "title": "format",
                        "description": "This key defines formatting options for literal parser configurations.\n\nThe value is an object that can contain `string_boundary` properties. These options control how the literal value is parsed and matched.\n\n## Examples\n\nIn this example, we have configured literal parser format options with string boundaries.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n          format:\n            string_boundary:\n              - '\"'\n```",
                        "additionalProperties": false
                      }
                    },
                    "required": [
                      "literal"
                    ],
                    "markdownDescription": "This key defines configuration options for literal parser configurations.\n\nThe value is an object that can contain `literal` and `format` properties. These options control what literal string value must be matched.\n\n## Examples\n\nIn this example, we have configured literal parser options with a literal value.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for literal parser configurations.\n\nThe value is an object that can contain `literal` and `format` properties. These options control what literal string value must be matched.\n\n## Examples\n\nIn this example, we have configured literal parser options with a literal value.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: literal\n        options:\n          literal: 'specific-value'\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key defines a parser configuration that parses an exact literal value. Mainly useful when configuring a snippet template.",
                "title": "Literal Parser Configuration",
                "documented": true,
                "description": "This key defines a parser configuration that parses an exact literal value. Mainly useful when configuring a snippet template.",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "optional",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for optional parser configurations.\n\nThe value must be `optional`. This specifies that the parameter uses the optional parser, which wraps another snippet configuration and makes it optional.\n\n## Examples\n\nIn this example, we have configured an optional parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[optional_content]]>>\"\n    params:\n      optional_content:\n        parser: optional\n        options:\n          snippet: 'content'\n```",
                    "markdownDescription": "This key defines the parser type for optional parser configurations.\n\nThe value must be `optional`. This specifies that the parameter uses the optional parser, which wraps another snippet configuration and makes it optional.\n\n## Examples\n\nIn this example, we have configured an optional parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[optional_content]]>>\"\n    params:\n      optional_content:\n        parser: optional\n        options:\n          snippet: 'content'\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "snippet": {
                        "type": "string",
                        "documented": true,
                        "title": "snippet",
                        "description": "This key defines a snippet string to wrap and make repeatable.\n\nThis shares the same params as the outermost snippet, so may reference itself or other params.",
                        "markdownDescription": "This key defines a snippet string to wrap and make repeatable.\n\nThis shares the same params as the outermost snippet, so may reference itself or other params."
                      },
                      "remove_empty": {
                        "type": "boolean",
                        "documented": true,
                        "title": "remove_empty",
                        "description": "This key toggles whether to output an empty string, or no value at all.\n\nSetting this key to `true` will output no value at all instead of an empty string. This will bubble up to any outer parsers, so may control whether they return output.\n\nBy default, this key is `false` (i.e., an empty string is output).",
                        "markdownDescription": "This key toggles whether to output an empty string, or no value at all.\n\nSetting this key to `true` will output no value at all instead of an empty string. This will bubble up to any outer parsers, so may control whether they return output.\n\nBy default, this key is `false` (i.e., an empty string is output)."
                      }
                    },
                    "required": [
                      "snippet"
                    ],
                    "markdownDescription": "This key defines configuration options for optional parser configurations.\n\nThe value is an object that can contain `snippet` and `remove_empty` properties. These options control which snippet configuration is wrapped and whether empty values are removed.\n\n## Examples\n\nIn this example, we have configured optional parser options with a snippet reference.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[optional_content]]>>\"\n    params:\n      optional_content:\n        parser: optional\n        options:\n          snippet: 'content'\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for optional parser configurations.\n\nThe value is an object that can contain `snippet` and `remove_empty` properties. These options control which snippet configuration is wrapped and whether empty values are removed.\n\n## Examples\n\nIn this example, we have configured optional parser options with a snippet reference.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[optional_content]]>>\"\n    params:\n      optional_content:\n        parser: optional\n        options:\n          snippet: 'content'\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key toggles whether matching zero times is a valid state for this parser.\n\nSetting this key to `true` will allow matching zero times as a valid state. If `false`, this parser requires at least one matching value. Setting this to `true` is preferred to wrapping the `repeating` parser inside an `optional` parser.\n\nBy default, this key is `false` (i.e., at least one matching value is required).",
                "title": "Optional Parser Configuration",
                "documented": true,
                "description": "This key toggles whether matching zero times is a valid state for this parser.\n\nSetting this key to `true` will allow matching zero times as a valid state. If `false`, this parser requires at least one matching value. Setting this to `true` is preferred to wrapping the `repeating` parser inside an `optional` parser.\n\nBy default, this key is `false` (i.e., at least one matching value is required).",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "repeating_literal",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for repeating literal parser configurations.\n\nThe value must be `repeating_literal`. This specifies that the parameter uses the repeating literal parser, which matches a literal string that can appear multiple times.\n\n## Examples\n\nIn this example, we have configured a repeating literal parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```",
                    "markdownDescription": "This key defines the parser type for repeating literal parser configurations.\n\nThe value must be `repeating_literal`. This specifies that the parameter uses the repeating literal parser, which matches a literal string that can appear multiple times.\n\n## Examples\n\nIn this example, we have configured a repeating literal parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "literal": {
                        "type": "string",
                        "documented": true,
                        "title": "literal",
                        "description": "This key defines the literal string value that can be repeated for repeating literal parser configurations.\n\nThe value is a string that specifies the exact text that can appear multiple times in the snippet.\n\n## Examples\n\nIn this example, we have configured a literal value for repeating literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```",
                        "markdownDescription": "This key defines the literal string value that can be repeated for repeating literal parser configurations.\n\nThe value is a string that specifies the exact text that can appear multiple times in the snippet.\n\n## Examples\n\nIn this example, we have configured a literal value for repeating literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```"
                      },
                      "default": {
                        "type": "number",
                        "documented": true,
                        "title": "default",
                        "description": "This key defines the default count for repeating literal parser configurations.\n\nThe value is a number that specifies how many times the literal should appear by default.\n\n## Examples\n\nIn this example, we have configured a default count for repeating literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```",
                        "markdownDescription": "This key defines the default count for repeating literal parser configurations.\n\nThe value is a number that specifies how many times the literal should appear by default.\n\n## Examples\n\nIn this example, we have configured a default count for repeating literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```"
                      },
                      "minimum": {
                        "type": "number",
                        "documented": true,
                        "title": "minimum",
                        "description": "This key defines the minimum number of times that the literal string must occur to match this parser.\n\nA good example is a markdown code block, which can open with any number of backticks greater than or equal to three.",
                        "markdownDescription": "This key defines the minimum number of times that the literal string must occur to match this parser.\n\nA good example is a markdown code block, which can open with any number of backticks greater than or equal to three."
                      },
                      "editor_key": {
                        "type": "string",
                        "documented": true,
                        "title": "editor_key",
                        "description": "This key defines the editor key for repeating literal parser configurations.\n\nThe value is a string that specifies the key name of an input to use for editing the repeating literal value.\n\n## Examples\n\nIn this example, we have configured an editor key for repeating literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n          editor_key: separator_count\n```",
                        "markdownDescription": "This key defines the editor key for repeating literal parser configurations.\n\nThe value is a string that specifies the key name of an input to use for editing the repeating literal value.\n\n## Examples\n\nIn this example, we have configured an editor key for repeating literal parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n          editor_key: separator_count\n```"
                      }
                    },
                    "required": [
                      "literal"
                    ],
                    "markdownDescription": "This key defines configuration options for repeating literal parser configurations.\n\nThe value is an object that can contain `literal`, `default`, `minimum`, and `editor_key` properties. These options control what literal string is matched and how many times it can appear.\n\n## Examples\n\nIn this example, we have configured repeating literal parser options with a literal value and default count.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for repeating literal parser configurations.\n\nThe value is an object that can contain `literal`, `default`, `minimum`, and `editor_key` properties. These options control what literal string is matched and how many times it can appear.\n\n## Examples\n\nIn this example, we have configured repeating literal parser options with a literal value and default count.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[literal_param]]>>\"\n    params:\n      literal_param:\n        parser: repeating_literal\n        options:\n          literal: 'separator'\n          default: 1\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key defines a parser configuration that parses a repeating set of exact literal values.",
                "title": "Repeating Literal Parser Config",
                "documented": true,
                "description": "This key defines a parser configuration that parses a repeating set of exact literal values.",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "repeating",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for repeating parser configurations.\n\nThe value must be `repeating`. This specifies that the parameter uses the repeating parser, which allows a snippet configuration to appear multiple times.\n\n## Examples\n\nIn this example, we have configured a repeating parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n```",
                    "markdownDescription": "This key defines the parser type for repeating parser configurations.\n\nThe value must be `repeating`. This specifies that the parameter uses the repeating parser, which allows a snippet configuration to appear multiple times.\n\n## Examples\n\nIn this example, we have configured a repeating parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "snippet": {
                        "type": "string",
                        "documented": true,
                        "title": "snippet",
                        "description": "This key defines the snippet configuration to repeat for repeating parser configurations.\n\nThe value is a string that specifies the key name of another snippet configuration defined in `_snippets`. This snippet configuration will be repeated multiple times.\n\n## Examples\n\nIn this example, we have configured a snippet reference for repeating parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n  content:\n    snippet: \"<<content [[text]]>>\"\n    params:\n      text:\n        parser: content\n        options:\n          editor_key: content_text\n```",
                        "markdownDescription": "This key defines the snippet configuration to repeat for repeating parser configurations.\n\nThe value is a string that specifies the key name of another snippet configuration defined in `_snippets`. This snippet configuration will be repeated multiple times.\n\n## Examples\n\nIn this example, we have configured a snippet reference for repeating parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n  content:\n    snippet: \"<<content [[text]]>>\"\n    params:\n      text:\n        parser: content\n        options:\n          editor_key: content_text\n```"
                      },
                      "editor_key": {
                        "type": "string",
                        "documented": true,
                        "title": "editor_key",
                        "description": "This key defines the editor key for repeating parser configurations.\n\nThe value is a string that specifies the key name of an input to use for editing repeating snippet instances.\n\n## Examples\n\nIn this example, we have configured an editor key for repeating parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n          editor_key: content_items\n```",
                        "markdownDescription": "This key defines the editor key for repeating parser configurations.\n\nThe value is a string that specifies the key name of an input to use for editing repeating snippet instances.\n\n## Examples\n\nIn this example, we have configured an editor key for repeating parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n          editor_key: content_items\n```"
                      },
                      "output_delimiter": {
                        "type": "string",
                        "documented": true,
                        "title": "output_delimiter",
                        "description": "This key defines how to format the output for parsers such as the content and repeating parsers.\n\nValid values are either `inline` or `block`.\n\nWhen set to `block`, values will always be output with leading and trailing newlines.\n\nWhen set to `inline`, values will always be output on a single line, with newlines inserted as `\\n`.\n\nIf unspecified, `inline` will be chosen when the value is a single line, otherwise `block`\nformatting will be used.",
                        "markdownDescription": "This key defines how to format the output for parsers such as the content and repeating parsers.\n\nValid values are either `inline` or `block`.\n\nWhen set to `block`, values will always be output with leading and trailing newlines.\n\nWhen set to `inline`, values will always be output on a single line, with newlines inserted as `\\n`.\n\nIf unspecified, `inline` will be chosen when the value is a single line, otherwise `block`\nformatting will be used."
                      },
                      "default_length": {
                        "type": "number",
                        "documented": true,
                        "title": "default_length",
                        "description": "This key defines how many repetitions should be created in the initial data when initializing a new Snippet.",
                        "markdownDescription": "This key defines how many repetitions should be created in the initial data when initializing a new Snippet."
                      },
                      "style": {
                        "$ref": "#/$defs/type.snippet-style"
                      },
                      "optional": {
                        "type": "boolean",
                        "documented": true,
                        "title": "optional",
                        "description": "This key toggles whether CloudCannon will treat repeating snippets as optional when parsing snippet parameters.\n\nSetting this key to `true` will make the repeating snippet instances optional, allowing snippets to match even when no instances are present.\n\nBy default, this key is `false` (i.e., at least one instance is required).\n\n## Examples\n\nIn this example, we have configured repeating parser to treat instances as optional.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n          optional: true\n```",
                        "markdownDescription": "This key toggles whether CloudCannon will treat repeating snippets as optional when parsing snippet parameters.\n\nSetting this key to `true` will make the repeating snippet instances optional, allowing snippets to match even when no instances are present.\n\nBy default, this key is `false` (i.e., at least one instance is required).\n\n## Examples\n\nIn this example, we have configured repeating parser to treat instances as optional.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n          optional: true\n```"
                      }
                    },
                    "required": [
                      "snippet"
                    ],
                    "markdownDescription": "This key defines configuration options for repeating parser configurations.\n\nThe value is an object that can contain `snippet`, `editor_key`, `output_delimiter`, `default_length`, `style`, and `optional` properties. These options control which snippet configuration is repeated and how repetitions are handled.\n\n## Examples\n\nIn this example, we have configured repeating parser options with a snippet reference.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for repeating parser configurations.\n\nThe value is an object that can contain `snippet`, `editor_key`, `output_delimiter`, `default_length`, `style`, and `optional` properties. These options control which snippet configuration is repeated and how repetitions are handled.\n\n## Examples\n\nIn this example, we have configured repeating parser options with a snippet reference.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[repeating_content]]>>\"\n    params:\n      repeating_content:\n        parser: repeating\n        options:\n          snippet: 'content'\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key defines a higher-order parser configuration that wraps a snippet string and allows it to repeat.",
                "title": "Repeating Parser Configuration",
                "documented": true,
                "description": "This key defines a higher-order parser configuration that wraps a snippet string and allows it to repeat.",
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "parser": {
                    "type": "string",
                    "const": "wrapper",
                    "documented": true,
                    "title": "parser",
                    "description": "This key defines the parser type for wrapper parser configurations.\n\nThe value must be `wrapper`. This specifies that the parameter uses the wrapper parser, which wraps another snippet configuration.\n\n## Examples\n\nIn this example, we have configured a wrapper parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n```",
                    "markdownDescription": "This key defines the parser type for wrapper parser configurations.\n\nThe value must be `wrapper`. This specifies that the parameter uses the wrapper parser, which wraps another snippet configuration.\n\n## Examples\n\nIn this example, we have configured a wrapper parser for a snippet parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n```"
                  },
                  "options": {
                    "type": "object",
                    "properties": {
                      "snippet": {
                        "type": "string",
                        "documented": true,
                        "title": "snippet",
                        "description": "This key defines the snippet configuration to wrap for wrapper parser configurations.\n\nThe value is a string that specifies the key name of another snippet configuration defined in `_snippets`. This snippet configuration will be wrapped by the wrapper parser.\n\n## Examples\n\nIn this example, we have configured a snippet reference for wrapper parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n  content:\n    snippet: \"<<content [[text]]>>\"\n    params:\n      text:\n        parser: content\n        options:\n          editor_key: content_text\n```",
                        "markdownDescription": "This key defines the snippet configuration to wrap for wrapper parser configurations.\n\nThe value is a string that specifies the key name of another snippet configuration defined in `_snippets`. This snippet configuration will be wrapped by the wrapper parser.\n\n## Examples\n\nIn this example, we have configured a snippet reference for wrapper parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n  content:\n    snippet: \"<<content [[text]]>>\"\n    params:\n      text:\n        parser: content\n        options:\n          editor_key: content_text\n```"
                      },
                      "remove_empty": {
                        "type": "boolean",
                        "documented": true,
                        "title": "remove_empty",
                        "description": "This key toggles whether CloudCannon will remove empty values from wrapper parser configurations.\n\nSetting this key to `true` will remove empty values from the wrapped snippet configuration.\n\nBy default, this key is `false` (i.e., empty values are not removed).\n\n## Examples\n\nIn this example, we have configured wrapper parser to remove empty values.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n          remove_empty: true\n```",
                        "markdownDescription": "This key toggles whether CloudCannon will remove empty values from wrapper parser configurations.\n\nSetting this key to `true` will remove empty values from the wrapped snippet configuration.\n\nBy default, this key is `false` (i.e., empty values are not removed).\n\n## Examples\n\nIn this example, we have configured wrapper parser to remove empty values.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n          remove_empty: true\n```"
                      },
                      "style": {
                        "$ref": "#/$defs/type.snippet-style"
                      }
                    },
                    "required": [
                      "snippet"
                    ],
                    "markdownDescription": "This key defines configuration options for wrapper parser configurations.\n\nThe value is an object that can contain `snippet` and `remove_empty` properties. These options control which snippet configuration is wrapped and whether empty values are removed.\n\n## Examples\n\nIn this example, we have configured wrapper parser options with a snippet reference.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n```",
                    "documented": true,
                    "title": "options",
                    "description": "This key defines configuration options for wrapper parser configurations.\n\nThe value is an object that can contain `snippet` and `remove_empty` properties. These options control which snippet configuration is wrapped and whether empty values are removed.\n\n## Examples\n\nIn this example, we have configured wrapper parser options with a snippet reference.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n```",
                    "additionalProperties": false
                  }
                },
                "required": [
                  "parser",
                  "options"
                ],
                "markdownDescription": "This key defines a wrapper parser configuration for wrapping another snippet configuration.\n\nThe value is an object that contains a `parser` property set to `wrapper` and an `options` object with `snippet` and optional `remove_empty` properties. The wrapper parser wraps another snippet configuration, allowing it to be used within a different snippet context.\n\n## Examples\n\nIn this example, we have configured a wrapper parser to wrap a content snippet.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n  content:\n    snippet: \"<<content [[text]]>>\"\n    params:\n      text:\n        parser: content\n        options:\n          editor_key: content_text\n```",
                "title": "Wrapper Parser Configuration",
                "documented": true,
                "description": "This key defines a wrapper parser configuration for wrapping another snippet configuration.\n\nThe value is an object that contains a `parser` property set to `wrapper` and an `options` object with `snippet` and optional `remove_empty` properties. The wrapper parser wraps another snippet configuration, allowing it to be used within a different snippet context.\n\n## Examples\n\nIn this example, we have configured a wrapper parser to wrap a content snippet.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[wrapped_content]]>>\"\n    params:\n      wrapped_content:\n        parser: wrapper\n        options:\n          snippet: 'content'\n  content:\n    snippet: \"<<content [[text]]>>\"\n    params:\n      text:\n        parser: content\n        options:\n          editor_key: content_text\n```",
                "additionalProperties": false
              }
            ],
            "documented": true,
            "title": "params.*",
            "description": "This key represents an individual snippet parameter configuration in the `params` object.\n\nThe value is an object that defines a parser configuration for a snippet parameter. Each parameter can use different parser types (argument, content, literal, etc.) with their specific options.\n\n## Examples\n\nIn this example, we have configured a snippet parameter using an argument parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            editor_key: example_id\n```",
            "markdownDescription": "This key represents an individual snippet parameter configuration in the `params` object.\n\nThe value is an object that defines a parser configuration for a snippet parameter. Each parameter can use different parser types (argument, content, literal, etc.) with their specific options.\n\n## Examples\n\nIn this example, we have configured a snippet parameter using an argument parser.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            editor_key: example_id\n```"
          }
        }
      },
      "markdownDescription": "This key defines a snippet configuration.",
      "title": "Snippet",
      "description": "This key defines a snippet configuration.",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "This key defines which inputs are available at a given level of the configuration cascade.\n\nThis key has no default.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_inputs` will default to any\nvalues configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\n## Examples\n\nIn this example, we have configured the `date_created` key as a *Date and Time Input*, which will automatically populate when you create a file using this input. Editors cannot alter this input as the interface is disabled.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    comment: UTC +0 timezone\n    context:\n      open: false\n      title: Help\n      icon: help\n      content: This date field will automatically populate when you create an article.\n    hidden: false\n    disabled: true\n    instance_value: NOW\n    cascade: true\n    options:\n      timezone: Etc/UTC\n```\n\nIn this example, we have configured the `blog_tags` key as a *Multiselect Input* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _inputs:\n      blog_tags:\n        type: multiselect\n        label: Blog type\n        comment: Select a blog type\n        context:\n          open: false\n          title: Help\n          icon: help\n          content: |\n            Blog tags help our users filter articles by topic.\n        options:\n          values:\n            - Opinion\n            - Feature\n            - Resource\n```",
      "title": "Inputs",
      "description": "This key defines which inputs are available at a given level of the configuration cascade.\n\nThis key has no default.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_inputs` will default to any\nvalues configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\n## Examples\n\nIn this example, we have configured the `date_created` key as a *Date and Time Input*, which will automatically populate when you create a file using this input. Editors cannot alter this input as the interface is disabled.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    comment: UTC +0 timezone\n    context:\n      open: false\n      title: Help\n      icon: help\n      content: This date field will automatically populate when you create an article.\n    hidden: false\n    disabled: true\n    instance_value: NOW\n    cascade: true\n    options:\n      timezone: Etc/UTC\n```\n\nIn this example, we have configured the `blog_tags` key as a *Multiselect Input* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _inputs:\n      blog_tags:\n        type: multiselect\n        label: Blog type\n        comment: Select a blog type\n        context:\n          open: false\n          title: Help\n          icon: help\n          content: |\n            Blog tags help our users filter articles by topic.\n        options:\n          values:\n            - Opinion\n            - Feature\n            - Resource\n```",
      "documented": true,
      "additionalProperties": {
        "$ref": "#/$defs/Input"
      }
    },
    "Input": {
      "anyOf": [
        {
          "oneOf": [
            {
              "$ref": "#/$defs/TextInput"
            },
            {
              "$ref": "#/$defs/TextareaInput"
            },
            {
              "$ref": "#/$defs/CodeInput"
            },
            {
              "$ref": "#/$defs/ColorInput"
            },
            {
              "$ref": "#/$defs/BooleanInput"
            },
            {
              "$ref": "#/$defs/NumberInput"
            },
            {
              "$ref": "#/$defs/RangeInput"
            },
            {
              "$ref": "#/$defs/RichTextInput"
            },
            {
              "$ref": "#/$defs/DateInput"
            },
            {
              "$ref": "#/$defs/TimeInput"
            },
            {
              "$ref": "#/$defs/FileInput"
            },
            {
              "$ref": "#/$defs/UrlInput"
            },
            {
              "$ref": "#/$defs/SelectInput"
            },
            {
              "$ref": "#/$defs/MultiselectInput"
            },
            {
              "$ref": "#/$defs/ChoiceInput"
            },
            {
              "$ref": "#/$defs/MultichoiceInput"
            },
            {
              "$ref": "#/$defs/ObjectInput"
            },
            {
              "$ref": "#/$defs/ArrayInput"
            },
            {
              "$ref": "#/$defs/AutoInput"
            }
          ],
          "title": "Known Input",
          "description": "This key defines an input configuration at a given level of the configuration cascade.\n\nThe value is an object that can contain `type`, `label`, `options`, `disabled`, `hidden`, and other input-specific properties. Each input configuration defines how team members interact with data in the *Data Editor*.\n\nFor more information, please read our documentation on [inputs](https://cloudcannon.com/documentation/articles/what-are-inputs/).\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _inputs:\n      title:\n        type: text\n        label: Title\n```",
          "documented": true,
          "markdownDescription": "This key defines an input configuration at a given level of the configuration cascade.\n\nThe value is an object that can contain `type`, `label`, `options`, `disabled`, `hidden`, and other input-specific properties. Each input configuration defines how team members interact with data in the *Data Editor*.\n\nFor more information, please read our documentation on [inputs](https://cloudcannon.com/documentation/articles/what-are-inputs/).\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _inputs:\n      title:\n        type: text\n        label: Title\n```"
        },
        {
          "$ref": "#/$defs/UnknownInput"
        }
      ],
      "title": "Input",
      "documented": true,
      "description": "This key defines an input configuration at a given level of the configuration cascade.\n\nThe value is an object that can contain `type`, `label`, `options`, `disabled`, `hidden`, and other input-specific properties. Each input configuration defines how team members interact with data in the *Data Editor*.\n\nFor more information, please read our documentation on [inputs](https://cloudcannon.com/documentation/articles/what-are-inputs/).\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _inputs:\n      title:\n        type: text\n        label: Title\n```",
      "markdownDescription": "This key defines an input configuration at a given level of the configuration cascade.\n\nThe value is an object that can contain `type`, `label`, `options`, `disabled`, `hidden`, and other input-specific properties. Each input configuration defines how team members interact with data in the *Data Editor*.\n\nFor more information, please read our documentation on [inputs](https://cloudcannon.com/documentation/articles/what-are-inputs/).\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _inputs:\n      title:\n        type: text\n        label: Title\n```"
    },
    "TextInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "enum": [
            "text",
            "email",
            "disabled",
            "pinterest",
            "facebook",
            "twitter",
            "github",
            "instagram"
          ],
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input* type.\n\n```yaml\n_inputs:\n  title:\n    type: text\n```",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input* type.\n\n```yaml\n_inputs:\n  title:\n    type: text\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "placeholder": {
              "description": "This key defines the text shown when this input has no value.\n\n## Examples\n\nIn this example, we have configured a placeholder for a *Text Input*.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    options:\n      placeholder: Enter a title\n```",
              "type": "string",
              "documented": true,
              "title": "placeholder",
              "markdownDescription": "This key defines the text shown when this input has no value.\n\n## Examples\n\nIn this example, we have configured a placeholder for a *Text Input*.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    options:\n      placeholder: Enter a title\n```"
            },
            "icon": {
              "description": "This key defines the icon shown beside the input.\n\n## Examples\n\nIn this example, we have configured an icon for the *Text Input* `title`.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    options:\n      icon: title\n```",
              "allOf": [
                {
                  "$ref": "#/$defs/icon"
                }
              ],
              "documented": true,
              "title": "icon",
              "markdownDescription": "This key defines the icon shown beside the input.\n\n## Examples\n\nIn this example, we have configured an icon for the *Text Input* `title`.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    options:\n      icon: title\n```"
            },
            "icon_color": {
              "allOf": [
                {
                  "$ref": "#/$defs/PreviewEntries"
                }
              ],
              "documented": true,
              "title": "icon_color",
              "description": "This key defines the color of the icon displayed beside a *Text Input*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon color for a text input with an array of values to provide fallback options. CloudCannon will use the value of `icon_color` first, then fall back to the static hex color value.\n\n```yaml\n_inputs:\n  email_address:\n    type: text\n    label: Email\n    options:\n      icon: email\n      icon_color:\n        - key: icon_color\n        - text: '#2196F3'\n```\n\nIn this example, we have configured the icon color to use a static CSS color value.\n\n```yaml\n_inputs:\n  phone_number:\n    type: text\n    label: Phone\n    options:\n      icon: phone\n      icon_color:\n        - text: 'blue'\n```",
              "markdownDescription": "This key defines the color of the icon displayed beside a *Text Input*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon color for a text input with an array of values to provide fallback options. CloudCannon will use the value of `icon_color` first, then fall back to the static hex color value.\n\n```yaml\n_inputs:\n  email_address:\n    type: text\n    label: Email\n    options:\n      icon: email\n      icon_color:\n        - key: icon_color\n        - text: '#2196F3'\n```\n\nIn this example, we have configured the icon color to use a static CSS color value.\n\n```yaml\n_inputs:\n  phone_number:\n    type: text\n    label: Phone\n    options:\n      icon: phone\n      icon_color:\n        - text: 'blue'\n```"
            },
            "icon_background_color": {
              "allOf": [
                {
                  "$ref": "#/$defs/PreviewEntries"
                }
              ],
              "documented": true,
              "title": "icon_background_color",
              "description": "This key defines the background color of the icon displayed beside a *Text Input*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon background color for a text input with an array of values to provide fallback options. CloudCannon will use the value of `icon_bg_color` first, then fall back to the static hex color value.\n\n```yaml\n_inputs:\n  email_address:\n    type: text\n    label: Email\n    options:\n      icon: email\n      icon_background_color:\n        - key: icon_bg_color\n        - text: '#e3f2fd'\n```\n\nIn this example, we have configured the icon background color to use a static CSS color value.\n\n```yaml\n_inputs:\n  phone_number:\n    type: text\n    label: Phone\n    options:\n      icon: phone\n      icon_background_color:\n        - text: 'lightblue'\n```",
              "markdownDescription": "This key defines the background color of the icon displayed beside a *Text Input*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon background color for a text input with an array of values to provide fallback options. CloudCannon will use the value of `icon_bg_color` first, then fall back to the static hex color value.\n\n```yaml\n_inputs:\n  email_address:\n    type: text\n    label: Email\n    options:\n      icon: email\n      icon_background_color:\n        - key: icon_bg_color\n        - text: '#e3f2fd'\n```\n\nIn this example, we have configured the icon background color to use a static CSS color value.\n\n```yaml\n_inputs:\n  phone_number:\n    type: text\n    label: Phone\n    options:\n      icon: phone\n      icon_background_color:\n        - text: 'lightblue'\n```"
            }
          },
          "markdownDescription": "This key defines options that are specific to Text Inputs.\n\n## Examples\n\nIn this example, we have configured *Text Input* options including comment and icon.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    options:\n      comment: Enter a title\n      icon: title\n```",
          "description": "This key defines options that are specific to Text Inputs.\n\n## Examples\n\nIn this example, we have configured *Text Input* options including comment and icon.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    options:\n      comment: Enter a title\n      icon: title\n```",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines a simple editing interface for plain text.\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input*.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    label: Blog Title\n```",
      "title": "Text Input",
      "description": "This key defines a simple editing interface for plain text.\n\n## Examples\n\nIn this example, we have configured the `title` key as a *Text Input*.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    label: Blog Title\n```",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs.*.comment": {
      "description": "This key defines the subtitle text above an Input.\n\nCloudCannon supports a limited selection of Markdown formatting for the value of this key: links, bold, italic, subscript, superscript, and inline\ncode.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to add helpful guidance for our `page_description` Input.\n\n```yaml\n_inputs:\n  page_description:\n    type: text\n    label: Page Description\n    comment: Enter a brief description of this page for search engines\n```",
      "type": "string",
      "documented": true,
      "title": "comment",
      "markdownDescription": "This key defines the subtitle text above an Input.\n\nCloudCannon supports a limited selection of Markdown formatting for the value of this key: links, bold, italic, subscript, superscript, and inline\ncode.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to add helpful guidance for our `page_description` Input.\n\n```yaml\n_inputs:\n  page_description:\n    type: text\n    label: Page Description\n    comment: Enter a brief description of this page for search engines\n```"
    },
    "type._inputs.*.context": {
      "type": "object",
      "properties": {
        "content": {
          "description": "This key defines the text content inside the context box.\n\nCloudCannon supports a limited selection of Markdown formatting for the value of this key: links, headings, bold, italic, subscript, superscript, and\ninline code.\n\nThis key is required for the `context` object to function.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to provide detailed guidance for our `blog_tags` Input.\n\n```yaml\n_inputs:\n  blog_tags:\n    type: multiselect\n    label: Blog Tags\n    context:\n      title: Tag Guidelines\n      icon: help\n      content: |\n        # Tag Guidelines\n\n        Choose 3-5 relevant tags that best describe this article. Tags help readers find related content and improve SEO.\n\n        **Good examples:** technology, web development, tutorials\n        **Avoid:** generic terms like \"blog\" or \"article\"\n```",
          "type": "string",
          "documented": true,
          "title": "content",
          "markdownDescription": "This key defines the text content inside the context box.\n\nCloudCannon supports a limited selection of Markdown formatting for the value of this key: links, headings, bold, italic, subscript, superscript, and\ninline code.\n\nThis key is required for the `context` object to function.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to provide detailed guidance for our `blog_tags` Input.\n\n```yaml\n_inputs:\n  blog_tags:\n    type: multiselect\n    label: Blog Tags\n    context:\n      title: Tag Guidelines\n      icon: help\n      content: |\n        # Tag Guidelines\n\n        Choose 3-5 relevant tags that best describe this article. Tags help readers find related content and improve SEO.\n\n        **Good examples:** technology, web development, tutorials\n        **Avoid:** generic terms like \"blog\" or \"article\"\n```"
        },
        "open": {
          "description": "This key defines whether the context box is open to display text content by default.\n\nBy default, this key is `false` (i.e., closed).\n\n## Examples\n\nIn this example, we want the context box to be open by default so users can immediately see the help information.\n\n```yaml\n_inputs:\n  seo_description:\n    type: text\n    label: SEO Description\n    context:\n      open: true\n      title: SEO Guidelines\n      icon: info\n      content: Keep descriptions between 150-160 characters for optimal search engine display.\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "open",
          "markdownDescription": "This key defines whether the context box is open to display text content by default.\n\nBy default, this key is `false` (i.e., closed).\n\n## Examples\n\nIn this example, we want the context box to be open by default so users can immediately see the help information.\n\n```yaml\n_inputs:\n  seo_description:\n    type: text\n    label: SEO Description\n    context:\n      open: true\n      title: SEO Guidelines\n      icon: info\n      content: Keep descriptions between 150-160 characters for optimal search engine display.\n```"
        },
        "title": {
          "description": "This key defines the title of the context box.\n\n## Examples\n\nIn this example, we want to customize the context box title to be more descriptive for our `author_bio` Input.\n\n```yaml\n_inputs:\n  author_bio:\n    type: textarea\n    label: Author Biography\n    context:\n      title: Writing Guidelines\n      icon: edit\n      content: Write a brief, professional biography (2-3 sentences) that highlights your expertise and experience.\n```",
          "type": "string",
          "documented": true,
          "title": "title",
          "markdownDescription": "This key defines the title of the context box.\n\n## Examples\n\nIn this example, we want to customize the context box title to be more descriptive for our `author_bio` Input.\n\n```yaml\n_inputs:\n  author_bio:\n    type: textarea\n    label: Author Biography\n    context:\n      title: Writing Guidelines\n      icon: edit\n      content: Write a brief, professional biography (2-3 sentences) that highlights your expertise and experience.\n```"
        },
        "icon": {
          "description": "This key defines which icon appears next to the context box title.\n\nThe value must match an icon name from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded) list.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to use a warning icon to draw attention to important information about our `file_upload` Input.\n\n```yaml\n_inputs:\n  file_upload:\n    type: file\n    label: Upload Document\n    context:\n      title: File Requirements\n      icon: warning\n      content: Maximum file size is 10MB.\n    options:\n      max_file_size: 10000\n```",
          "allOf": [
            {
              "$ref": "#/$defs/icon"
            }
          ],
          "documented": true,
          "title": "icon",
          "markdownDescription": "This key defines which icon appears next to the context box title.\n\nThe value must match an icon name from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded) list.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to use a warning icon to draw attention to important information about our `file_upload` Input.\n\n```yaml\n_inputs:\n  file_upload:\n    type: file\n    label: Upload Document\n    context:\n      title: File Requirements\n      icon: warning\n      content: Maximum file size is 10MB.\n    options:\n      max_file_size: 10000\n```"
        }
      },
      "markdownDescription": "This key defines a context box for extra information about an Input.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to add a context box to our `date_created` Input to explain its purpose.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    instance_value: NOW\n    context:\n      open: false\n      title: Help\n      icon: help\n      content: This date field will automatically populate when you create an article.\n```",
      "description": "This key defines a context box for extra information about an Input.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to add a context box to our `date_created` Input to explain its purpose.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    instance_value: NOW\n    context:\n      open: false\n      title: Help\n      icon: help\n      content: This date field will automatically populate when you create an article.\n```",
      "documented": true,
      "title": "context",
      "additionalProperties": false
    },
    "icon": {
      "type": "string",
      "enum": [
        "123",
        "360",
        "10k",
        "10mp",
        "11mp",
        "12mp",
        "13mp",
        "14mp",
        "15mp",
        "16mp",
        "17mp",
        "18_up_rating",
        "18mp",
        "19mp",
        "1k",
        "1k_plus",
        "1x_mobiledata",
        "1x_mobiledata_badge",
        "20mp",
        "21mp",
        "22mp",
        "23mp",
        "24fps_select",
        "24mp",
        "2d",
        "2k",
        "2k_plus",
        "2mp",
        "30fps",
        "30fps_select",
        "3d",
        "3d_rotation",
        "3g_mobiledata",
        "3g_mobiledata_badge",
        "3k",
        "3k_plus",
        "3mp",
        "3p",
        "4g_mobiledata",
        "4g_mobiledata_badge",
        "4g_plus_mobiledata",
        "4k",
        "4k_plus",
        "4mp",
        "50mp",
        "5g",
        "5g_mobiledata_badge",
        "5k",
        "5k_plus",
        "5mp",
        "60fps",
        "60fps_select",
        "6_ft_apart",
        "6k",
        "6k_plus",
        "6mp",
        "7k",
        "7k_plus",
        "7mp",
        "8k",
        "8k_plus",
        "8mp",
        "9k",
        "9k_plus",
        "9mp",
        "abc",
        "ac_unit",
        "accessibility",
        "accessibility_new",
        "accessible",
        "accessible_forward",
        "accessible_menu",
        "account_balance",
        "account_balance_wallet",
        "account_box",
        "account_child",
        "account_child_invert",
        "account_circle",
        "account_circle_off",
        "account_tree",
        "action_key",
        "activity_zone",
        "acute",
        "ad",
        "ad_group",
        "ad_group_off",
        "ad_off",
        "ad_units",
        "adaptive_audio_mic",
        "adaptive_audio_mic_off",
        "adb",
        "add",
        "add_2",
        "add_a_photo",
        "add_ad",
        "add_alert",
        "add_box",
        "add_business",
        "add_call",
        "add_card",
        "add_chart",
        "add_circle",
        "add_column_left",
        "add_column_right",
        "add_comment",
        "add_diamond",
        "add_home",
        "add_home_work",
        "add_link",
        "add_location",
        "add_location_alt",
        "add_moderator",
        "add_notes",
        "add_photo_alternate",
        "add_reaction",
        "add_road",
        "add_row_above",
        "add_row_below",
        "add_shopping_cart",
        "add_task",
        "add_to_drive",
        "add_to_home_screen",
        "add_to_queue",
        "add_triangle",
        "adf_scanner",
        "adjust",
        "admin_meds",
        "admin_panel_settings",
        "ads_click",
        "agender",
        "agriculture",
        "air",
        "air_freshener",
        "air_purifier",
        "air_purifier_gen",
        "airline_seat_flat",
        "airline_seat_flat_angled",
        "airline_seat_individual_suite",
        "airline_seat_legroom_extra",
        "airline_seat_legroom_normal",
        "airline_seat_legroom_reduced",
        "airline_seat_recline_extra",
        "airline_seat_recline_normal",
        "airline_stops",
        "airlines",
        "airplane_ticket",
        "airplanemode_inactive",
        "airplay",
        "airport_shuttle",
        "airware",
        "airwave",
        "alarm",
        "alarm_add",
        "alarm_off",
        "alarm_on",
        "alarm_pause",
        "alarm_smart_wake",
        "album",
        "align_center",
        "align_end",
        "align_flex_center",
        "align_flex_end",
        "align_flex_start",
        "align_horizontal_center",
        "align_horizontal_left",
        "align_horizontal_right",
        "align_items_stretch",
        "align_justify_center",
        "align_justify_flex_end",
        "align_justify_flex_start",
        "align_justify_space_around",
        "align_justify_space_between",
        "align_justify_space_even",
        "align_justify_stretch",
        "align_self_stretch",
        "align_space_around",
        "align_space_between",
        "align_space_even",
        "align_start",
        "align_stretch",
        "align_vertical_bottom",
        "align_vertical_center",
        "align_vertical_top",
        "all_inbox",
        "all_inclusive",
        "all_match",
        "all_out",
        "allergies",
        "allergy",
        "alt_route",
        "alternate_email",
        "altitude",
        "ambulance",
        "amend",
        "amp_stories",
        "analytics",
        "anchor",
        "android",
        "animated_images",
        "animation",
        "aod",
        "aod_tablet",
        "aod_watch",
        "apartment",
        "api",
        "apk_document",
        "apk_install",
        "app_badging",
        "app_blocking",
        "app_registration",
        "apparel",
        "approval",
        "approval_delegation",
        "apps",
        "apps_outage",
        "aq",
        "aq_indoor",
        "ar_on_you",
        "ar_stickers",
        "architecture",
        "archive",
        "area_chart",
        "arming_countdown",
        "arrow_and_edge",
        "arrow_back",
        "arrow_back_2",
        "arrow_back_ios",
        "arrow_back_ios_new",
        "arrow_circle_down",
        "arrow_circle_left",
        "arrow_circle_right",
        "arrow_circle_up",
        "arrow_cool_down",
        "arrow_downward",
        "arrow_downward_alt",
        "arrow_drop_down",
        "arrow_drop_down_circle",
        "arrow_drop_up",
        "arrow_forward",
        "arrow_forward_ios",
        "arrow_insert",
        "arrow_left",
        "arrow_left_alt",
        "arrow_menu_close",
        "arrow_menu_open",
        "arrow_or_edge",
        "arrow_outward",
        "arrow_range",
        "arrow_right",
        "arrow_right_alt",
        "arrow_selector_tool",
        "arrow_split",
        "arrow_top_left",
        "arrow_top_right",
        "arrow_upload_progress",
        "arrow_upload_ready",
        "arrow_upward",
        "arrow_upward_alt",
        "arrow_warm_up",
        "arrows_input",
        "arrows_more_down",
        "arrows_more_up",
        "arrows_output",
        "arrows_outward",
        "art_track",
        "article",
        "article_person",
        "article_shortcut",
        "artist",
        "aspect_ratio",
        "assignment",
        "assignment_add",
        "assignment_ind",
        "assignment_late",
        "assignment_return",
        "assignment_returned",
        "assignment_turned_in",
        "assist_walker",
        "assistant_device",
        "assistant_direction",
        "assistant_navigation",
        "assistant_on_hub",
        "assured_workload",
        "asterisk",
        "atm",
        "atr",
        "attach_email",
        "attach_file",
        "attach_file_add",
        "attach_file_off",
        "attach_money",
        "attachment",
        "attractions",
        "attribution",
        "audio_description",
        "audio_file",
        "audio_video_receiver",
        "auto_awesome_mosaic",
        "auto_awesome_motion",
        "auto_delete",
        "auto_read_pause",
        "auto_read_play",
        "auto_stories",
        "auto_towing",
        "auto_transmission",
        "autofps_select",
        "automation",
        "autopause",
        "autoplay",
        "autorenew",
        "autostop",
        "av1",
        "av_timer",
        "avc",
        "avg_pace",
        "avg_time",
        "award_star",
        "azm",
        "baby_changing_station",
        "back_hand",
        "back_to_tab",
        "background_dot_large",
        "background_dot_small",
        "background_grid_small",
        "background_replace",
        "backlight_high",
        "backlight_high_off",
        "backlight_low",
        "backpack",
        "backspace",
        "backup",
        "backup_table",
        "badge",
        "badge_critical_battery",
        "bakery_dining",
        "balance",
        "balcony",
        "ballot",
        "bar_chart",
        "bar_chart_4_bars",
        "bar_chart_off",
        "barcode",
        "barcode_reader",
        "barcode_scanner",
        "barefoot",
        "batch_prediction",
        "bath_outdoor",
        "bath_private",
        "bath_public_large",
        "bathroom",
        "bathtub",
        "battery_0_bar",
        "battery_1_bar",
        "battery_2_bar",
        "battery_3_bar",
        "battery_4_bar",
        "battery_5_bar",
        "battery_6_bar",
        "battery_alert",
        "battery_android_0",
        "battery_android_1",
        "battery_android_2",
        "battery_android_3",
        "battery_android_4",
        "battery_android_5",
        "battery_android_6",
        "battery_android_alert",
        "battery_android_bolt",
        "battery_android_full",
        "battery_android_plus",
        "battery_android_question",
        "battery_android_share",
        "battery_android_shield",
        "battery_change",
        "battery_charging_20",
        "battery_charging_30",
        "battery_charging_50",
        "battery_charging_60",
        "battery_charging_80",
        "battery_charging_90",
        "battery_charging_full",
        "battery_error",
        "battery_full",
        "battery_full_alt",
        "battery_horiz_000",
        "battery_horiz_050",
        "battery_horiz_075",
        "battery_low",
        "battery_plus",
        "battery_profile",
        "battery_saver",
        "battery_share",
        "battery_status_good",
        "battery_unknown",
        "battery_very_low",
        "beach_access",
        "bed",
        "bedroom_baby",
        "bedroom_child",
        "bedroom_parent",
        "bedtime",
        "bedtime_off",
        "beenhere",
        "bento",
        "bia",
        "bid_landscape",
        "bid_landscape_disabled",
        "bigtop_updates",
        "bike_dock",
        "bike_lane",
        "bike_scooter",
        "biotech",
        "blanket",
        "blender",
        "blind",
        "blinds",
        "blinds_closed",
        "block",
        "blood_pressure",
        "bloodtype",
        "bluetooth",
        "bluetooth_connected",
        "bluetooth_disabled",
        "bluetooth_drive",
        "bluetooth_searching",
        "blur_circular",
        "blur_linear",
        "blur_medium",
        "blur_off",
        "blur_on",
        "blur_short",
        "boat_bus",
        "boat_railway",
        "body_fat",
        "body_system",
        "bolt",
        "bomb",
        "book",
        "book_2",
        "book_3",
        "book_4",
        "book_5",
        "book_6",
        "book_online",
        "book_ribbon",
        "bookmark",
        "bookmark_add",
        "bookmark_added",
        "bookmark_bag",
        "bookmark_check",
        "bookmark_flag",
        "bookmark_heart",
        "bookmark_manager",
        "bookmark_remove",
        "bookmark_star",
        "bookmarks",
        "books_movies_and_music",
        "border_all",
        "border_bottom",
        "border_clear",
        "border_color",
        "border_horizontal",
        "border_inner",
        "border_left",
        "border_outer",
        "border_right",
        "border_style",
        "border_top",
        "border_vertical",
        "borg",
        "bottom_app_bar",
        "bottom_drawer",
        "bottom_navigation",
        "bottom_panel_close",
        "bottom_panel_open",
        "bottom_right_click",
        "bottom_sheets",
        "box",
        "box_add",
        "box_edit",
        "boy",
        "brand_awareness",
        "brand_family",
        "branding_watermark",
        "breakfast_dining",
        "breaking_news",
        "breaking_news_alt_1",
        "breastfeeding",
        "brick",
        "brightness_1",
        "brightness_2",
        "brightness_3",
        "brightness_4",
        "brightness_5",
        "brightness_6",
        "brightness_7",
        "brightness_alert",
        "brightness_auto",
        "brightness_empty",
        "brightness_medium",
        "bring_your_own_ip",
        "broadcast_on_home",
        "broadcast_on_personal",
        "broken_image",
        "browse",
        "browse_activity",
        "browse_gallery",
        "browser_updated",
        "brunch_dining",
        "brush",
        "bubble",
        "bubble_chart",
        "bubbles",
        "bug_report",
        "build",
        "build_circle",
        "bungalow",
        "burst_mode",
        "bus_alert",
        "bus_railway",
        "business_center",
        "business_chip",
        "business_messages",
        "buttons_alt",
        "cabin",
        "cable",
        "cable_car",
        "cached",
        "cadence",
        "cake",
        "cake_add",
        "calculate",
        "calendar_add_on",
        "calendar_apps_script",
        "calendar_clock",
        "calendar_month",
        "calendar_today",
        "calendar_view_day",
        "calendar_view_month",
        "calendar_view_week",
        "call",
        "call_end",
        "call_log",
        "call_made",
        "call_merge",
        "call_missed",
        "call_missed_outgoing",
        "call_quality",
        "call_received",
        "call_split",
        "call_to_action",
        "camera",
        "camera_front",
        "camera_indoor",
        "camera_outdoor",
        "camera_rear",
        "camera_roll",
        "camera_video",
        "cameraswitch",
        "campaign",
        "camping",
        "cancel",
        "cancel_presentation",
        "cancel_schedule_send",
        "candle",
        "candlestick_chart",
        "cannabis",
        "captive_portal",
        "capture",
        "car_crash",
        "car_defrost_left",
        "car_defrost_low_left",
        "car_defrost_low_right",
        "car_defrost_mid_low_left",
        "car_defrost_mid_right",
        "car_defrost_right",
        "car_fan_low_left",
        "car_fan_low_mid_left",
        "car_fan_low_right",
        "car_fan_mid_left",
        "car_fan_mid_low_right",
        "car_fan_mid_right",
        "car_fan_recirculate",
        "car_gear",
        "car_lock",
        "car_mirror_heat",
        "car_rental",
        "car_repair",
        "car_tag",
        "card_membership",
        "card_travel",
        "cardio_load",
        "cardiology",
        "cards",
        "cards_star",
        "carpenter",
        "carry_on_bag",
        "carry_on_bag_checked",
        "carry_on_bag_inactive",
        "carry_on_bag_question",
        "cases",
        "casino",
        "cast",
        "cast_connected",
        "cast_for_education",
        "cast_pause",
        "cast_warning",
        "castle",
        "category",
        "category_search",
        "celebration",
        "cell_merge",
        "cell_tower",
        "cell_wifi",
        "center_focus_strong",
        "center_focus_weak",
        "chair",
        "chair_alt",
        "chalet",
        "change_circle",
        "change_history",
        "charger",
        "charging_station",
        "chart_data",
        "chat",
        "chat_add_on",
        "chat_apps_script",
        "chat_bubble",
        "chat_error",
        "chat_info",
        "chat_paste_go",
        "chat_paste_go_2",
        "check",
        "check_box",
        "check_box_outline_blank",
        "check_circle",
        "check_in_out",
        "check_indeterminate_small",
        "check_small",
        "checkbook",
        "checked_bag",
        "checked_bag_question",
        "checklist",
        "checklist_rtl",
        "checkroom",
        "cheer",
        "chef_hat",
        "chess",
        "chess_pawn",
        "chevron_backward",
        "chevron_forward",
        "chevron_left",
        "chevron_right",
        "child_care",
        "child_friendly",
        "chip_extraction",
        "chips",
        "chrome_reader_mode",
        "chromecast_2",
        "chromecast_device",
        "chronic",
        "church",
        "cinematic_blur",
        "circle",
        "circle_notifications",
        "circles",
        "circles_ext",
        "clarify",
        "clean_hands",
        "cleaning",
        "cleaning_bucket",
        "cleaning_services",
        "clear_all",
        "clear_day",
        "climate_mini_split",
        "clinical_notes",
        "clock_arrow_down",
        "clock_arrow_up",
        "clock_loader_10",
        "clock_loader_20",
        "clock_loader_40",
        "clock_loader_60",
        "clock_loader_80",
        "clock_loader_90",
        "close",
        "close_fullscreen",
        "close_small",
        "closed_caption",
        "closed_caption_add",
        "closed_caption_disabled",
        "cloud",
        "cloud_alert",
        "cloud_circle",
        "cloud_done",
        "cloud_download",
        "cloud_lock",
        "cloud_off",
        "cloud_sync",
        "cloud_upload",
        "co2",
        "co_present",
        "code",
        "code_blocks",
        "code_off",
        "coffee",
        "coffee_maker",
        "cognition",
        "cognition_2",
        "collapse_all",
        "collapse_content",
        "collections_bookmark",
        "colorize",
        "colors",
        "combine_columns",
        "comedy_mask",
        "comic_bubble",
        "comment",
        "comment_bank",
        "comments_disabled",
        "commit",
        "communication",
        "communities",
        "commute",
        "compare",
        "compare_arrows",
        "compass_calibration",
        "component_exchange",
        "compost",
        "compress",
        "computer",
        "computer_arrow_up",
        "computer_cancel",
        "concierge",
        "conditions",
        "confirmation_number",
        "congenital",
        "connect_without_contact",
        "connected_tv",
        "connecting_airports",
        "construction",
        "contact_emergency",
        "contact_mail",
        "contact_page",
        "contact_phone",
        "contact_support",
        "contactless",
        "contactless_off",
        "contacts",
        "contacts_product",
        "content_copy",
        "content_cut",
        "content_paste",
        "content_paste_go",
        "content_paste_off",
        "content_paste_search",
        "contextual_token",
        "contextual_token_add",
        "contract",
        "contract_delete",
        "contract_edit",
        "contrast",
        "contrast_circle",
        "contrast_rtl_off",
        "contrast_square",
        "control_camera",
        "control_point_duplicate",
        "controller_gen",
        "conversion_path",
        "conversion_path_off",
        "convert_to_text",
        "conveyor_belt",
        "cookie",
        "cookie_off",
        "cooking",
        "cool_to_dry",
        "copy_all",
        "copyright",
        "coronavirus",
        "corporate_fare",
        "cottage",
        "counter_0",
        "counter_1",
        "counter_2",
        "counter_3",
        "counter_4",
        "counter_5",
        "counter_6",
        "counter_7",
        "counter_8",
        "counter_9",
        "countertops",
        "create_new_folder",
        "credit_card",
        "credit_card_clock",
        "credit_card_gear",
        "credit_card_heart",
        "credit_card_off",
        "credit_score",
        "crib",
        "crisis_alert",
        "crop",
        "crop_16_9",
        "crop_3_2",
        "crop_5_4",
        "crop_7_5",
        "crop_9_16",
        "crop_free",
        "crop_landscape",
        "crop_portrait",
        "crop_rotate",
        "crop_square",
        "crossword",
        "crowdsource",
        "crown",
        "cruelty_free",
        "css",
        "csv",
        "currency_bitcoin",
        "currency_exchange",
        "currency_franc",
        "currency_lira",
        "currency_pound",
        "currency_ruble",
        "currency_rupee",
        "currency_rupee_circle",
        "currency_yen",
        "currency_yuan",
        "curtains",
        "curtains_closed",
        "custom_typography",
        "cycle",
        "cyclone",
        "dangerous",
        "dark_mode",
        "dashboard",
        "dashboard_2",
        "dashboard_customize",
        "data_alert",
        "data_array",
        "data_check",
        "data_exploration",
        "data_info_alert",
        "data_loss_prevention",
        "data_object",
        "data_saver_on",
        "data_table",
        "data_thresholding",
        "data_usage",
        "database",
        "database_off",
        "database_search",
        "database_upload",
        "dataset",
        "dataset_linked",
        "date_range",
        "deblur",
        "deceased",
        "decimal_decrease",
        "decimal_increase",
        "deck",
        "dehaze",
        "delete",
        "delete_forever",
        "delete_history",
        "delete_sweep",
        "delivery_truck_bolt",
        "delivery_truck_speed",
        "demography",
        "density_large",
        "density_medium",
        "density_small",
        "dentistry",
        "departure_board",
        "deployed_code",
        "deployed_code_account",
        "deployed_code_alert",
        "deployed_code_history",
        "deployed_code_update",
        "dermatology",
        "description",
        "deselect",
        "design_services",
        "desk",
        "deskphone",
        "desktop_access_disabled",
        "desktop_cloud",
        "desktop_cloud_stack",
        "desktop_landscape",
        "desktop_landscape_add",
        "desktop_mac",
        "desktop_portrait",
        "desktop_windows",
        "destruction",
        "details",
        "detection_and_zone",
        "detector",
        "detector_alarm",
        "detector_battery",
        "detector_co",
        "detector_offline",
        "detector_smoke",
        "detector_status",
        "developer_board",
        "developer_board_off",
        "developer_guide",
        "developer_mode",
        "developer_mode_tv",
        "device_band",
        "device_hub",
        "device_thermostat",
        "device_unknown",
        "devices",
        "devices_fold",
        "devices_fold_2",
        "devices_off",
        "devices_other",
        "devices_wearables",
        "dew_point",
        "diagnosis",
        "diagonal_line",
        "dialer_sip",
        "dialogs",
        "dialpad",
        "diamond",
        "dictionary",
        "difference",
        "digital_out_of_home",
        "digital_wellbeing",
        "dining",
        "dinner_dining",
        "directions",
        "directions_alt",
        "directions_alt_off",
        "directions_bike",
        "directions_boat",
        "directions_bus",
        "directions_car",
        "directions_off",
        "directions_railway",
        "directions_railway_2",
        "directions_run",
        "directions_subway",
        "directions_walk",
        "directory_sync",
        "dirty_lens",
        "disabled_by_default",
        "disabled_visible",
        "disc_full",
        "discover_tune",
        "dishwasher",
        "dishwasher_gen",
        "display_external_input",
        "display_settings",
        "distance",
        "diversity_1",
        "diversity_2",
        "diversity_3",
        "diversity_4",
        "dns",
        "do_not_disturb_off",
        "do_not_disturb_on",
        "do_not_disturb_on_total_silence",
        "do_not_step",
        "do_not_touch",
        "dock",
        "dock_to_bottom",
        "dock_to_left",
        "dock_to_right",
        "docs",
        "docs_add_on",
        "docs_apps_script",
        "document_scanner",
        "document_search",
        "domain",
        "domain_add",
        "domain_disabled",
        "domain_verification",
        "domain_verification_off",
        "domino_mask",
        "done_all",
        "done_outline",
        "donut_large",
        "donut_small",
        "door_back",
        "door_front",
        "door_open",
        "door_sensor",
        "door_sliding",
        "doorbell",
        "doorbell_3p",
        "doorbell_chime",
        "double_arrow",
        "downhill_skiing",
        "download",
        "download_2",
        "download_done",
        "download_for_offline",
        "downloading",
        "draft",
        "draft_orders",
        "drafts",
        "drag_click",
        "drag_handle",
        "drag_indicator",
        "drag_pan",
        "draw",
        "draw_abstract",
        "draw_collage",
        "dresser",
        "drive_export",
        "drive_file_move",
        "drive_folder_upload",
        "dropdown",
        "dropper_eye",
        "dry",
        "dry_cleaning",
        "dual_screen",
        "duo",
        "dvr",
        "dynamic_feed",
        "dynamic_form",
        "e911_avatar",
        "e911_emergency",
        "e_mobiledata",
        "e_mobiledata_badge",
        "ear_sound",
        "earbud_case",
        "earbud_left",
        "earbud_right",
        "earbuds",
        "earbuds_2",
        "earbuds_battery",
        "early_on",
        "earthquake",
        "east",
        "ecg",
        "ecg_heart",
        "eco",
        "eda",
        "edgesensor_high",
        "edgesensor_low",
        "edit",
        "edit_arrow_down",
        "edit_arrow_up",
        "edit_attributes",
        "edit_audio",
        "edit_calendar",
        "edit_document",
        "edit_location",
        "edit_location_alt",
        "edit_note",
        "edit_notifications",
        "edit_off",
        "edit_road",
        "edit_square",
        "editor_choice",
        "egg",
        "egg_alt",
        "eject",
        "elderly",
        "elderly_woman",
        "electric_bike",
        "electric_bolt",
        "electric_car",
        "electric_meter",
        "electric_moped",
        "electric_rickshaw",
        "electric_scooter",
        "electrical_services",
        "elevation",
        "elevator",
        "emergency",
        "emergency_heat",
        "emergency_heat_2",
        "emergency_home",
        "emergency_recording",
        "emergency_share",
        "emergency_share_off",
        "emoji_food_beverage",
        "emoji_language",
        "emoji_nature",
        "emoji_objects",
        "emoji_people",
        "emoji_symbols",
        "emoji_transportation",
        "emoticon",
        "empty_dashboard",
        "enable",
        "encrypted",
        "encrypted_add",
        "encrypted_add_circle",
        "encrypted_minus_circle",
        "encrypted_off",
        "endocrinology",
        "energy",
        "energy_program_saving",
        "energy_program_time_used",
        "energy_savings_leaf",
        "engineering",
        "enhanced_encryption",
        "ent",
        "enterprise",
        "enterprise_off",
        "equal",
        "equalizer",
        "eraser_size_1",
        "eraser_size_2",
        "eraser_size_3",
        "eraser_size_4",
        "eraser_size_5",
        "error",
        "error_med",
        "escalator",
        "escalator_warning",
        "euro",
        "euro_symbol",
        "ev_mobiledata_badge",
        "ev_shadow",
        "ev_shadow_add",
        "ev_shadow_minus",
        "ev_station",
        "event",
        "event_available",
        "event_busy",
        "event_list",
        "event_note",
        "event_repeat",
        "event_seat",
        "event_upcoming",
        "exclamation",
        "exercise",
        "exit_to_app",
        "expand",
        "expand_all",
        "expand_circle_down",
        "expand_circle_right",
        "expand_circle_up",
        "expand_content",
        "expansion_panels",
        "experiment",
        "explicit",
        "explore",
        "explore_nearby",
        "explore_off",
        "explosion",
        "export_notes",
        "exposure",
        "exposure_neg_1",
        "exposure_neg_2",
        "exposure_plus_1",
        "exposure_plus_2",
        "exposure_zero",
        "extension",
        "extension_off",
        "eye_tracking",
        "eyeglasses",
        "eyeglasses_2",
        "face",
        "face_2",
        "face_3",
        "face_4",
        "face_5",
        "face_6",
        "face_down",
        "face_left",
        "face_nod",
        "face_retouching_off",
        "face_right",
        "face_shake",
        "face_up",
        "fact_check",
        "factory",
        "falling",
        "familiar_face_and_zone",
        "family_history",
        "family_home",
        "family_link",
        "family_restroom",
        "family_star",
        "fan_focus",
        "fan_indirect",
        "farsight_digital",
        "fast_forward",
        "fast_rewind",
        "fastfood",
        "faucet",
        "favorite",
        "fax",
        "feature_search",
        "featured_play_list",
        "featured_seasonal_and_gifts",
        "featured_video",
        "feedback",
        "female",
        "femur",
        "femur_alt",
        "fence",
        "fertile",
        "festival",
        "fiber_dvr",
        "fiber_manual_record",
        "fiber_new",
        "fiber_pin",
        "fiber_smart_record",
        "file_copy",
        "file_copy_off",
        "file_download_off",
        "file_export",
        "file_json",
        "file_map",
        "file_map_stack",
        "file_open",
        "file_png",
        "file_present",
        "file_save",
        "file_save_off",
        "file_upload_off",
        "files",
        "filter",
        "filter_1",
        "filter_2",
        "filter_3",
        "filter_4",
        "filter_5",
        "filter_6",
        "filter_7",
        "filter_8",
        "filter_9",
        "filter_9_plus",
        "filter_alt",
        "filter_alt_off",
        "filter_arrow_right",
        "filter_b_and_w",
        "filter_center_focus",
        "filter_drama",
        "filter_frames",
        "filter_hdr",
        "filter_list",
        "filter_list_off",
        "filter_none",
        "filter_retrolux",
        "filter_tilt_shift",
        "filter_vintage",
        "finance",
        "finance_chip",
        "finance_mode",
        "find_in_page",
        "find_replace",
        "fingerprint",
        "fingerprint_off",
        "fire_extinguisher",
        "fire_hydrant",
        "fire_truck",
        "fireplace",
        "first_page",
        "fit_page",
        "fit_page_height",
        "fit_page_width",
        "fit_screen",
        "fit_width",
        "fitness_center",
        "fitness_tracker",
        "flag",
        "flag_2",
        "flag_check",
        "flag_circle",
        "flaky",
        "flare",
        "flash_auto",
        "flash_off",
        "flash_on",
        "flashlight_off",
        "flashlight_on",
        "flatware",
        "flex_direction",
        "flex_no_wrap",
        "flex_wrap",
        "flight",
        "flight_class",
        "flight_land",
        "flight_takeoff",
        "flights_and_hotels",
        "flip",
        "flip_camera_android",
        "flip_camera_ios",
        "flip_to_back",
        "flip_to_front",
        "float_landscape_2",
        "float_portrait_2",
        "flood",
        "floor",
        "floor_lamp",
        "flowchart",
        "flowsheet",
        "fluid",
        "fluid_balance",
        "fluid_med",
        "fluorescent",
        "flutter",
        "flutter_dash",
        "flyover",
        "fmd_bad",
        "foggy",
        "folded_hands",
        "folder",
        "folder_check",
        "folder_check_2",
        "folder_code",
        "folder_copy",
        "folder_data",
        "folder_delete",
        "folder_eye",
        "folder_info",
        "folder_limited",
        "folder_managed",
        "folder_match",
        "folder_off",
        "folder_open",
        "folder_shared",
        "folder_special",
        "folder_supervised",
        "folder_zip",
        "follow_the_signs",
        "font_download",
        "font_download_off",
        "food_bank",
        "foot_bones",
        "footprint",
        "for_you",
        "forest",
        "fork_left",
        "fork_right",
        "fork_spoon",
        "forklift",
        "format_align_center",
        "format_align_justify",
        "format_align_left",
        "format_align_right",
        "format_bold",
        "format_clear",
        "format_color_fill",
        "format_color_reset",
        "format_color_text",
        "format_h1",
        "format_h2",
        "format_h3",
        "format_h4",
        "format_h5",
        "format_h6",
        "format_image_left",
        "format_image_right",
        "format_indent_decrease",
        "format_indent_increase",
        "format_ink_highlighter",
        "format_italic",
        "format_letter_spacing",
        "format_letter_spacing_2",
        "format_letter_spacing_standard",
        "format_letter_spacing_wide",
        "format_letter_spacing_wider",
        "format_line_spacing",
        "format_list_bulleted",
        "format_list_bulleted_add",
        "format_list_numbered",
        "format_list_numbered_rtl",
        "format_overline",
        "format_paint",
        "format_paragraph",
        "format_quote",
        "format_quote_off",
        "format_shapes",
        "format_size",
        "format_strikethrough",
        "format_text_clip",
        "format_text_overflow",
        "format_text_wrap",
        "format_textdirection_l_to_r",
        "format_textdirection_r_to_l",
        "format_textdirection_vertical",
        "format_underlined",
        "format_underlined_squiggle",
        "forms_add_on",
        "forms_apps_script",
        "fort",
        "forum",
        "forward",
        "forward_10",
        "forward_30",
        "forward_5",
        "forward_circle",
        "forward_media",
        "forward_to_inbox",
        "foundation",
        "fragrance",
        "frame_inspect",
        "frame_person",
        "frame_person_mic",
        "frame_person_off",
        "frame_reload",
        "frame_source",
        "free_cancellation",
        "front_hand",
        "front_loader",
        "full_coverage",
        "full_hd",
        "full_stacked_bar_chart",
        "fullscreen",
        "fullscreen_exit",
        "fullscreen_portrait",
        "function",
        "functions",
        "funicular",
        "g_mobiledata",
        "g_mobiledata_badge",
        "g_translate",
        "gallery_thumbnail",
        "gamepad",
        "garage",
        "garage_door",
        "garage_home",
        "garden_cart",
        "gas_meter",
        "gastroenterology",
        "gate",
        "gavel",
        "general_device",
        "genetics",
        "genres",
        "gesture",
        "gesture_select",
        "gif",
        "gif_2",
        "gif_box",
        "girl",
        "gite",
        "glass_cup",
        "globe",
        "globe_asia",
        "globe_book",
        "globe_location_pin",
        "globe_uk",
        "glucose",
        "glyphs",
        "go_to_line",
        "golf_course",
        "gondola_lift",
        "google_home_devices",
        "google_tv_remote",
        "google_wifi",
        "gpp_bad",
        "gpp_maybe",
        "gradient",
        "grading",
        "grain",
        "graph_1",
        "graph_2",
        "graph_3",
        "graph_4",
        "graph_5",
        "graph_6",
        "graph_7",
        "graphic_eq",
        "grass",
        "grid_3x3",
        "grid_3x3_off",
        "grid_4x4",
        "grid_goldenratio",
        "grid_guides",
        "grid_off",
        "grid_on",
        "grid_view",
        "grocery",
        "group",
        "group_add",
        "group_off",
        "group_remove",
        "group_search",
        "group_work",
        "grouped_bar_chart",
        "groups",
        "groups_2",
        "groups_3",
        "guardian",
        "gynecology",
        "h_mobiledata",
        "h_mobiledata_badge",
        "h_plus_mobiledata",
        "h_plus_mobiledata_badge",
        "hail",
        "hallway",
        "hand_bones",
        "hand_gesture",
        "hand_gesture_off",
        "handheld_controller",
        "handshake",
        "handyman",
        "hangout_video",
        "hangout_video_off",
        "hard_disk",
        "hard_drive",
        "hard_drive_2",
        "hardware",
        "hd",
        "hdr_auto",
        "hdr_auto_select",
        "hdr_enhanced_select",
        "hdr_off",
        "hdr_off_select",
        "hdr_on",
        "hdr_on_select",
        "hdr_plus",
        "hdr_plus_off",
        "hdr_strong",
        "hdr_weak",
        "head_mounted_device",
        "headphones",
        "headphones_battery",
        "headset_mic",
        "headset_off",
        "healing",
        "health_and_beauty",
        "health_and_safety",
        "health_metrics",
        "heap_snapshot_large",
        "heap_snapshot_multiple",
        "heap_snapshot_thumbnail",
        "hearing",
        "hearing_aid",
        "hearing_aid_disabled",
        "hearing_aid_disabled_left",
        "hearing_aid_left",
        "hearing_disabled",
        "heart_broken",
        "heart_check",
        "heart_minus",
        "heart_plus",
        "heat",
        "heat_pump",
        "heat_pump_balance",
        "height",
        "helicopter",
        "help",
        "help_center",
        "help_clinic",
        "hematology",
        "hevc",
        "hexagon",
        "hide",
        "hide_image",
        "hide_source",
        "high_density",
        "high_quality",
        "high_res",
        "highlight",
        "highlight_keyboard_focus",
        "highlight_mouse_cursor",
        "highlight_text_cursor",
        "highlighter_size_1",
        "highlighter_size_2",
        "highlighter_size_3",
        "highlighter_size_4",
        "highlighter_size_5",
        "hiking",
        "history",
        "history_2",
        "history_edu",
        "history_off",
        "history_toggle_off",
        "hive",
        "hls",
        "hls_off",
        "holiday_village",
        "home",
        "home_and_garden",
        "home_app_logo",
        "home_health",
        "home_improvement_and_tools",
        "home_iot_device",
        "home_max",
        "home_max_dots",
        "home_mini",
        "home_pin",
        "home_repair_service",
        "home_speaker",
        "home_storage",
        "home_work",
        "horizontal_distribute",
        "horizontal_rule",
        "horizontal_split",
        "host",
        "hot_tub",
        "hotel",
        "hotel_class",
        "hourglass",
        "hourglass_arrow_down",
        "hourglass_arrow_up",
        "hourglass_bottom",
        "hourglass_disabled",
        "hourglass_empty",
        "hourglass_pause",
        "hourglass_top",
        "house",
        "house_siding",
        "house_with_shield",
        "houseboat",
        "household_supplies",
        "hov",
        "how_to_reg",
        "how_to_vote",
        "hr_resting",
        "html",
        "http",
        "hub",
        "humerus",
        "humerus_alt",
        "humidity_high",
        "humidity_indoor",
        "humidity_low",
        "humidity_mid",
        "humidity_percentage",
        "hvac",
        "hvac_max_defrost",
        "ice_skating",
        "icecream",
        "id_card",
        "identity_aware_proxy",
        "identity_platform",
        "ifl",
        "iframe",
        "iframe_off",
        "image",
        "image_arrow_up",
        "image_aspect_ratio",
        "image_search",
        "imagesearch_roller",
        "imagesmode",
        "immunology",
        "import_contacts",
        "important_devices",
        "in_home_mode",
        "inactive_order",
        "inbox",
        "inbox_customize",
        "inbox_text",
        "inbox_text_asterisk",
        "inbox_text_person",
        "inbox_text_share",
        "incomplete_circle",
        "indeterminate_check_box",
        "indeterminate_question_box",
        "info",
        "info_i",
        "infrared",
        "ink_eraser",
        "ink_eraser_off",
        "ink_highlighter",
        "ink_highlighter_move",
        "ink_marker",
        "ink_pen",
        "ink_selection",
        "inpatient",
        "input",
        "input_circle",
        "insert_chart",
        "insert_page_break",
        "insert_text",
        "install_desktop",
        "instant_mix",
        "integration_instructions",
        "interactive_space",
        "interests",
        "interpreter_mode",
        "inventory",
        "inventory_2",
        "invert_colors",
        "invert_colors_off",
        "ios",
        "ios_share",
        "iron",
        "jamboard_kiosk",
        "javascript",
        "join",
        "join_inner",
        "join_left",
        "join_right",
        "joystick",
        "jump_to_element",
        "kayaking",
        "kebab_dining",
        "keep",
        "keep_off",
        "keep_public",
        "kettle",
        "key",
        "key_off",
        "key_vertical",
        "key_visualizer",
        "keyboard",
        "keyboard_alt",
        "keyboard_arrow_down",
        "keyboard_arrow_left",
        "keyboard_arrow_right",
        "keyboard_arrow_up",
        "keyboard_backspace",
        "keyboard_capslock",
        "keyboard_capslock_badge",
        "keyboard_command_key",
        "keyboard_control_key",
        "keyboard_double_arrow_down",
        "keyboard_double_arrow_left",
        "keyboard_double_arrow_right",
        "keyboard_double_arrow_up",
        "keyboard_external_input",
        "keyboard_full",
        "keyboard_hide",
        "keyboard_keys",
        "keyboard_lock",
        "keyboard_lock_off",
        "keyboard_off",
        "keyboard_onscreen",
        "keyboard_option_key",
        "keyboard_previous_language",
        "keyboard_return",
        "keyboard_tab",
        "keyboard_tab_rtl",
        "kid_star",
        "king_bed",
        "kitchen",
        "kitesurfing",
        "lab_panel",
        "lab_profile",
        "lab_research",
        "label",
        "label_important",
        "label_off",
        "labs",
        "lan",
        "landscape",
        "landscape_2",
        "landscape_2_edit",
        "landscape_2_off",
        "landslide",
        "language",
        "language_chinese_array",
        "language_chinese_cangjie",
        "language_chinese_dayi",
        "language_chinese_pinyin",
        "language_chinese_quick",
        "language_chinese_wubi",
        "language_french",
        "language_gb_english",
        "language_international",
        "language_japanese_kana",
        "language_korean_latin",
        "language_pinyin",
        "language_spanish",
        "language_us",
        "language_us_colemak",
        "language_us_dvorak",
        "laps",
        "laptop_car",
        "laptop_chromebook",
        "laptop_mac",
        "laptop_windows",
        "lasso_select",
        "last_page",
        "laundry",
        "layers",
        "layers_clear",
        "lda",
        "leaderboard",
        "leak_add",
        "leak_remove",
        "left_click",
        "left_panel_close",
        "left_panel_open",
        "legend_toggle",
        "lens_blur",
        "letter_switch",
        "library_add",
        "library_add_check",
        "library_books",
        "library_music",
        "license",
        "lift_to_talk",
        "light",
        "light_group",
        "light_mode",
        "light_off",
        "lightbulb",
        "lightbulb_2",
        "lightbulb_circle",
        "lightning_stand",
        "line_axis",
        "line_curve",
        "line_end",
        "line_end_arrow",
        "line_end_arrow_notch",
        "line_end_circle",
        "line_end_diamond",
        "line_end_square",
        "line_start",
        "line_start_arrow",
        "line_start_arrow_notch",
        "line_start_circle",
        "line_start_diamond",
        "line_start_square",
        "line_style",
        "line_weight",
        "linear_scale",
        "link",
        "link_off",
        "linked_camera",
        "linked_services",
        "liquor",
        "list",
        "list_alt",
        "list_alt_add",
        "list_alt_check",
        "lists",
        "live_help",
        "live_tv",
        "living",
        "local_activity",
        "local_atm",
        "local_bar",
        "local_cafe",
        "local_car_wash",
        "local_convenience_store",
        "local_dining",
        "local_drink",
        "local_fire_department",
        "local_florist",
        "local_gas_station",
        "local_hospital",
        "local_laundry_service",
        "local_library",
        "local_mall",
        "local_parking",
        "local_pharmacy",
        "local_pizza",
        "local_police",
        "local_post_office",
        "local_see",
        "local_shipping",
        "local_taxi",
        "location_away",
        "location_chip",
        "location_city",
        "location_disabled",
        "location_home",
        "location_off",
        "location_on",
        "location_searching",
        "lock",
        "lock_clock",
        "lock_open",
        "lock_open_circle",
        "lock_open_right",
        "lock_person",
        "lock_reset",
        "login",
        "logo_dev",
        "logout",
        "looks",
        "looks_3",
        "looks_4",
        "looks_5",
        "looks_6",
        "looks_one",
        "looks_two",
        "loupe",
        "low_density",
        "low_priority",
        "lowercase",
        "loyalty",
        "lte_mobiledata",
        "lte_mobiledata_badge",
        "lte_plus_mobiledata",
        "lte_plus_mobiledata_badge",
        "luggage",
        "lunch_dining",
        "lyrics",
        "macro_auto",
        "macro_off",
        "magnification_large",
        "magnification_small",
        "magnify_docked",
        "magnify_fullscreen",
        "mail",
        "mail_lock",
        "mail_off",
        "male",
        "man",
        "man_2",
        "man_3",
        "man_4",
        "manage_accounts",
        "manage_history",
        "manage_search",
        "manga",
        "manufacturing",
        "map",
        "map_search",
        "maps_ugc",
        "margin",
        "mark_as_unread",
        "mark_chat_read",
        "mark_chat_unread",
        "mark_email_read",
        "mark_email_unread",
        "mark_unread_chat_alt",
        "markdown",
        "markdown_copy",
        "markdown_paste",
        "markunread_mailbox",
        "masked_transitions",
        "masked_transitions_add",
        "masks",
        "match_case",
        "match_case_off",
        "match_word",
        "matter",
        "maximize",
        "measuring_tape",
        "media_bluetooth_off",
        "media_bluetooth_on",
        "media_link",
        "media_output",
        "media_output_off",
        "mediation",
        "medical_information",
        "medical_mask",
        "medical_services",
        "medication",
        "medication_liquid",
        "meeting_room",
        "memory",
        "memory_alt",
        "menstrual_health",
        "menu",
        "menu_book",
        "menu_open",
        "merge",
        "merge_type",
        "metabolism",
        "metro",
        "mfg_nest_yale_lock",
        "mic",
        "mic_alert",
        "mic_double",
        "mic_external_off",
        "mic_external_on",
        "mic_off",
        "microbiology",
        "microwave",
        "microwave_gen",
        "military_tech",
        "mimo",
        "mimo_disconnect",
        "mindfulness",
        "minimize",
        "minor_crash",
        "mintmark",
        "missed_video_call",
        "missing_controller",
        "mist",
        "mitre",
        "mixture_med",
        "mms",
        "mobile_hand",
        "mobile_hand_left",
        "mobile_hand_left_off",
        "mobile_hand_off",
        "mobile_loupe",
        "mobile_off",
        "mobile_screen_share",
        "mobile_screensaver",
        "mobile_sound_2",
        "mobile_speaker",
        "mobiledata_off",
        "mode_comment",
        "mode_cool",
        "mode_cool_off",
        "mode_dual",
        "mode_fan",
        "mode_fan_off",
        "mode_heat",
        "mode_heat_cool",
        "mode_heat_off",
        "mode_night",
        "mode_of_travel",
        "mode_off_on",
        "mode_standby",
        "model_training",
        "modeling",
        "money",
        "money_bag",
        "money_off",
        "monitor",
        "monitor_heart",
        "monitor_weight",
        "monitor_weight_gain",
        "monitor_weight_loss",
        "monitoring",
        "monochrome_photos",
        "monorail",
        "mood",
        "mood_bad",
        "moon_stars",
        "mop",
        "moped",
        "more",
        "more_down",
        "more_horiz",
        "more_time",
        "more_up",
        "more_vert",
        "mosque",
        "motion_blur",
        "motion_mode",
        "motion_photos_auto",
        "motion_photos_off",
        "motion_photos_on",
        "motion_photos_paused",
        "motion_play",
        "motion_sensor_active",
        "motion_sensor_alert",
        "motion_sensor_idle",
        "motion_sensor_urgent",
        "motorcycle",
        "mountain_flag",
        "mouse",
        "mouse_lock",
        "mouse_lock_off",
        "move",
        "move_down",
        "move_group",
        "move_item",
        "move_location",
        "move_selection_down",
        "move_selection_left",
        "move_selection_right",
        "move_selection_up",
        "move_to_inbox",
        "move_up",
        "moved_location",
        "movie",
        "movie_edit",
        "movie_info",
        "movie_off",
        "moving",
        "moving_beds",
        "moving_ministry",
        "mp",
        "multicooker",
        "multiline_chart",
        "multimodal_hand_eye",
        "multiple_airports",
        "multiple_stop",
        "museum",
        "music_cast",
        "music_note",
        "music_note_add",
        "music_off",
        "music_video",
        "my_location",
        "mystery",
        "nat",
        "nature",
        "nature_people",
        "navigation",
        "near_me",
        "near_me_disabled",
        "nearby",
        "nearby_error",
        "nearby_off",
        "nephrology",
        "nest_audio",
        "nest_cam_floodlight",
        "nest_cam_indoor",
        "nest_cam_iq",
        "nest_cam_iq_outdoor",
        "nest_cam_magnet_mount",
        "nest_cam_outdoor",
        "nest_cam_stand",
        "nest_cam_wall_mount",
        "nest_cam_wired_stand",
        "nest_clock_farsight_analog",
        "nest_clock_farsight_digital",
        "nest_connect",
        "nest_detect",
        "nest_display",
        "nest_display_max",
        "nest_doorbell_visitor",
        "nest_eco_leaf",
        "nest_farsight_weather",
        "nest_found_savings",
        "nest_heat_link_e",
        "nest_heat_link_gen_3",
        "nest_hello_doorbell",
        "nest_mini",
        "nest_multi_room",
        "nest_protect",
        "nest_remote",
        "nest_remote_comfort_sensor",
        "nest_secure_alarm",
        "nest_sunblock",
        "nest_tag",
        "nest_thermostat",
        "nest_thermostat_e_eu",
        "nest_thermostat_gen_3",
        "nest_thermostat_sensor",
        "nest_thermostat_sensor_eu",
        "nest_thermostat_zirconium_eu",
        "nest_true_radiant",
        "nest_wake_on_approach",
        "nest_wake_on_press",
        "nest_wifi_point",
        "nest_wifi_pro",
        "nest_wifi_pro_2",
        "nest_wifi_router",
        "network_cell",
        "network_check",
        "network_intel_node",
        "network_intelligence",
        "network_intelligence_history",
        "network_intelligence_update",
        "network_locked",
        "network_manage",
        "network_node",
        "network_ping",
        "network_wifi",
        "network_wifi_1_bar",
        "network_wifi_1_bar_locked",
        "network_wifi_2_bar",
        "network_wifi_2_bar_locked",
        "network_wifi_3_bar",
        "network_wifi_3_bar_locked",
        "network_wifi_locked",
        "neurology",
        "new_label",
        "new_window",
        "news",
        "newsmode",
        "newspaper",
        "newsstand",
        "next_plan",
        "next_week",
        "nfc",
        "nfc_off",
        "night_shelter",
        "night_sight_auto",
        "night_sight_auto_off",
        "night_sight_max",
        "nightlife",
        "nightlight",
        "nights_stay",
        "no_accounts",
        "no_adult_content",
        "no_backpack",
        "no_crash",
        "no_drinks",
        "no_encryption",
        "no_flash",
        "no_food",
        "no_luggage",
        "no_meals",
        "no_meeting_room",
        "no_photography",
        "no_sim",
        "no_sound",
        "no_stroller",
        "no_transfer",
        "noise_aware",
        "noise_control_off",
        "noise_control_on",
        "nordic_walking",
        "north",
        "north_east",
        "north_west",
        "not_accessible",
        "not_accessible_forward",
        "not_listed_location",
        "not_started",
        "note_add",
        "note_alt",
        "note_stack",
        "note_stack_add",
        "notes",
        "notification_add",
        "notification_important",
        "notification_multiple",
        "notification_settings",
        "notification_sound",
        "notifications",
        "notifications_active",
        "notifications_off",
        "notifications_paused",
        "notifications_unread",
        "numbers",
        "nutrition",
        "ods",
        "odt",
        "offline_bolt",
        "offline_pin",
        "offline_pin_off",
        "offline_share",
        "oil_barrel",
        "on_device_training",
        "on_hub_device",
        "oncology",
        "online_prediction",
        "onsen",
        "opacity",
        "open_in_browser",
        "open_in_full",
        "open_in_new",
        "open_in_new_down",
        "open_in_new_off",
        "open_jam",
        "open_run",
        "open_with",
        "ophthalmology",
        "oral_disease",
        "orbit",
        "order_approve",
        "order_play",
        "orders",
        "orthopedics",
        "other_admission",
        "other_houses",
        "outbound",
        "outbox",
        "outbox_alt",
        "outdoor_garden",
        "outdoor_grill",
        "outgoing_mail",
        "outlet",
        "outpatient",
        "outpatient_med",
        "output",
        "output_circle",
        "oven",
        "oven_gen",
        "overview",
        "overview_key",
        "owl",
        "oxygen_saturation",
        "p2p",
        "pace",
        "pacemaker",
        "package",
        "package_2",
        "padding",
        "page_control",
        "page_footer",
        "page_header",
        "page_info",
        "pageless",
        "pages",
        "pageview",
        "paid",
        "palette",
        "pallet",
        "pan_tool",
        "pan_tool_alt",
        "pan_zoom",
        "panorama",
        "panorama_horizontal",
        "panorama_photosphere",
        "panorama_vertical",
        "panorama_wide_angle",
        "paragliding",
        "park",
        "partly_cloudy_day",
        "partly_cloudy_night",
        "partner_exchange",
        "partner_reports",
        "party_mode",
        "passkey",
        "password",
        "password_2",
        "password_2_off",
        "patient_list",
        "pattern",
        "pause",
        "pause_circle",
        "pause_presentation",
        "payments",
        "pedal_bike",
        "pediatrics",
        "pen_size_1",
        "pen_size_2",
        "pen_size_3",
        "pen_size_4",
        "pen_size_5",
        "pending",
        "pending_actions",
        "pentagon",
        "percent",
        "pergola",
        "perm_camera_mic",
        "perm_contact_calendar",
        "perm_data_setting",
        "perm_device_information",
        "perm_media",
        "perm_phone_msg",
        "perm_scan_wifi",
        "person",
        "person_2",
        "person_3",
        "person_4",
        "person_add",
        "person_add_disabled",
        "person_alert",
        "person_apron",
        "person_book",
        "person_cancel",
        "person_celebrate",
        "person_check",
        "person_edit",
        "person_off",
        "person_pin",
        "person_pin_circle",
        "person_play",
        "person_raised_hand",
        "person_remove",
        "person_search",
        "person_shield",
        "personal_bag",
        "personal_bag_off",
        "personal_bag_question",
        "personal_injury",
        "personal_places",
        "pest_control",
        "pest_control_rodent",
        "pet_supplies",
        "pets",
        "phishing",
        "phone_android",
        "phone_bluetooth_speaker",
        "phone_callback",
        "phone_disabled",
        "phone_enabled",
        "phone_forwarded",
        "phone_in_talk",
        "phone_iphone",
        "phone_locked",
        "phone_missed",
        "phone_paused",
        "phonelink_erase",
        "phonelink_ring",
        "phonelink_ring_off",
        "phonelink_setup",
        "photo",
        "photo_album",
        "photo_auto_merge",
        "photo_camera",
        "photo_camera_back",
        "photo_camera_front",
        "photo_frame",
        "photo_library",
        "photo_prints",
        "photo_size_select_large",
        "photo_size_select_small",
        "php",
        "physical_therapy",
        "piano",
        "piano_off",
        "picture_as_pdf",
        "picture_in_picture",
        "picture_in_picture_alt",
        "picture_in_picture_center",
        "picture_in_picture_large",
        "picture_in_picture_medium",
        "picture_in_picture_mobile",
        "picture_in_picture_off",
        "picture_in_picture_small",
        "pie_chart",
        "pill",
        "pill_off",
        "pin",
        "pin_drop",
        "pin_end",
        "pin_invoke",
        "pinboard",
        "pinboard_unread",
        "pinch",
        "pinch_zoom_in",
        "pinch_zoom_out",
        "pip",
        "pip_exit",
        "pivot_table_chart",
        "place_item",
        "plagiarism",
        "planet",
        "planner_banner_ad_pt",
        "planner_review",
        "play_arrow",
        "play_circle",
        "play_disabled",
        "play_for_work",
        "play_lesson",
        "play_pause",
        "playing_cards",
        "playlist_add",
        "playlist_add_check",
        "playlist_add_check_circle",
        "playlist_add_circle",
        "playlist_play",
        "playlist_remove",
        "plug_connect",
        "plumbing",
        "podcasts",
        "podiatry",
        "podium",
        "point_of_sale",
        "point_scan",
        "poker_chip",
        "policy",
        "policy_alert",
        "polyline",
        "polymer",
        "pool",
        "portable_wifi_off",
        "position_bottom_left",
        "position_bottom_right",
        "position_top_right",
        "post",
        "post_add",
        "potted_plant",
        "power",
        "power_input",
        "power_off",
        "power_settings_circle",
        "power_settings_new",
        "prayer_times",
        "precision_manufacturing",
        "pregnancy",
        "pregnant_woman",
        "preliminary",
        "prescriptions",
        "present_to_all",
        "preview",
        "preview_off",
        "price_change",
        "price_check",
        "print",
        "print_add",
        "print_connect",
        "print_disabled",
        "print_error",
        "print_lock",
        "priority",
        "priority_high",
        "privacy",
        "privacy_tip",
        "private_connectivity",
        "problem",
        "procedure",
        "process_chart",
        "production_quantity_limits",
        "productivity",
        "progress_activity",
        "prompt_suggestion",
        "propane",
        "propane_tank",
        "psychiatry",
        "psychology",
        "psychology_alt",
        "public",
        "public_off",
        "publish",
        "published_with_changes",
        "pulmonology",
        "pulse_alert",
        "punch_clock",
        "qr_code",
        "qr_code_2",
        "qr_code_2_add",
        "qr_code_scanner",
        "query_stats",
        "question_exchange",
        "question_mark",
        "queue_music",
        "queue_play_next",
        "quick_phrases",
        "quick_reference",
        "quick_reference_all",
        "quick_reorder",
        "quickreply",
        "quiz",
        "r_mobiledata",
        "radar",
        "radio",
        "radio_button_checked",
        "radio_button_partial",
        "radio_button_unchecked",
        "radiology",
        "railway_alert",
        "railway_alert_2",
        "rainy",
        "rainy_heavy",
        "rainy_light",
        "rainy_snow",
        "ramen_dining",
        "ramp_left",
        "ramp_right",
        "range_hood",
        "rate_review",
        "raven",
        "raw_off",
        "raw_on",
        "read_more",
        "readiness_score",
        "real_estate_agent",
        "rear_camera",
        "rebase",
        "rebase_edit",
        "receipt",
        "receipt_long",
        "receipt_long_off",
        "recent_actors",
        "recent_patient",
        "recenter",
        "recommend",
        "record_voice_over",
        "rectangle",
        "recycling",
        "redeem",
        "redo",
        "reduce_capacity",
        "refresh",
        "regular_expression",
        "relax",
        "release_alert",
        "remember_me",
        "reminder",
        "remote_gen",
        "remove",
        "remove_done",
        "remove_from_queue",
        "remove_moderator",
        "remove_road",
        "remove_selection",
        "remove_shopping_cart",
        "reopen_window",
        "reorder",
        "repartition",
        "repeat",
        "repeat_on",
        "repeat_one",
        "repeat_one_on",
        "replace_audio",
        "replace_image",
        "replace_video",
        "replay",
        "replay_10",
        "replay_30",
        "replay_5",
        "reply",
        "reply_all",
        "report",
        "report_off",
        "request_page",
        "request_quote",
        "reset_brightness",
        "reset_focus",
        "reset_image",
        "reset_iso",
        "reset_settings",
        "reset_shadow",
        "reset_shutter_speed",
        "reset_tv",
        "reset_white_balance",
        "reset_wrench",
        "resize",
        "respiratory_rate",
        "responsive_layout",
        "restart_alt",
        "restaurant",
        "restore_from_trash",
        "restore_page",
        "resume",
        "reviews",
        "rewarded_ads",
        "rheumatology",
        "rib_cage",
        "rice_bowl",
        "right_click",
        "right_panel_close",
        "right_panel_open",
        "ring_volume",
        "ripples",
        "road",
        "robot",
        "robot_2",
        "rocket",
        "rocket_launch",
        "roller_shades",
        "roller_shades_closed",
        "roller_skating",
        "roofing",
        "room_preferences",
        "room_service",
        "rotate_90_degrees_ccw",
        "rotate_90_degrees_cw",
        "rotate_auto",
        "rotate_left",
        "rotate_right",
        "roundabout_left",
        "roundabout_right",
        "rounded_corner",
        "route",
        "router",
        "router_off",
        "routine",
        "rowing",
        "rss_feed",
        "rsvp",
        "rtt",
        "rubric",
        "rule",
        "rule_folder",
        "rule_settings",
        "run_circle",
        "running_with_errors",
        "rv_hookup",
        "safety_check",
        "safety_check_off",
        "safety_divider",
        "sailing",
        "salinity",
        "sanitizer",
        "satellite",
        "satellite_alt",
        "sauna",
        "save",
        "save_as",
        "save_clock",
        "saved_search",
        "savings",
        "scale",
        "scan",
        "scan_delete",
        "scanner",
        "scatter_plot",
        "scene",
        "schedule",
        "schedule_send",
        "schema",
        "school",
        "science",
        "science_off",
        "scooter",
        "score",
        "scoreboard",
        "screen_lock_landscape",
        "screen_lock_portrait",
        "screen_lock_rotation",
        "screen_record",
        "screen_rotation",
        "screen_rotation_alt",
        "screen_rotation_up",
        "screen_search_desktop",
        "screen_share",
        "screenshot",
        "screenshot_frame",
        "screenshot_frame_2",
        "screenshot_keyboard",
        "screenshot_monitor",
        "screenshot_region",
        "screenshot_tablet",
        "script",
        "scrollable_header",
        "scuba_diving",
        "sd",
        "sd_card",
        "sd_card_alert",
        "sdk",
        "search",
        "search_activity",
        "search_check",
        "search_check_2",
        "search_hands_free",
        "search_insights",
        "search_off",
        "seat_cool_left",
        "seat_cool_right",
        "seat_heat_left",
        "seat_heat_right",
        "seat_vent_left",
        "seat_vent_right",
        "security",
        "security_key",
        "security_update_good",
        "security_update_warning",
        "segment",
        "select",
        "select_all",
        "select_check_box",
        "select_to_speak",
        "select_window",
        "select_window_2",
        "select_window_off",
        "self_care",
        "self_improvement",
        "sell",
        "send",
        "send_and_archive",
        "send_money",
        "send_time_extension",
        "send_to_mobile",
        "sensor_door",
        "sensor_occupied",
        "sensor_window",
        "sensors",
        "sensors_krx",
        "sensors_krx_off",
        "sensors_off",
        "sentiment_calm",
        "sentiment_content",
        "sentiment_dissatisfied",
        "sentiment_excited",
        "sentiment_extremely_dissatisfied",
        "sentiment_frustrated",
        "sentiment_neutral",
        "sentiment_sad",
        "sentiment_satisfied",
        "sentiment_stressed",
        "sentiment_very_dissatisfied",
        "sentiment_very_satisfied",
        "sentiment_worried",
        "serif",
        "server_person",
        "service_toolbox",
        "set_meal",
        "settings",
        "settings_accessibility",
        "settings_account_box",
        "settings_alert",
        "settings_applications",
        "settings_b_roll",
        "settings_backup_restore",
        "settings_bluetooth",
        "settings_brightness",
        "settings_cell",
        "settings_cinematic_blur",
        "settings_ethernet",
        "settings_heart",
        "settings_input_antenna",
        "settings_input_component",
        "settings_input_hdmi",
        "settings_input_svideo",
        "settings_motion_mode",
        "settings_night_sight",
        "settings_overscan",
        "settings_panorama",
        "settings_phone",
        "settings_photo_camera",
        "settings_power",
        "settings_remote",
        "settings_slow_motion",
        "settings_system_daydream",
        "settings_timelapse",
        "settings_video_camera",
        "settings_voice",
        "settop_component",
        "severe_cold",
        "shadow",
        "shadow_add",
        "shadow_minus",
        "shape_line",
        "shapes",
        "share",
        "share_eta",
        "share_location",
        "share_off",
        "share_reviews",
        "share_windows",
        "sheets_rtl",
        "shelf_auto_hide",
        "shelf_position",
        "shelves",
        "shield",
        "shield_lock",
        "shield_locked",
        "shield_moon",
        "shield_person",
        "shield_question",
        "shield_watch",
        "shield_with_heart",
        "shield_with_house",
        "shift",
        "shift_lock",
        "shift_lock_off",
        "shop",
        "shop_two",
        "shopping_bag",
        "shopping_bag_speed",
        "shopping_basket",
        "shopping_cart",
        "shopping_cart_checkout",
        "shopping_cart_off",
        "shoppingmode",
        "short_stay",
        "short_text",
        "show_chart",
        "shower",
        "shuffle",
        "shuffle_on",
        "shutter_speed",
        "shutter_speed_add",
        "shutter_speed_minus",
        "sick",
        "side_navigation",
        "sign_language",
        "signal_cellular_0_bar",
        "signal_cellular_1_bar",
        "signal_cellular_2_bar",
        "signal_cellular_3_bar",
        "signal_cellular_4_bar",
        "signal_cellular_add",
        "signal_cellular_alt",
        "signal_cellular_alt_1_bar",
        "signal_cellular_alt_2_bar",
        "signal_cellular_connected_no_internet_0_bar",
        "signal_cellular_connected_no_internet_4_bar",
        "signal_cellular_nodata",
        "signal_cellular_null",
        "signal_cellular_off",
        "signal_cellular_pause",
        "signal_disconnected",
        "signal_wifi_0_bar",
        "signal_wifi_4_bar",
        "signal_wifi_bad",
        "signal_wifi_off",
        "signal_wifi_statusbar_not_connected",
        "signal_wifi_statusbar_null",
        "signature",
        "signpost",
        "sim_card",
        "sim_card_download",
        "simulation",
        "single_bed",
        "sip",
        "siren",
        "siren_check",
        "siren_open",
        "siren_question",
        "skateboarding",
        "skeleton",
        "skillet",
        "skillet_cooktop",
        "skip_next",
        "skip_previous",
        "skull",
        "skull_list",
        "slab_serif",
        "sledding",
        "sleep_score",
        "slide_library",
        "sliders",
        "slideshow",
        "slow_motion_video",
        "smart_card_reader",
        "smart_card_reader_off",
        "smart_display",
        "smart_outlet",
        "smart_screen",
        "smart_toy",
        "smartphone",
        "smartphone_camera",
        "smb_share",
        "smoke_free",
        "smoking_rooms",
        "sms",
        "snippet_folder",
        "snooze",
        "snowboarding",
        "snowing",
        "snowing_heavy",
        "snowmobile",
        "snowshoeing",
        "soap",
        "social_distance",
        "social_leaderboard",
        "solar_power",
        "sort",
        "sort_by_alpha",
        "sos",
        "sound_detection_dog_barking",
        "sound_detection_glass_break",
        "sound_detection_loud_sound",
        "sound_sampler",
        "soup_kitchen",
        "source_environment",
        "source_notes",
        "south",
        "south_america",
        "south_east",
        "south_west",
        "spa",
        "space_bar",
        "space_dashboard",
        "spatial_audio",
        "spatial_audio_off",
        "spatial_speaker",
        "spatial_tracking",
        "speaker",
        "speaker_group",
        "speaker_notes",
        "speaker_notes_off",
        "speaker_phone",
        "special_character",
        "specific_gravity",
        "speech_to_text",
        "speed",
        "speed_0_25",
        "speed_0_2x",
        "speed_0_5",
        "speed_0_5x",
        "speed_0_75",
        "speed_0_7x",
        "speed_1_2",
        "speed_1_25",
        "speed_1_2x",
        "speed_1_5",
        "speed_1_5x",
        "speed_1_75",
        "speed_1_7x",
        "speed_2x",
        "speed_camera",
        "spellcheck",
        "split_scene",
        "split_scene_down",
        "split_scene_left",
        "split_scene_right",
        "split_scene_up",
        "splitscreen",
        "splitscreen_add",
        "splitscreen_bottom",
        "splitscreen_landscape",
        "splitscreen_left",
        "splitscreen_portrait",
        "splitscreen_right",
        "splitscreen_top",
        "splitscreen_vertical_add",
        "spo2",
        "spoke",
        "sports",
        "sports_and_outdoors",
        "sports_bar",
        "sports_baseball",
        "sports_basketball",
        "sports_cricket",
        "sports_esports",
        "sports_football",
        "sports_golf",
        "sports_gymnastics",
        "sports_handball",
        "sports_hockey",
        "sports_kabaddi",
        "sports_martial_arts",
        "sports_mma",
        "sports_motorsports",
        "sports_rugby",
        "sports_score",
        "sports_soccer",
        "sports_tennis",
        "sports_volleyball",
        "sprinkler",
        "sprint",
        "square",
        "square_dot",
        "square_foot",
        "ssid_chart",
        "stack",
        "stack_group",
        "stack_hexagon",
        "stack_off",
        "stack_star",
        "stacked_bar_chart",
        "stacked_email",
        "stacked_inbox",
        "stacked_line_chart",
        "stacks",
        "stadia_controller",
        "stadium",
        "stairs",
        "stairs_2",
        "star",
        "star_half",
        "star_rate",
        "star_rate_half",
        "star_shine",
        "stars",
        "stars_2",
        "start",
        "stat_0",
        "stat_1",
        "stat_2",
        "stat_3",
        "stat_minus_1",
        "stat_minus_2",
        "stat_minus_3",
        "stay_current_landscape",
        "steering_wheel_heat",
        "step",
        "step_into",
        "step_out",
        "step_over",
        "steppers",
        "steps",
        "stethoscope",
        "stethoscope_arrow",
        "stethoscope_check",
        "sticky_note",
        "sticky_note_2",
        "stock_media",
        "stockpot",
        "stop",
        "stop_circle",
        "stop_screen_share",
        "storage",
        "store",
        "storefront",
        "storm",
        "straight",
        "straighten",
        "strategy",
        "stream",
        "stream_apps",
        "streetview",
        "stress_management",
        "strikethrough_s",
        "stroke_full",
        "stroke_partial",
        "stroller",
        "style",
        "styler",
        "stylus",
        "stylus_brush",
        "stylus_fountain_pen",
        "stylus_highlighter",
        "stylus_laser_pointer",
        "stylus_note",
        "stylus_pen",
        "stylus_pencil",
        "subdirectory_arrow_left",
        "subdirectory_arrow_right",
        "subheader",
        "subject",
        "subscript",
        "subscriptions",
        "subtitles",
        "subtitles_gear",
        "subtitles_off",
        "subway",
        "summarize",
        "sunny",
        "sunny_snowing",
        "superscript",
        "supervised_user_circle",
        "supervised_user_circle_off",
        "supervisor_account",
        "support",
        "support_agent",
        "surfing",
        "surgical",
        "surround_sound",
        "swap_calls",
        "swap_driving_apps",
        "swap_driving_apps_wheel",
        "swap_horiz",
        "swap_horizontal_circle",
        "swap_vert",
        "swap_vertical_circle",
        "sweep",
        "swipe",
        "swipe_down",
        "swipe_down_alt",
        "swipe_left",
        "swipe_left_alt",
        "swipe_right",
        "swipe_right_alt",
        "swipe_up",
        "swipe_up_alt",
        "swipe_vertical",
        "switch",
        "switch_access",
        "switch_access_2",
        "switch_access_3",
        "switch_access_shortcut",
        "switch_access_shortcut_add",
        "switch_account",
        "switch_camera",
        "switch_left",
        "switch_right",
        "switch_video",
        "switches",
        "sword_rose",
        "swords",
        "symptoms",
        "synagogue",
        "sync",
        "sync_alt",
        "sync_arrow_down",
        "sync_arrow_up",
        "sync_desktop",
        "sync_disabled",
        "sync_lock",
        "sync_problem",
        "sync_saved_locally",
        "syringe",
        "system_update",
        "system_update_alt",
        "tab",
        "tab_close",
        "tab_close_inactive",
        "tab_close_right",
        "tab_duplicate",
        "tab_group",
        "tab_inactive",
        "tab_move",
        "tab_new_right",
        "tab_recent",
        "tab_search",
        "tab_unselected",
        "table",
        "table_bar",
        "table_chart",
        "table_chart_view",
        "table_convert",
        "table_edit",
        "table_eye",
        "table_lamp",
        "table_restaurant",
        "table_rows",
        "table_rows_narrow",
        "table_view",
        "tablet",
        "tablet_android",
        "tablet_camera",
        "tablet_mac",
        "tabs",
        "tactic",
        "tag",
        "takeout_dining",
        "tamper_detection_off",
        "tamper_detection_on",
        "tap_and_play",
        "tapas",
        "target",
        "task",
        "task_alt",
        "taunt",
        "taxi_alert",
        "team_dashboard",
        "temp_preferences_eco",
        "temple_buddhist",
        "temple_hindu",
        "tenancy",
        "terminal",
        "text_ad",
        "text_compare",
        "text_decrease",
        "text_fields",
        "text_fields_alt",
        "text_format",
        "text_increase",
        "text_rotate_up",
        "text_rotate_vertical",
        "text_rotation_angledown",
        "text_rotation_angleup",
        "text_rotation_down",
        "text_rotation_none",
        "text_select_end",
        "text_select_jump_to_beginning",
        "text_select_jump_to_end",
        "text_select_move_back_character",
        "text_select_move_back_word",
        "text_select_move_down",
        "text_select_move_forward_character",
        "text_select_move_forward_word",
        "text_select_move_up",
        "text_select_start",
        "text_snippet",
        "text_to_speech",
        "text_up",
        "texture",
        "texture_add",
        "texture_minus",
        "theater_comedy",
        "theaters",
        "thermometer",
        "thermometer_add",
        "thermometer_gain",
        "thermometer_loss",
        "thermometer_minus",
        "thermostat",
        "thermostat_arrow_down",
        "thermostat_arrow_up",
        "thermostat_auto",
        "thermostat_carbon",
        "things_to_do",
        "thread_unread",
        "threat_intelligence",
        "thumb_down",
        "thumb_up",
        "thumbnail_bar",
        "thumbs_up_down",
        "thunderstorm",
        "tibia",
        "tibia_alt",
        "tile_large",
        "tile_medium",
        "tile_small",
        "time_auto",
        "timelapse",
        "timeline",
        "timer",
        "timer_10",
        "timer_10_alt_1",
        "timer_10_select",
        "timer_3",
        "timer_3_alt_1",
        "timer_3_select",
        "timer_5",
        "timer_5_shutter",
        "timer_arrow_down",
        "timer_arrow_up",
        "timer_off",
        "timer_pause",
        "timer_play",
        "tire_repair",
        "title",
        "titlecase",
        "toast",
        "toc",
        "today",
        "toggle_off",
        "toggle_on",
        "token",
        "toll",
        "tonality",
        "toolbar",
        "tools_flat_head",
        "tools_installation_kit",
        "tools_ladder",
        "tools_level",
        "tools_phillips",
        "tools_pliers_wire_stripper",
        "tools_power_drill",
        "tooltip",
        "tooltip_2",
        "top_panel_close",
        "top_panel_open",
        "topic",
        "tornado",
        "total_dissolved_solids",
        "touch_app",
        "touch_double",
        "touch_long",
        "touch_triple",
        "touchpad_mouse",
        "touchpad_mouse_off",
        "tour",
        "toys",
        "toys_and_games",
        "toys_fan",
        "track_changes",
        "trackpad_input",
        "trackpad_input_2",
        "trackpad_input_3",
        "traffic",
        "traffic_jam",
        "trail_length",
        "trail_length_medium",
        "trail_length_short",
        "train",
        "tram",
        "transcribe",
        "transfer_within_a_station",
        "transform",
        "transgender",
        "transit_enterexit",
        "transit_ticket",
        "transition_chop",
        "transition_dissolve",
        "transition_fade",
        "transition_push",
        "transition_slide",
        "translate",
        "transportation",
        "travel",
        "travel_explore",
        "travel_luggage_and_bags",
        "trending_down",
        "trending_flat",
        "trending_up",
        "trip",
        "trip_origin",
        "trolley",
        "trolley_cable_car",
        "trophy",
        "troubleshoot",
        "tsunami",
        "tsv",
        "tty",
        "tune",
        "turn_left",
        "turn_right",
        "turn_sharp_left",
        "turn_sharp_right",
        "turn_slight_left",
        "turn_slight_right",
        "tv",
        "tv_displays",
        "tv_gen",
        "tv_guide",
        "tv_next",
        "tv_off",
        "tv_options_edit_channels",
        "tv_options_input_settings",
        "tv_remote",
        "tv_signin",
        "tv_with_assistant",
        "two_pager",
        "two_pager_store",
        "two_wheeler",
        "type_specimen",
        "u_turn_left",
        "u_turn_right",
        "ulna_radius",
        "ulna_radius_alt",
        "umbrella",
        "unarchive",
        "undo",
        "unfold_less",
        "unfold_less_double",
        "unfold_more",
        "unfold_more_double",
        "ungroup",
        "universal_currency",
        "universal_currency_alt",
        "universal_local",
        "unknown_2",
        "unknown_5",
        "unknown_7",
        "unknown_document",
        "unknown_med",
        "unlicense",
        "unpaved_road",
        "unpublished",
        "unsubscribe",
        "upcoming",
        "update",
        "update_disabled",
        "upgrade",
        "upi_pay",
        "upload",
        "upload_2",
        "upload_file",
        "uppercase",
        "urology",
        "usb",
        "usb_off",
        "user_attributes",
        "vaccines",
        "vacuum",
        "valve",
        "vape_free",
        "vaping_rooms",
        "variable_add",
        "variable_insert",
        "variable_remove",
        "variables",
        "ventilator",
        "verified",
        "verified_off",
        "verified_user",
        "vertical_align_bottom",
        "vertical_align_center",
        "vertical_align_top",
        "vertical_distribute",
        "vertical_shades",
        "vertical_shades_closed",
        "vertical_split",
        "vibration",
        "video_call",
        "video_camera_back",
        "video_camera_back_add",
        "video_camera_front",
        "video_camera_front_off",
        "video_chat",
        "video_file",
        "video_label",
        "video_library",
        "video_search",
        "video_settings",
        "video_stable",
        "videocam",
        "videocam_alert",
        "videocam_off",
        "videogame_asset",
        "videogame_asset_off",
        "view_agenda",
        "view_apps",
        "view_array",
        "view_carousel",
        "view_column",
        "view_column_2",
        "view_comfy",
        "view_comfy_alt",
        "view_compact",
        "view_compact_alt",
        "view_cozy",
        "view_day",
        "view_headline",
        "view_in_ar",
        "view_in_ar_off",
        "view_kanban",
        "view_list",
        "view_module",
        "view_object_track",
        "view_quilt",
        "view_real_size",
        "view_sidebar",
        "view_stream",
        "view_timeline",
        "view_week",
        "vignette",
        "villa",
        "visibility",
        "visibility_lock",
        "visibility_off",
        "vital_signs",
        "vo2_max",
        "voice_chat",
        "voice_over_off",
        "voice_selection",
        "voice_selection_off",
        "voicemail",
        "voicemail_2",
        "volcano",
        "volume_down",
        "volume_down_alt",
        "volume_mute",
        "volume_off",
        "volume_up",
        "volunteer_activism",
        "voting_chip",
        "vpn_key",
        "vpn_key_alert",
        "vpn_key_off",
        "vpn_lock",
        "vpn_lock_2",
        "vr180_create2d",
        "vr180_create2d_off",
        "vrpano",
        "wall_art",
        "wall_lamp",
        "wallet",
        "wallpaper",
        "wallpaper_slideshow",
        "wand_shine",
        "wand_stars",
        "ward",
        "warehouse",
        "warning",
        "warning_off",
        "wash",
        "watch",
        "watch_arrow",
        "watch_button_press",
        "watch_check",
        "watch_off",
        "watch_screentime",
        "watch_vibration",
        "watch_wake",
        "water",
        "water_bottle",
        "water_bottle_large",
        "water_damage",
        "water_do",
        "water_drop",
        "water_ec",
        "water_full",
        "water_heater",
        "water_lock",
        "water_loss",
        "water_lux",
        "water_medium",
        "water_orp",
        "water_ph",
        "water_pump",
        "water_voc",
        "waterfall_chart",
        "waves",
        "waving_hand",
        "wb_auto",
        "wb_incandescent",
        "wb_iridescent",
        "wb_shade",
        "wb_sunny",
        "wb_twilight",
        "wc",
        "weather_hail",
        "weather_mix",
        "weather_snowy",
        "web",
        "web_asset",
        "web_asset_off",
        "web_stories",
        "web_traffic",
        "webhook",
        "weekend",
        "weight",
        "west",
        "whatshot",
        "wheelchair_pickup",
        "where_to_vote",
        "widget_medium",
        "widget_small",
        "widget_width",
        "widgets",
        "width_full",
        "width_normal",
        "width_wide",
        "wifi",
        "wifi_1_bar",
        "wifi_2_bar",
        "wifi_add",
        "wifi_calling",
        "wifi_calling_bar_1",
        "wifi_calling_bar_2",
        "wifi_calling_bar_3",
        "wifi_channel",
        "wifi_find",
        "wifi_home",
        "wifi_lock",
        "wifi_notification",
        "wifi_off",
        "wifi_password",
        "wifi_protected_setup",
        "wifi_proxy",
        "wifi_tethering",
        "wifi_tethering_error",
        "wifi_tethering_off",
        "wind_power",
        "window",
        "window_closed",
        "window_open",
        "window_sensor",
        "windshield_defrost_front",
        "windshield_defrost_rear",
        "windshield_heat_front",
        "wine_bar",
        "woman",
        "woman_2",
        "work",
        "work_alert",
        "work_history",
        "work_update",
        "workspace_premium",
        "workspaces",
        "wounds_injuries",
        "wrap_text",
        "wrist",
        "wrong_location",
        "wysiwyg",
        "yard",
        "your_trips",
        "youtube_activity",
        "youtube_searched_for",
        "zone_person_alert",
        "zone_person_idle",
        "zone_person_urgent",
        "zoom_in",
        "zoom_in_map",
        "zoom_out",
        "zoom_out_map"
      ],
      "title": "Icon",
      "description": "Material Symbol icon names available in CloudCannon for UI elements and content previews.",
      "documented": false,
      "markdownDescription": "Material Symbol icon names available in CloudCannon for UI elements and content previews."
    },
    "type.documentation": {
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "description": "This key defines the URL for the documentation link at the top of a *Collection browser*.\n\nYou must define this key for the\n`documentation` object to function.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have configured the `blog` Collection documentation link to go to `example.com`.\n\n```yaml\ncollections_config:\n  blog:\n    documentation:\n      url: <https://example.com>\n```",
          "documented": true,
          "title": "url",
          "markdownDescription": "This key defines the URL for the documentation link at the top of a *Collection browser*.\n\nYou must define this key for the\n`documentation` object to function.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have configured the `blog` Collection documentation link to go to `example.com`.\n\n```yaml\ncollections_config:\n  blog:\n    documentation:\n      url: https://example.com\n```"
        },
        "text": {
          "description": "This key defines the link text for the documentation link at the top of a *Collection browser*.\n\n## Examples\n\nIn this example, the text for the documentation link is `CloudCannon Documentation`.\n\n```yaml\ncollections_config:\n  data:\n    documentation:\n      url: <https://cloudcannon.com/documentation/>\n      text: CloudCannon Documentation\n```",
          "type": "string",
          "documented": true,
          "title": "text",
          "markdownDescription": "This key defines the link text for the documentation link at the top of a *Collection browser*.\n\n## Examples\n\nIn this example, the text for the documentation link is `CloudCannon Documentation`.\n\n```yaml\ncollections_config:\n  data:\n    documentation:\n      url: https://cloudcannon.com/documentation/\n      text: CloudCannon Documentation\n```"
        },
        "icon": {
          "description": "This key defines the icon for the documentation link at the top of a *Collection browser*.\n\nValues can be from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded) library.\n\n## Examples\n\nIn this example, we have configured the `star` icon for the `blog` Collection documentation link.\n\n```yaml\ncollections_config:\n  blog:\n    documentation:\n      url: <https://www.cloudcannon.com/documentation/>\n      icon: star\n```",
          "default": "auto_stories",
          "allOf": [
            {
              "$ref": "#/$defs/icon"
            }
          ],
          "documented": true,
          "title": "icon",
          "markdownDescription": "This key defines the icon for the documentation link at the top of a *Collection browser*.\n\nValues can be from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded) library.\n\n## Examples\n\nIn this example, we have configured the `star` icon for the `blog` Collection documentation link.\n\n```yaml\ncollections_config:\n  blog:\n    documentation:\n      url: https://www.cloudcannon.com/documentation/\n      icon: star\n```"
        }
      },
      "required": [
        "url"
      ],
      "markdownDescription": "This key defines the documentation link at the top of a *Collection browser*.\n\nCollection documentation is useful for assisting your team members.\n\n## Examples\n\nIn this example, the documentation link for the `data` Collection goes to [CloudCannon Documentation](https://cloudcannon.com/documentation/).\n\n```yaml\ncollections_config:\n  data:\n    documentation:\n      url: https://cloudcannon.com/documentation/\n      text: CloudCannon Documentation\n      icon: star\n```",
      "title": "Documentation",
      "description": "This key defines the documentation link at the top of a *Collection browser*.\n\nCollection documentation is useful for assisting your team members.\n\n## Examples\n\nIn this example, the documentation link for the `data` Collection goes to [CloudCannon Documentation](https://cloudcannon.com/documentation/).\n\n```yaml\ncollections_config:\n  data:\n    documentation:\n      url: <https://cloudcannon.com/documentation/>\n      text: CloudCannon Documentation\n      icon: star\n```",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs.*.label": {
      "description": "This key defines the bold title text above an Input.\n\n## Examples\n\nIn this example, we want to customize the label for our `page_title` Input to be more descriptive.\n\n```yaml\n_inputs:\n  page_title:\n    type: text\n    label: Article Title\n    comment: Enter the main title for this article\n```",
      "type": "string",
      "documented": true,
      "title": "label",
      "markdownDescription": "This key defines the bold title text above an Input.\n\n## Examples\n\nIn this example, we want to customize the label for our `page_title` Input to be more descriptive.\n\n```yaml\n_inputs:\n  page_title:\n    type: text\n    label: Article Title\n    comment: Enter the main title for this article\n```"
    },
    "type._inputs.*.hidden": {
      "description": "This key defines the visibility of an input in the *Data Editor* or the sidebar of the *Visual Editor* or *Content Editor*.\n\nHidden inputs are useful when you want an input to exist, but not be visible or editable outside of the Source Editor.\n\nValue can be a boolean or a string. A boolean value of `true` will hide the input.\n\nA string value can hide an input based on the value of another input.\n\nYou can reverse the value with a `!` character at the beginning.\n\n* `published` hides an input when the sibling input `published` is truthy\n* `!published` hides an input when the sibling input `published` is falsy\n\nFor reverse values in `YAML` files, the string should be in `'` or `\"` quotation marks.\n\nBy default, this key follows the input naming convention where key names beginning with an underscore are hidden `true`.",
      "default": false,
      "anyOf": [
        {
          "type": "boolean",
          "title": "Boolean Hidden",
          "documented": true,
          "description": "This key represents a boolean value for the `hidden` key that toggles whether CloudCannon hides an input from view.\n\nWhen set to `true`, CloudCannon hides the input from the *Data Editor* and the sidebar of the *Visual Editor* or *Content Editor*. The input still exists in the file and can be edited in the *Source Editor*.\n\nWhen set to `false`, CloudCannon displays the input normally.\n\nBy default, this key follows the input naming convention where key names beginning with an underscore are hidden (`true`). Otherwise, this key defaults to `false` (i.e., the input is visible).\n\n## Examples\n\nIn this example, we have configured an input to be hidden using a boolean value, making it only editable in the *Source Editor*.\n\n```yaml\n_inputs:\n  internal_id:\n    type: text\n    label: Internal ID\n    hidden: true\n```",
          "markdownDescription": "This key represents a boolean value for the `hidden` key that toggles whether CloudCannon hides an input from view.\n\nWhen set to `true`, CloudCannon hides the input from the *Data Editor* and the sidebar of the *Visual Editor* or *Content Editor*. The input still exists in the file and can be edited in the *Source Editor*.\n\nWhen set to `false`, CloudCannon displays the input normally.\n\nBy default, this key follows the input naming convention where key names beginning with an underscore are hidden (`true`). Otherwise, this key defaults to `false` (i.e., the input is visible).\n\n## Examples\n\nIn this example, we have configured an input to be hidden using a boolean value, making it only editable in the *Source Editor*.\n\n```yaml\n_inputs:\n  internal_id:\n    type: text\n    label: Internal ID\n    hidden: true\n```"
        },
        {
          "type": "string",
          "title": "Query String Hidden",
          "documented": true,
          "description": "This key represents a query string value for the `hidden` key that conditionally hides an input based on another input's value.\n\nThe value is a string that references a sibling input key name. CloudCannon evaluates the referenced input's value to determine whether to hide this input.\n\nWhen the referenced input is truthy, CloudCannon hides this input. You can reverse this behavior by prefixing the string with `!`.\n\nFor reverse values in YAML files, the string should be wrapped in single or double quotation marks.\n\n## Examples\n\nIn this example, we have configured an input to be hidden when the `published` input is truthy.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  draft_notes:\n    type: textarea\n    label: Draft notes\n    hidden: published\n```\n\nIn this example, we have configured an input to be hidden when the `published` input is falsy using the `!` prefix.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  publish_date:\n    type: datetime\n    label: Publish date\n    hidden: '!published'\n```",
          "markdownDescription": "This key represents a query string value for the `hidden` key that conditionally hides an input based on another input's value.\n\nThe value is a string that references a sibling input key name. CloudCannon evaluates the referenced input's value to determine whether to hide this input.\n\nWhen the referenced input is truthy, CloudCannon hides this input. You can reverse this behavior by prefixing the string with `!`.\n\nFor reverse values in YAML files, the string should be wrapped in single or double quotation marks.\n\n## Examples\n\nIn this example, we have configured an input to be hidden when the `published` input is truthy.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  draft_notes:\n    type: textarea\n    label: Draft notes\n    hidden: published\n```\n\nIn this example, we have configured an input to be hidden when the `published` input is falsy using the `!` prefix.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  publish_date:\n    type: datetime\n    label: Publish date\n    hidden: '!published'\n```"
        }
      ],
      "documented": true,
      "title": "hidden",
      "markdownDescription": "This key defines the visibility of an input in the *Data Editor* or the sidebar of the *Visual Editor* or *Content Editor*.\n\nHidden inputs are useful when you want an input to exist, but not be visible or editable outside of the Source Editor.\n\nValue can be a boolean or a string. A boolean value of `true` will hide the input.\n\nA string value can hide an input based on the value of another input.\n\nYou can reverse the value with a `!` character at the beginning.\n\n* `published` hides an input when the sibling input `published` is truthy\n* `!published` hides an input when the sibling input `published` is falsy\n\nFor reverse values in `YAML` files, the string should be in `'` or `\"` quotation marks.\n\nBy default, this key follows the input naming convention where key names beginning with an underscore are hidden `true`."
    },
    "type._inputs.*.disabled": {
      "description": "This key defines whether the value of an input is editable in the *Data Editor* or the sidebar of the *Visual Editor* or *Content Editor*.\n\nDisabled inputs are useful if you want CloudCannon to display the input value, but prevent team members from editing the value outside of the Source\nEditor.\n\nThe value of this key can be a boolean or a string. A boolean value of `true` will prevent team members from editing the value.\n\nA string value can prevent team members from editing an input based on the value of another input.\n\nYou can reverse the value with a `!` character at the beginning.\n\n* `published` hides an input when the sibling input `published` is truthy\n* `!published` hides an input when the sibling input `published` is falsy\n\nFor reverse values in `YAML` files, the string should be in `'` or `\"` quotation marks.\n\nBy default, this key is `false` (i.e., team members can edit input values).\n\n## Examples\n\nIn this example, we have configured the `date_created` Date input, which will automatically populate when you create a file using this input. Editors cannot alter this input as the interface is disabled.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    comment: UTC +0 timezone\n    disabled: true\n    instance_value: NOW\n    options:\n      timezone: Etc/UTC\n```",
      "default": false,
      "anyOf": [
        {
          "type": "boolean",
          "title": "Boolean",
          "documented": true,
          "description": "This key represents a boolean value for the `disabled` key that toggles whether CloudCannon prevents editing of an input value.\n\nWhen set to `true`, CloudCannon prevents team members from editing the input value in the *Data Editor* or the sidebar of the *Visual Editor* or *Content Editor*. The input value is still displayed but cannot be modified outside of the *Source Editor*.\n\nWhen set to `false`, team members can edit the input value normally.\n\nBy default, this key is `false` (i.e., team members can edit input values).\n\n## Examples\n\nIn this example, we have configured a datetime input to be disabled using a boolean value, preventing editors from modifying the automatically generated date.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    disabled: true\n    instance_value: NOW\n```",
          "markdownDescription": "This key represents a boolean value for the `disabled` key that toggles whether CloudCannon prevents editing of an input value.\n\nWhen set to `true`, CloudCannon prevents team members from editing the input value in the *Data Editor* or the sidebar of the *Visual Editor* or *Content Editor*. The input value is still displayed but cannot be modified outside of the *Source Editor*.\n\nWhen set to `false`, team members can edit the input value normally.\n\nBy default, this key is `false` (i.e., team members can edit input values).\n\n## Examples\n\nIn this example, we have configured a datetime input to be disabled using a boolean value, preventing editors from modifying the automatically generated date.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    disabled: true\n    instance_value: NOW\n```"
        },
        {
          "type": "string",
          "title": "Query String",
          "documented": true,
          "description": "This key represents a query string value for the `disabled` key that conditionally prevents editing of an input value based on another input's value.\n\nThe value is a string that references a sibling input key name. CloudCannon evaluates the referenced input's value to determine whether to disable this input.\n\nWhen the referenced input is truthy, CloudCannon disables this input. You can reverse this behavior by prefixing the string with `!`.\n\nFor reverse values in YAML files, the string should be wrapped in single or double quotation marks.\n\n## Examples\n\nIn this example, we have configured an input to be disabled when the `published` input is truthy.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  edit_date:\n    type: datetime\n    label: Last edited\n    disabled: published\n```\n\nIn this example, we have configured an input to be disabled when the `published` input is falsy using the `!` prefix.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  draft_notes:\n    type: textarea\n    label: Draft notes\n    disabled: '!published'\n```",
          "markdownDescription": "This key represents a query string value for the `disabled` key that conditionally prevents editing of an input value based on another input's value.\n\nThe value is a string that references a sibling input key name. CloudCannon evaluates the referenced input's value to determine whether to disable this input.\n\nWhen the referenced input is truthy, CloudCannon disables this input. You can reverse this behavior by prefixing the string with `!`.\n\nFor reverse values in YAML files, the string should be wrapped in single or double quotation marks.\n\n## Examples\n\nIn this example, we have configured an input to be disabled when the `published` input is truthy.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  edit_date:\n    type: datetime\n    label: Last edited\n    disabled: published\n```\n\nIn this example, we have configured an input to be disabled when the `published` input is falsy using the `!` prefix.\n\n```yaml\n_inputs:\n  published:\n    type: checkbox\n    label: Published\n  draft_notes:\n    type: textarea\n    label: Draft notes\n    disabled: '!published'\n```"
        }
      ],
      "documented": true,
      "title": "disabled",
      "markdownDescription": "This key defines whether the value of an input is editable in the *Data Editor* or the sidebar of the *Visual Editor* or *Content Editor*.\n\nDisabled inputs are useful if you want CloudCannon to display the input value, but prevent team members from editing the value outside of the Source\nEditor.\n\nThe value of this key can be a boolean or a string. A boolean value of `true` will prevent team members from editing the value.\n\nA string value can prevent team members from editing an input based on the value of another input.\n\nYou can reverse the value with a `!` character at the beginning.\n\n* `published` hides an input when the sibling input `published` is truthy\n* `!published` hides an input when the sibling input `published` is falsy\n\nFor reverse values in `YAML` files, the string should be in `'` or `\"` quotation marks.\n\nBy default, this key is `false` (i.e., team members can edit input values).\n\n## Examples\n\nIn this example, we have configured the `date_created` Date input, which will automatically populate when you create a file using this input. Editors cannot alter this input as the interface is disabled.\n\n```yaml\n_inputs:\n  date_created:\n    type: datetime\n    label: Date of article creation\n    comment: UTC +0 timezone\n    disabled: true\n    instance_value: NOW\n    options:\n      timezone: Etc/UTC\n```"
    },
    "type._inputs.*.instance_value": {
      "title": "Instance Value",
      "description": "This key defines whether an input is automatically populated with a value when the input is created.\n\nThis occurs when creating a new file, or adding array items containing this input.\n\nValid values are `UUID` or `NOW`.\n\n* `UUID` generates a uuidv4 key (<a href=\"<https://softwareengineering.stackexchange.com/a/130298>\" target=\"_blank\" rel=\"noopener\">extremely unlikely to generate duplicates)</a>, useful for identifying unique items (e.g. `6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b`)\n* `NOW` generates the current datetime in the Site's configured timezone\n\n## Examples\n\nIn this example, we have configured an input to automatically populate with a UUID when created.\n\n```yaml\n_inputs:\n  id:\n    type: text\n    instance_value: UUID\n```",
      "type": "string",
      "enum": [
        "UUID",
        "NOW"
      ],
      "documented": true,
      "markdownDescription": "This key defines whether an input is automatically populated with a value when the input is created.\n\nThis occurs when creating a new file, or adding array items containing this input.\n\nValid values are `UUID` or `NOW`.\n\n* `UUID` generates a uuidv4 key (<a href=\"https://softwareengineering.stackexchange.com/a/130298\" target=\"_blank\" rel=\"noopener\">extremely unlikely to generate duplicates)</a>, useful for identifying unique items (e.g. `6ec0bd7f-11c0-43da-975e-2a8ad9ebae0b`)\n* `NOW` generates the current datetime in the Site's configured timezone\n\n## Examples\n\nIn this example, we have configured an input to automatically populate with a UUID when created.\n\n```yaml\n_inputs:\n  id:\n    type: text\n    instance_value: UUID\n```"
    },
    "type._inputs.*.disable_instance_value_rehydration": {
      "description": "This key toggles whether CloudCannon will rehydrate inputs configured with an `instance_value` with a new value when duplicated.\n\nSetting this key to `true` will prevent rehydration of instance values when inputs are duplicated.\n\n## Examples\n\nIn this example, CloudCannon will prevent rehydration of instance values when inputs are duplicated.\n\n```yaml\n_inputs:\n  id:\n    type: text\n    instance_value: UUID\n    disable_instance_value_rehydration: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "disable_instance_value_rehydration",
      "markdownDescription": "This key toggles whether CloudCannon will rehydrate inputs configured with an `instance_value` with a new value when duplicated.\n\nSetting this key to `true` will prevent rehydration of instance values when inputs are duplicated.\n\n## Examples\n\nIn this example, CloudCannon will prevent rehydration of instance values when inputs are duplicated.\n\n```yaml\n_inputs:\n  id:\n    type: text\n    instance_value: UUID\n    disable_instance_value_rehydration: true\n```"
    },
    "type._inputs.*.cascade": {
      "description": "This key defines whether CloudCannon should merge this input configuration with any matching, less specific configurations elsewhere in the\nconfiguration cascade.\n\nThe [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/) works by finding the most specific `_inputs` entry.\n\nUsually, once an option is found in the cascade, there's no reason to keep looking.\n\nWhen this key is `true`, the cascade continues looking and each entry found is merged.\n\nThis key allows you to define some options globally while using specific options for other keys at different levels of the cascade.\n\nFor example, define a `comment` globally, but use collection-specific `label` for inputs in different collections.\n\nYou can stop the cascade at any point in the configuration cascade by setting `cascade` to `false`.\n\n## Examples\n\nIn this example, we have configured cascade to merge input configurations across the configuration cascade.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    cascade: true\n    comment: Global comment for all title inputs\n```",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "cascade",
      "markdownDescription": "This key defines whether CloudCannon should merge this input configuration with any matching, less specific configurations elsewhere in the\nconfiguration cascade.\n\nThe [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/) works by finding the most specific `_inputs` entry.\n\nUsually, once an option is found in the cascade, there's no reason to keep looking.\n\nWhen this key is `true`, the cascade continues looking and each entry found is merged.\n\nThis key allows you to define some options globally while using specific options for other keys at different levels of the cascade.\n\nFor example, define a `comment` globally, but use collection-specific `label` for inputs in different collections.\n\nYou can stop the cascade at any point in the configuration cascade by setting `cascade` to `false`.\n\n## Examples\n\nIn this example, we have configured cascade to merge input configurations across the configuration cascade.\n\n```yaml\n_inputs:\n  title:\n    type: text\n    cascade: true\n    comment: Global comment for all title inputs\n```"
    },
    "type._inputs.*.options.max_length": {
      "description": "This key defines the maximum string length, in characters, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will warn you when an Input value is too long.\n\nIf the Input already contains a longer value, CloudCannon will require you to remove characters until the Input contains a valid string to save your\nchanges, or discard your unsaved changes.\n\nValue can be any non-negative integer.\n\nIf this key is set to `0`, CloudCannon requires the Input to be empty.\n\nIf `options.min_length` is also configured, this key cannot be a smaller number.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\nTo use this key in a Select Input, `allow_create` must be set to `true`.\n\n## Examples\n\nIn this example, we want our team to enter a blog description using the Rich Text `seo_description` Input. This Input limits you to a maximum of 125 characters.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      min_length: 25\n```",
      "type": "number",
      "documented": true,
      "title": "max_length",
      "markdownDescription": "This key defines the maximum string length, in characters, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will warn you when an Input value is too long.\n\nIf the Input already contains a longer value, CloudCannon will require you to remove characters until the Input contains a valid string to save your\nchanges, or discard your unsaved changes.\n\nValue can be any non-negative integer.\n\nIf this key is set to `0`, CloudCannon requires the Input to be empty.\n\nIf `options.min_length` is also configured, this key cannot be a smaller number.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\nTo use this key in a Select Input, `allow_create` must be set to `true`.\n\n## Examples\n\nIn this example, we want our team to enter a blog description using the Rich Text `seo_description` Input. This Input limits you to a maximum of 125 characters.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      min_length: 25\n```"
    },
    "type._inputs.*.options.max_length_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max_length`.\n\nThis key requires you to define `options.max_length`.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of characters using a custom message.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      max_length_message: You are only allowed 125 characters.\n      min_length: 25\n      min_length_message: Please write more than 25 characters.\n```",
      "type": "string",
      "documented": true,
      "title": "max_length_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max_length`.\n\nThis key requires you to define `options.max_length`.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of characters using a custom message.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      max_length_message: You are only allowed 125 characters.\n      min_length: 25\n      min_length_message: Please write more than 25 characters.\n```"
    },
    "type._inputs.*.options.min_length": {
      "description": "This key defines the minimum string length, in characters, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will warn you when an Input value is too short.\n\nIf the Input already contains a shorter value, CloudCannon will require you to add characters until the Input contains a valid string to save your\nchanges, or discard your unsaved changes.\n\nValue can be any positive integer.\n\nIf `options.max_length` is also configured, this key cannot be a greater number.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\nTo use this key in a Select Input, `allow_create` must be set to `true`.\n\n## Examples\n\nIn this example, we want our team to enter a blog description using the Rich Text `seo_description` Input. This Input requires a minimum of 25 characters.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      min_length: 25\n```",
      "type": "number",
      "documented": true,
      "title": "min_length",
      "markdownDescription": "This key defines the minimum string length, in characters, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will warn you when an Input value is too short.\n\nIf the Input already contains a shorter value, CloudCannon will require you to add characters until the Input contains a valid string to save your\nchanges, or discard your unsaved changes.\n\nValue can be any positive integer.\n\nIf `options.max_length` is also configured, this key cannot be a greater number.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\nTo use this key in a Select Input, `allow_create` must be set to `true`.\n\n## Examples\n\nIn this example, we want our team to enter a blog description using the Rich Text `seo_description` Input. This Input requires a minimum of 25 characters.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      min_length: 25\n```"
    },
    "type._inputs.*.options.min_length_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.min_length`.\n\nThis key requires you to define `options.min_length`.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of characters using a custom message.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      max_length_message: You are only allowed 125 characters.\n      min_length: 25\n      min_length_message: Please write more than 25 characters.\n```",
      "type": "string",
      "documented": true,
      "title": "min_length_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.min_length`.\n\nThis key requires you to define `options.min_length`.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of characters using a custom message.\n\n```yaml\n_inputs:\n  seo_description:\n    type: markdown\n    comment: Enter a brief description of this blog.\n    options:\n      max_length: 125\n      max_length_message: You are only allowed 125 characters.\n      min_length: 25\n      min_length_message: Please write more than 25 characters.\n```"
    },
    "type._inputs.*.options.max_words": {
      "description": "This key defines the maximum string length, in words, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too long. If the Input already contains a longer value, CloudCannon will require you to remove characters until the Input contains a valid string to save your changes, or discard your unsaved changes.",
      "type": "number",
      "documented": true,
      "title": "max_words",
      "markdownDescription": "This key defines the maximum string length, in words, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too long. If the Input already contains a longer value, CloudCannon will require you to remove characters until the Input contains a valid string to save your changes, or discard your unsaved changes."
    },
    "type._inputs.*.options.max_words_message": {
      "description": "This key defines the message that explains which maximum string length an Input will accept. This key requires you to define `options.max_words.",
      "type": "string",
      "documented": true,
      "title": "max_words_message",
      "markdownDescription": "This key defines the message that explains which maximum string length an Input will accept. This key requires you to define `options.max_words."
    },
    "type._inputs.*.options.min_words": {
      "description": "This key defines the minimum string length, in words, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too short. If the Input already contains a shorter value, CloudCannon will require you to add characters until the Input contains a valid string to save your changes, or discard your unsaved changes.",
      "type": "number",
      "documented": true,
      "title": "min_words",
      "markdownDescription": "This key defines the minimum string length, in words, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too short. If the Input already contains a shorter value, CloudCannon will require you to add characters until the Input contains a valid string to save your changes, or discard your unsaved changes."
    },
    "type._inputs.*.options.min_words_message": {
      "description": "This key defines the message that explains which minimum string length an Input will accept. This key requires you to define `options.min_words`.",
      "type": "string",
      "documented": true,
      "title": "min_words_message",
      "markdownDescription": "This key defines the message that explains which minimum string length an Input will accept. This key requires you to define `options.min_words`."
    },
    "type._inputs.*.options.max_graphemes": {
      "description": "This key defines the maximum string length, in graphemes, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too long. If the Input already contains a longer value, CloudCannon will require you to remove characters until the Input contains a valid string to save your changes, or discard your unsaved changes.",
      "type": "number",
      "documented": true,
      "title": "max_graphemes",
      "markdownDescription": "This key defines the maximum string length, in graphemes, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too long. If the Input already contains a longer value, CloudCannon will require you to remove characters until the Input contains a valid string to save your changes, or discard your unsaved changes."
    },
    "type._inputs.*.options.max_graphemes_message": {
      "description": "This key defines the message that explains which maximum string length an Input will accept. This key requires you to define `options.max_graphemes.",
      "type": "string",
      "documented": true,
      "title": "max_graphemes_message",
      "markdownDescription": "This key defines the message that explains which maximum string length an Input will accept. This key requires you to define `options.max_graphemes."
    },
    "type._inputs.*.options.min_graphemes": {
      "description": "This key defines the minimum string length, in graphemes, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too short. If the Input already contains a shorter value, CloudCannon will require you to add characters until the Input contains a valid string to save your changes, or discard your unsaved changes.",
      "type": "number",
      "documented": true,
      "title": "min_graphemes",
      "markdownDescription": "This key defines the minimum string length, in graphemes, that CloudCannon will allow in an Input. When configured, CloudCannon will warn you when an Input value is too short. If the Input already contains a shorter value, CloudCannon will require you to add characters until the Input contains a valid string to save your changes, or discard your unsaved changes."
    },
    "type._inputs.*.options.min_graphemes_message": {
      "description": "This key defines the message that explains which minimum string length an Input will accept. This key requires you to define `options.min_graphemes`.",
      "type": "string",
      "documented": true,
      "title": "min_graphemes_message",
      "markdownDescription": "This key defines the message that explains which minimum string length an Input will accept. This key requires you to define `options.min_graphemes`."
    },
    "type._inputs.*.options.locale": {
      "description": "This key defines the locale that CloudCannon uses to determine the number of words or graphemes in this Input, if you have `max_words`, `min_words`, `max_graphemes`, or `min_graphemes` configured.",
      "type": "string",
      "documented": true,
      "title": "locale",
      "markdownDescription": "This key defines the locale that CloudCannon uses to determine the number of words or graphemes in this Input, if you have `max_words`, `min_words`, `max_graphemes`, or `min_graphemes` configured."
    },
    "type._inputs.*.options.pattern": {
      "description": "This key defines a [regular expression](https://re2js.leopard.in.ua/) that the Input value must match.\n\nWhen configured, CloudCannon will require you to enter a value that matches the REGEX pattern.\n\nIf the Input already contains an invalid value, CloudCannon will require you to enter a valid string to save your changes, or discard your unsaved\nchanges.\n\nValue must be a valid REGEX string.\n\nIf your REGEX string includes a `\\` character and CloudCannon Configuration File is a `.yml` file, use single quotes `'` around the string to avoid a\nbuild error.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\nTo use this key in a Select Input, `allow_create` must be set to `true`.\n\n## Examples\n\nIn this example, we want our team to add an email address to the `contact_email` Input using the correct email format.\n\n```yaml\n_inputs:\n  contact_email:\n    type: email\n    options:\n      pattern: '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'\n      pattern_message: 'Please use the format ___@___.__'\n```",
      "type": "string",
      "documented": true,
      "title": "pattern",
      "markdownDescription": "This key defines a [regular expression](https://re2js.leopard.in.ua/) that the Input value must match.\n\nWhen configured, CloudCannon will require you to enter a value that matches the REGEX pattern.\n\nIf the Input already contains an invalid value, CloudCannon will require you to enter a valid string to save your changes, or discard your unsaved\nchanges.\n\nValue must be a valid REGEX string.\n\nIf your REGEX string includes a `\\` character and CloudCannon Configuration File is a `.yml` file, use single quotes `'` around the string to avoid a\nbuild error.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\nTo use this key in a Select Input, `allow_create` must be set to `true`.\n\n## Examples\n\nIn this example, we want our team to add an email address to the `contact_email` Input using the correct email format.\n\n```yaml\n_inputs:\n  contact_email:\n    type: email\n    options:\n      pattern: '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'\n      pattern_message: 'Please use the format ___@___.__'\n```"
    },
    "type._inputs.*.options.pattern_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.pattern`.\n\nThis key requires you to define `options.pattern`.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to use the correct email format in the `contact_email` Input using a pattern message.\n\n```yaml\n_inputs:\n  contact_email:\n    type: email\n    options:\n      pattern: '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'\n      pattern_message: 'Please use the format ___@___.__'\n```",
      "type": "string",
      "documented": true,
      "title": "pattern_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.pattern`.\n\nThis key requires you to define `options.pattern`.\n\nThis key has no default.\n\nThis key is available for Code, Color, File, Select, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to use the correct email format in the `contact_email` Input using a pattern message.\n\n```yaml\n_inputs:\n  contact_email:\n    type: email\n    options:\n      pattern: '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}'\n      pattern_message: 'Please use the format ___@___.__'\n```"
    },
    "type._inputs.*.options.pattern_flags": {
      "description": "This key defines the flags (e.g. case-insensitive searching) for the regular expression set in `options.pattern`.\n\n## Examples\n\nIn this example, we have configured pattern flags for a text input to enable case-insensitive searching.\n\n```yaml\n_inputs:\n  search_term:\n    type: text\n    options:\n      pattern: \"^[a-z]+$\"\n      pattern_flags:\n        ignore_case: true\n```",
      "type": "object",
      "properties": {
        "global": {
          "description": "This key defines the `g` flag - Search globally.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "global",
          "markdownDescription": "This key defines the `g` flag - Search globally."
        },
        "ignore_case": {
          "description": "This key defines the `i` flag - Case-insensitive.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "ignore_case",
          "markdownDescription": "This key defines the `i` flag - Case-insensitive."
        },
        "multiline": {
          "description": "This key defines the `m` flag - `^` and `$` match the start and end of each line rather than the entire string.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "multiline",
          "markdownDescription": "This key defines the `m` flag - `^` and `$` match the start and end of each line rather than the entire string."
        },
        "dot_all": {
          "description": "This key defines the `s` flag - `.` matches newline characters.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "dot_all",
          "markdownDescription": "This key defines the `s` flag - `.` matches newline characters."
        },
        "unicode": {
          "description": "This key defines the `u` flag - Pattern is treated as a sequence of Unicode code points.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "unicode",
          "markdownDescription": "This key defines the `u` flag - Pattern is treated as a sequence of Unicode code points."
        },
        "unicode_sets": {
          "description": "This key defines the `v` flag for extended `unicode` mode.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "unicode_sets",
          "markdownDescription": "This key defines the `v` flag for extended `unicode` mode."
        }
      },
      "markdownDescription": "This key defines the flags (e.g. case-insensitive searching) for the regular expression set in `options.pattern`.\n\n## Examples\n\nIn this example, we have configured pattern flags for a text input to enable case-insensitive searching.\n\n```yaml\n_inputs:\n  search_term:\n    type: text\n    options:\n      pattern: \"^[a-z]+$\"\n      pattern_flags:\n        ignore_case: true\n```",
      "documented": true,
      "title": "pattern_flags",
      "additionalProperties": false
    },
    "type._inputs.*.options.required": {
      "description": "This key toggles whether CloudCannon requires this Input to have a value.\n\nSetting this key to `true` will require you to enter a value to save your changes, or discard your unsaved changes.\n\nBy default, this key is `false` (i.e., CloudCannon does not require this Input to have a value).\n\nThis key is available for Array, Code, Color, Date and Time, File, Number, Object, Select and Multiselect, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we want to require our team to enter an `author` value for markup files with this Input.\n\n```yaml\n_inputs:\n  author:\n    type: text\n    comment: Enter the name of the author for this blog post.\n    options:\n      required: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "required",
      "markdownDescription": "This key toggles whether CloudCannon requires this Input to have a value.\n\nSetting this key to `true` will require you to enter a value to save your changes, or discard your unsaved changes.\n\nBy default, this key is `false` (i.e., CloudCannon does not require this Input to have a value).\n\nThis key is available for Array, Code, Color, Date and Time, File, Number, Object, Select and Multiselect, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we want to require our team to enter an `author` value for markup files with this Input.\n\n```yaml\n_inputs:\n  author:\n    type: text\n    comment: Enter the name of the author for this blog post.\n    options:\n      required: true\n```"
    },
    "type._inputs.*.options.required_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.required`.\n\nThis key requires you to define `options.required`.\n\nThis key has no default.\n\nThis key is available for Array, Code, Color, Date and Time, File, Number, Object, Select and Multiselect, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to use enter an Input value using a required message.\n\n```yaml\n_inputs:\n  author:\n    type: text\n    comment: Enter the name of the author for this blog post.\n    options:\n      required: true\n      required_message: You are not allowed to leave this blank.\n```",
      "type": "string",
      "documented": true,
      "title": "required_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.required`.\n\nThis key requires you to define `options.required`.\n\nThis key has no default.\n\nThis key is available for Array, Code, Color, Date and Time, File, Number, Object, Select and Multiselect, Text, Rich Text, and URL Inputs.\n\n## Examples\n\nIn this example, we prompt our team to use enter an Input value using a required message.\n\n```yaml\n_inputs:\n  author:\n    type: text\n    comment: Enter the name of the author for this blog post.\n    options:\n      required: true\n      required_message: You are not allowed to leave this blank.\n```"
    },
    "type._inputs.*.options.empty_type(text)": {
      "default": "null",
      "description": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values.",
      "type": "string",
      "enum": [
        "null",
        "string"
      ],
      "documented": true,
      "title": "Text Empty Type",
      "markdownDescription": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values."
    },
    "PreviewEntries": {
      "anyOf": [
        {
          "$ref": "#/$defs/type.preview-entry.(array)"
        },
        {
          "$ref": "#/$defs/type.preview-entry.(raw-text)"
        },
        {
          "$ref": "#/$defs/type.preview-entry.(false)"
        }
      ],
      "documented": false,
      "title": "icon_color(previewentries)"
    },
    "type.preview-entry.(array)": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/type.preview-entry"
      },
      "title": "Array Preview Entry",
      "documented": true,
      "description": "This key represents an array of preview entries for displaying data on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an array of preview entry objects, strings, or `false` values. Each preview entry object can contain a `key`, `template`, or `text` property. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured an array of preview entries with an array of values to provide fallback options. CloudCannon will use the value of `title` first, then the `{name}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n        - template: '{name}'\n        - text: 'Untitled'\n```",
      "markdownDescription": "This key represents an array of preview entries for displaying data on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an array of preview entry objects, strings, or `false` values. Each preview entry object can contain a `key`, `template`, or `text` property. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured an array of preview entries with an array of values to provide fallback options. CloudCannon will use the value of `title` first, then the `{name}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n        - template: '{name}'\n        - text: 'Untitled'\n```"
    },
    "type.preview-entry": {
      "anyOf": [
        {
          "$ref": "#/$defs/type.preview-entry.(key)"
        },
        {
          "$ref": "#/$defs/type.preview-entry.(template)"
        },
        {
          "$ref": "#/$defs/type.preview-entry.(text)"
        },
        {
          "$ref": "#/$defs/type.preview-entry.(raw-text)"
        },
        {
          "$ref": "#/$defs/type.preview-entry.(false)"
        }
      ],
      "title": "Preview Entry",
      "documented": true,
      "description": "This key defines a preview entry configuration for displaying data on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an object with a `key`, `template`, or `text` property, a raw text string, `false`, or an array of these values. When multiple entries are provided, CloudCannon will use them in order as fallback options. Preview entries are used to configure how data is displayed in card previews.\n\n## Examples\n\nIn this example, we have configured a preview entry with an array of values to provide fallback options. CloudCannon will use the value of `title` first, then the `{name}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n        - template: '{name}'\n        - text: 'Untitled'\n```\n\nIn this example, we have configured a preview entry to display the `title` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```",
      "markdownDescription": "This key defines a preview entry configuration for displaying data on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an object with a `key`, `template`, or `text` property, a raw text string, `false`, or an array of these values. When multiple entries are provided, CloudCannon will use them in order as fallback options. Preview entries are used to configure how data is displayed in card previews.\n\n## Examples\n\nIn this example, we have configured a preview entry with an array of values to provide fallback options. CloudCannon will use the value of `title` first, then the `{name}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n        - template: '{name}'\n        - text: 'Untitled'\n```\n\nIn this example, we have configured a preview entry to display the `title` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```"
    },
    "type.preview-entry.(key)": {
      "type": "object",
      "properties": {
        "key": {
          "type": "string",
          "title": "Key Value",
          "documented": true,
          "description": "This key defines the data key name to display in a key preview entry.\n\nThe value is a string that specifies the name of a data key whose value will be displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the key value to display the `title` field.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```",
          "markdownDescription": "This key defines the data key name to display in a key preview entry.\n\nThe value is a string that specifies the name of a data key whose value will be displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the key value to display the `title` field.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```"
        }
      },
      "required": [
        "key"
      ],
      "markdownDescription": "This key represents a key preview entry type for displaying data from a specific key on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an object that contains a `key` property with a string value. This displays the value of the specified data key in card previews.\n\n## Examples\n\nIn this example, we have configured a key preview entry to display the `title` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```",
      "title": "Key Preview Entry",
      "documented": true,
      "description": "This key represents a key preview entry type for displaying data from a specific key on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an object that contains a `key` property with a string value. This displays the value of the specified data key in card previews.\n\n## Examples\n\nIn this example, we have configured a key preview entry to display the `title` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```",
      "additionalProperties": false
    },
    "type.preview-entry.(template)": {
      "type": "object",
      "properties": {
        "template": {
          "type": "string",
          "title": "Template Value",
          "documented": true,
          "description": "This key defines the template string to use in a template preview entry.\n\nThe value is a string that specifies a template with placeholders (e.g., `{name}`, `{date}`) that will be replaced with data values when displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the template value to display author and date.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - template: '{author} - {date}'\n```",
          "markdownDescription": "This key defines the template string to use in a template preview entry.\n\nThe value is a string that specifies a template with placeholders (e.g., `{name}`, `{date}`) that will be replaced with data values when displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the template value to display author and date.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - template: '{author} - {date}'\n```"
        }
      },
      "required": [
        "template"
      ],
      "markdownDescription": "This key represents a template preview entry type for displaying formatted text using a template on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an object that contains a `template` property with a string value. This displays formatted text using template syntax (e.g., `{name}`) in card previews.\n\n## Examples\n\nIn this example, we have configured a template preview entry to display formatted text.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - template: '{author} - {date}'\n```",
      "title": "Template Preview Entry",
      "documented": true,
      "description": "This key represents a template preview entry type for displaying formatted text using a template on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an object that contains a `template` property with a string value. This displays formatted text using template syntax (e.g., `{name}`) in card previews.\n\n## Examples\n\nIn this example, we have configured a template preview entry to display formatted text.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - template: '{author} - {date}'\n```",
      "additionalProperties": false
    },
    "type.preview-entry.(text)": {
      "type": "object",
      "properties": {
        "text": {
          "type": "string",
          "title": "Text Value",
          "documented": true,
          "description": "This key defines the static text string to display in a text preview entry.\n\nThe value is a string that specifies static text to display on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the text value to display a static fallback message.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - text: 'Untitled'\n```",
          "markdownDescription": "This key defines the static text string to display in a text preview entry.\n\nThe value is a string that specifies static text to display on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the text value to display a static fallback message.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - text: 'Untitled'\n```"
        }
      },
      "required": [
        "text"
      ],
      "markdownDescription": "This key represents a text preview entry type for displaying static text on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an object that contains a `text` property with a string value. This displays static text in card previews.\n\n## Examples\n\nIn this example, we have configured a text preview entry to display static text.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - text: 'Untitled'\n```",
      "title": "Text Preview Entry",
      "documented": true,
      "description": "This key represents a text preview entry type for displaying static text on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an object that contains a `text` property with a string value. This displays static text in card previews.\n\n## Examples\n\nIn this example, we have configured a text preview entry to display static text.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - text: 'Untitled'\n```",
      "additionalProperties": false
    },
    "type.preview-entry.(raw-text)": {
      "type": "string",
      "title": "Raw Text Preview Entry",
      "documented": true,
      "description": "This key represents a raw text preview entry type for displaying static text on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is a string that specifies static text to display in card previews. This is equivalent to using `{ text: \"...\" }` but in a simpler format.\n\n## Examples\n\nIn this example, we have configured a raw text preview entry to display static text.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text: 'Untitled'\n```",
      "markdownDescription": "This key represents a raw text preview entry type for displaying static text on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is a string that specifies static text to display in card previews. This is equivalent to using `{ text: \"...\" }` but in a simpler format.\n\n## Examples\n\nIn this example, we have configured a raw text preview entry to display static text.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text: 'Untitled'\n```"
    },
    "type.preview-entry.(false)": {
      "type": "boolean",
      "const": false,
      "title": "False Preview Entry",
      "documented": true,
      "description": "This key represents a preview entry that disables the preview display for a specific field on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value must be `false`. Setting a preview entry to `false` will hide that preview element.\n\n## Examples\n\nIn this example, we have configured the preview text to be disabled.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text: false\n```",
      "markdownDescription": "This key represents a preview entry that disables the preview display for a specific field on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value must be `false`. Setting a preview entry to `false` will hide that preview element.\n\n## Examples\n\nIn this example, we have configured the preview text to be disabled.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text: false\n```"
    },
    "TextareaInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "textarea",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `description` key as a *Textarea Input* type.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n```",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `description` key as a *Textarea Input* type.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "placeholder": {
              "description": "This key defines the text shown when this input has no value.\n\n## Examples\n\nIn this example, we have configured a placeholder for a *Textarea Input*.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    options:\n      placeholder: Enter a description\n```",
              "type": "string",
              "documented": true,
              "title": "placeholder",
              "markdownDescription": "This key defines the text shown when this input has no value.\n\n## Examples\n\nIn this example, we have configured a placeholder for a *Textarea Input*.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    options:\n      placeholder: Enter a description\n```"
            },
            "show_count": {
              "description": "This key toggles whether a character counter is shown below the input.\n\nSetting this key to `true` will show a character counter below the input.\n\n## Examples\n\nIn this example, CloudCannon will show a character counter below the *Textarea Input*.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    options:\n      show_count: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "show_count",
              "markdownDescription": "This key toggles whether a character counter is shown below the input.\n\nSetting this key to `true` will show a character counter below the input.\n\n## Examples\n\nIn this example, CloudCannon will show a character counter below the *Textarea Input*.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    options:\n      show_count: true\n```"
            }
          },
          "markdownDescription": "This key defines options that are specific to Textarea Inputs.\n\n## Examples\n\nIn this example, we have configured *Textarea Input* options including comment and character count.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    options:\n      comment: Enter a description\n      show_count: true\n```",
          "description": "This key defines options that are specific to Textarea Inputs.\n\n## Examples\n\nIn this example, we have configured *Textarea Input* options including comment and character count.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    options:\n      comment: Enter a description\n      show_count: true\n```",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for plain text.\n\n## Examples\n\nIn this example, we have configured the `description` key as a *Textarea Input*.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    label: Description\n```",
      "title": "Textarea Input",
      "description": "This key defines an editing interface for plain text.\n\n## Examples\n\nIn this example, we have configured the `description` key as a *Textarea Input*.\n\n```yaml\n_inputs:\n  description:\n    type: textarea\n    label: Description\n```",
      "documented": true,
      "additionalProperties": false
    },
    "CodeInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "code",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "tab_size": {
              "default": 2,
              "type": "number",
              "documented": true,
              "title": "tab_size",
              "description": "This key defines the number of spaces inserted when the Tab key is pressed in a *Code Input*.\n\nThe value is a number representing the number of spaces. This affects both indentation behavior and how existing tabs are displayed.\n\n## Examples\n\nIn this example, we have configured a code input to use 4 spaces for indentation instead of the default 2.\n\n```yaml\n_inputs:\n  python_code:\n    type: code\n    label: Python Code\n    options:\n      tab_size: 4\n```",
              "markdownDescription": "This key defines the number of spaces inserted when the Tab key is pressed in a *Code Input*.\n\nThe value is a number representing the number of spaces. This affects both indentation behavior and how existing tabs are displayed.\n\n## Examples\n\nIn this example, we have configured a code input to use 4 spaces for indentation instead of the default 2.\n\n```yaml\n_inputs:\n  python_code:\n    type: code\n    label: Python Code\n    options:\n      tab_size: 4\n```"
            },
            "theme": {
              "default": "basic_dark",
              "allOf": [
                {
                  "$ref": "#/$defs/Theme"
                }
              ],
              "documented": true,
              "title": "theme",
              "description": "This key defines the color theme used for syntax highlighting in *Code Inputs*.\n\n\nBy default, this key is `basic_dark`.\n\n## Examples\n\nIn this example, we have configured a code input to use the `dracula` theme for a dark-colored editing experience.\n\n```yaml\n_inputs:\n  javascript_code:\n    type: code\n    label: JavaScript\n    options:\n      theme: dracula\n```",
              "markdownDescription": "This key defines the color theme used for syntax highlighting in *Code Inputs*.\n\n\nBy default, this key is `basic_dark`.\n\n## Examples\n\nIn this example, we have configured a code input to use the `dracula` theme for a dark-colored editing experience.\n\n```yaml\n_inputs:\n  javascript_code:\n    type: code\n    label: JavaScript\n    options:\n      theme: dracula\n```"
            },
            "show_gutter": {
              "default": true,
              "type": "boolean",
              "documented": true,
              "title": "show_gutter",
              "description": "This key toggles whether CloudCannon displays line numbers in the gutter of *Code Inputs*.\n\nSetting this key to `false` will hide line numbers in the left gutter of the code editor.\n\nBy default, this key is `true` (i.e., line numbers are displayed).\n\n## Examples\n\nIn this example, we have configured a code input to hide line numbers by setting `show_gutter` to `false`.\n\n```yaml\n_inputs:\n  css_code:\n    type: code\n    label: Custom CSS\n    options:\n      show_gutter: false\n```",
              "markdownDescription": "This key toggles whether CloudCannon displays line numbers in the gutter of *Code Inputs*.\n\nSetting this key to `false` will hide line numbers in the left gutter of the code editor.\n\nBy default, this key is `true` (i.e., line numbers are displayed).\n\n## Examples\n\nIn this example, we have configured a code input to hide line numbers by setting `show_gutter` to `false`.\n\n```yaml\n_inputs:\n  css_code:\n    type: code\n    label: Custom CSS\n    options:\n      show_gutter: false\n```"
            },
            "soft_wrap": {
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "soft_wrap",
              "description": "This key toggles whether long lines wrap to the next line in *Code Inputs*.\n\nSetting this key to `true` will wrap lines that exceed the width of the code area to the next line without adding a line break character.\n\nBy default, this key is `false` (i.e., long lines extend horizontally and require horizontal scrolling).\n\n## Examples\n\nIn this example, we have configured a code input to enable soft line wrapping for better readability of long lines.\n\n```yaml\n_inputs:\n  markdown_content:\n    type: code\n    label: Markdown\n    options:\n      soft_wrap: true\n```",
              "markdownDescription": "This key toggles whether long lines wrap to the next line in *Code Inputs*.\n\nSetting this key to `true` will wrap lines that exceed the width of the code area to the next line without adding a line break character.\n\nBy default, this key is `false` (i.e., long lines extend horizontally and require horizontal scrolling).\n\n## Examples\n\nIn this example, we have configured a code input to enable soft line wrapping for better readability of long lines.\n\n```yaml\n_inputs:\n  markdown_content:\n    type: code\n    label: Markdown\n    options:\n      soft_wrap: true\n```"
            },
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "max_visible_lines": {
              "description": "This key defines the maximum number of visible lines for this input, effectively controlling maximum height.\n\nWhen the containing text exceeds this number, the input becomes a scroll area.",
              "type": "number",
              "documented": true,
              "title": "max_visible_lines",
              "markdownDescription": "This key defines the maximum number of visible lines for this input, effectively controlling maximum height.\n\nWhen the containing text exceeds this number, the input becomes a scroll area."
            },
            "min_visible_lines": {
              "description": "This key defines the minimum number of visible lines for this input, effectively controlling initial height.\n\nWhen the containing text exceeds this number, the input grows line by line to the lines defined by `max_visible_lines`.",
              "type": "number",
              "documented": true,
              "title": "min_visible_lines",
              "markdownDescription": "This key defines the minimum number of visible lines for this input, effectively controlling initial height.\n\nWhen the containing text exceeds this number, the input grows line by line to the lines defined by `max_visible_lines`."
            },
            "syntax": {
              "description": "This key defines how the editor parses your content for syntax highlighting.\n\nShould be set to the language of the code going into the input.",
              "allOf": [
                {
                  "$ref": "#/$defs/Syntax"
                }
              ],
              "documented": true,
              "title": "syntax",
              "markdownDescription": "This key defines how the editor parses your content for syntax highlighting.\n\nShould be set to the language of the code going into the input."
            }
          },
          "markdownDescription": "This key defines options that are specific to Code Inputs.",
          "description": "This key defines options that are specific to Code Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for code or mono-spaced plain text content.",
      "title": "Code Input",
      "description": "This key defines an editing interface for code or mono-spaced plain text content.",
      "documented": true,
      "additionalProperties": false
    },
    "Theme": {
      "type": "string",
      "enum": [
        "atomone",
        "basic_dark",
        "basic_light",
        "darcula",
        "dracula",
        "duotone_dark",
        "duotone_light",
        "eclipse",
        "github_dark",
        "github_light",
        "gruvbox_dark",
        "gruvbox_light",
        "material_dark",
        "material_light",
        "solarized_dark",
        "solarized_light",
        "sublime",
        "tokyo_night",
        "tokyo_night_day",
        "tokyo_night_storm",
        "tomorrow_night_blue",
        "vscode_dark",
        "vscode_light",
        "xcode_dark",
        "xcode_light"
      ],
      "documented": false,
      "title": "theme(theme)"
    },
    "Syntax": {
      "type": "string",
      "enum": [
        "c_cpp",
        "clojure",
        "cobol",
        "coffee",
        "csharp",
        "css",
        "d",
        "dart",
        "diff",
        "dockerfile",
        "eiffel",
        "elm",
        "erlang",
        "forth",
        "fortran",
        "fsharp",
        "gherkin",
        "golang",
        "groovy",
        "haskell",
        "haskell_cabal",
        "haxe",
        "html",
        "java",
        "javascript",
        "json",
        "julia",
        "kotlin",
        "less",
        "liquid",
        "livescript",
        "lua",
        "markdown",
        "mysql",
        "nginx",
        "nsis",
        "objectivec",
        "ocaml",
        "pascal",
        "pgsql",
        "pig",
        "powershell",
        "properties",
        "protobuf",
        "puppet",
        "python",
        "r",
        "ruby",
        "rust",
        "sass",
        "scala",
        "scheme",
        "scss",
        "sh",
        "sql",
        "stylus",
        "swift",
        "tcl",
        "toml",
        "turtle",
        "typescript",
        "vbscript",
        "velocity",
        "verilog",
        "vhdl",
        "xml",
        "xquery",
        "yaml"
      ],
      "title": "Syntax",
      "description": "Available syntax highlighting languages for code editors in CloudCannon.",
      "documented": false,
      "markdownDescription": "Available syntax highlighting languages for code editors in CloudCannon."
    },
    "ColorInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "color",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "format": {
              "description": "This key defines what format the color value is saved as.\n\nDefaults to the naming convention, or \"hex\" if that is unset.",
              "type": "string",
              "enum": [
                "rgb",
                "hex",
                "hsl",
                "hsv"
              ],
              "documented": true,
              "title": "format",
              "markdownDescription": "This key defines what format the color value is saved as.\n\nDefaults to the naming convention, or \"hex\" if that is unset."
            },
            "alpha": {
              "description": "This key toggles whether CloudCannon will show a control for adjusting the transparency of the selected color.\n\nSetting this key to `true` will show a control for adjusting the transparency of the selected color.\n\nBy default, this key uses the naming convention (i.e., enabled if the input key ends with \"a\").",
              "type": "boolean",
              "documented": true,
              "title": "alpha",
              "markdownDescription": "This key toggles whether CloudCannon will show a control for adjusting the transparency of the selected color.\n\nSetting this key to `true` will show a control for adjusting the transparency of the selected color.\n\nBy default, this key uses the naming convention (i.e., enabled if the input key ends with \"a\")."
            },
            "palette": {
              "type": "array",
              "items": {
                "type": "string",
                "documented": true,
                "title": "palette[*]",
                "description": "This key represents an individual color string in the `_inputs.*.(color-input).options.palette` array.\n\nThe value is a string that specifies a color in the predefined palette for *Color Inputs*. Each string can be a hex code (e.g., `#ff0000`), CSS color name, or other valid color format.\n\n## Examples\n\nIn this example, we have configured a color input with a palette containing a hex code color value.\n\n```yaml\n_inputs:\n  primary_color:\n    type: color\n    label: Primary Color\n    options:\n      palette:\n        - '#ff0000'\n```\n\nIn this example, we have configured a color input with a palette containing a CSS color name.\n\n```yaml\n_inputs:\n  accent_color:\n    type: color\n    label: Accent Color\n    options:\n      palette:\n        - red\n```",
                "markdownDescription": "This key represents an individual color string in the `_inputs.*.(color-input).options.palette` array.\n\nThe value is a string that specifies a color in the predefined palette for *Color Inputs*. Each string can be a hex code (e.g., `#ff0000`), CSS color name, or other valid color format.\n\n## Examples\n\nIn this example, we have configured a color input with a palette containing a hex code color value.\n\n```yaml\n_inputs:\n  primary_color:\n    type: color\n    label: Primary Color\n    options:\n      palette:\n        - '#ff0000'\n```\n\nIn this example, we have configured a color input with a palette containing a CSS color name.\n\n```yaml\n_inputs:\n  accent_color:\n    type: color\n    label: Accent Color\n    options:\n      palette:\n        - red\n```"
              },
              "documented": true,
              "title": "palette",
              "description": "This key defines a predefined color palette for *Color Inputs*.\n\nThe value is an array of color strings. Each string can be a hex code (e.g., `#ff0000`), CSS color name, or other valid color format.\n\nWhen a palette is configured, users can select colors from the palette in addition to using the color picker (unless `hide_picker` is set to `true`).\n\n## Examples\n\nIn this example, we have configured a color input with a palette of brand colors for quick selection.\n\n```yaml\n_inputs:\n  primary_color:\n    type: color\n    label: Primary Color\n    options:\n      palette:\n        - '#ff0000'\n        - '#00ff00'\n        - '#0000ff'\n        - '#ffff00'\n```\n\nIn this example, we have configured a color input with a palette using CSS color names.\n\n```yaml\n_inputs:\n  accent_color:\n    type: color\n    label: Accent Color\n    options:\n      palette:\n        - red\n        - blue\n        - green\n        - yellow\n```",
              "markdownDescription": "This key defines a predefined color palette for *Color Inputs*.\n\nThe value is an array of color strings. Each string can be a hex code (e.g., `#ff0000`), CSS color name, or other valid color format.\n\nWhen a palette is configured, users can select colors from the palette in addition to using the color picker (unless `hide_picker` is set to `true`).\n\n## Examples\n\nIn this example, we have configured a color input with a palette of brand colors for quick selection.\n\n```yaml\n_inputs:\n  primary_color:\n    type: color\n    label: Primary Color\n    options:\n      palette:\n        - '#ff0000'\n        - '#00ff00'\n        - '#0000ff'\n        - '#ffff00'\n```\n\nIn this example, we have configured a color input with a palette using CSS color names.\n\n```yaml\n_inputs:\n  accent_color:\n    type: color\n    label: Accent Color\n    options:\n      palette:\n        - red\n        - blue\n        - green\n        - yellow\n```"
            },
            "hide_picker": {
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "hide_picker",
              "description": "This key toggles whether CloudCannon hides the color picker UI in *Color Inputs*.\n\nSetting this key to `true` will hide the color picker interface, requiring users to enter color values manually or select from a palette if one is configured.\n\nBy default, this key is `false` (i.e., the color picker is displayed).\n\n## Examples\n\nIn this example, we have configured a color input to hide the picker UI, requiring users to select from the predefined palette or enter values manually.\n\n```yaml\n_inputs:\n  brand_color:\n    type: color\n    label: Brand Color\n    options:\n      palette:\n        - '#ff0000'\n        - '#00ff00'\n        - '#0000ff'\n      hide_picker: true\n```",
              "markdownDescription": "This key toggles whether CloudCannon hides the color picker UI in *Color Inputs*.\n\nSetting this key to `true` will hide the color picker interface, requiring users to enter color values manually or select from a palette if one is configured.\n\nBy default, this key is `false` (i.e., the color picker is displayed).\n\n## Examples\n\nIn this example, we have configured a color input to hide the picker UI, requiring users to select from the predefined palette or enter values manually.\n\n```yaml\n_inputs:\n  brand_color:\n    type: color\n    label: Brand Color\n    options:\n      palette:\n        - '#ff0000'\n        - '#00ff00'\n        - '#0000ff'\n      hide_picker: true\n```"
            }
          },
          "markdownDescription": "This key defines options that are specific to Color Inputs.",
          "description": "This key defines options that are specific to Color Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for color values.",
      "title": "Color Input",
      "description": "This key defines an editing interface for color values.",
      "documented": true,
      "additionalProperties": false
    },
    "BooleanInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "enum": [
            "checkbox",
            "switch"
          ],
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `featured` key as a *Boolean Input* type.\n\n```yaml\n_inputs:\n  featured:\n    type: switch\n```",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `featured` key as a *Boolean Input* type.\n\n```yaml\n_inputs:\n  featured:\n    type: switch\n```"
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for true or false values.\n\n## Examples\n\nIn this example, we have configured the `featured` key as a *Boolean Input*.\n\n```yaml\n_inputs:\n  featured:\n    type: switch\n    label: Featured\n```",
      "title": "Boolean Input",
      "description": "This key defines an editing interface for true or false values.\n\n## Examples\n\nIn this example, we have configured the `featured` key as a *Boolean Input*.\n\n```yaml\n_inputs:\n  featured:\n    type: switch\n    label: Featured\n```",
      "documented": true,
      "additionalProperties": false
    },
    "NumberInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "number",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `quantity` key as a *Number Input* type.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n```",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `quantity` key as a *Number Input* type.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(number)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "min": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.min"
                }
              ],
              "documented": false,
              "title": "min"
            },
            "max": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.max"
                }
              ],
              "documented": false,
              "title": "max"
            },
            "step": {
              "$ref": "#/$defs/type._inputs.*.options.step"
            },
            "min_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_message"
            },
            "max_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_message"
            }
          },
          "markdownDescription": "This key defines options that are specific to Number Inputs.\n\n## Examples\n\nIn this example, we have configured *Number Input* options including min and max values.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n    options:\n      min: 1\n      max: 100\n```",
          "description": "This key defines options that are specific to Number Inputs.\n\n## Examples\n\nIn this example, we have configured *Number Input* options including min and max values.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n    options:\n      min: 1\n      max: 100\n```",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for numeric values.\n\n## Examples\n\nIn this example, we have configured the `quantity` key as a *Number Input*.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n    label: Quantity\n```",
      "title": "Number Input",
      "description": "This key defines an editing interface for numeric values.\n\n## Examples\n\nIn this example, we have configured the `quantity` key as a *Number Input*.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n    label: Quantity\n```",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs.*.options.empty_type(number)": {
      "default": "null",
      "description": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values.\n\n## Examples\n\nIn this example, we have configured how empty number values will be saved.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n    options:\n      empty_type: number\n```",
      "type": "string",
      "enum": [
        "null",
        "number"
      ],
      "documented": true,
      "title": "Number Empty Type",
      "markdownDescription": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values.\n\n## Examples\n\nIn this example, we have configured how empty number values will be saved.\n\n```yaml\n_inputs:\n  quantity:\n    type: number\n    options:\n      empty_type: number\n```"
    },
    "type._inputs.*.options.min": {
      "type": "number",
      "description": "This key defines the minimum numerical value CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from entering a lesser numerical value.\n\nIf the Input already contains a lesser numerical value, CloudCannon will require you to enter a valid value to save your changes, or discard your\nunsaved changes.\n\nThis key is required for `range` inputs.\n\nValue can be any number.\n\nIf `options.max` is also configured, this key cannot be a greater number.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we want to add a rating out of five for each article in our travel blog using the `rating` Input. This Input limits you to a minimum rating of one.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      min: 1\n```",
      "documented": true,
      "title": "min",
      "markdownDescription": "This key defines the minimum numerical value CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from entering a lesser numerical value.\n\nIf the Input already contains a lesser numerical value, CloudCannon will require you to enter a valid value to save your changes, or discard your\nunsaved changes.\n\nThis key is required for `range` inputs.\n\nValue can be any number.\n\nIf `options.max` is also configured, this key cannot be a greater number.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we want to add a rating out of five for each article in our travel blog using the `rating` Input. This Input limits you to a minimum rating of one.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      min: 1\n```"
    },
    "type._inputs.*.options.max": {
      "type": "number",
      "description": "This key defines the maximum numerical value CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from entering a greater numerical value.\n\nIf the Input already contains a greater numerical value, CloudCannon will require you to enter a valid value to save your changes, or discard your\nunsaved changes.\n\nThis key is required for `range` inputs.\n\nValue can be any integer.\n\nIf `options.min` is also configured, this key cannot be a lesser number.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we want to add a rating out of five for each article in our travel blog using the `rating` Input. This Input limits you to a maximum rating of five.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      min: 1\n```",
      "documented": true,
      "title": "max",
      "markdownDescription": "This key defines the maximum numerical value CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from entering a greater numerical value.\n\nIf the Input already contains a greater numerical value, CloudCannon will require you to enter a valid value to save your changes, or discard your\nunsaved changes.\n\nThis key is required for `range` inputs.\n\nValue can be any integer.\n\nIf `options.min` is also configured, this key cannot be a lesser number.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we want to add a rating out of five for each article in our travel blog using the `rating` Input. This Input limits you to a maximum rating of five.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      min: 1\n```"
    },
    "type._inputs.*.options.step": {
      "description": "This key defines a number that specifies the granularity that the value must adhere to, or the special value any, which allows any decimal value between `max` and `min`.\n\n## Examples\n\nIn this example, we have configured a *Range Input* to use a step value of 5.\n\n```yaml\n_inputs:\n  rating:\n    type: range\n    options:\n      min: 0\n      max: 100\n      step: 5\n```",
      "type": "number",
      "documented": true,
      "title": "step",
      "markdownDescription": "This key defines a number that specifies the granularity that the value must adhere to, or the special value any, which allows any decimal value between `max` and `min`.\n\n## Examples\n\nIn this example, we have configured a *Range Input* to use a step value of 5.\n\n```yaml\n_inputs:\n  rating:\n    type: range\n    options:\n      min: 0\n      max: 100\n      step: 5\n```"
    },
    "type._inputs.*.options.min_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.min`.\nThis key requires you to define `options.min`.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number using a custom message.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      max_message: Cannot be more than 5\n      min: 1\n      min_message: Cannot be less than 1\n```",
      "type": "string",
      "documented": true,
      "title": "min_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.min`.\nThis key requires you to define `options.min`.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number using a custom message.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      max_message: Cannot be more than 5\n      min: 1\n      min_message: Cannot be less than 1\n```"
    },
    "type._inputs.*.options.max_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max`.\nThis key requires you to define `options.max`.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number using a custom message.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      max_message: Cannot be more than 5\n      min: 1\n      min_message: Cannot be less than 1\n```",
      "type": "string",
      "documented": true,
      "title": "max_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max`.\nThis key requires you to define `options.max`.\n\nThis key has no default.\n\nThis key is available for Number Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number using a custom message.\n\n```yaml\n_inputs:\n  rating:\n    type: number\n    comment: How highly did you rate this experience?\n    options:\n      max: 5\n      max_message: Cannot be more than 5\n      min: 1\n      min_message: Cannot be less than 1\n```"
    },
    "RangeInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "range",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(number)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "min": {
              "$ref": "#/$defs/type._inputs.*.options.min"
            },
            "max": {
              "$ref": "#/$defs/type._inputs.*.options.max"
            },
            "step": {
              "$ref": "#/$defs/type._inputs.*.options.step"
            },
            "min_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_message"
            },
            "max_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_message"
            }
          },
          "required": [
            "min",
            "max"
          ],
          "markdownDescription": "This key defines options that are specific to Range Inputs.",
          "description": "This key defines options that are specific to Range Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines a slider interface for selecting a numeric value.",
      "title": "Range Input",
      "description": "This key defines a slider interface for selecting a numeric value.",
      "documented": true,
      "additionalProperties": false
    },
    "RichTextInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "enum": [
            "html",
            "markdown"
          ],
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "mime_type": {
              "$ref": "#/$defs/type._inputs.*.options.mime_type"
            },
            "resize_style": {
              "$ref": "#/$defs/type._inputs.*.options.resize_style"
            },
            "width": {
              "$ref": "#/$defs/type._inputs.*.options.width"
            },
            "height": {
              "$ref": "#/$defs/type._inputs.*.options.height"
            },
            "expandable": {
              "$ref": "#/$defs/type._inputs.*.options.expandable"
            },
            "image_size_attributes": {
              "$ref": "#/$defs/type._inputs.*.options.image_size_attributes"
            },
            "allowed_sources": {
              "$ref": "#/$defs/type._inputs.*.options.allowed_sources"
            },
            "prevent_resize_existing_files": {
              "$ref": "#/$defs/type._inputs.*.options.prevent_resize_existing_files"
            },
            "sizes": {
              "$ref": "#/$defs/type._inputs.*.options.sizes"
            },
            "paths": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.paths"
                }
              ],
              "documented": false,
              "title": "paths"
            },
            "bold": {
              "$ref": "#/$defs/type._editables.*.bold"
            },
            "copyformatting": {
              "$ref": "#/$defs/type._editables.*.copyformatting"
            },
            "italic": {
              "$ref": "#/$defs/type._editables.*.italic"
            },
            "link": {
              "$ref": "#/$defs/type._editables.*.link"
            },
            "redo": {
              "$ref": "#/$defs/type._editables.*.redo"
            },
            "removeformat": {
              "$ref": "#/$defs/type._editables.*.removeformat"
            },
            "strike": {
              "$ref": "#/$defs/type._editables.*.strike"
            },
            "subscript": {
              "$ref": "#/$defs/type._editables.*.subscript"
            },
            "superscript": {
              "$ref": "#/$defs/type._editables.*.superscript"
            },
            "underline": {
              "$ref": "#/$defs/type._editables.*.underline"
            },
            "undo": {
              "$ref": "#/$defs/type._editables.*.undo"
            },
            "remove_custom_markup": {
              "$ref": "#/$defs/type._editables.*.remove_custom_markup"
            },
            "allow_custom_markup": {
              "$ref": "#/$defs/type._editables.*.allow_custom_markup"
            },
            "blockquote": {
              "$ref": "#/$defs/type._editables.*.blockquote"
            },
            "bulletedlist": {
              "$ref": "#/$defs/type._editables.*.bulletedlist"
            },
            "center": {
              "$ref": "#/$defs/type._editables.*.center"
            },
            "code_inline": {
              "$ref": "#/$defs/type._editables.*.code_inline"
            },
            "code_block": {
              "$ref": "#/$defs/type._editables.*.code_block"
            },
            "code": {
              "$ref": "#/$defs/type._editables.*.code"
            },
            "embed": {
              "$ref": "#/$defs/type._editables.*.embed"
            },
            "format": {
              "$ref": "#/$defs/type._editables.*.format"
            },
            "horizontalrule": {
              "$ref": "#/$defs/type._editables.*.horizontalrule"
            },
            "image": {
              "$ref": "#/$defs/type._editables.*.image"
            },
            "indent": {
              "$ref": "#/$defs/type._editables.*.indent"
            },
            "justify": {
              "$ref": "#/$defs/type._editables.*.justify"
            },
            "left": {
              "$ref": "#/$defs/type._editables.*.left"
            },
            "numberedlist": {
              "$ref": "#/$defs/type._editables.*.numberedlist"
            },
            "outdent": {
              "$ref": "#/$defs/type._editables.*.outdent"
            },
            "right": {
              "$ref": "#/$defs/type._editables.*.right"
            },
            "snippet": {
              "$ref": "#/$defs/type._editables.*.snippet"
            },
            "styles": {
              "$ref": "#/$defs/type._editables.*.styles"
            },
            "table": {
              "$ref": "#/$defs/type._editables.*.table"
            },
            "join_above": {
              "$ref": "#/$defs/type._editables.*.join_above"
            },
            "join_below": {
              "$ref": "#/$defs/type._editables.*.join_below"
            },
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "allow_resize": {
              "deprecated": true,
              "type": "boolean",
              "documented": true,
              "title": "allow_resize",
              "description": "This key is deprecated. Use `preview_resize` instead.\n\nThis key toggles whether CloudCannon will show the resize handler to vertically resize the input.\n\nSetting this key to `false` will hide the resize handler.\n\nBy default, this key is `true` (i.e., the resize handler is shown).",
              "markdownDescription": "This key is deprecated. Use `preview_resize` instead.\n\nThis key toggles whether CloudCannon will show the resize handler to vertically resize the input.\n\nSetting this key to `false` will hide the resize handler.\n\nBy default, this key is `true` (i.e., the resize handler is shown)."
            },
            "prevent_resize": {
              "description": "Shows or hides the resize handler to vertically resize the input.",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "prevent_resize",
              "markdownDescription": "Shows or hides the resize handler to vertically resize the input."
            },
            "initial_height": {
              "description": "This key defines the initial height of this input in pixels (px).",
              "type": "number",
              "documented": true,
              "title": "initial_height",
              "markdownDescription": "This key defines the initial height of this input in pixels (px)."
            }
          },
          "markdownDescription": "This key defines options that are specific to Rich Text Inputs.",
          "description": "This key defines options that are specific to Rich Text Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for HTML markup content.",
      "title": "Rich Text Input",
      "description": "This key defines an editing interface for HTML markup content.",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs.*.options.mime_type": {
      "title": "Mime Type",
      "description": "This key defines what format an image is converted to prior to upload.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to convert images to WebP format prior to upload.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      mime_type: image/webp\n```",
      "type": "string",
      "enum": [
        "image/jpeg",
        "image/png",
        "image/webp"
      ],
      "documented": true,
      "markdownDescription": "This key defines what format an image is converted to prior to upload.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to convert images to WebP format prior to upload.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      mime_type: image/webp\n```"
    },
    "type._inputs.*.options.resize_style": {
      "title": "Resize Style",
      "description": "This key defines how image files are resized prior to upload, using a bounding box defined by `width` and `height` options.\n\nValid values are `cover`, `contain`, `crop`, or `stretch`:\n\n* `cover` keeps aspect ratio and ensures the image covers the bounding box\n* `contain` keeps aspect ratio and ensures the image fits inside the bounding box\n* `crop` prompts the user with and interface to select an aspect-ratio-respecting area\n* `stretch` ignores aspect ratio and resizes the image to the bounding box\n\nThis key does not apply to existing images, and does not work if `width` and `height` options are not defined.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to resize images using the `cover` style to ensure images cover the bounding box while maintaining aspect ratio.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n```",
      "default": "contain",
      "type": "string",
      "enum": [
        "cover",
        "contain",
        "stretch",
        "crop"
      ],
      "documented": true,
      "markdownDescription": "This key defines how image files are resized prior to upload, using a bounding box defined by `width` and `height` options.\n\nValid values are `cover`, `contain`, `crop`, or `stretch`:\n\n* `cover` keeps aspect ratio and ensures the image covers the bounding box\n* `contain` keeps aspect ratio and ensures the image fits inside the bounding box\n* `crop` prompts the user with and interface to select an aspect-ratio-respecting area\n* `stretch` ignores aspect ratio and resizes the image to the bounding box\n\nThis key does not apply to existing images, and does not work if `width` and `height` options are not defined.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to resize images using the `cover` style to ensure images cover the bounding box while maintaining aspect ratio.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n```"
    },
    "type._inputs.*.options.width": {
      "title": "Width",
      "description": "This key defines the width of the bounding box used in the resizing method defined by `resize_style`.",
      "type": "number",
      "documented": true,
      "markdownDescription": "This key defines the width of the bounding box used in the resizing method defined by `resize_style`."
    },
    "type._inputs.*.options.height": {
      "title": "Height",
      "description": "This key defines the height of the bounding box used in the resizing method defined by `resize_style`.\n\n## Examples\n\nIn this example, we have configured the height of the bounding box for an *Image Input*.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n```",
      "type": "number",
      "documented": true,
      "markdownDescription": "This key defines the height of the bounding box used in the resizing method defined by `resize_style`.\n\n## Examples\n\nIn this example, we have configured the height of the bounding box for an *Image Input*.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n```"
    },
    "type._inputs.*.options.expandable": {
      "title": "Expandable",
      "description": "This key defines whether you can upscale an image to fit the bounding box while resizing an image prior to upload.\n\nHas no effect if files are not resized.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to allow upscaling images to fit the bounding box while resizing.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n      expandable: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "markdownDescription": "This key defines whether you can upscale an image to fit the bounding box while resizing an image prior to upload.\n\nHas no effect if files are not resized.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to allow upscaling images to fit the bounding box while resizing.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n      expandable: true\n```"
    },
    "type._inputs.*.options.image_size_attributes": {
      "title": "Image Size Attributes",
      "description": "This key toggles whether CloudCannon will instruct a rich text editor to save `width` and `height` attributes on image elements.\n\nSetting this key to `true` will instruct the rich text editor to save `width` and `height` attributes on image elements. This can prevent pop-in as a page loads.\n\nBy default, this key is `false` (i.e., width and height attributes are not saved on image elements). This defaults to `true` if the [Image Size Attributes site flag](https://cloudcannon.com/documentation/articles/legacy-option-flags/#image-size-attributes-default-behaviour) is enabled (this is enabled for sites created before June 23 2023, in order to keep those sites working).\n\n## Examples\n\nIn this example, CloudCannon will save width and height attributes on image elements in a *Rich Text Input*.\n\n```yaml\n_inputs:\n  content:\n    type: markdown\n    options:\n      image_size_attributes: true\n```",
      "default": true,
      "type": "boolean",
      "documented": true,
      "markdownDescription": "This key toggles whether CloudCannon will instruct a rich text editor to save `width` and `height` attributes on image elements.\n\nSetting this key to `true` will instruct the rich text editor to save `width` and `height` attributes on image elements. This can prevent pop-in as a page loads.\n\nBy default, this key is `false` (i.e., width and height attributes are not saved on image elements). This defaults to `true` if the [Image Size Attributes site flag](https://cloudcannon.com/documentation/articles/legacy-option-flags/#image-size-attributes-default-behaviour) is enabled (this is enabled for sites created before June 23 2023, in order to keep those sites working).\n\n## Examples\n\nIn this example, CloudCannon will save width and height attributes on image elements in a *Rich Text Input*.\n\n```yaml\n_inputs:\n  content:\n    type: markdown\n    options:\n      image_size_attributes: true\n```"
    },
    "type._inputs.*.options.allowed_sources": {
      "title": "Allowed Sources",
      "description": "This key defines which sources and DAMs you are allowed to upload to and browse.\n\nThe value can be an array of strings. Valid values include `site-files` and the reference key for any DAM connected to your site.\n\nIf `site-files` is omitted from the array, site files will not be available as an asset source for this input.\n\n## Examples\n\nIn this example, we have configured allowed sources for an *Image Input*.\n\n```yaml\n_inputs:\n  image:\n    type: image\n    options:\n      allowed_sources:\n        - site-files\n        - my-cloudinary-dam\n```",
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "allowed_sources[*]",
        "description": "This key defines which sources and DAMs you are allowed to upload to and browse.\n\nThe value can be an array of strings. Valid values include `site-files` and the reference key for any DAM connected to your site.\n\nIf `site-files` is omitted from the array, site files will not be available as an asset source for this input.\n\n## Examples\n\nIn this example, we have configured allowed sources for an *Image Input*.\n\n```yaml\n_inputs:\n  image:\n    type: image\n    options:\n      allowed_sources:\n        - site-files\n        - my-cloudinary-dam\n```",
        "markdownDescription": "This key defines which sources and DAMs you are allowed to upload to and browse.\n\nThe value can be an array of strings. Valid values include `site-files` and the reference key for any DAM connected to your site.\n\nIf `site-files` is omitted from the array, site files will not be available as an asset source for this input.\n\n## Examples\n\nIn this example, we have configured allowed sources for an *Image Input*.\n\n```yaml\n_inputs:\n  image:\n    type: image\n    options:\n      allowed_sources:\n        - site-files\n        - my-cloudinary-dam\n```"
      },
      "documented": true,
      "markdownDescription": "This key defines which sources and DAMs you are allowed to upload to and browse.\n\nThe value can be an array of strings. Valid values include `site-files` and the reference key for any DAM connected to your site.\n\nIf `site-files` is omitted from the array, site files will not be available as an asset source for this input.\n\n## Examples\n\nIn this example, we have configured allowed sources for an *Image Input*.\n\n```yaml\n_inputs:\n  image:\n    type: image\n    options:\n      allowed_sources:\n        - site-files\n        - my-cloudinary-dam\n```"
    },
    "type._inputs.*.options.prevent_resize_existing_files": {
      "title": "Prevent Resize Existing Files",
      "description": "This key toggles whether CloudCannon will skip the image resizing process configured for this input when selecting existing images.\n\nSetting this key to `true` will skip the image resizing process when selecting existing images.\n\n## Examples\n\nIn this example, CloudCannon will skip the image resizing process when selecting existing images for an *Image Input*.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n      prevent_resize_existing_files: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "markdownDescription": "This key toggles whether CloudCannon will skip the image resizing process configured for this input when selecting existing images.\n\nSetting this key to `true` will skip the image resizing process when selecting existing images.\n\n## Examples\n\nIn this example, CloudCannon will skip the image resizing process when selecting existing images for an *Image Input*.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      width: 1200\n      height: 600\n      resize_style: cover\n      prevent_resize_existing_files: true\n```"
    },
    "type._inputs.*.options.sizes": {
      "title": "Sizes",
      "description": "This key defines definitions for creating additional images of different sizes when uploading or selecting existing files.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to create additional images of different sizes when uploading or selecting files.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      sizes:\n        - size: 2x\n        - size: 3x\n```",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "size": {
            "type": "string",
            "description": "This key defines a number suffixed with \"x\" (relative size) or \"w\" (fixed width) for setting the dimensions of the image (e.g. 2x, 3x, 100w, 360w).\n\n## Examples\n\nIn this example, we have configured a size definition for an *Image Input* to create a 2x relative size image.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      sizes:\n        - size: 2x\n```",
            "documented": true,
            "title": "size",
            "markdownDescription": "This key defines a number suffixed with \"x\" (relative size) or \"w\" (fixed width) for setting the dimensions of the image (e.g. 2x, 3x, 100w, 360w).\n\n## Examples\n\nIn this example, we have configured a size definition for an *Image Input* to create a 2x relative size image.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      sizes:\n        - size: 2x\n```"
          },
          "target": {
            "description": "This key defines a reference to another input that is given the path to this additional image file.",
            "type": "string",
            "documented": true,
            "title": "target",
            "markdownDescription": "This key defines a reference to another input that is given the path to this additional image file."
          }
        },
        "required": [
          "size"
        ],
        "markdownDescription": "This key represents an individual size definition in the `options.sizes` array for *Image Inputs*.\n\nThe value is an object that can contain `size` and `target` properties.\n\n## Examples\n\nIn this example, we have configured a size definition for an *Image Input*.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      sizes:\n        - size: 2x\n          target: hero_image_2x\n```",
        "documented": true,
        "title": "sizes[*]",
        "description": "This key represents an individual size definition in the `options.sizes` array for *Image Inputs*.\n\nThe value is an object that can contain `size` and `target` properties.\n\n## Examples\n\nIn this example, we have configured a size definition for an *Image Input*.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      sizes:\n        - size: 2x\n          target: hero_image_2x\n```",
        "additionalProperties": false
      },
      "documented": true,
      "markdownDescription": "This key defines definitions for creating additional images of different sizes when uploading or selecting existing files.\n\n## Examples\n\nIn this example, we have configured an *Image Input* to create additional images of different sizes when uploading or selecting files.\n\n```yaml\n_inputs:\n  hero_image:\n    type: image\n    options:\n      sizes:\n        - size: 2x\n        - size: 3x\n```"
    },
    "type.paths": {
      "type": "object",
      "properties": {
        "static": {
          "$ref": "#/$defs/paths.static"
        },
        "uploads": {
          "$ref": "#/$defs/paths.uploads"
        },
        "uploads_filename": {
          "$ref": "#/$defs/paths.uploads_filename"
        },
        "dam_uploads": {
          "$ref": "#/$defs/paths.dam_uploads"
        },
        "dam_uploads_filename": {
          "$ref": "#/$defs/paths.dam_uploads_filename"
        },
        "dam_static": {
          "$ref": "#/$defs/paths.dam_static"
        },
        "uploads_use_relative_path": {
          "$ref": "#/$defs/paths.uploads_use_relative_path"
        }
      },
      "markdownDescription": "This key defines paths for your Rich Text editors or File inputs.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `paths` will default to any\nvalues configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\n## Examples\n\nIn this example, we have configured paths for the `blog` Collection to set custom upload and static paths.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      uploads: /uploads/blog/\n      static: /assets/\n```",
      "title": "Paths",
      "documented": true,
      "description": "This key defines paths for your Rich Text editors or File inputs.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `paths` will default to any\nvalues configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\n## Examples\n\nIn this example, we have configured paths for the `blog` Collection to set custom upload and static paths.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      uploads: /uploads/blog/\n      static: /assets/\n```",
      "additionalProperties": false
    },
    "paths.static": {
      "type": "string",
      "documented": true,
      "title": "static",
      "description": "This key defines the path for the location of statically copied assets.\n\n## Examples\n\nIn this example, we have configured the static path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      static: /assets/\n```",
      "markdownDescription": "This key defines the path for the location of statically copied assets.\n\n## Examples\n\nIn this example, we have configured the static path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      static: /assets/\n```"
    },
    "paths.uploads": {
      "default": "uploads",
      "type": "string",
      "documented": true,
      "title": "uploads",
      "description": "This key defines the paths for the default location of newly uploaded site files.\n\nYou can use [dynamic placeholders](https://cloudcannon.com/documentation/articles/configure-your-template-strings/) for `uploads` and `dam_uploads`.\n\n## Examples\n\nIn this example, we have configured the uploads path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      uploads: /uploads/blog/\n```",
      "markdownDescription": "This key defines the paths for the default location of newly uploaded site files.\n\nYou can use [dynamic placeholders](https://cloudcannon.com/documentation/articles/configure-your-template-strings/) for `uploads` and `dam_uploads`.\n\n## Examples\n\nIn this example, we have configured the uploads path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      uploads: /uploads/blog/\n```"
    },
    "paths.uploads_filename": {
      "type": "string",
      "documented": true,
      "title": "uploads_filename",
      "description": "This key defines the path for the name of the uploaded file.\n\n## Examples\n\nIn this example, we have configured the uploads filename path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      uploads_filename: '{filename|slugify}'\n```",
      "markdownDescription": "This key defines the path for the name of the uploaded file.\n\n## Examples\n\nIn this example, we have configured the uploads filename path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      uploads_filename: '{filename|slugify}'\n```"
    },
    "paths.dam_uploads": {
      "type": "string",
      "documented": true,
      "title": "dam_uploads",
      "description": "This key defines the path for the default location of newly uploaded [DAM](https://cloudcannon.com/documentation/articles/introduction-to-assets-and-dams/)\nfiles.\n\nYou can use [dynamic placeholders](https://cloudcannon.com/documentation/articles/configure-your-template-strings/) for `uploads` and `dam_uploads`.\n\n## Examples\n\nIn this example, we have configured the DAM uploads path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      dam_uploads: /dam/uploads/blog/\n```",
      "markdownDescription": "This key defines the path for the default location of newly uploaded [DAM](https://cloudcannon.com/documentation/articles/introduction-to-assets-and-dams/)\nfiles.\n\nYou can use [dynamic placeholders](https://cloudcannon.com/documentation/articles/configure-your-template-strings/) for `uploads` and `dam_uploads`.\n\n## Examples\n\nIn this example, we have configured the DAM uploads path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      dam_uploads: /dam/uploads/blog/\n```"
    },
    "paths.dam_uploads_filename": {
      "type": "string",
      "documented": true,
      "title": "dam_uploads_filename",
      "description": "This key defines the path for the name of the uploaded file, when uploading [DAM](https://cloudcannon.com/documentation/articles/introduction-to-assets-and-dams/) files.\n\n## Examples\n\nIn this example, we have configured the DAM uploads filename path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      dam_uploads_filename: '{filename|slugify}'\n```",
      "markdownDescription": "This key defines the path for the name of the uploaded file, when uploading [DAM](https://cloudcannon.com/documentation/articles/introduction-to-assets-and-dams/) files.\n\n## Examples\n\nIn this example, we have configured the DAM uploads filename path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      dam_uploads_filename: '{filename|slugify}'\n```"
    },
    "paths.dam_static": {
      "type": "string",
      "documented": true,
      "title": "dam_static",
      "description": "This key defines the path for the location of statically copied assets for [DAM](https://cloudcannon.com/documentation/articles/introduction-to-assets-and-dams/) files.\n\n## Examples\n\nIn this example, we have configured the DAM static path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      dam_static: /assets/dam/\n```",
      "markdownDescription": "This key defines the path for the location of statically copied assets for [DAM](https://cloudcannon.com/documentation/articles/introduction-to-assets-and-dams/) files.\n\n## Examples\n\nIn this example, we have configured the DAM static path for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    paths:\n      dam_static: /assets/dam/\n```"
    },
    "paths.uploads_use_relative_path": {
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "uploads_use_relative_path",
      "description": "This key toggles whether CloudCannon will use relative paths instead of absolute paths for uploaded files.\n\nSetting this key to `true` will make CloudCannon use relative paths for uploaded files, which are relative to the file being edited rather than the repository root.\n\n## Examples\n\nIn this example, we have configured uploads to use relative paths for files uploaded in the Content Editor.\n\n```yaml\n_editables:\n  content:\n    paths:\n      uploads_use_relative_path: true\n```",
      "markdownDescription": "This key toggles whether CloudCannon will use relative paths instead of absolute paths for uploaded files.\n\nSetting this key to `true` will make CloudCannon use relative paths for uploaded files, which are relative to the file being edited rather than the repository root.\n\n## Examples\n\nIn this example, we have configured uploads to use relative paths for files uploaded in the Content Editor.\n\n```yaml\n_editables:\n  content:\n    paths:\n      uploads_use_relative_path: true\n```"
    },
    "type._editables.*.bold": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to bold selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to bold selected text.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "bold",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to bold selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to bold selected text."
    },
    "type._editables.*.copyformatting": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to copy formatting from selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to copy formatting from selected text. Applies to `bold`, `italic`, `underline`, `strike`, `subscript`, and `superscript` formatting. Does not copy other styles or formatting.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "copyformatting",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to copy formatting from selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to copy formatting from selected text. Applies to `bold`, `italic`, `underline`, `strike`, `subscript`, and `superscript` formatting. Does not copy other styles or formatting."
    },
    "type._editables.*.italic": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to italicize selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to italicize selected text.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "italic",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to italicize selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to italicize selected text."
    },
    "type._editables.*.link": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to create a hyperlink around selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to create a hyperlink around selected text.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "link",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to create a hyperlink around selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to create a hyperlink around selected text."
    },
    "type._editables.*.redo": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to redo recent edits undone with `undo`.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to redo recent edits. Undo is always enabled through standard OS-specific keyboard shortcuts.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "redo",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to redo recent edits undone with `undo`.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to redo recent edits. Undo is always enabled through standard OS-specific keyboard shortcuts."
    },
    "type._editables.*.removeformat": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to remove formatting from selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to remove formatting. Applies to `bold`, `italic`, `underline`, `strike`, `subscript`, and `superscript` formatting. Does not remove other styles or formatting.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "removeformat",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to remove formatting from selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to remove formatting. Applies to `bold`, `italic`, `underline`, `strike`, `subscript`, and `superscript` formatting. Does not remove other styles or formatting."
    },
    "type._editables.*.strike": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to strike through selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to strike through selected text.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "strike",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to strike through selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to strike through selected text."
    },
    "type._editables.*.subscript": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to subscript selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to subscript selected text.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "subscript",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to subscript selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to subscript selected text."
    },
    "type._editables.*.superscript": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to superscript selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to superscript selected text.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "superscript",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to superscript selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to superscript selected text."
    },
    "type._editables.*.underline": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to underline selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to underline selected text.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "underline",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to underline selected text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to underline selected text."
    },
    "type._editables.*.undo": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to undo recent edits.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to undo recent edits. Undo is always enabled through standard OS-specific keyboard shortcuts.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "undo",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to undo recent edits.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to undo recent edits. Undo is always enabled through standard OS-specific keyboard shortcuts."
    },
    "type._editables.*.remove_custom_markup": {
      "description": "This key toggles whether CloudCannon will allow you to strip custom markup from content edited in a rich text editor, allowing you to clean files of unnecessary HTML content.\n\nSetting this key to `true` will enable stripping custom markup from content. The `remove_custom_markup` key is disabled if `allow_custom_markup` is enabled.",
      "type": "boolean",
      "documented": true,
      "title": "remove_custom_markup",
      "markdownDescription": "This key toggles whether CloudCannon will allow you to strip custom markup from content edited in a rich text editor, allowing you to clean files of unnecessary HTML content.\n\nSetting this key to `true` will enable stripping custom markup from content. The `remove_custom_markup` key is disabled if `allow_custom_markup` is enabled."
    },
    "type._editables.*.allow_custom_markup": {
      "description": "This key toggles whether CloudCannon will allow you to edit custom markup in rich text editors and explicitly accept the risk of unintentionally deleting elements that cannot be recreated.\n\nSetting this key to `true` will enable editing of custom markup. When using `allow_custom_markup` outside of editable regions, content that uses JavaScript will not be editable for security reasons. These inputs will appear as uneditable snippets.",
      "type": "boolean",
      "documented": true,
      "title": "allow_custom_markup",
      "markdownDescription": "This key toggles whether CloudCannon will allow you to edit custom markup in rich text editors and explicitly accept the risk of unintentionally deleting elements that cannot be recreated.\n\nSetting this key to `true` will enable editing of custom markup. When using `allow_custom_markup` outside of editable regions, content that uses JavaScript will not be editable for security reasons. These inputs will appear as uneditable snippets."
    },
    "type._editables.*.blockquote": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to wrap selected blocks of text in a block quote.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to wrap selected blocks of text in a block quote.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "blockquote",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to wrap selected blocks of text in a block quote.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to wrap selected blocks of text in a block quote."
    },
    "type._editables.*.bulletedlist": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert an unordered list or convert selected text to an unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert an unordered list or convert selected text to an unordered list.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "bulletedlist",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert an unordered list or convert selected text to an unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert an unordered list or convert selected text to an unordered list."
    },
    "type._editables.*.center": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to center align selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to center align selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file.",
      "type": "string",
      "documented": true,
      "title": "center",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to center align selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to center align selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file."
    },
    "type._editables.*.code_inline": {
      "description": "This key toggles whether CloudCannon will display a control in your WYSIWYG toolbar to create an inline code element, containing any selected text.\n\nSetting this key to `true` will enable a control in your WYSIWYG toolbar to create an inline code element.\n\nBy default, this key is `false` (i.e., the inline code control is not displayed).",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "code_inline",
      "markdownDescription": "This key toggles whether CloudCannon will display a control in your WYSIWYG toolbar to create an inline code element, containing any selected text.\n\nSetting this key to `true` will enable a control in your WYSIWYG toolbar to create an inline code element.\n\nBy default, this key is `false` (i.e., the inline code control is not displayed)."
    },
    "type._editables.*.code_block": {
      "description": "This key toggles whether CloudCannon will display a control in your WYSIWYG toolbar to insert a code block in editable regions.\n\nSetting this key to `true` will enable a control in your WYSIWYG toolbar to insert a code block.\n\nBy default, this key is `false` (i.e., the code block control is not displayed).",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "code_block",
      "markdownDescription": "This key toggles whether CloudCannon will display a control in your WYSIWYG toolbar to insert a code block in editable regions.\n\nSetting this key to `true` will enable a control in your WYSIWYG toolbar to insert a code block.\n\nBy default, this key is `false` (i.e., the code block control is not displayed)."
    },
    "type._editables.*.code": {
      "description": "This key toggles whether CloudCannon will display tools in your WYSIWYG toolbar to turn selected text into inline code and selected text into a code block.\n\nSetting this key to `true` will enable two tools in your WYSIWYG toolbar to turn selected text into inline code and selected text into a code block.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "code",
      "markdownDescription": "This key toggles whether CloudCannon will display tools in your WYSIWYG toolbar to turn selected text into inline code and selected text into a code block.\n\nSetting this key to `true` will enable two tools in your WYSIWYG toolbar to turn selected text into inline code and selected text into a code block."
    },
    "type._editables.*.embed": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a region of raw HTML for YouTube, Vimeo, social media posts, or other media.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a region of raw HTML. Embedded content is sanitized to mitigate XSS risks, which includes removing `style` tags. Embeds containing `script` tags are not loaded a rich text editor.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "embed",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a region of raw HTML for YouTube, Vimeo, social media posts, or other media.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a region of raw HTML. Embedded content is sanitized to mitigate XSS risks, which includes removing `style` tags. Embeds containing `script` tags are not loaded a rich text editor."
    },
    "type._editables.*.format": {
      "description": "This key toggles whether CloudCannon will display a dropdown menu tool in your WYSIWYG toolbar for structured text.\n\nSetting this key to `true` will enable a dropdown menu tool in your WYSIWYG toolbar for structured text. Valid values include for `p`, `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `pre`, `address`, and `div`. Include a space between each values, e.g. `format: p h1 h2`.",
      "default": "p h1 h2 h3 h4 h5 h6",
      "type": "string",
      "documented": true,
      "title": "format",
      "markdownDescription": "This key toggles whether CloudCannon will display a dropdown menu tool in your WYSIWYG toolbar for structured text.\n\nSetting this key to `true` will enable a dropdown menu tool in your WYSIWYG toolbar for structured text. Valid values include for `p`, `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `pre`, `address`, and `div`. Include a space between each values, e.g. `format: p h1 h2`."
    },
    "type._editables.*.horizontalrule": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a horizontal line.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a horizontal line.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "horizontalrule",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a horizontal line.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a horizontal line."
    },
    "type._editables.*.image": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert an image and enter alternative text and title text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert an image. Select an existing image, upload an image, or use an external link.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "image",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert an image and enter alternative text and title text.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert an image. Select an existing image, upload an image, or use an external link."
    },
    "type._editables.*.indent": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to increase the indentation of a list item in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to increase the indentation of a list item.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "indent",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to increase the indentation of a list item in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to increase the indentation of a list item."
    },
    "type._editables.*.justify": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to justify selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to justify selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file.",
      "type": "string",
      "documented": true,
      "title": "justify",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to justify selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to justify selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file."
    },
    "type._editables.*.left": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to left align selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to left align selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file.",
      "type": "string",
      "documented": true,
      "title": "left",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to left align selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to left align selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file."
    },
    "type._editables.*.numberedlist": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert an ordered list or convert selected text to an ordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert an ordered list or convert selected text to an ordered list.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "numberedlist",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert an ordered list or convert selected text to an ordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert an ordered list or convert selected text to an ordered list."
    },
    "type._editables.*.outdent": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to decrease the indentation of a list item in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to decrease the indentation of a list item.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "outdent",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to decrease the indentation of a list item in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to decrease the indentation of a list item."
    },
    "type._editables.*.right": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to right align selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to right align selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file.",
      "type": "string",
      "documented": true,
      "title": "right",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to right align selected text by toggling a class name for that text block.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to right align selected text. The value is the class name to align the text. The styles for this class must be defined in the `styles` file."
    },
    "type._editables.*.snippet": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a [Snippet](https://cloudcannon.com/documentation/articles/what-is-a-snippet/), if any are available.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a Snippet.",
      "default": true,
      "type": "boolean",
      "documented": true,
      "title": "snippet",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a [Snippet](https://cloudcannon.com/documentation/articles/what-is-a-snippet/), if any are available.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a Snippet."
    },
    "type._editables.*.styles": {
      "description": "This key toggles whether CloudCannon will display a dropdown menu in your WYSIWYG toolbar to apply a style to selected text.\n\n## Examples\n\nIn this example, we have enabled a dropdown menu in our WYSIWYG toolbar to apply a style to selected text. The styles are defined in the `/css/styles.css` file.\n\n```yaml\n_editables:\n  content:\n    styles: /css/styles.css\n```\n\nThis example file defines the styles that CloudCannon can add to your WYSIWYG toolbar.\n\n```css\n/* Can be applied to blocks of content */\np.callout {\n  margin: 10px;\n  border: 1px solid #f5f5f5;\n  background-color: #eee;\n}\n\n/* Can be applied to inline content */\nspan.big-blue-text {\n  font-size: 2rem;\n  color: blue;\n}\n\n/* Applied to content, excluded from style dropdown */\nh2 {\n  font-family: cursive;\n}\n\n/* Applied to content, excluded from style dropdown */\n.align-left { text-align: left; }\n.align-center { text-align: center; }\n.align-right { text-align: right; }\n.align-justify { text-align: justify; }\n```",
      "type": "string",
      "documented": true,
      "title": "styles",
      "markdownDescription": "This key toggles whether CloudCannon will display a dropdown menu in your WYSIWYG toolbar to apply a style to selected text.\n\n## Examples\n\nIn this example, we have enabled a dropdown menu in our WYSIWYG toolbar to apply a style to selected text. The styles are defined in the `/css/styles.css` file.\n\n```yaml\n_editables:\n  content:\n    styles: /css/styles.css\n```\n\nThis example file defines the styles that CloudCannon can add to your WYSIWYG toolbar.\n\n```css\n/* Can be applied to blocks of content */\np.callout {\n  margin: 10px;\n  border: 1px solid #f5f5f5;\n  background-color: #eee;\n}\n\n/* Can be applied to inline content */\nspan.big-blue-text {\n  font-size: 2rem;\n  color: blue;\n}\n\n/* Applied to content, excluded from style dropdown */\nh2 {\n  font-family: cursive;\n}\n\n/* Applied to content, excluded from style dropdown */\n.align-left { text-align: left; }\n.align-center { text-align: center; }\n.align-right { text-align: right; }\n.align-justify { text-align: justify; }\n```"
    },
    "type._editables.*.table": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a table.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a table. Further table options are available from the table context menu in the rich text editor.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "table",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to insert a table.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to insert a table. Further table options are available from the table context menu in the rich text editor."
    },
    "type._editables.*.join_above": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to merge a list item with the item above it in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to merge a list item with the item above it.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "join_above",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to merge a list item with the item above it in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to merge a list item with the item above it."
    },
    "type._editables.*.join_below": {
      "description": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to merge a list item with the item below it in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to merge a list item with the item below it.",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "join_below",
      "markdownDescription": "This key toggles whether CloudCannon will display a tool in your WYSIWYG toolbar to merge a list item with the item below it in an ordered or unordered list.\n\nSetting this key to `true` will enable a tool in your WYSIWYG toolbar to merge a list item with the item below it."
    },
    "DateInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "enum": [
            "date",
            "datetime"
          ],
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "timezone": {
              "description": "Specifies the time zone that dates are displayed and edited in. Also changes the suffix the date is persisted to the file with. Defaults to the global `timezone`.",
              "allOf": [
                {
                  "$ref": "#/$defs/type.timezone"
                }
              ],
              "documented": false,
              "title": "timezone",
              "markdownDescription": "Specifies the time zone that dates are displayed and edited in. Also changes the suffix the date is persisted to the file with. Defaults to the global `timezone`."
            },
            "start_from": {
              "description": "This key defines the earliest date and time, inclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting an earlier date and time.\n\nIf the Input already contains an earlier date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard\nyour unsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nThe value can have quotation marks or no quotation marks.\n\nIf `options.end_before` is also configured, this key cannot be a later date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we want our team to enter the date and time of an event in the `2022_event` Input. This Input will only allow dates on or after January 1st, 2022.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      end_before: 2023-01-01T00:00:00Z\n```",
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z||([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                  "title": "String Start From",
                  "documented": true,
                  "description": "This key defines the earliest date and time, inclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting an earlier date and time.\n\nIf the Input already contains an earlier date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard\nyour unsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format and should be in quotes.\n\nIf `options.end_before` is also configured, this key cannot be a later date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.",
                  "markdownDescription": "This key defines the earliest date and time, inclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting an earlier date and time.\n\nIf the Input already contains an earlier date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard\nyour unsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format and should be in quotes.\n\nIf `options.end_before` is also configured, this key cannot be a later date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs."
                },
                {
                  "title": "Date Start From",
                  "documented": true,
                  "description": "This key defines the earliest date and time, inclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting an earlier date and time.\n\nIf the Input already contains an earlier date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard\nyour unsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format and should not be in quotes.\n\nIf `options.end_before` is also configured, this key cannot be a later date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.",
                  "markdownDescription": "This key defines the earliest date and time, inclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting an earlier date and time.\n\nIf the Input already contains an earlier date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard\nyour unsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format and should not be in quotes.\n\nIf `options.end_before` is also configured, this key cannot be a later date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs."
                }
              ],
              "documented": true,
              "title": "start_from",
              "markdownDescription": "This key defines the earliest date and time, inclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting an earlier date and time.\n\nIf the Input already contains an earlier date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard\nyour unsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nThe value can have quotation marks or no quotation marks.\n\nIf `options.end_before` is also configured, this key cannot be a later date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we want our team to enter the date and time of an event in the `2022_event` Input. This Input will only allow dates on or after January 1st, 2022.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      end_before: 2023-01-01T00:00:00Z\n```"
            },
            "start_from_message": {
              "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.start_from`.\nThis key requires you to define `options.start_from`.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid date using a custom message.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      start_from_message: Date is too early. Must be during 2022.\n      end_before: 2023-01-01T00:00:00Z\n      end_before_message: Date is too late. Must be during 2022.\n```",
              "type": "string",
              "documented": true,
              "title": "start_from_message",
              "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.start_from`.\nThis key requires you to define `options.start_from`.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid date using a custom message.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      start_from_message: Date is too early. Must be during 2022.\n      end_before: 2023-01-01T00:00:00Z\n      end_before_message: Date is too late. Must be during 2022.\n```"
            },
            "end_before": {
              "description": "This key defines the date and time, exclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting a later date and time.\n\nIf the Input already contains a later date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nThe value can have quotation marks or no quotation marks.\n\nIf `options.start_from` is also configured, this key cannot be an earlier date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we want our team to enter the date and time of an event in the `2022_event` Input. This Input will only allow dates before January 1st, 2023.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      end_before: 2023-01-01T00:00:00Z\n```",
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z||([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
                  "title": "String End Before",
                  "documented": true,
                  "description": "This key defines the date and time, exclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting a later date and time.\n\nIf the Input already contains a later date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nIf `options.start_from` is also configured, this key cannot be an earlier date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.",
                  "markdownDescription": "This key defines the date and time, exclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting a later date and time.\n\nIf the Input already contains a later date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nIf `options.start_from` is also configured, this key cannot be an earlier date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs."
                },
                {
                  "title": "Date End Before",
                  "documented": true,
                  "description": "This key defines the date and time, exclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting a later date and time.\n\nIf the Input already contains a later date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nIf `options.start_from` is also configured, this key cannot be an earlier date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.",
                  "markdownDescription": "This key defines the date and time, exclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting a later date and time.\n\nIf the Input already contains a later date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nIf `options.start_from` is also configured, this key cannot be an earlier date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs."
                }
              ],
              "documented": true,
              "title": "end_before",
              "markdownDescription": "This key defines the date and time, exclusive, that CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from selecting a later date and time.\n\nIf the Input already contains a later date and time, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be in [ISO8601](https://www.iso.org/iso-8601-date-and-time-format.html) format.\n\nThe value can have quotation marks or no quotation marks.\n\nIf `options.start_from` is also configured, this key cannot be an earlier date and time.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we want our team to enter the date and time of an event in the `2022_event` Input. This Input will only allow dates before January 1st, 2023.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      end_before: 2023-01-01T00:00:00Z\n```"
            },
            "end_before_message": {
              "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.end_before`.\nThis key requires you to define `options.end_before`.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid date using a custom message.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      start_from_message: Date is too early. Must be during 2022.\n      end_before: 2023-01-01T00:00:00Z\n      end_before_message: Date is too late. Must be during 2022.\n```",
              "type": "string",
              "documented": true,
              "title": "end_before_message",
              "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.end_before`.\nThis key requires you to define `options.end_before`.\n\nThis key has no default.\n\nThis key is available for Date and Time Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid date using a custom message.\n\n```yaml\n_inputs:\n  2022_event:\n    type: datetime\n    options:\n      start_from: 2022-01-01T00:00:00Z\n      start_from_message: Date is too early. Must be during 2022.\n      end_before: 2023-01-01T00:00:00Z\n      end_before_message: Date is too late. Must be during 2022.\n```"
            }
          },
          "markdownDescription": "This key defines options that are specific to Date Inputs.",
          "description": "This key defines options that are specific to Date Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for date and/or time values.",
      "title": "Date/Datetime Input",
      "description": "This key defines an editing interface for date and/or time values.",
      "documented": true,
      "additionalProperties": false
    },
    "type.timezone": {
      "type": "string",
      "enum": [
        "Africa/Abidjan",
        "Africa/Accra",
        "Africa/Addis_Ababa",
        "Africa/Algiers",
        "Africa/Asmara",
        "Africa/Asmera",
        "Africa/Bamako",
        "Africa/Bangui",
        "Africa/Banjul",
        "Africa/Bissau",
        "Africa/Blantyre",
        "Africa/Brazzaville",
        "Africa/Bujumbura",
        "Africa/Cairo",
        "Africa/Casablanca",
        "Africa/Ceuta",
        "Africa/Conakry",
        "Africa/Dakar",
        "Africa/Dar_es_Salaam",
        "Africa/Djibouti",
        "Africa/Douala",
        "Africa/El_Aaiun",
        "Africa/Freetown",
        "Africa/Gaborone",
        "Africa/Harare",
        "Africa/Johannesburg",
        "Africa/Juba",
        "Africa/Kampala",
        "Africa/Khartoum",
        "Africa/Kigali",
        "Africa/Kinshasa",
        "Africa/Lagos",
        "Africa/Libreville",
        "Africa/Lome",
        "Africa/Luanda",
        "Africa/Lubumbashi",
        "Africa/Lusaka",
        "Africa/Malabo",
        "Africa/Maputo",
        "Africa/Maseru",
        "Africa/Mbabane",
        "Africa/Mogadishu",
        "Africa/Monrovia",
        "Africa/Nairobi",
        "Africa/Ndjamena",
        "Africa/Niamey",
        "Africa/Nouakchott",
        "Africa/Ouagadougou",
        "Africa/Porto-Novo",
        "Africa/Sao_Tome",
        "Africa/Timbuktu",
        "Africa/Tripoli",
        "Africa/Tunis",
        "Africa/Windhoek",
        "America/Adak",
        "America/Anchorage",
        "America/Anguilla",
        "America/Antigua",
        "America/Araguaina",
        "America/Argentina/Buenos_Aires",
        "America/Argentina/Catamarca",
        "America/Argentina/ComodRivadavia",
        "America/Argentina/Cordoba",
        "America/Argentina/Jujuy",
        "America/Argentina/La_Rioja",
        "America/Argentina/Mendoza",
        "America/Argentina/Rio_Gallegos",
        "America/Argentina/Salta",
        "America/Argentina/San_Juan",
        "America/Argentina/San_Luis",
        "America/Argentina/Tucuman",
        "America/Argentina/Ushuaia",
        "America/Aruba",
        "America/Asuncion",
        "America/Atikokan",
        "America/Atka",
        "America/Bahia",
        "America/Bahia_Banderas",
        "America/Barbados",
        "America/Belem",
        "America/Belize",
        "America/Blanc-Sablon",
        "America/Boa_Vista",
        "America/Bogota",
        "America/Boise",
        "America/Buenos_Aires",
        "America/Cambridge_Bay",
        "America/Campo_Grande",
        "America/Cancun",
        "America/Caracas",
        "America/Catamarca",
        "America/Cayenne",
        "America/Cayman",
        "America/Chicago",
        "America/Chihuahua",
        "America/Coral_Harbour",
        "America/Cordoba",
        "America/Costa_Rica",
        "America/Creston",
        "America/Cuiaba",
        "America/Curacao",
        "America/Danmarkshavn",
        "America/Dawson",
        "America/Dawson_Creek",
        "America/Denver",
        "America/Detroit",
        "America/Dominica",
        "America/Edmonton",
        "America/Eirunepe",
        "America/El_Salvador",
        "America/Ensenada",
        "America/Fort_Nelson",
        "America/Fort_Wayne",
        "America/Fortaleza",
        "America/Glace_Bay",
        "America/Godthab",
        "America/Goose_Bay",
        "America/Grand_Turk",
        "America/Grenada",
        "America/Guadeloupe",
        "America/Guatemala",
        "America/Guayaquil",
        "America/Guyana",
        "America/Halifax",
        "America/Havana",
        "America/Hermosillo",
        "America/Indiana/Indianapolis",
        "America/Indiana/Knox",
        "America/Indiana/Marengo",
        "America/Indiana/Petersburg",
        "America/Indiana/Tell_City",
        "America/Indiana/Vevay",
        "America/Indiana/Vincennes",
        "America/Indiana/Winamac",
        "America/Indianapolis",
        "America/Inuvik",
        "America/Iqaluit",
        "America/Jamaica",
        "America/Jujuy",
        "America/Juneau",
        "America/Kentucky/Louisville",
        "America/Kentucky/Monticello",
        "America/Knox_IN",
        "America/Kralendijk",
        "America/La_Paz",
        "America/Lima",
        "America/Los_Angeles",
        "America/Louisville",
        "America/Lower_Princes",
        "America/Maceio",
        "America/Managua",
        "America/Manaus",
        "America/Marigot",
        "America/Martinique",
        "America/Matamoros",
        "America/Mazatlan",
        "America/Mendoza",
        "America/Menominee",
        "America/Merida",
        "America/Metlakatla",
        "America/Mexico_City",
        "America/Miquelon",
        "America/Moncton",
        "America/Monterrey",
        "America/Montevideo",
        "America/Montreal",
        "America/Montserrat",
        "America/Nassau",
        "America/New_York",
        "America/Nipigon",
        "America/Nome",
        "America/Noronha",
        "America/North_Dakota/Beulah",
        "America/North_Dakota/Center",
        "America/North_Dakota/New_Salem",
        "America/Nuuk",
        "America/Ojinaga",
        "America/Panama",
        "America/Pangnirtung",
        "America/Paramaribo",
        "America/Phoenix",
        "America/Port_of_Spain",
        "America/Port-au-Prince",
        "America/Porto_Acre",
        "America/Porto_Velho",
        "America/Puerto_Rico",
        "America/Punta_Arenas",
        "America/Rainy_River",
        "America/Rankin_Inlet",
        "America/Recife",
        "America/Regina",
        "America/Resolute",
        "America/Rio_Branco",
        "America/Rosario",
        "America/Santa_Isabel",
        "America/Santarem",
        "America/Santiago",
        "America/Santo_Domingo",
        "America/Sao_Paulo",
        "America/Scoresbysund",
        "America/Shiprock",
        "America/Sitka",
        "America/St_Barthelemy",
        "America/St_Johns",
        "America/St_Kitts",
        "America/St_Lucia",
        "America/St_Thomas",
        "America/St_Vincent",
        "America/Swift_Current",
        "America/Tegucigalpa",
        "America/Thule",
        "America/Thunder_Bay",
        "America/Tijuana",
        "America/Toronto",
        "America/Tortola",
        "America/Vancouver",
        "America/Virgin",
        "America/Whitehorse",
        "America/Winnipeg",
        "America/Yakutat",
        "America/Yellowknife",
        "Antarctica/Casey",
        "Antarctica/Davis",
        "Antarctica/DumontDUrville",
        "Antarctica/Macquarie",
        "Antarctica/Mawson",
        "Antarctica/McMurdo",
        "Antarctica/Palmer",
        "Antarctica/Rothera",
        "Antarctica/South_Pole",
        "Antarctica/Syowa",
        "Antarctica/Troll",
        "Antarctica/Vostok",
        "Arctic/Longyearbyen",
        "Asia/Aden",
        "Asia/Almaty",
        "Asia/Amman",
        "Asia/Anadyr",
        "Asia/Aqtau",
        "Asia/Aqtobe",
        "Asia/Ashgabat",
        "Asia/Ashkhabad",
        "Asia/Atyrau",
        "Asia/Baghdad",
        "Asia/Bahrain",
        "Asia/Baku",
        "Asia/Bangkok",
        "Asia/Barnaul",
        "Asia/Beirut",
        "Asia/Bishkek",
        "Asia/Brunei",
        "Asia/Calcutta",
        "Asia/Chita",
        "Asia/Choibalsan",
        "Asia/Chongqing",
        "Asia/Chungking",
        "Asia/Colombo",
        "Asia/Dacca",
        "Asia/Damascus",
        "Asia/Dhaka",
        "Asia/Dili",
        "Asia/Dubai",
        "Asia/Dushanbe",
        "Asia/Famagusta",
        "Asia/Gaza",
        "Asia/Harbin",
        "Asia/Hebron",
        "Asia/Ho_Chi_Minh",
        "Asia/Hong_Kong",
        "Asia/Hovd",
        "Asia/Irkutsk",
        "Asia/Istanbul",
        "Asia/Jakarta",
        "Asia/Jayapura",
        "Asia/Jerusalem",
        "Asia/Kabul",
        "Asia/Kamchatka",
        "Asia/Karachi",
        "Asia/Kashgar",
        "Asia/Kathmandu",
        "Asia/Katmandu",
        "Asia/Khandyga",
        "Asia/Kolkata",
        "Asia/Krasnoyarsk",
        "Asia/Kuala_Lumpur",
        "Asia/Kuching",
        "Asia/Kuwait",
        "Asia/Macao",
        "Asia/Macau",
        "Asia/Magadan",
        "Asia/Makassar",
        "Asia/Manila",
        "Asia/Muscat",
        "Asia/Nicosia",
        "Asia/Novokuznetsk",
        "Asia/Novosibirsk",
        "Asia/Omsk",
        "Asia/Oral",
        "Asia/Phnom_Penh",
        "Asia/Pontianak",
        "Asia/Pyongyang",
        "Asia/Qatar",
        "Asia/Qostanay",
        "Asia/Qyzylorda",
        "Asia/Rangoon",
        "Asia/Riyadh",
        "Asia/Saigon",
        "Asia/Sakhalin",
        "Asia/Samarkand",
        "Asia/Seoul",
        "Asia/Shanghai",
        "Asia/Singapore",
        "Asia/Srednekolymsk",
        "Asia/Taipei",
        "Asia/Tashkent",
        "Asia/Tbilisi",
        "Asia/Tehran",
        "Asia/Tel_Aviv",
        "Asia/Thimbu",
        "Asia/Thimphu",
        "Asia/Tokyo",
        "Asia/Tomsk",
        "Asia/Ujung_Pandang",
        "Asia/Ulaanbaatar",
        "Asia/Ulan_Bator",
        "Asia/Urumqi",
        "Asia/Ust-Nera",
        "Asia/Vientiane",
        "Asia/Vladivostok",
        "Asia/Yakutsk",
        "Asia/Yangon",
        "Asia/Yekaterinburg",
        "Asia/Yerevan",
        "Atlantic/Azores",
        "Atlantic/Bermuda",
        "Atlantic/Canary",
        "Atlantic/Cape_Verde",
        "Atlantic/Faeroe",
        "Atlantic/Faroe",
        "Atlantic/Jan_Mayen",
        "Atlantic/Madeira",
        "Atlantic/Reykjavik",
        "Atlantic/South_Georgia",
        "Atlantic/St_Helena",
        "Atlantic/Stanley",
        "Australia/ACT",
        "Australia/Adelaide",
        "Australia/Brisbane",
        "Australia/Broken_Hill",
        "Australia/Canberra",
        "Australia/Currie",
        "Australia/Darwin",
        "Australia/Eucla",
        "Australia/Hobart",
        "Australia/LHI",
        "Australia/Lindeman",
        "Australia/Lord_Howe",
        "Australia/Melbourne",
        "Australia/North",
        "Australia/NSW",
        "Australia/Perth",
        "Australia/Queensland",
        "Australia/South",
        "Australia/Sydney",
        "Australia/Tasmania",
        "Australia/Victoria",
        "Australia/West",
        "Australia/Yancowinna",
        "Brazil/Acre",
        "Brazil/DeNoronha",
        "Brazil/East",
        "Brazil/West",
        "Canada/Atlantic",
        "Canada/Central",
        "Canada/Eastern",
        "Canada/Mountain",
        "Canada/Newfoundland",
        "Canada/Pacific",
        "Canada/Saskatchewan",
        "Canada/Yukon",
        "CET",
        "Chile/Continental",
        "Chile/EasterIsland",
        "CST6CDT",
        "Cuba",
        "EET",
        "Egypt",
        "Eire",
        "EST",
        "EST5EDT",
        "Etc/GMT",
        "Etc/GMT-0",
        "Etc/GMT-1",
        "Etc/GMT-10",
        "Etc/GMT-11",
        "Etc/GMT-12",
        "Etc/GMT-13",
        "Etc/GMT-14",
        "Etc/GMT-2",
        "Etc/GMT-3",
        "Etc/GMT-4",
        "Etc/GMT-5",
        "Etc/GMT-6",
        "Etc/GMT-7",
        "Etc/GMT-8",
        "Etc/GMT-9",
        "Etc/GMT+0",
        "Etc/GMT+1",
        "Etc/GMT+10",
        "Etc/GMT+11",
        "Etc/GMT+12",
        "Etc/GMT+2",
        "Etc/GMT+3",
        "Etc/GMT+4",
        "Etc/GMT+5",
        "Etc/GMT+6",
        "Etc/GMT+7",
        "Etc/GMT+8",
        "Etc/GMT+9",
        "Etc/GMT0",
        "Etc/Greenwich",
        "Etc/UCT",
        "Etc/Universal",
        "Etc/UTC",
        "Etc/Zulu",
        "Europe/Amsterdam",
        "Europe/Andorra",
        "Europe/Astrakhan",
        "Europe/Athens",
        "Europe/Belfast",
        "Europe/Belgrade",
        "Europe/Berlin",
        "Europe/Bratislava",
        "Europe/Brussels",
        "Europe/Bucharest",
        "Europe/Budapest",
        "Europe/Busingen",
        "Europe/Chisinau",
        "Europe/Copenhagen",
        "Europe/Dublin",
        "Europe/Gibraltar",
        "Europe/Guernsey",
        "Europe/Helsinki",
        "Europe/Isle_of_Man",
        "Europe/Istanbul",
        "Europe/Jersey",
        "Europe/Kaliningrad",
        "Europe/Kiev",
        "Europe/Kirov",
        "Europe/Kyiv",
        "Europe/Lisbon",
        "Europe/Ljubljana",
        "Europe/London",
        "Europe/Luxembourg",
        "Europe/Madrid",
        "Europe/Malta",
        "Europe/Mariehamn",
        "Europe/Minsk",
        "Europe/Monaco",
        "Europe/Moscow",
        "Europe/Nicosia",
        "Europe/Oslo",
        "Europe/Paris",
        "Europe/Podgorica",
        "Europe/Prague",
        "Europe/Riga",
        "Europe/Rome",
        "Europe/Samara",
        "Europe/San_Marino",
        "Europe/Sarajevo",
        "Europe/Saratov",
        "Europe/Simferopol",
        "Europe/Skopje",
        "Europe/Sofia",
        "Europe/Stockholm",
        "Europe/Tallinn",
        "Europe/Tirane",
        "Europe/Tiraspol",
        "Europe/Ulyanovsk",
        "Europe/Uzhgorod",
        "Europe/Vaduz",
        "Europe/Vatican",
        "Europe/Vienna",
        "Europe/Vilnius",
        "Europe/Volgograd",
        "Europe/Warsaw",
        "Europe/Zagreb",
        "Europe/Zaporozhye",
        "Europe/Zurich",
        "GB",
        "GB-Eire",
        "GMT",
        "GMT-0",
        "GMT+0",
        "GMT0",
        "Greenwich",
        "Hongkong",
        "HST",
        "Iceland",
        "Indian/Antananarivo",
        "Indian/Chagos",
        "Indian/Christmas",
        "Indian/Cocos",
        "Indian/Comoro",
        "Indian/Kerguelen",
        "Indian/Mahe",
        "Indian/Maldives",
        "Indian/Mauritius",
        "Indian/Mayotte",
        "Indian/Reunion",
        "Iran",
        "Israel",
        "Jamaica",
        "Japan",
        "Kwajalein",
        "Libya",
        "MET",
        "Mexico/BajaNorte",
        "Mexico/BajaSur",
        "Mexico/General",
        "MST",
        "MST7MDT",
        "Navajo",
        "NZ",
        "NZ-CHAT",
        "Pacific/Apia",
        "Pacific/Auckland",
        "Pacific/Bougainville",
        "Pacific/Chatham",
        "Pacific/Chuuk",
        "Pacific/Easter",
        "Pacific/Efate",
        "Pacific/Enderbury",
        "Pacific/Fakaofo",
        "Pacific/Fiji",
        "Pacific/Funafuti",
        "Pacific/Galapagos",
        "Pacific/Gambier",
        "Pacific/Guadalcanal",
        "Pacific/Guam",
        "Pacific/Honolulu",
        "Pacific/Johnston",
        "Pacific/Kanton",
        "Pacific/Kiritimati",
        "Pacific/Kosrae",
        "Pacific/Kwajalein",
        "Pacific/Majuro",
        "Pacific/Marquesas",
        "Pacific/Midway",
        "Pacific/Nauru",
        "Pacific/Niue",
        "Pacific/Norfolk",
        "Pacific/Noumea",
        "Pacific/Pago_Pago",
        "Pacific/Palau",
        "Pacific/Pitcairn",
        "Pacific/Pohnpei",
        "Pacific/Ponape",
        "Pacific/Port_Moresby",
        "Pacific/Rarotonga",
        "Pacific/Saipan",
        "Pacific/Samoa",
        "Pacific/Tahiti",
        "Pacific/Tarawa",
        "Pacific/Tongatapu",
        "Pacific/Truk",
        "Pacific/Wake",
        "Pacific/Wallis",
        "Pacific/Yap",
        "Poland",
        "Portugal",
        "PRC",
        "PST8PDT",
        "ROC",
        "ROK",
        "Singapore",
        "Turkey",
        "UCT",
        "Universal",
        "US/Alaska",
        "US/Aleutian",
        "US/Arizona",
        "US/Central",
        "US/East-Indiana",
        "US/Eastern",
        "US/Hawaii",
        "US/Indiana-Starke",
        "US/Michigan",
        "US/Mountain",
        "US/Pacific",
        "US/Samoa",
        "UTC",
        "W-SU",
        "WET",
        "Zulu"
      ],
      "title": "Timezone",
      "documented": true,
      "description": "This key defines the timezone for your Site.\n\nValue must be in IANA timezone format.\n\nFor more information, please read our documentation on [Date and Time inputs](https://cloudcannon.com/documentation/articles/what-are-date-and-time-inputs/).",
      "markdownDescription": "This key defines the timezone for your Site.\n\nValue must be in IANA timezone format.\n\nFor more information, please read our documentation on [Date and Time inputs](https://cloudcannon.com/documentation/articles/what-are-date-and-time-inputs/)."
    },
    "TimeInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "time",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            }
          },
          "markdownDescription": "This key defines options that are specific to Time Inputs.",
          "description": "This key defines options that are specific to Time Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for time values only.",
      "title": "Time Input",
      "description": "This key defines an editing interface for time values only.",
      "documented": true,
      "additionalProperties": false
    },
    "FileInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "enum": [
            "file",
            "document",
            "image"
          ],
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "mime_type": {
              "$ref": "#/$defs/type._inputs.*.options.mime_type"
            },
            "resize_style": {
              "$ref": "#/$defs/type._inputs.*.options.resize_style"
            },
            "width": {
              "$ref": "#/$defs/type._inputs.*.options.width"
            },
            "height": {
              "$ref": "#/$defs/type._inputs.*.options.height"
            },
            "expandable": {
              "$ref": "#/$defs/type._inputs.*.options.expandable"
            },
            "image_size_attributes": {
              "$ref": "#/$defs/type._inputs.*.options.image_size_attributes"
            },
            "allowed_sources": {
              "$ref": "#/$defs/type._inputs.*.options.allowed_sources"
            },
            "prevent_resize_existing_files": {
              "$ref": "#/$defs/type._inputs.*.options.prevent_resize_existing_files"
            },
            "sizes": {
              "$ref": "#/$defs/type._inputs.*.options.sizes"
            },
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "paths": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.paths"
                }
              ],
              "documented": false,
              "title": "paths"
            },
            "accepts_mime_types": {
              "$ref": "#/$defs/type._inputs.*.options.accepts_mime_types"
            },
            "max_file_size": {
              "$ref": "#/$defs/type._inputs.*.options.max_file_size"
            },
            "max_file_size_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_file_size_message"
            },
            "disable_upload_file": {
              "$ref": "#/$defs/type._inputs.*.options.disable_upload_file"
            },
            "disable_direct_input": {
              "$ref": "#/$defs/type._inputs.*.options.disable_direct_input"
            },
            "disable_upload_file_in_file_browser": {
              "$ref": "#/$defs/type._inputs.*.options.disable_upload_file_in_file_browser"
            }
          },
          "markdownDescription": "This key defines options that are specific to File Inputs.",
          "description": "This key defines options that are specific to File Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for uploading files to your repository or DAM and browsing existing assets.",
      "title": "File Input",
      "description": "This key defines an editing interface for uploading files to your repository or DAM and browsing existing assets.",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs.*.options.accepts_mime_types": {
      "description": "This key defines which file types are available to select or upload to this input.\n\nAccepted format is an array or comma-separated string of MIME types.\n\nThe special value \"*\" means any type is accepted.\n\n## Examples\n\nIn this example, we have configured a *Image Input* to accept only JPEG or PNG files.\n\n```yaml\n_inputs:\n  featured_image:\n    type: image\n    options:\n      accepts_mime_types:\n        - image/jpeg\n        - image/png\n```",
      "anyOf": [
        {
          "type": "string",
          "title": "Comma Separated Accepts Mime Types",
          "documented": true,
          "description": "This key represents a comma-separated string format for the `accepts_mime_types` key that restricts which file types are available to select or upload in *File Inputs*.\n\nThe value is a string containing MIME types separated by commas. Each MIME type specifies a file type that CloudCannon will allow for this input.\n\nAvailable MIME types include image formats (`image/x-icon`, `image/gif`, `image/jpeg`, `image/png`, `image/webp`, `image/bmp`, `image/svg+xml`) and document formats (`application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `application/vnd.ms-excel`, `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`, `application/vnd.ms-powerpoint`, `application/vnd.openxmlformats-officedocument.presentationml.presentation`).\n\nUse the comma-separated format when you prefer a more compact configuration or when working with a small number of MIME types.\n\nThe special value `\"*\"` means any file type is accepted.\n\n## Examples\n\nIn this example, we have configured a *File Input* to accept only image files using a comma-separated string of image MIME types.\n\n```yaml\n_inputs:\n  hero_image:\n    type: file\n    label: Hero Image\n    options:\n      accepts_mime_types: 'image/jpeg,image/png,image/webp'\n```\n\nIn this example, we have configured a *File Input* to accept only document files using a comma-separated string of document MIME types.\n\n```yaml\n_inputs:\n  document:\n    type: file\n    label: Document\n    options:\n      accepts_mime_types: 'application/pdf,application/msword'\n```\n\nIn this example, we have configured a *File Input* to accept any file type using the special `\"*\"` value.\n\n```yaml\n_inputs:\n  any_file:\n    type: file\n    label: Any File\n    options:\n      accepts_mime_types: '*'\n```",
          "markdownDescription": "This key represents a comma-separated string format for the `accepts_mime_types` key that restricts which file types are available to select or upload in *File Inputs*.\n\nThe value is a string containing MIME types separated by commas. Each MIME type specifies a file type that CloudCannon will allow for this input.\n\nAvailable MIME types include image formats (`image/x-icon`, `image/gif`, `image/jpeg`, `image/png`, `image/webp`, `image/bmp`, `image/svg+xml`) and document formats (`application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `application/vnd.ms-excel`, `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`, `application/vnd.ms-powerpoint`, `application/vnd.openxmlformats-officedocument.presentationml.presentation`).\n\nUse the comma-separated format when you prefer a more compact configuration or when working with a small number of MIME types.\n\nThe special value `\"*\"` means any file type is accepted.\n\n## Examples\n\nIn this example, we have configured a *File Input* to accept only image files using a comma-separated string of image MIME types.\n\n```yaml\n_inputs:\n  hero_image:\n    type: file\n    label: Hero Image\n    options:\n      accepts_mime_types: 'image/jpeg,image/png,image/webp'\n```\n\nIn this example, we have configured a *File Input* to accept only document files using a comma-separated string of document MIME types.\n\n```yaml\n_inputs:\n  document:\n    type: file\n    label: Document\n    options:\n      accepts_mime_types: 'application/pdf,application/msword'\n```\n\nIn this example, we have configured a *File Input* to accept any file type using the special `\"*\"` value.\n\n```yaml\n_inputs:\n  any_file:\n    type: file\n    label: Any File\n    options:\n      accepts_mime_types: '*'\n```"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/MimeType"
          },
          "title": "Array Accepts Mime Types",
          "documented": true,
          "description": "This key represents an array format for the `accepts_mime_types` key that restricts which file types are available to select or upload in *File Inputs*.\n\nThe value is an array of MIME type strings. Each string specifies a file type that CloudCannon will allow for this input.\n\nAvailable MIME types include image formats (`image/x-icon`, `image/gif`, `image/jpeg`, `image/png`, `image/webp`, `image/bmp`, `image/svg+xml`) and document formats (`application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `application/vnd.ms-excel`, `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`, `application/vnd.ms-powerpoint`, `application/vnd.openxmlformats-officedocument.presentationml.presentation`).\n\nUse the array format when you want to explicitly list multiple MIME types, making it easier to read and maintain in your configuration.\n\n## Examples\n\nIn this example, we have configured a *File Input* to accept only image files using an array of image MIME types.\n\n```yaml\n_inputs:\n  hero_image:\n    type: file\n    label: Hero Image\n    options:\n      accepts_mime_types:\n        - image/jpeg\n        - image/png\n        - image/webp\n```\n\nIn this example, we have configured a *File Input* to accept only document files using an array of document MIME types.\n\n```yaml\n_inputs:\n  document:\n    type: file\n    label: Document\n    options:\n      accepts_mime_types:\n        - application/pdf\n        - application/msword\n        - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n```",
          "markdownDescription": "This key represents an array format for the `accepts_mime_types` key that restricts which file types are available to select or upload in *File Inputs*.\n\nThe value is an array of MIME type strings. Each string specifies a file type that CloudCannon will allow for this input.\n\nAvailable MIME types include image formats (`image/x-icon`, `image/gif`, `image/jpeg`, `image/png`, `image/webp`, `image/bmp`, `image/svg+xml`) and document formats (`application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `application/vnd.ms-excel`, `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`, `application/vnd.ms-powerpoint`, `application/vnd.openxmlformats-officedocument.presentationml.presentation`).\n\nUse the array format when you want to explicitly list multiple MIME types, making it easier to read and maintain in your configuration.\n\n## Examples\n\nIn this example, we have configured a *File Input* to accept only image files using an array of image MIME types.\n\n```yaml\n_inputs:\n  hero_image:\n    type: file\n    label: Hero Image\n    options:\n      accepts_mime_types:\n        - image/jpeg\n        - image/png\n        - image/webp\n```\n\nIn this example, we have configured a *File Input* to accept only document files using an array of document MIME types.\n\n```yaml\n_inputs:\n  document:\n    type: file\n    label: Document\n    options:\n      accepts_mime_types:\n        - application/pdf\n        - application/msword\n        - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n```"
        }
      ],
      "documented": true,
      "title": "accepts_mime_types",
      "markdownDescription": "This key defines which file types are available to select or upload to this input.\n\nAccepted format is an array or comma-separated string of MIME types.\n\nThe special value \"*\" means any type is accepted.\n\n## Examples\n\nIn this example, we have configured a *Image Input* to accept only JPEG or PNG files.\n\n```yaml\n_inputs:\n  featured_image:\n    type: image\n    options:\n      accepts_mime_types:\n        - image/jpeg\n        - image/png\n```"
    },
    "MimeType": {
      "type": "string",
      "enum": [
        "x-world/x-3dmf",
        "application/x-authorware-bin",
        "application/x-authorware-map",
        "application/x-authorware-seg",
        "text/vnd.abc",
        "video/animaflex",
        "application/postscript",
        "audio/aiff",
        "audio/x-aiff",
        "application/x-aim",
        "text/x-audiosoft-intra",
        "application/x-navi-animation",
        "application/x-nokia-9000-communicator-add-on-software",
        "application/mime",
        "application/arj",
        "image/x-jg",
        "video/x-ms-asf",
        "text/x-asm",
        "text/asp",
        "application/x-mplayer2",
        "video/x-ms-asf-plugin",
        "audio/basic",
        "audio/x-au",
        "application/x-troff-msvideo",
        "video/avi",
        "video/msvideo",
        "video/x-msvideo",
        "video/avs-video",
        "application/x-bcpio",
        "application/mac-binary",
        "application/macbinary",
        "application/x-binary",
        "application/x-macbinary",
        "image/bmp",
        "image/x-windows-bmp",
        "application/book",
        "application/x-bsh",
        "application/x-bzip",
        "application/x-bzip2",
        "text/plain",
        "text/x-c",
        "application/vnd.ms-pki.seccat",
        "application/clariscad",
        "application/x-cocoa",
        "application/cdf",
        "application/x-cdf",
        "application/x-netcdf",
        "application/pkix-cert",
        "application/x-x509-ca-cert",
        "application/x-chat",
        "application/java",
        "application/java-byte-code",
        "application/x-java-class",
        "application/x-cpio",
        "application/mac-compactpro",
        "application/x-compactpro",
        "application/x-cpt",
        "application/pkcs-crl",
        "application/pkix-crl",
        "application/x-x509-user-cert",
        "application/x-csh",
        "text/x-script.csh",
        "application/x-pointplus",
        "text/css",
        "text/csv",
        "application/x-director",
        "application/x-deepv",
        "video/x-dv",
        "video/dl",
        "video/x-dl",
        "application/msword",
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        "application/commonground",
        "application/drafting",
        "application/x-dvi",
        "drawing/x-dwf (old)",
        "model/vnd.dwf",
        "application/acad",
        "image/vnd.dwg",
        "image/x-dwg",
        "application/dxf",
        "text/x-script.elisp",
        "application/x-bytecode.elisp (compiled elisp)",
        "application/x-elc",
        "application/x-envoy",
        "application/x-esrehber",
        "text/x-setext",
        "application/envoy",
        "text/x-fortran",
        "application/vnd.fdf",
        "application/fractals",
        "image/fif",
        "video/fli",
        "video/x-fli",
        "image/florian",
        "text/vnd.fmi.flexstor",
        "video/x-atomic3d-feature",
        "image/vnd.fpx",
        "image/vnd.net-fpx",
        "application/freeloader",
        "audio/make",
        "image/g3fax",
        "image/gif",
        "video/gl",
        "video/x-gl",
        "audio/x-gsm",
        "application/x-gsp",
        "application/x-gss",
        "application/x-gtar",
        "application/x-compressed",
        "application/x-gzip",
        "multipart/x-gzip",
        "text/x-h",
        "application/x-hdf",
        "application/x-helpfile",
        "application/vnd.hp-hpgl",
        "text/x-script",
        "application/hlp",
        "application/x-winhelp",
        "application/binhex",
        "application/binhex4",
        "application/mac-binhex",
        "application/mac-binhex40",
        "application/x-binhex40",
        "application/x-mac-binhex40",
        "application/hta",
        "text/x-component",
        "text/html",
        "text/webviewhtml",
        "x-conference/x-cooltalk",
        "image/x-icon",
        "image/ief",
        "application/iges",
        "model/iges",
        "application/x-ima",
        "application/x-httpd-imap",
        "application/inf",
        "application/x-internett-signup",
        "application/x-ip2",
        "video/x-isvideo",
        "audio/it",
        "application/x-inventor",
        "i-world/i-vrml",
        "application/x-livescreen",
        "audio/x-jam",
        "text/x-java-source",
        "application/x-java-commerce",
        "image/jpeg",
        "image/pjpeg",
        "image/x-jps",
        "application/x-javascript",
        "application/javascript",
        "application/ecmascript",
        "text/javascript",
        "text/ecmascript",
        "application/json",
        "image/jutvision",
        "music/x-karaoke",
        "application/x-ksh",
        "text/x-script.ksh",
        "audio/nspaudio",
        "audio/x-nspaudio",
        "audio/x-liveaudio",
        "application/x-latex",
        "application/lha",
        "application/x-lha",
        "application/x-lisp",
        "text/x-script.lisp",
        "text/x-la-asf",
        "application/x-lzh",
        "application/lzx",
        "application/x-lzx",
        "text/x-m",
        "audio/mpeg",
        "audio/x-mpequrl",
        "audio/m4a",
        "audio/x-m4a",
        "application/x-troff-man",
        "application/x-navimap",
        "application/mbedlet",
        "application/x-magic-cap-package-1.0",
        "application/mcad",
        "application/x-mathcad",
        "image/vasa",
        "text/mcf",
        "application/netmc",
        "text/markdown",
        "application/x-troff-me",
        "message/rfc822",
        "application/x-midi",
        "audio/midi",
        "audio/x-mid",
        "audio/x-midi",
        "music/crescendo",
        "x-music/x-midi",
        "application/x-frame",
        "application/x-mif",
        "www/mime",
        "audio/x-vnd.audioexplosion.mjuicemediafile",
        "video/x-motion-jpeg",
        "application/base64",
        "application/x-meme",
        "audio/mod",
        "audio/x-mod",
        "video/quicktime",
        "video/x-sgi-movie",
        "audio/x-mpeg",
        "video/x-mpeg",
        "video/x-mpeq2a",
        "audio/mpeg3",
        "audio/x-mpeg-3",
        "video/mp4",
        "application/x-project",
        "video/mpeg",
        "application/vnd.ms-project",
        "application/marc",
        "application/x-troff-ms",
        "application/x-vnd.audioexplosion.mzz",
        "image/naplps",
        "application/vnd.nokia.configuration-message",
        "image/x-niff",
        "application/x-mix-transfer",
        "application/x-conference",
        "application/x-navidoc",
        "application/octet-stream",
        "application/oda",
        "audio/ogg",
        "application/ogg",
        "video/ogg",
        "application/x-omc",
        "application/x-omcdatamaker",
        "application/x-omcregerator",
        "text/x-pascal",
        "application/pkcs10",
        "application/x-pkcs10",
        "application/pkcs-12",
        "application/x-pkcs12",
        "application/x-pkcs7-signature",
        "application/pkcs7-mime",
        "application/x-pkcs7-mime",
        "application/x-pkcs7-certreqresp",
        "application/pkcs7-signature",
        "application/pro_eng",
        "text/pascal",
        "image/x-portable-bitmap",
        "application/vnd.hp-pcl",
        "application/x-pcl",
        "image/x-pict",
        "image/x-pcx",
        "chemical/x-pdb",
        "application/pdf",
        "audio/make.my.funk",
        "image/x-portable-graymap",
        "image/x-portable-greymap",
        "image/pict",
        "application/x-newton-compatible-pkg",
        "application/vnd.ms-pki.pko",
        "text/x-script.perl",
        "application/x-pixclscript",
        "image/x-xpixmap",
        "text/x-script.perl-module",
        "application/x-pagemaker",
        "image/png",
        "application/x-portable-anymap",
        "image/x-portable-anymap",
        "model/x-pov",
        "image/x-portable-pixmap",
        "application/mspowerpoint",
        "application/powerpoint",
        "application/vnd.ms-powerpoint",
        "application/x-mspowerpoint",
        "application/vnd.openxmlformats-officedocument.presentationml.presentation",
        "application/x-freelance",
        "paleovu/x-pv",
        "text/x-script.phyton",
        "application/x-bytecode.python",
        "audio/vnd.qcelp",
        "image/x-quicktime",
        "video/x-qtc",
        "audio/x-pn-realaudio",
        "audio/x-pn-realaudio-plugin",
        "audio/x-realaudio",
        "application/x-cmu-raster",
        "image/cmu-raster",
        "image/x-cmu-raster",
        "text/x-script.rexx",
        "image/vnd.rn-realflash",
        "image/x-rgb",
        "application/vnd.rn-realmedia",
        "audio/mid",
        "application/ringing-tones",
        "application/vnd.nokia.ringing-tone",
        "application/vnd.rn-realplayer",
        "application/x-troff",
        "image/vnd.rn-realpix",
        "application/x-rtf",
        "text/richtext",
        "application/rtf",
        "video/vnd.rn-realvideo",
        "audio/s3m",
        "application/x-tbook",
        "application/x-lotusscreencam",
        "text/x-script.guile",
        "text/x-script.scheme",
        "video/x-scm",
        "application/sdp",
        "application/x-sdp",
        "application/sounder",
        "application/sea",
        "application/x-sea",
        "application/set",
        "text/sgml",
        "text/x-sgml",
        "application/x-sh",
        "application/x-shar",
        "text/x-script.sh",
        "text/x-server-parsed-html",
        "audio/x-psid",
        "application/x-sit",
        "application/x-stuffit",
        "application/x-koan",
        "application/x-seelogo",
        "application/smil",
        "audio/x-adpcm",
        "application/solids",
        "application/x-pkcs7-certificates",
        "text/x-speech",
        "application/futuresplash",
        "application/x-sprite",
        "application/x-wais-source",
        "application/streamingmedia",
        "application/vnd.ms-pki.certstore",
        "application/step",
        "application/sla",
        "application/vnd.ms-pki.stl",
        "application/x-navistyle",
        "application/x-sv4cpio",
        "application/x-sv4crc",
        "image/svg+xml",
        "application/x-world",
        "x-world/x-svr",
        "application/x-shockwave-flash",
        "application/x-tar",
        "application/toolbook",
        "application/x-tcl",
        "text/x-script.tcl",
        "text/x-script.tcsh",
        "application/x-tex",
        "application/x-texinfo",
        "application/plain",
        "application/gnutar",
        "image/tiff",
        "image/x-tiff",
        "application/toml",
        "audio/tsp-audio",
        "application/dsptype",
        "audio/tsplayer",
        "text/tab-separated-values",
        "application/i-deas",
        "text/uri-list",
        "application/x-ustar",
        "multipart/x-ustar",
        "text/x-uuencode",
        "application/x-cdlink",
        "text/x-vcalendar",
        "application/vda",
        "video/vdo",
        "application/groupwise",
        "video/vivo",
        "video/vnd.vivo",
        "application/vocaltec-media-desc",
        "application/vocaltec-media-file",
        "audio/voc",
        "audio/x-voc",
        "video/vosaic",
        "audio/voxware",
        "audio/x-twinvq-plugin",
        "audio/x-twinvq",
        "application/x-vrml",
        "model/vrml",
        "x-world/x-vrml",
        "x-world/x-vrt",
        "application/x-visio",
        "application/wordperfect6.0",
        "application/wordperfect6.1",
        "audio/wav",
        "audio/x-wav",
        "application/x-qpro",
        "image/vnd.wap.wbmp",
        "application/vnd.xara",
        "video/webm",
        "audio/webm",
        "image/webp",
        "application/x-123",
        "windows/metafile",
        "text/vnd.wap.wml",
        "application/vnd.wap.wmlc",
        "text/vnd.wap.wmlscript",
        "application/vnd.wap.wmlscriptc",
        "video/x-ms-wmv",
        "application/wordperfect",
        "application/x-wpwin",
        "application/x-lotus",
        "application/mswrite",
        "application/x-wri",
        "text/scriplet",
        "application/x-wintalk",
        "image/x-xbitmap",
        "image/x-xbm",
        "image/xbm",
        "video/x-amt-demorun",
        "xgl/drawing",
        "image/vnd.xiff",
        "application/excel",
        "application/vnd.ms-excel",
        "application/x-excel",
        "application/x-msexcel",
        "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
        "audio/xm",
        "application/xml",
        "text/xml",
        "xgl/movie",
        "application/x-vnd.ls-xpix",
        "image/xpm",
        "video/x-amt-showrun",
        "image/x-xwd",
        "image/x-xwindowdump",
        "text/vnd.yaml",
        "application/x-compress",
        "application/x-zip-compressed",
        "application/zip",
        "multipart/x-zip",
        "text/x-script.zsh"
      ],
      "title": "Mime Type",
      "description": "This key represents an array format for the `accepts_mime_types` key that restricts which file types are available to select or upload in *File Inputs*.\n\nThe value is an array of MIME type strings. Each string specifies a file type that CloudCannon will allow for this input.\n\nAvailable MIME types include image formats (`image/x-icon`, `image/gif`, `image/jpeg`, `image/png`, `image/webp`, `image/bmp`, `image/svg+xml`) and document formats (`application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `application/vnd.ms-excel`, `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`, `application/vnd.ms-powerpoint`, `application/vnd.openxmlformats-officedocument.presentationml.presentation`).\n\nUse the array format when you want to explicitly list multiple MIME types, making it easier to read and maintain in your configuration.\n\n## Examples\n\nIn this example, we have configured a *File Input* to accept only image files using an array of image MIME types.\n\n```yaml\n_inputs:\n  hero_image:\n    type: file\n    label: Hero Image\n    options:\n      accepts_mime_types:\n        - image/jpeg\n        - image/png\n        - image/webp\n```\n\nIn this example, we have configured a *File Input* to accept only document files using an array of document MIME types.\n\n```yaml\n_inputs:\n  document:\n    type: file\n    label: Document\n    options:\n      accepts_mime_types:\n        - application/pdf\n        - application/msword\n        - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n```",
      "documented": true,
      "markdownDescription": "This key represents an array format for the `accepts_mime_types` key that restricts which file types are available to select or upload in *File Inputs*.\n\nThe value is an array of MIME type strings. Each string specifies a file type that CloudCannon will allow for this input.\n\nAvailable MIME types include image formats (`image/x-icon`, `image/gif`, `image/jpeg`, `image/png`, `image/webp`, `image/bmp`, `image/svg+xml`) and document formats (`application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `application/vnd.ms-excel`, `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`, `application/vnd.ms-powerpoint`, `application/vnd.openxmlformats-officedocument.presentationml.presentation`).\n\nUse the array format when you want to explicitly list multiple MIME types, making it easier to read and maintain in your configuration.\n\n## Examples\n\nIn this example, we have configured a *File Input* to accept only image files using an array of image MIME types.\n\n```yaml\n_inputs:\n  hero_image:\n    type: file\n    label: Hero Image\n    options:\n      accepts_mime_types:\n        - image/jpeg\n        - image/png\n        - image/webp\n```\n\nIn this example, we have configured a *File Input* to accept only document files using an array of document MIME types.\n\n```yaml\n_inputs:\n  document:\n    type: file\n    label: Document\n    options:\n      accepts_mime_types:\n        - application/pdf\n        - application/msword\n        - application/vnd.openxmlformats-officedocument.wordprocessingml.document\n```"
    },
    "type._inputs.*.options.max_file_size": {
      "description": "This key defines the maximum file size in kB that CloudCannon will allow you to upload.\n\nWhen configured, CloudCannon will prevent you from saving your changes until you select a valid file size, or discard your unsaved changes.\n\nValue can be any positive integer.\n\nThis key has no default.\n\nThis key is available for File and URL Inputs.\n\n## Examples\n\nIn this example, we want our team to upload an image using the `feature_image` Input. This Input limits you to a maximum file size of 750 kB.\n\n```yaml\n_inputs:\n  feature_image:\n    type: image\n    comment: Select the feature image for the banner.\n    options:\n      max_file_size: 140\n```",
      "type": "number",
      "documented": true,
      "title": "max_file_size",
      "markdownDescription": "This key defines the maximum file size in kB that CloudCannon will allow you to upload.\n\nWhen configured, CloudCannon will prevent you from saving your changes until you select a valid file size, or discard your unsaved changes.\n\nValue can be any positive integer.\n\nThis key has no default.\n\nThis key is available for File and URL Inputs.\n\n## Examples\n\nIn this example, we want our team to upload an image using the `feature_image` Input. This Input limits you to a maximum file size of 750 kB.\n\n```yaml\n_inputs:\n  feature_image:\n    type: image\n    comment: Select the feature image for the banner.\n    options:\n      max_file_size: 140\n```"
    },
    "type._inputs.*.options.max_file_size_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max_file_size`.\nThis key requires you to define `options.max_file_size`.\n\nThis key has no default.\n\nThis key is available for File and URL Inputs.\n\n## Examples\n\nIn this example, we want our team to upload an image using the `feature_image` Input. This Input limits you to a maximum file size of 750 kB.\n\n```yaml\n_inputs:\n  feature_image:\n    type: image\n    comment: Select the feature image for the banner.\n    options:\n      max_file_size: 140\n      max_file_size_message: For SEO, keep this under 140kB\n```",
      "type": "string",
      "documented": true,
      "title": "max_file_size_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max_file_size`.\nThis key requires you to define `options.max_file_size`.\n\nThis key has no default.\n\nThis key is available for File and URL Inputs.\n\n## Examples\n\nIn this example, we want our team to upload an image using the `feature_image` Input. This Input limits you to a maximum file size of 750 kB.\n\n```yaml\n_inputs:\n  feature_image:\n    type: image\n    comment: Select the feature image for the banner.\n    options:\n      max_file_size: 140\n      max_file_size_message: For SEO, keep this under 140kB\n```"
    },
    "type._inputs.*.options.disable_upload_file": {
      "description": "This key toggles whether CloudCannon will disable the context menu option and the drop area for uploading files.\n\nSetting this key to `true` will disable the context menu option and prevent uploading file through drag-and-drop in a *File Input*.\n\n## Examples\n\nIn this example, CloudCannon will disable the option to upload a file in the context menu and prevent uploading file through drag-and-drop in a *File Input*.\n\n```yaml\n_inputs:\n  image:\n    type: image\n    options:\n      disable_upload_file: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "disable_upload_file",
      "markdownDescription": "This key toggles whether CloudCannon will disable the context menu option and the drop area for uploading files.\n\nSetting this key to `true` will disable the context menu option and prevent uploading file through drag-and-drop in a *File Input*.\n\n## Examples\n\nIn this example, CloudCannon will disable the option to upload a file in the context menu and prevent uploading file through drag-and-drop in a *File Input*.\n\n```yaml\n_inputs:\n  image:\n    type: image\n    options:\n      disable_upload_file: true\n```"
    },
    "type._inputs.*.options.disable_direct_input": {
      "description": "This key toggles whether CloudCannon will prevent typing into the *Text Input*, while still allowing context menu options to change the value.\n\nSetting this key to `true` will prevent typing into the *Text Input*.\n\n## Examples\n\nIn this example, CloudCannon will prevent typing into the *Text Input* `url`.\n\n```yaml\n_inputs:\n  url:\n    type: url\n    options:\n      disable_direct_input: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "disable_direct_input",
      "markdownDescription": "This key toggles whether CloudCannon will prevent typing into the *Text Input*, while still allowing context menu options to change the value.\n\nSetting this key to `true` will prevent typing into the *Text Input*.\n\n## Examples\n\nIn this example, CloudCannon will prevent typing into the *Text Input* `url`.\n\n```yaml\n_inputs:\n  url:\n    type: url\n    options:\n      disable_direct_input: true\n```"
    },
    "type._inputs.*.options.disable_upload_file_in_file_browser": {
      "description": "This key toggles whether CloudCannon will prevent file uploads inside the \"Select existing file/image\" file browser modal window.\n\nSetting this key to `true` will prevent file uploads inside the file browser modal window.\n\n## Examples\n\nIn this example, CloudCannon will disable the option to upload files inside the file browser modal window.\n\n```yaml\n_inputs:\n  image:\n    type: file\n    options:\n      disable_upload_file_in_file_browser: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "disable_upload_file_in_file_browser",
      "markdownDescription": "This key toggles whether CloudCannon will prevent file uploads inside the \"Select existing file/image\" file browser modal window.\n\nSetting this key to `true` will prevent file uploads inside the file browser modal window.\n\n## Examples\n\nIn this example, CloudCannon will disable the option to upload files inside the file browser modal window.\n\n```yaml\n_inputs:\n  image:\n    type: file\n    options:\n      disable_upload_file_in_file_browser: true\n```"
    },
    "UrlInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "url",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "mime_type": {
              "$ref": "#/$defs/type._inputs.*.options.mime_type"
            },
            "resize_style": {
              "$ref": "#/$defs/type._inputs.*.options.resize_style"
            },
            "width": {
              "$ref": "#/$defs/type._inputs.*.options.width"
            },
            "height": {
              "$ref": "#/$defs/type._inputs.*.options.height"
            },
            "expandable": {
              "$ref": "#/$defs/type._inputs.*.options.expandable"
            },
            "image_size_attributes": {
              "$ref": "#/$defs/type._inputs.*.options.image_size_attributes"
            },
            "allowed_sources": {
              "$ref": "#/$defs/type._inputs.*.options.allowed_sources"
            },
            "prevent_resize_existing_files": {
              "$ref": "#/$defs/type._inputs.*.options.prevent_resize_existing_files"
            },
            "sizes": {
              "$ref": "#/$defs/type._inputs.*.options.sizes"
            },
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "paths": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.paths"
                }
              ],
              "documented": false,
              "title": "paths"
            },
            "accepts_mime_types": {
              "$ref": "#/$defs/type._inputs.*.options.accepts_mime_types"
            },
            "max_file_size": {
              "$ref": "#/$defs/type._inputs.*.options.max_file_size"
            },
            "max_file_size_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_file_size_message"
            },
            "disable_upload_file": {
              "$ref": "#/$defs/type._inputs.*.options.disable_upload_file"
            },
            "disable_direct_input": {
              "$ref": "#/$defs/type._inputs.*.options.disable_direct_input"
            },
            "disable_upload_file_in_file_browser": {
              "$ref": "#/$defs/type._inputs.*.options.disable_upload_file_in_file_browser"
            },
            "hide_link_to_file": {
              "description": "This key toggles whether CloudCannon will hide the options to link to an existing file, and upload a new file.\n\nSetting this key to `true` will hide the options to link to an existing file and upload a new file. This does not prevent typing a file path in the input.\n\nBy default, this key is `false` (i.e., the options to link to an existing file and upload a new file are shown).",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "hide_link_to_file",
              "markdownDescription": "This key toggles whether CloudCannon will hide the options to link to an existing file, and upload a new file.\n\nSetting this key to `true` will hide the options to link to an existing file and upload a new file. This does not prevent typing a file path in the input.\n\nBy default, this key is `false` (i.e., the options to link to an existing file and upload a new file are shown)."
            },
            "hide_link_to_page": {
              "description": "This key toggles whether CloudCannon will hide the option to link to a page.\n\nSetting this key to `true` will hide the option to link to a page. This does not prevent typing a file's output URL in the input.\n\nBy default, this key is `false` (i.e., the option to link to a page is shown).",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "hide_link_to_page",
              "markdownDescription": "This key toggles whether CloudCannon will hide the option to link to a page.\n\nSetting this key to `true` will hide the option to link to a page. This does not prevent typing a file's output URL in the input.\n\nBy default, this key is `false` (i.e., the option to link to a page is shown)."
            },
            "hide_link_to_email_address": {
              "description": "This key toggles whether CloudCannon will hide the option to link to an email address.\n\nSetting this key to `true` will hide the option to link to an email address. This does not prevent typing a `mailto:` link in the input.\n\nBy default, this key is `false` (i.e., the option to link to an email address is shown).",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "hide_link_to_email_address",
              "markdownDescription": "This key toggles whether CloudCannon will hide the option to link to an email address.\n\nSetting this key to `true` will hide the option to link to an email address. This does not prevent typing a `mailto:` link in the input.\n\nBy default, this key is `false` (i.e., the option to link to an email address is shown)."
            },
            "hide_link_to_telephone": {
              "description": "This key toggles whether CloudCannon will hide the option to link to a telephone number.\n\nSetting this key to `true` will hide the option to link to a telephone number. This does not prevent typing a `tel:` link in the input.\n\nBy default, this key is `false` (i.e., the option to link to a telephone number is shown).",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "hide_link_to_telephone",
              "markdownDescription": "This key toggles whether CloudCannon will hide the option to link to a telephone number.\n\nSetting this key to `true` will hide the option to link to a telephone number. This does not prevent typing a `tel:` link in the input.\n\nBy default, this key is `false` (i.e., the option to link to a telephone number is shown)."
            }
          },
          "markdownDescription": "This key defines options that are specific to URL Inputs.",
          "description": "This key defines options that are specific to URL Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for relative, absolute, and fully qualified URLs.",
      "title": "URL Input",
      "description": "This key defines an editing interface for relative, absolute, and fully qualified URLs.",
      "documented": true,
      "additionalProperties": false
    },
    "SelectInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "select",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `category` key as a *Select Input* type.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `category` key as a *Select Input* type.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.preview"
                }
              ],
              "documented": false,
              "title": "preview"
            },
            "picker_preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.picker_preview"
                }
              ],
              "documented": false,
              "title": "picker_preview"
            },
            "allow_create": {
              "$ref": "#/$defs/type._inputs.*.options.allow_create"
            },
            "allow_empty": {
              "$ref": "#/$defs/type._inputs.*.options.allow_empty"
            },
            "values": {
              "$ref": "#/$defs/type._inputs.*.options.values"
            },
            "value_key": {
              "$ref": "#/$defs/type._inputs.*.options.value_key"
            },
            "view": {
              "$ref": "#/$defs/type._inputs.*.options.view"
            },
            "picker_view": {
              "$ref": "#/$defs/type._inputs.*.options.picker_view"
            },
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            }
          },
          "markdownDescription": "This key defines options that are specific to Select Inputs.\n\n## Examples\n\nIn this example, we have configured *Select Input* options including values.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```",
          "description": "This key defines options that are specific to Select Inputs.\n\n## Examples\n\nIn this example, we have configured *Select Input* options including values.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for data with multiple predefined options.\n\nSelect inputs only allow one value.\n\n## Examples\n\nIn this example, we have configured the `category` key as a *Select Input*.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    label: Category\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```",
      "title": "Select Input",
      "description": "This key defines an editing interface for data with multiple predefined options.\n\nSelect inputs only allow one value.\n\n## Examples\n\nIn this example, we have configured the `category` key as a *Select Input*.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    label: Category\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```",
      "documented": true,
      "additionalProperties": false
    },
    "type.preview": {
      "type": "object",
      "properties": {
        "text": {
          "$ref": "#/$defs/type.preview.text"
        },
        "subtext": {
          "$ref": "#/$defs/type.preview.subtext"
        },
        "image": {
          "$ref": "#/$defs/type.preview.image"
        },
        "icon": {
          "$ref": "#/$defs/type.preview.icon"
        },
        "icon_color": {
          "$ref": "#/$defs/type.preview.icon_color"
        },
        "icon_background_color": {
          "$ref": "#/$defs/type.preview.icon_background_color"
        },
        "tags": {
          "$ref": "#/$defs/type.preview.tags"
        },
        "metadata": {
          "$ref": "#/$defs/type.preview.metadata"
        },
        "gallery": {
          "$ref": "#/$defs/type.preview.gallery"
        }
      },
      "markdownDescription": "This key defines the appearance of a Card.\n\nYou can configure Card preview for [Collections](https://cloudcannon.com/documentation/articles/what-is-a-collection/), [Schemas](https://cloudcannon.com/documentation/articles/what-is-a-schema/),\n[Object inputs](https://cloudcannon.com/documentation/articles/what-is-an-object-input/), [Array inputs](https://cloudcannon.com/documentation/articles/what-is-an-array-input/), [Select\ninputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/), [Structures](https://cloudcannon.com/documentation/articles/what-is-a-structure/), the Structure modal,\n[Snippets](https://cloudcannon.com/documentation/articles/what-is-a-snippet/), and the Snippet modal.\n\nFor more information about previews, please read our documentation on [configuring card previews](https://cloudcannon.com/documentation/articles/configure-your-card-previews/).\n\n## Examples\n\nIn this example, we have configured the appearance of file Cards in the *Collection browser*.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n      subtext:\n        - key: author\n      icon: edit_note\n      icon_color:\n        - key: color\n        - '#ff0000'\n      image:\n        - key: image\n      metadata:\n        - template: [url]\n        - icon: event\n          text:\n            - template: 'Published on {date|date_long}'\n      gallery:\n        - key: featured_image\n```\n\nIn this example, we have configured the appearance of Cards in inputs using the Structure `staff`.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - value:\n          _type: Employee\n          name:\n          job_description:\n          profile_picture:\n        preview:\n          text:\n            - key: name\n            - Employee\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: support_agent\n      - value:\n          _type: Manager\n          name:\n          job_description:\n          profile_picture:\n          url:\n        preview:\n          text:\n            - key: name\n            - Manager\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: face\n```",
      "title": "Preview",
      "documented": true,
      "description": "This key defines the appearance of a Card.\n\nYou can configure Card preview for [Collections](https://cloudcannon.com/documentation/articles/what-is-a-collection/), [Schemas](https://cloudcannon.com/documentation/articles/what-is-a-schema/),\n[Object inputs](https://cloudcannon.com/documentation/articles/what-is-an-object-input/), [Array inputs](https://cloudcannon.com/documentation/articles/what-is-an-array-input/), [Select\ninputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/), [Structures](https://cloudcannon.com/documentation/articles/what-is-a-structure/), the Structure modal,\n[Snippets](https://cloudcannon.com/documentation/articles/what-is-a-snippet/), and the Snippet modal.\n\nFor more information about previews, please read our documentation on [configuring card previews](https://cloudcannon.com/documentation/articles/configure-your-card-previews/).\n\n## Examples\n\nIn this example, we have configured the appearance of file Cards in the *Collection browser*.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n      subtext:\n        - key: author\n      icon: edit_note\n      icon_color:\n        - key: color\n        - '#ff0000'\n      image:\n        - key: image\n      metadata:\n        - template: [url]\n        - icon: event\n          text:\n            - template: 'Published on {date|date_long}'\n      gallery:\n        - key: featured_image\n```\n\nIn this example, we have configured the appearance of Cards in inputs using the Structure `staff`.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - value:\n          _type: Employee\n          name:\n          job_description:\n          profile_picture:\n        preview:\n          text:\n            - key: name\n            - Employee\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: support_agent\n      - value:\n          _type: Manager\n          name:\n          job_description:\n          profile_picture:\n          url:\n        preview:\n          text:\n            - key: name\n            - Manager\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: face\n```",
      "additionalProperties": false
    },
    "type.preview.text": {
      "allOf": [
        {
          "$ref": "#/$defs/PreviewEntries"
        }
      ],
      "documented": true,
      "title": "text",
      "description": "This key defines the main text displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured the main text for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `title` first, then the `{name}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n        - template: '{name}'\n        - text: 'Untitled'\n```\n\nIn this example, we have configured the main text for *Cards* in the `blog` Collection to display the `title` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```",
      "markdownDescription": "This key defines the main text displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured the main text for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `title` first, then the `{name}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n        - template: '{name}'\n        - text: 'Untitled'\n```\n\nIn this example, we have configured the main text for *Cards* in the `blog` Collection to display the `title` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      text:\n        - key: title\n```"
    },
    "type.preview.subtext": {
      "allOf": [
        {
          "$ref": "#/$defs/PreviewEntries"
        }
      ],
      "documented": true,
      "title": "subtext",
      "description": "This key defines the secondary text displayed below the main text on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured the subtext for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `author` first, then the `{writer}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      subtext:\n        - key: author\n        - template: '{writer}'\n        - text: 'Unknown author'\n```\n\nIn this example, we have configured the subtext for *Cards* in the `blog` Collection to display the `author` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      subtext:\n        - key: author\n```",
      "markdownDescription": "This key defines the secondary text displayed below the main text on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured the subtext for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `author` first, then the `{writer}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      subtext:\n        - key: author\n        - template: '{writer}'\n        - text: 'Unknown author'\n```\n\nIn this example, we have configured the subtext for *Cards* in the `blog` Collection to display the `author` key.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      subtext:\n        - key: author\n```"
    },
    "type.preview.image": {
      "allOf": [
        {
          "$ref": "#/$defs/PreviewEntries"
        }
      ],
      "documented": true,
      "title": "image",
      "description": "This key defines the image displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string that results in a file path or URL to an image file. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured the image for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `featured_image` first, then the `{thumbnail}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      image:\n        - key: featured_image\n        - template: '{thumbnail}'\n        - text: 'default-image.jpg'\n```\n\nIn this example, we have configured the image for *Structure Cards* to display the `profile_picture` key.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - value:\n          _type: Employee\n          name:\n          profile_picture:\n        preview:\n          image:\n            - key: profile_picture\n```",
      "markdownDescription": "This key defines the image displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string that results in a file path or URL to an image file. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\n## Examples\n\nIn this example, we have configured the image for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `featured_image` first, then the `{thumbnail}` template, and finally fall back to the static text value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      image:\n        - key: featured_image\n        - template: '{thumbnail}'\n        - text: 'default-image.jpg'\n```\n\nIn this example, we have configured the image for *Structure Cards* to display the `profile_picture` key.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - value:\n          _type: Employee\n          name:\n          profile_picture:\n        preview:\n          image:\n            - key: profile_picture\n```"
    },
    "type.preview.icon": {
      "allOf": [
        {
          "$ref": "#/$defs/PreviewEntries"
        }
      ],
      "documented": true,
      "title": "icon",
      "description": "This key defines the icon displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, text string, that results in one of [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded). When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nFor *Cards* in the *Collection Browser*, this key defaults to the value of `collections_config.*.icon`. Otherwise, this key has no default.\n\n## Examples\n\nIn this example, we have configured the icon for *Cards* in the `blog` Collection to use the `edit_note` icon.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon: edit_note\n```\n\nIn this example, we have configured the icon for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `logo` first, then fall back to the `edit_note` icon.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon:\n        - key: logo\n        - edit_note\n```",
      "markdownDescription": "This key defines the icon displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, text string, that results in one of [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded). When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nFor *Cards* in the *Collection Browser*, this key defaults to the value of `collections_config.*.icon`. Otherwise, this key has no default.\n\n## Examples\n\nIn this example, we have configured the icon for *Cards* in the `blog` Collection to use the `edit_note` icon.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon: edit_note\n```\n\nIn this example, we have configured the icon for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `logo` first, then fall back to the `edit_note` icon.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon:\n        - key: logo\n        - edit_note\n```"
    },
    "type.preview.icon_color": {
      "allOf": [
        {
          "$ref": "#/$defs/PreviewEntries"
        }
      ],
      "documented": true,
      "title": "icon_color",
      "description": "This key defines the color of the icon displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon color for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `color` first, then fall back to the static hex color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon_color:\n        - key: color\n        - text: '#ff0000'\n```",
      "markdownDescription": "This key defines the color of the icon displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon color for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `color` first, then fall back to the static hex color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon_color:\n        - key: color\n        - text: '#ff0000'\n```"
    },
    "type.preview.icon_background_color": {
      "allOf": [
        {
          "$ref": "#/$defs/PreviewEntries"
        }
      ],
      "documented": true,
      "title": "icon_background_color",
      "description": "This key defines the background color of the icon displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon background color for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `bg_color` first, then fall back to the static hex color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon_background_color:\n        - key: bg_color\n        - text: '#f0f0f0'\n```",
      "markdownDescription": "This key defines the background color of the icon displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the icon background color for *Cards* in the `blog` Collection with an array of values to provide fallback options. CloudCannon will use the value of `bg_color` first, then fall back to the static hex color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      icon_background_color:\n        - key: bg_color\n        - text: '#f0f0f0'\n```"
    },
    "type.preview.tags": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "tags[*]",
        "description": "This key represents an individual tag string in the `preview.tags` array.\n\nThe value is a string that specifies a tag to display on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured a tag for *Cards* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      tags:\n        - featured\n```",
        "markdownDescription": "This key represents an individual tag string in the `preview.tags` array.\n\nThe value is a string that specifies a tag to display on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured a tag for *Cards* in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      tags:\n        - featured\n```"
      },
      "documented": true,
      "title": "tags",
      "description": "This key defines tags displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured tags for *Cards* in the `blog` Collection to display category tags.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      tags:\n        - featured\n        - tutorial\n```",
      "markdownDescription": "This key defines tags displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured tags for *Cards* in the `blog` Collection to display category tags.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      tags:\n        - featured\n        - tutorial\n```"
    },
    "type.preview.metadata": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/PreviewMetadataEntry"
      },
      "documented": true,
      "title": "metadata",
      "description": "This key defines metadata entries displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an array of metadata entry objects. Each metadata entry can contain `text`, `image`, `icon`, `icon_color`, and `icon_background_color` properties.\n\nMetadata entries are typically used to display additional information about a card, such as publication dates, URLs, or other contextual data.\n\n## Examples\n\nIn this example, we have configured two metadata entries for *Cards* in the `blog` Collection to display the URL and publication date.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      metadata:\n        - text:\n          - key: url\n        - icon: event\n          icon_color: light-blue\n          text:\n            - template: 'Published on {date|date_long}'\n```",
      "markdownDescription": "This key defines metadata entries displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value is an array of metadata entry objects. Each metadata entry can contain `text`, `image`, `icon`, `icon_color`, and `icon_background_color` properties.\n\nMetadata entries are typically used to display additional information about a card, such as publication dates, URLs, or other contextual data.\n\n## Examples\n\nIn this example, we have configured two metadata entries for *Cards* in the `blog` Collection to display the URL and publication date.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      metadata:\n        - text:\n          - key: url\n        - icon: event\n          icon_color: light-blue\n          text:\n            - template: 'Published on {date|date_long}'\n```"
    },
    "PreviewMetadataEntry": {
      "type": "object",
      "properties": {
        "text": {
          "$ref": "#/$defs/type.preview.text"
        },
        "image": {
          "$ref": "#/$defs/type.preview.image"
        },
        "icon": {
          "$ref": "#/$defs/type.preview.icon"
        },
        "icon_color": {
          "$ref": "#/$defs/type.preview.icon_color"
        },
        "icon_background_color": {
          "$ref": "#/$defs/type.preview.icon_background_color"
        }
      },
      "markdownDescription": "This key represents an individual metadata entry object in the `preview.metadata` array.\n\nThe value is an object that can contain `text`, `image`, `icon`, `icon_color`, and `icon_background_color` properties. Each metadata entry is displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured a metadata entry for *Cards* in the `blog` Collection to display the URL using a template.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      metadata:\n        - template: '[url]'\n```",
      "documented": true,
      "title": "metadata[*]",
      "description": "This key represents an individual metadata entry object in the `preview.metadata` array.\n\nThe value is an object that can contain `text`, `image`, `icon`, `icon_color`, and `icon_background_color` properties. Each metadata entry is displayed on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured a metadata entry for *Cards* in the `blog` Collection to display the URL using a template.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      metadata:\n        - template: '[url]'\n```",
      "additionalProperties": false
    },
    "type.preview.gallery": {
      "type": "object",
      "properties": {
        "text": {
          "$ref": "#/$defs/type.preview.text"
        },
        "image": {
          "$ref": "#/$defs/type.preview.image"
        },
        "icon": {
          "$ref": "#/$defs/type.preview.icon"
        },
        "icon_color": {
          "$ref": "#/$defs/type.preview.icon_color"
        },
        "icon_background_color": {
          "$ref": "#/$defs/type.preview.icon_background_color"
        },
        "fit": {
          "$ref": "#/$defs/preview.gallery.fit"
        },
        "background_color": {
          "$ref": "#/$defs/type.preview.gallery.background_color"
        }
      },
      "markdownDescription": "This key defines the appearance of the gallery section on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the gallery section for *Cards* in the `blog` Collection to display the image stored under the `featured_image` key with a padded fit.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        fit: padded\n```",
      "documented": true,
      "title": "gallery",
      "description": "This key defines the appearance of the gallery section on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\n## Examples\n\nIn this example, we have configured the gallery section for *Cards* in the `blog` Collection to display the image stored under the `featured_image` key with a padded fit.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        fit: padded\n```",
      "additionalProperties": false
    },
    "preview.gallery.fit": {
      "default": "padded",
      "type": "string",
      "enum": [
        "padded",
        "cover",
        "contain",
        "cover-top"
      ],
      "documented": true,
      "title": "fit",
      "description": "This key defines how images fit within their containers in the gallery section of a *Card*.\n\nValid values are `padded` (default), `contain`, `cover`, or `cover-top`.\n\n* The `padded` value adds padding around images to maintain aspect ratio.\n* The `contain` value ensures images fit entirely within the container by setting the largest dimension of the image to the largest dimension of the container, while maintaining aspect ratio.\n* The `cover` value ensures images cover the entire container while maintaining aspect ratio, aligning the center of the image with the center of the container.\n* The `cover-top` value ensures images cover the entire container while maintaining aspect ratio, aligning the top of the image with the top of the container.\n\nThis key defaults to `contain`.\n\n## Examples\n\nIn this example, we have configured the gallery fit to use `cover` so images cover the entire container while maintaining aspect ratio, aligning the center of the image with the center of the container.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        fit: cover\n```",
      "markdownDescription": "This key defines how images fit within their containers in the gallery section of a *Card*.\n\nValid values are `padded` (default), `contain`, `cover`, or `cover-top`.\n\n* The `padded` value adds padding around images to maintain aspect ratio.\n* The `contain` value ensures images fit entirely within the container by setting the largest dimension of the image to the largest dimension of the container, while maintaining aspect ratio.\n* The `cover` value ensures images cover the entire container while maintaining aspect ratio, aligning the center of the image with the center of the container.\n* The `cover-top` value ensures images cover the entire container while maintaining aspect ratio, aligning the top of the image with the top of the container.\n\nThis key defaults to `contain`.\n\n## Examples\n\nIn this example, we have configured the gallery fit to use `cover` so images cover the entire container while maintaining aspect ratio, aligning the center of the image with the center of the container.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        fit: cover\n```"
    },
    "type.preview.gallery.background_color": {
      "allOf": [
        {
          "$ref": "#/$defs/PreviewEntries"
        }
      ],
      "documented": true,
      "title": "background_color",
      "description": "This key defines the background color of the gallery area on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the gallery background color with an array of values to provide fallback options. CloudCannon will use the value of `gallery_bg_color` first, then the `{bg_color}` template, and finally fall back to the static hex color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        background_color:\n          - key: gallery_bg_color\n          - template: '{bg_color}'\n          - text: '#ffffff'\n```\n\nIn this example, we have configured the gallery background color to use a static CSS color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        background_color:\n          - 'red'\n```",
      "markdownDescription": "This key defines the background color of the gallery area on *Cards* in the *Collection browser*, *Structures*, and *Snippets*.\n\nThe value can be an array or a single value, and reference a key, template, or text string. When multiple entries are provided, CloudCannon will use them in order as fallback options.\n\nColor values can be hex codes (e.g., `#ff0000`), CSS color names, or reference a data key that contains a color value.\n\n## Examples\n\nIn this example, we have configured the gallery background color with an array of values to provide fallback options. CloudCannon will use the value of `gallery_bg_color` first, then the `{bg_color}` template, and finally fall back to the static hex color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        background_color:\n          - key: gallery_bg_color\n          - template: '{bg_color}'\n          - text: '#ffffff'\n```\n\nIn this example, we have configured the gallery background color to use a static CSS color value.\n\n```yaml\ncollections_config:\n  blog:\n    preview:\n      gallery:\n        image:\n          - key: featured_image\n        background_color:\n          - 'red'\n```"
    },
    "type.picker_preview": {
      "title": "Picker Preview",
      "allOf": [
        {
          "$ref": "#/$defs/type.preview"
        }
      ],
      "documented": true,
      "description": "This key defines the appearance of a Card when choosing an item to create. This uses `preview` as a base, and keys inside this object are overrides.\n\nYou can configure Card preview for [Collections](https://cloudcannon.com/documentation/articles/what-is-a-collection/), [Schemas](https://cloudcannon.com/documentation/articles/what-is-a-schema/),\n[Object inputs](https://cloudcannon.com/documentation/articles/what-is-an-object-input/), [Array inputs](https://cloudcannon.com/documentation/articles/what-is-an-array-input/), [Select\ninputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/), [Structures](https://cloudcannon.com/documentation/articles/what-is-a-structure/), the Structure modal,\n[Snippets](https://cloudcannon.com/documentation/articles/what-is-a-snippet/), and the Snippet modal.\n\nFor more information about previews, please read our documentation on [configuring card previews](https://cloudcannon.com/documentation/articles/configure-your-card-previews/).\n\n## Examples\n\nIn this example, we have configured the appearance of Cards in inputs using the Structure `staff` when adding items.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - value:\n          _type: Employee\n          name:\n          job_description:\n          profile_picture:\n        picker_preview:\n          text:\n            - key: name\n            - Employee\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: support_agent\n      - value:\n          _type: Manager\n          name:\n          job_description:\n          profile_picture:\n          url:\n        picker_preview:\n          text:\n            - key: name\n            - Manager\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: face\n```",
      "markdownDescription": "This key defines the appearance of a Card when choosing an item to create. This uses `preview` as a base, and keys inside this object are overrides.\n\nYou can configure Card preview for [Collections](https://cloudcannon.com/documentation/articles/what-is-a-collection/), [Schemas](https://cloudcannon.com/documentation/articles/what-is-a-schema/),\n[Object inputs](https://cloudcannon.com/documentation/articles/what-is-an-object-input/), [Array inputs](https://cloudcannon.com/documentation/articles/what-is-an-array-input/), [Select\ninputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/), [Structures](https://cloudcannon.com/documentation/articles/what-is-a-structure/), the Structure modal,\n[Snippets](https://cloudcannon.com/documentation/articles/what-is-a-snippet/), and the Snippet modal.\n\nFor more information about previews, please read our documentation on [configuring card previews](https://cloudcannon.com/documentation/articles/configure-your-card-previews/).\n\n## Examples\n\nIn this example, we have configured the appearance of Cards in inputs using the Structure `staff` when adding items.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - value:\n          _type: Employee\n          name:\n          job_description:\n          profile_picture:\n        picker_preview:\n          text:\n            - key: name\n            - Employee\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: support_agent\n      - value:\n          _type: Manager\n          name:\n          job_description:\n          profile_picture:\n          url:\n        picker_preview:\n          text:\n            - key: name\n            - Manager\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: face\n```"
    },
    "type._inputs.*.options.allow_create": {
      "description": "This key toggles whether CloudCannon will allow new text values to be created at edit time.\n\nSetting this key to `true` will allow new text values to be created at edit time.\n\n## Examples\n\nIn this example, CloudCannon will allow users to add new values to a *Select Input*.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n      allow_create: true\n```",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "allow_create",
      "markdownDescription": "This key toggles whether CloudCannon will allow new text values to be created at edit time.\n\nSetting this key to `true` will allow new text values to be created at edit time.\n\n## Examples\n\nIn this example, CloudCannon will allow users to add new values to a *Select Input*.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n      allow_create: true\n```"
    },
    "type._inputs.*.options.allow_empty": {
      "deprecated": true,
      "description": "This key is deprecated. If you want to prevent empty values, we recommend setting `_inputs.*.options.required` to `true` instead.\n\nThis key toggles whether CloudCannon will accept empty values, and pre-select the first option if opened with an empty value.\n\nSetting this key to `true` will allow CloudCannon to accept empty values.\n\n## Examples\n\nIn this example, CloudCannon will accept empty values for a *Select Input*.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n      allow_empty: true\n```",
      "type": "boolean",
      "documented": true,
      "title": "allow_empty",
      "markdownDescription": "This key is deprecated. If you want to prevent empty values, we recommend setting `_inputs.*.options.required` to `true` instead.\n\nThis key toggles whether CloudCannon will accept empty values, and pre-select the first option if opened with an empty value.\n\nSetting this key to `true` will allow CloudCannon to accept empty values.\n\n## Examples\n\nIn this example, CloudCannon will accept empty values for a *Select Input*.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n      allow_empty: true\n```"
    },
    "type._inputs.*.options.values": {
      "description": "This key defines the values available to choose from.\n\nOptional, defaults to fetching values from the naming convention (e.g. `colors` or `my_colors` for data set `colors`).\n\n## Examples\n\nIn this example, we have configured a *Select Input* with custom values to choose from.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```",
      "anyOf": [
        {
          "type": "string",
          "title": "Dataset Reference Values",
          "description": "This key defines a reference to a dataset.",
          "documented": true,
          "markdownDescription": "This key defines a reference to a dataset."
        },
        {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "documented": false,
                "title": "values(any-of-1)(text-array)[*]"
              },
              "title": "Text Array",
              "documented": false
            },
            {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "documented": false,
              "title": "Text Object",
              "additionalProperties": {
                "type": "string",
                "documented": false,
                "title": "values(any-of-1)(text-object).*"
              }
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "title": "values(any-of-1)(object-array)[*]",
                "documented": false,
                "additionalProperties": {}
              },
              "title": "Object Array",
              "documented": false
            },
            {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "documented": false,
              "title": "Object",
              "additionalProperties": {}
            }
          ],
          "description": "Data formats for populating select and multiselect input options, supporting arrays and objects.",
          "documented": false,
          "title": "values(any-of-1)",
          "markdownDescription": "Data formats for populating select and multiselect input options, supporting arrays and objects."
        }
      ],
      "documented": true,
      "title": "values",
      "markdownDescription": "This key defines the values available to choose from.\n\nOptional, defaults to fetching values from the naming convention (e.g. `colors` or `my_colors` for data set `colors`).\n\n## Examples\n\nIn this example, we have configured a *Select Input* with custom values to choose from.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n```"
    },
    "type._inputs.*.options.value_key": {
      "description": "This key defines the key used for mapping between saved values and objects in values.\n\nThis changes how the input saves selected values to match.\n\nDefaults to checking for \"id\", \"uuid\", \"path\", \"title\", then \"name\".\n\nHas no effect unless values is an array of objects, the key is used instead for objects, and the value itself is used for primitive types.",
      "type": "string",
      "documented": true,
      "title": "value_key",
      "markdownDescription": "This key defines the key used for mapping between saved values and objects in values.\n\nThis changes how the input saves selected values to match.\n\nDefaults to checking for \"id\", \"uuid\", \"path\", \"title\", then \"name\".\n\nHas no effect unless values is an array of objects, the key is used instead for objects, and the value itself is used for primitive types."
    },
    "type._inputs.*.options.view": {
      "description": "This key defines how selected items are rendered.",
      "type": "string",
      "enum": [
        "card",
        "text",
        "gallery",
        "gallery-left"
      ],
      "documented": true,
      "title": "view",
      "markdownDescription": "This key defines how selected items are rendered."
    },
    "type._inputs.*.options.picker_view": {
      "description": "This key defines how CloudCannon should render selectable options in the dropdown of a *Select Input*.\n\n## Examples\n\nIn this example, we have configured a *Select Input* to display options using the card view.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n      picker_view: card\n```",
      "type": "string",
      "enum": [
        "card",
        "text",
        "gallery",
        "gallery-left"
      ],
      "documented": true,
      "title": "picker_view",
      "markdownDescription": "This key defines how CloudCannon should render selectable options in the dropdown of a *Select Input*.\n\n## Examples\n\nIn this example, we have configured a *Select Input* to display options using the card view.\n\n```yaml\n_inputs:\n  category:\n    type: select\n    options:\n      values:\n        - Blog\n        - News\n        - Events\n      picker_view: card\n```"
    },
    "MultiselectInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "multiselect",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `tags` key as a *Multiselect Input* type.\n\n```yaml\n_inputs:\n  tags:\n    type: multiselect\n```",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `tags` key as a *Multiselect Input* type.\n\n```yaml\n_inputs:\n  tags:\n    type: multiselect\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.preview"
                }
              ],
              "documented": false,
              "title": "preview"
            },
            "picker_preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.picker_preview"
                }
              ],
              "documented": false,
              "title": "picker_preview"
            },
            "allow_create": {
              "$ref": "#/$defs/type._inputs.*.options.allow_create"
            },
            "allow_empty": {
              "$ref": "#/$defs/type._inputs.*.options.allow_empty"
            },
            "values": {
              "$ref": "#/$defs/type._inputs.*.options.values"
            },
            "value_key": {
              "$ref": "#/$defs/type._inputs.*.options.value_key"
            },
            "view": {
              "$ref": "#/$defs/type._inputs.*.options.view"
            },
            "picker_view": {
              "$ref": "#/$defs/type._inputs.*.options.picker_view"
            },
            "max_items": {
              "$ref": "#/$defs/type._inputs.*.options.max_items"
            },
            "max_items_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_items_message"
            },
            "min_items": {
              "$ref": "#/$defs/type._inputs.*.options.min_items"
            },
            "min_items_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_items_message"
            },
            "unique_on": {
              "$ref": "#/$defs/type._inputs.*.options.unique_on"
            },
            "unique_on_message": {
              "$ref": "#/$defs/type._inputs.*.options.unique_on_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(array)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            }
          },
          "markdownDescription": "This key defines options that are specific to Multiselect Inputs.\n\n## Examples\n\nIn this example, we have configured *Multiselect Input* options including values.\n\n```yaml\n_inputs:\n  tags:\n    type: multiselect\n    options:\n      values:\n        - featured\n        - news\n        - events\n```",
          "description": "This key defines options that are specific to Multiselect Inputs.\n\n## Examples\n\nIn this example, we have configured *Multiselect Input* options including values.\n\n```yaml\n_inputs:\n  tags:\n    type: multiselect\n    options:\n      values:\n        - featured\n        - news\n        - events\n```",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for data with multiple predefined options.\n\nMultiselect inputs allow several values.\n\n## Examples\n\nIn this example, we have configured the `tags` key as a *Multiselect Input*.\n\n```yaml\n_inputs:\n  tags:\n    type: multiselect\n    label: Tags\n    options:\n      values:\n        - featured\n        - news\n        - events\n```",
      "title": "Multiselect Input",
      "description": "This key defines an editing interface for data with multiple predefined options.\n\nMultiselect inputs allow several values.\n\n## Examples\n\nIn this example, we have configured the `tags` key as a *Multiselect Input*.\n\n```yaml\n_inputs:\n  tags:\n    type: multiselect\n    label: Tags\n    options:\n      values:\n        - featured\n        - news\n        - events\n```",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs.*.options.max_items": {
      "description": "This key defines the maximum number of items CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from adding more items to this Input.\n\nIf the Input already contains more items, CloudCannon will require you to remove items until the Input contains a valid number to save your changes,\nor discard your unsaved changes.\n\nValue can be any positive integer.\n\nIf `options.min_items` is also configured, this key cannot be a lesser number.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we want to add an array of filepaths to our homepage's `featured_posts` Input. This Input limits you to a maximum of five array items.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```",
      "type": "number",
      "documented": true,
      "title": "max_items",
      "markdownDescription": "This key defines the maximum number of items CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from adding more items to this Input.\n\nIf the Input already contains more items, CloudCannon will require you to remove items until the Input contains a valid number to save your changes,\nor discard your unsaved changes.\n\nValue can be any positive integer.\n\nIf `options.min_items` is also configured, this key cannot be a lesser number.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we want to add an array of filepaths to our homepage's `featured_posts` Input. This Input limits you to a maximum of five array items.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```"
    },
    "type._inputs.*.options.max_items_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max_items`.\n\nThis key requires you to define `options.max_items`.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of items using a custom message.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```",
      "type": "string",
      "documented": true,
      "title": "max_items_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.max_items`.\n\nThis key requires you to define `options.max_items`.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of items using a custom message.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```"
    },
    "type._inputs.*.options.min_items": {
      "description": "This key defines the minimum number of items CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from removing items from this Input below this value.\n\nIf the Input already contains fewer items, CloudCannon will require you to add items until the Input contains a valid number to save your changes, or\ndiscard your unsaved changes.\n\nValue can be any positive integer.\n\nIf `options.min_items` is also configured, this key cannot be a greater number.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we want to add an array of filepaths to our homepage's `featured_posts` Input. This Input limits you to a maximum of two array items.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```",
      "type": "number",
      "documented": true,
      "title": "min_items",
      "markdownDescription": "This key defines the minimum number of items CloudCannon will allow in an Input.\n\nWhen configured, CloudCannon will prevent you from removing items from this Input below this value.\n\nIf the Input already contains fewer items, CloudCannon will require you to add items until the Input contains a valid number to save your changes, or\ndiscard your unsaved changes.\n\nValue can be any positive integer.\n\nIf `options.min_items` is also configured, this key cannot be a greater number.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we want to add an array of filepaths to our homepage's `featured_posts` Input. This Input limits you to a maximum of two array items.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```"
    },
    "type._inputs.*.options.min_items_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.min_items`.\n\nThis key requires you to define `options.min_items`.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of items using a custom message.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```",
      "type": "string",
      "documented": true,
      "title": "min_items_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.min_items`.\n\nThis key requires you to define `options.min_items`.\n\nThis key has no default.\n\nThis key is available for Array and Multiselect or Multichoice Inputs.\n\n## Examples\n\nIn this example, we prompt our team to enter a valid number of items using a custom message.\n\n```yaml\n_inputs:\n  featured_posts:\n    type: array\n    options:\n      max_items: 5\n      max_items_message: Cannot be more than 5\n      min_items: 2\n      min_items_message: Cannot be less than 2\n```"
    },
    "type._inputs.*.options.unique_on": {
      "description": "This key defines the JSON Path selector that CloudCannon should use to determine if the value of an Input is unique.\n\nWhen configured, CloudCannon will require the value of the Input to be unique compared to the value defined on the JSON Path.\n\nIf the Input already contains a non-unique value, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be a valid JSON Path.\n\nThis key has no default.\n\nThis key is available for Array inputs.\n\n## Examples\n\nIn this example, we want our team to add article filepaths to the `related_articles` Input. This Input requires all the filepaths to be unique.\n\n```yaml\n_inputs:\n  related_articles:\n    type: array\n    options:\n      unique_on: '$.path'\n```\n\n```yaml\nrelated_articles:\n  - path: /articles/first-article.md\n    featured: true\n  - path: /articles/second-article.md\n    featured: false\n```",
      "type": "string",
      "documented": true,
      "title": "unique_on",
      "markdownDescription": "This key defines the JSON Path selector that CloudCannon should use to determine if the value of an Input is unique.\n\nWhen configured, CloudCannon will require the value of the Input to be unique compared to the value defined on the JSON Path.\n\nIf the Input already contains a non-unique value, CloudCannon will require you to change it to a valid value to save your changes, or discard your\nunsaved changes.\n\nValue must be a valid JSON Path.\n\nThis key has no default.\n\nThis key is available for Array inputs.\n\n## Examples\n\nIn this example, we want our team to add article filepaths to the `related_articles` Input. This Input requires all the filepaths to be unique.\n\n```yaml\n_inputs:\n  related_articles:\n    type: array\n    options:\n      unique_on: '$.path'\n```\n\n```yaml\nrelated_articles:\n  - path: /articles/first-article.md\n    featured: true\n  - path: /articles/second-article.md\n    featured: false\n```"
    },
    "type._inputs.*.options.unique_on_message": {
      "description": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.unique_on`.\nThis key requires you to define `options.unique_on`.\n\nThis key has no default.\n\nThis key is available for Array inputs.\n\n## Examples\n\nIn this example, we want our team to add article filepaths to the `related_articles` Input. This Input requires all the filepaths to be unique.\n\n```yaml\n_inputs:\n  related_articles:\n    type: array\n    options:\n      unique_on: '$.path'\n      unique_on_message: The value for path must be different for all items.\n```\n\n```yaml\nrelated_articles:\n  - path: /articles/first-article.md\n    featured: true\n  - path: /articles/first-article.md\n    featured: false\n```",
      "type": "string",
      "documented": true,
      "title": "unique_on_message",
      "markdownDescription": "This key defines a custom error message that explains why a value has failed the validation criteria from `options.unique_on`.\nThis key requires you to define `options.unique_on`.\n\nThis key has no default.\n\nThis key is available for Array inputs.\n\n## Examples\n\nIn this example, we want our team to add article filepaths to the `related_articles` Input. This Input requires all the filepaths to be unique.\n\n```yaml\n_inputs:\n  related_articles:\n    type: array\n    options:\n      unique_on: '$.path'\n      unique_on_message: The value for path must be different for all items.\n```\n\n```yaml\nrelated_articles:\n  - path: /articles/first-article.md\n    featured: true\n  - path: /articles/first-article.md\n    featured: false\n```"
    },
    "type._inputs.*.options.empty_type(array)": {
      "default": "null",
      "description": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values.\n\n## Examples\n\nIn this example, we have configured how empty array values will be saved.\n\n```yaml\n_inputs:\n  tags:\n    type: array\n    options:\n      empty_type: array\n```",
      "type": "string",
      "enum": [
        "null",
        "array"
      ],
      "documented": true,
      "title": "Array Empty Type",
      "markdownDescription": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values.\n\n## Examples\n\nIn this example, we have configured how empty array values will be saved.\n\n```yaml\n_inputs:\n  tags:\n    type: array\n    options:\n      empty_type: array\n```"
    },
    "ChoiceInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "choice",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `status` key as a *Choice Input* type.\n\n```yaml\n_inputs:\n  status:\n    type: choice\n```",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves.\n\n## Examples\n\nIn this example, we have configured the `status` key as a *Choice Input* type.\n\n```yaml\n_inputs:\n  status:\n    type: choice\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.preview"
                }
              ],
              "documented": false,
              "title": "preview"
            },
            "picker_preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.picker_preview"
                }
              ],
              "documented": false,
              "title": "picker_preview"
            },
            "allow_empty": {
              "$ref": "#/$defs/type._inputs.*.options.allow_empty"
            },
            "values": {
              "$ref": "#/$defs/type._inputs.*.options.values"
            },
            "value_key": {
              "$ref": "#/$defs/type._inputs.*.options.value_key"
            },
            "view": {
              "$ref": "#/$defs/type._inputs.*.options.view"
            },
            "picker_view": {
              "$ref": "#/$defs/type._inputs.*.options.picker_view"
            },
            "max_length": {
              "$ref": "#/$defs/type._inputs.*.options.max_length"
            },
            "max_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_length_message"
            },
            "min_length": {
              "$ref": "#/$defs/type._inputs.*.options.min_length"
            },
            "min_length_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_length_message"
            },
            "max_words": {
              "$ref": "#/$defs/type._inputs.*.options.max_words"
            },
            "max_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_words_message"
            },
            "min_words": {
              "$ref": "#/$defs/type._inputs.*.options.min_words"
            },
            "min_words_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_words_message"
            },
            "max_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes"
            },
            "max_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_graphemes_message"
            },
            "min_graphemes": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes"
            },
            "min_graphemes_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_graphemes_message"
            },
            "locale": {
              "$ref": "#/$defs/type._inputs.*.options.locale"
            },
            "pattern": {
              "$ref": "#/$defs/type._inputs.*.options.pattern"
            },
            "pattern_message": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_message"
            },
            "pattern_flags": {
              "$ref": "#/$defs/type._inputs.*.options.pattern_flags"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(text)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            }
          },
          "markdownDescription": "This key defines options that are specific to Choice Inputs.\n\n## Examples\n\nIn this example, we have configured *Choice Input* options including values.\n\n```yaml\n_inputs:\n  status:\n    type: choice\n    options:\n      values:\n        - draft\n        - published\n        - archived\n```",
          "description": "This key defines options that are specific to Choice Inputs.\n\n## Examples\n\nIn this example, we have configured *Choice Input* options including values.\n\n```yaml\n_inputs:\n  status:\n    type: choice\n    options:\n      values:\n        - draft\n        - published\n        - archived\n```",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for data with multiple predefined options.\n\nChoice inputs only allow one value.\n\n## Examples\n\nIn this example, we have configured the `status` key as a *Choice Input*.\n\n```yaml\n_inputs:\n  status:\n    type: choice\n    label: Status\n    options:\n      values:\n        - draft\n        - published\n        - archived\n```",
      "title": "Choice Input",
      "description": "This key defines an editing interface for data with multiple predefined options.\n\nChoice inputs only allow one value.\n\n## Examples\n\nIn this example, we have configured the `status` key as a *Choice Input*.\n\n```yaml\n_inputs:\n  status:\n    type: choice\n    label: Status\n    options:\n      values:\n        - draft\n        - published\n        - archived\n```",
      "documented": true,
      "additionalProperties": false
    },
    "MultichoiceInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "multichoice",
          "title": "Type",
          "description": "This key defines the type of editing interface used for an Input.\n\nEach Input type has a different appearance and functionality, processes and accepts different types of values, and has different configuration\noptions.\n\nValue can be one of the following: `auto`, `checkbox`, `switch`, `code`, `color`, `datetime`, `date`, `time`, `file`, `document`, `image`, `number`,\n`range`, `object`, `array`, `select`, `multiselect`, `choice`, `multichoice`, `text`, `textarea`, `email`, `html`, `markdown`, or `url`.\n\nIf the type or value of an Input is misconfigured, CloudCannon will display an orange warning instead of an Input.\n\nIf type is not configured for an Input, CloudCannon will attempt to determine Input type based on value or key name conventions.\n\n## Examples\n\nIn this example, we have configured the `categories` key as a *Multichoice Input* type.\n\n```yaml\n_inputs:\n  categories:\n    type: multichoice\n```",
          "documented": true,
          "markdownDescription": "This key defines the type of editing interface used for an Input.\n\nEach Input type has a different appearance and functionality, processes and accepts different types of values, and has different configuration\noptions.\n\nValue can be one of the following: `auto`, `checkbox`, `switch`, `code`, `color`, `datetime`, `date`, `time`, `file`, `document`, `image`, `number`,\n`range`, `object`, `array`, `select`, `multiselect`, `choice`, `multichoice`, `text`, `textarea`, `email`, `html`, `markdown`, or `url`.\n\nIf the type or value of an Input is misconfigured, CloudCannon will display an orange warning instead of an Input.\n\nIf type is not configured for an Input, CloudCannon will attempt to determine Input type based on value or key name conventions.\n\n## Examples\n\nIn this example, we have configured the `categories` key as a *Multichoice Input* type.\n\n```yaml\n_inputs:\n  categories:\n    type: multichoice\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.preview"
                }
              ],
              "documented": false,
              "title": "preview"
            },
            "picker_preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.picker_preview"
                }
              ],
              "documented": false,
              "title": "picker_preview"
            },
            "allow_empty": {
              "$ref": "#/$defs/type._inputs.*.options.allow_empty"
            },
            "values": {
              "$ref": "#/$defs/type._inputs.*.options.values"
            },
            "value_key": {
              "$ref": "#/$defs/type._inputs.*.options.value_key"
            },
            "view": {
              "$ref": "#/$defs/type._inputs.*.options.view"
            },
            "picker_view": {
              "$ref": "#/$defs/type._inputs.*.options.picker_view"
            },
            "max_items": {
              "$ref": "#/$defs/type._inputs.*.options.max_items"
            },
            "max_items_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_items_message"
            },
            "min_items": {
              "$ref": "#/$defs/type._inputs.*.options.min_items"
            },
            "min_items_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_items_message"
            },
            "unique_on": {
              "$ref": "#/$defs/type._inputs.*.options.unique_on"
            },
            "unique_on_message": {
              "$ref": "#/$defs/type._inputs.*.options.unique_on_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(array)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            }
          },
          "markdownDescription": "This key defines options that are specific to Multichoice Inputs.\n\n## Examples\n\nIn this example, we have configured *Multichoice Input* options including values.\n\n```yaml\n_inputs:\n  categories:\n    type: multichoice\n    options:\n      values:\n        - technology\n        - design\n        - business\n```",
          "description": "This key defines options that are specific to Multichoice Inputs.\n\n## Examples\n\nIn this example, we have configured *Multichoice Input* options including values.\n\n```yaml\n_inputs:\n  categories:\n    type: multichoice\n    options:\n      values:\n        - technology\n        - design\n        - business\n```",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines an editing interface for data with multiple predefined options.\n\nMultichoice inputs allow several values.\n\n## Examples\n\nIn this example, we have configured the `categories` key as a *Multichoice Input*.\n\n```yaml\n_inputs:\n  categories:\n    type: multichoice\n    label: Categories\n    options:\n      values:\n        - technology\n        - design\n        - business\n```",
      "title": "Multichoice Input",
      "description": "This key defines an editing interface for data with multiple predefined options.\n\nMultichoice inputs allow several values.\n\n## Examples\n\nIn this example, we have configured the `categories` key as a *Multichoice Input*.\n\n```yaml\n_inputs:\n  categories:\n    type: multichoice\n    label: Categories\n    options:\n      values:\n        - technology\n        - design\n        - business\n```",
      "documented": true,
      "additionalProperties": false
    },
    "ObjectInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "object",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(object)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "preview": {
              "allOf": [
                {
                  "$ref": "#/$defs/type.preview"
                }
              ],
              "documented": false,
              "title": "preview"
            },
            "subtype": {
              "description": "This key defines the appearance and behavior of the input.",
              "type": "string",
              "enum": [
                "object",
                "mutable",
                "tabbed"
              ],
              "documented": true,
              "title": "subtype",
              "markdownDescription": "This key defines the appearance and behavior of the input."
            },
            "entries": {
              "description": "This key defines the appearance and function of entries in a mutable *Object Input*.\n\nThe value is an object that can contain optional `allowed_keys`, `structures`, `assigned_structures`, `comment`, and `documentation` keys.\n\nAvailable for Mutable Objects only.\n\n## Examples\n\nIn this example, we have configured entries options with assigned structures for specific allowed keys.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n        assigned_structures:\n          title:\n            - article_metadata\n            - page_metadata\n```",
              "type": "object",
              "properties": {
                "allowed_keys": {
                  "description": "This key defines a limited set of key names for nested keys within your *Object Input*.\n\nThe value is an array of key name strings. This affects entries when adding or renaming nested keys.\n\nThis set is used when entries are added and renamed with `allow_create` enabled. Has no effect if `allow_create` is not enabled.\n\nAvailable for Mutable Objects only.\n\nBy default, this key is `[]`.\n\n## Examples\n\nIn this example, we have configured an allowed key name for entries in a mutable *Object Input*.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n```",
                  "type": "array",
                  "items": {
                    "type": "string",
                    "documented": true,
                    "title": "allowed_keys[*]",
                    "description": "This key represents an individual allowed key string in the `_inputs.*(object-input).options.entries.allowed_keys` array.\n\nThe value is a string that specifies a key name that can exist on the data within an *Object Input*. This set is used when entries are added and renamed with `allow_create` enabled.\n\n## Examples\n\nIn this example, we have configured an allowed key name for entries in a mutable *Object Input*.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n```",
                    "markdownDescription": "This key represents an individual allowed key string in the `_inputs.*(object-input).options.entries.allowed_keys` array.\n\nThe value is a string that specifies a key name that can exist on the data within an *Object Input*. This set is used when entries are added and renamed with `allow_create` enabled.\n\n## Examples\n\nIn this example, we have configured an allowed key name for entries in a mutable *Object Input*.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n```"
                  },
                  "documented": true,
                  "title": "allowed_keys",
                  "markdownDescription": "This key defines a limited set of key names for nested keys within your *Object Input*.\n\nThe value is an array of key name strings. This affects entries when adding or renaming nested keys.\n\nThis set is used when entries are added and renamed with `allow_create` enabled. Has no effect if `allow_create` is not enabled.\n\nAvailable for Mutable Objects only.\n\nBy default, this key is `[]`.\n\n## Examples\n\nIn this example, we have configured an allowed key name for entries in a mutable *Object Input*.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n```"
                },
                "assigned_structures": {
                  "description": "This key defines how to assign structures to specific key names for entries in the *Object Input*.\n\nThe value is an object where each property key is an allowed key name, and each property value is an array of structure key name strings. When selecting an entry key name, CloudCannon will prompt team members to choose one of the assigned structures for that allowed key. Structure values are referred to by their `id`.\n\nAvailable for Mutable Objects only.",
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "markdownDescription": "This key defines how to assign structures to specific key names for entries in the *Object Input*.\n\nThe value is an object where each property key is an allowed key name, and each property value is an array of structure key name strings. When selecting an entry key name, CloudCannon will prompt team members to choose one of the assigned structures for that allowed key. Structure values are referred to by their `id`.\n\nAvailable for Mutable Objects only.",
                  "documented": true,
                  "title": "assigned_structures",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "documented": true,
                      "title": "*[*]",
                      "description": "This key represents an individual assigned structure string in the `_inputs.*(object-input).options.entries.assigned_structures.*` array.\n\nThe value is a string that specifies a structure key name assigned to entries in an *Object Input*.\n\n## Examples\n\nIn this example, we have configured an assigned structure for entries in a mutable *Object Input*.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n        assigned_structures:\n          title:\n            - article_metadata\n```",
                      "markdownDescription": "This key represents an individual assigned structure string in the `_inputs.*(object-input).options.entries.assigned_structures.*` array.\n\nThe value is a string that specifies a structure key name assigned to entries in an *Object Input*.\n\n## Examples\n\nIn this example, we have configured an assigned structure for entries in a mutable *Object Input*.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n        assigned_structures:\n          title:\n            - article_metadata\n```"
                    },
                    "documented": true,
                    "title": "assigned_structures.*",
                    "description": "This key represents the assigned structures for a specific allowed key name in the `_inputs.*(object-input).options.entries.assigned_structures` object.\n\nThe value is an array of structure key name strings. When team members select this allowed key name, CloudCannon will prompt them to choose one of these structures.\n\nAvailable for Mutable Objects only.",
                    "markdownDescription": "This key represents the assigned structures for a specific allowed key name in the `_inputs.*(object-input).options.entries.assigned_structures` object.\n\nThe value is an array of structure key name strings. When team members select this allowed key name, CloudCannon will prompt them to choose one of these structures.\n\nAvailable for Mutable Objects only."
                  }
                },
                "structures": {
                  "description": "This key defines which predefined templates to use for populating entries nested in the *Object Input*.\n\nThe value can be a string or an object. When configured, team members can select a [structure](https://cloudcannon.com/documentation/developer-articles/what-is-a-structure/) to populate the Object with input/input groups.\n\nIf configured as an object, CloudCannon will use the values directly. If configured as a string, CloudCannon will use the matching structures value defined under `_structures` in the [configuration cascade](https://cloudcannon.com/documentation/developer-articles/using-the-configuration-cascade/).\n\nAvailable for Mutable Objects only.\n\n> **Note:** This key looks similar to `structures`. However, the `structures` key applies to the Object input itself, while `entries.structures` applies to the entries within the object.\n\nThis key has no default.",
                  "anyOf": [
                    {
                      "$ref": "#/$defs/type.structure-reference"
                    },
                    {
                      "$ref": "#/$defs/type.structure"
                    }
                  ],
                  "documented": true,
                  "title": "structures",
                  "markdownDescription": "This key defines which predefined templates to use for populating entries nested in the *Object Input*.\n\nThe value can be a string or an object. When configured, team members can select a [structure](https://cloudcannon.com/documentation/developer-articles/what-is-a-structure/) to populate the Object with input/input groups.\n\nIf configured as an object, CloudCannon will use the values directly. If configured as a string, CloudCannon will use the matching structures value defined under `_structures` in the [configuration cascade](https://cloudcannon.com/documentation/developer-articles/using-the-configuration-cascade/).\n\nAvailable for Mutable Objects only.\n\n> **Note:** This key looks similar to `structures`. However, the `structures` key applies to the Object input itself, while `entries.structures` applies to the entries within the object.\n\nThis key has no default."
                },
                "comment": {
                  "$ref": "#/$defs/entries_comment"
                },
                "documentation": {
                  "description": "Provides a custom link for documentation for editors shown above the key input when adding/renaming within a mutable object input.",
                  "allOf": [
                    {
                      "$ref": "#/$defs/type.documentation"
                    }
                  ],
                  "documented": false,
                  "title": "documentation",
                  "markdownDescription": "Provides a custom link for documentation for editors shown above the key input when adding/renaming within a mutable object input."
                }
              },
              "markdownDescription": "This key defines the appearance and function of entries in a mutable *Object Input*.\n\nThe value is an object that can contain optional `allowed_keys`, `structures`, `assigned_structures`, `comment`, and `documentation` keys.\n\nAvailable for Mutable Objects only.\n\n## Examples\n\nIn this example, we have configured entries options with assigned structures for specific allowed keys.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        allowed_keys:\n          - title\n        assigned_structures:\n          title:\n            - article_metadata\n            - page_metadata\n```",
              "documented": true,
              "title": "entries",
              "additionalProperties": false
            },
            "groups": {
              "description": "This key defines how you can group the inputs inside this object together without changing the data structure.",
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "heading": {
                    "description": "This key defines the main text for the group shown when collapsed or expanded.",
                    "type": "string",
                    "documented": true,
                    "title": "heading",
                    "markdownDescription": "This key defines the main text for the group shown when collapsed or expanded."
                  },
                  "comment": {
                    "description": "This key defines the subtext below the `heading`.\n\nSupports a limited set of Markdown: links, bold, italic, subscript, superscript, and inline code elements are allowed.",
                    "type": "string",
                    "documented": true,
                    "title": "comment",
                    "markdownDescription": "This key defines the subtext below the `heading`.\n\nSupports a limited set of Markdown: links, bold, italic, subscript, superscript, and inline code elements are allowed."
                  },
                  "collapsed": {
                    "description": "This key toggles whether this group is collapsed or expanded when first viewed.\n\nSetting this key to `true` will collapse this group when first viewed.\n\nBy default, this key is `false` (i.e., the group is expanded when first viewed).",
                    "default": false,
                    "type": "boolean",
                    "documented": true,
                    "title": "collapsed",
                    "markdownDescription": "This key toggles whether this group is collapsed or expanded when first viewed.\n\nSetting this key to `true` will collapse this group when first viewed.\n\nBy default, this key is `false` (i.e., the group is expanded when first viewed)."
                  },
                  "inputs": {
                    "description": "This key defines the keys of each input in this group.",
                    "type": "array",
                    "items": {
                      "type": "string",
                      "documented": true,
                      "title": "inputs[*]",
                      "description": "This key represents an individual input key name string in the `_inputs.*(object-input).options.groups[*].inputs` array.\n\nThe value is a string that specifies the key name of an input to include in a group within an *Object Input*.",
                      "markdownDescription": "This key represents an individual input key name string in the `_inputs.*(object-input).options.groups[*].inputs` array.\n\nThe value is a string that specifies the key name of an input to include in a group within an *Object Input*."
                    },
                    "documented": true,
                    "title": "inputs",
                    "markdownDescription": "This key defines the keys of each input in this group."
                  },
                  "documentation": {
                    "description": "Provides a custom link for documentation for editors shown above the collection file list.",
                    "allOf": [
                      {
                        "$ref": "#/$defs/type.documentation"
                      }
                    ],
                    "documented": false,
                    "title": "documentation",
                    "markdownDescription": "Provides a custom link for documentation for editors shown above the collection file list."
                  }
                },
                "markdownDescription": "This key represents an individual group object in the `_inputs.*(object-input).options.groups` array.\n\nThe value is an object that groups inputs together inside an *Object Input* without changing the data structure. Each group typically contains a `heading` and `inputs` array.",
                "documented": true,
                "title": "groups[*]",
                "description": "This key represents an individual group object in the `_inputs.*(object-input).options.groups` array.\n\nThe value is an object that groups inputs together inside an *Object Input* without changing the data structure. Each group typically contains a `heading` and `inputs` array.",
                "additionalProperties": false
              },
              "documented": true,
              "title": "groups",
              "markdownDescription": "This key defines how you can group the inputs inside this object together without changing the data structure."
            },
            "place_groups_below": {
              "description": "This key defines which order input groups and ungrouped inputs appear in.",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "place_groups_below",
              "markdownDescription": "This key defines which order input groups and ungrouped inputs appear in."
            },
            "allow_label_formatting": {
              "description": "This key toggles whether labels on mutable object entries are formatted.\n\nSetting this key to `true` will format labels on mutable object entries.\n\nBy default, this key is `false` (i.e., labels are not formatted).",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "allow_label_formatting",
              "markdownDescription": "This key toggles whether labels on mutable object entries are formatted.\n\nSetting this key to `true` will format labels on mutable object entries.\n\nBy default, this key is `false` (i.e., labels are not formatted)."
            },
            "view": {
              "description": "This key defines how object previews are rendered.",
              "type": "string",
              "enum": [
                "card",
                "gallery",
                "gallery-left"
              ],
              "documented": true,
              "title": "view",
              "markdownDescription": "This key defines how object previews are rendered."
            },
            "structures": {
              "description": "This key defines data formats for value of this object.\n\nWhen choosing an item, team members are prompted to choose from a number of values you have defined. `structures` applies to the object itself.",
              "anyOf": [
                {
                  "$ref": "#/$defs/type.structure-reference"
                },
                {
                  "$ref": "#/$defs/type.structure"
                }
              ],
              "documented": true,
              "title": "structures",
              "markdownDescription": "This key defines data formats for value of this object.\n\nWhen choosing an item, team members are prompted to choose from a number of values you have defined. `structures` applies to the object itself."
            }
          },
          "markdownDescription": "This key defines options that are specific to Object Inputs.",
          "description": "This key defines options that are specific to Object Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines a user interface for a group of inputs.",
      "title": "Object Input",
      "description": "This key defines a user interface for a group of inputs.",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs.*.options.empty_type(object)": {
      "default": "null",
      "description": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values.\n\n## Examples\n\nIn this example, we have configured how empty object values will be saved.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      empty_type: object\n```",
      "type": "string",
      "enum": [
        "null",
        "object"
      ],
      "documented": true,
      "title": "Object Empty Type",
      "markdownDescription": "This key defines how an 'empty' value will be saved. Does not apply to existing empty values.\n\n## Examples\n\nIn this example, we have configured how empty object values will be saved.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      empty_type: object\n```"
    },
    "type.structure-reference": {
      "type": "string",
      "title": "Structure Reference",
      "description": "A reference to an existing structure.",
      "documented": true,
      "markdownDescription": "A reference to an existing structure."
    },
    "type.structure": {
      "type": "object",
      "properties": {
        "reorder_inputs": {
          "description": "This key toggles whether CloudCannon will reorder inputs in a file to match the order defined in a given Structure.\n\nSetting this key to `false` will preserve the existing order of inputs in a file, regardless of the order defined in the Structure.\n\nBy default, this key is `true` (i.e., inputs are reordered to match the Structure).\n\nYou can also configure this behavior for specific values of a Structure using `values[*].reorder_inputs`.\n\n## Examples\n\nIn this example, we want to preserve the order of the inputs in a file over the order in the associated Structure.\n\n```yaml\n_structures:\n  related_articles:\n    reorder_inputs: false\n    values:\n      - value:\n        name:\n        description:\n        url:\n```",
          "default": true,
          "type": "boolean",
          "documented": true,
          "title": "reorder_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will reorder inputs in a file to match the order defined in a given Structure.\n\nSetting this key to `false` will preserve the existing order of inputs in a file, regardless of the order defined in the Structure.\n\nBy default, this key is `true` (i.e., inputs are reordered to match the Structure).\n\nYou can also configure this behavior for specific values of a Structure using `values[*].reorder_inputs`.\n\n## Examples\n\nIn this example, we want to preserve the order of the inputs in a file over the order in the associated Structure.\n\n```yaml\n_structures:\n  related_articles:\n    reorder_inputs: false\n    values:\n      - value:\n        name:\n        description:\n        url:\n```"
        },
        "hide_extra_inputs": {
          "description": "This key toggles whether CloudCannon will hide inputs that are not present in a Structure from the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\nSetting this key to `true` will hide inputs that are not present in a Structure from the Data Editor. Hiding these inputs does not delete the data. You can see non-structure data keys by opening a file in the [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). This key has no effect if `remove_extra_inputs` is `true`.\n\nYou can also configure this behavior for specific values of a Structure using `values[*].hide_extra_inputs`.\n\n## Examples\n\nIn this example, we don't want inputs outside of those listed in the Structure (e.g., old inputs from deprecated versions of this Structure) to appear in the Data Editor.\n\n```yaml\n_structures:\n  related_articles:\n    hide_extra_inputs: true\n    values:\n      - value:\n        name:\n        description:\n        url:\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "hide_extra_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will hide inputs that are not present in a Structure from the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\nSetting this key to `true` will hide inputs that are not present in a Structure from the Data Editor. Hiding these inputs does not delete the data. You can see non-structure data keys by opening a file in the [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). This key has no effect if `remove_extra_inputs` is `true`.\n\nYou can also configure this behavior for specific values of a Structure using `values[*].hide_extra_inputs`.\n\n## Examples\n\nIn this example, we don't want inputs outside of those listed in the Structure (e.g., old inputs from deprecated versions of this Structure) to appear in the Data Editor.\n\n```yaml\n_structures:\n  related_articles:\n    hide_extra_inputs: true\n    values:\n      - value:\n        name:\n        description:\n        url:\n```"
        },
        "remove_empty_inputs": {
          "description": "This key toggles whether CloudCannon will remove empty nested inputs from an Object Input or Array Input using a given Structure before persisting\nthem to your file.\n\nSetting this key to `true` will remove empty nested inputs from an Object Input or Array Input using a given Structure before persisting\nthem to your file. CloudCannon considers an input to be empty when its value is `null`, `' '`, or undefined. If this key is true, empty inputs will be visible in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/) but not the [Source\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). For this key to function, you must also configure `id_key` for the Structure, as removing inputs prevents CloudCannon from comparing Structure values.\n\nBy default, this key is `false` (i.e., CloudCannon does not remove empty inputs).\n\nYou can also configure this behavior for specific values of a Structure using structure.values.[*].remove_empty_inputs.\n\n## Examples\n\nIn this example, we want to delete any unnecessary nested inputs (i.e., input we choose not to provide a value for) from Object or Array inputs referenceing the `event_details` Structure.\n\n```yaml\n_structures:\n  event_details:\n    remove_empty_inputs: true\n    values:\n      - value:\n        name:\n        description:\n        url:\n        time:\n        place:\n        sponsor:\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "remove_empty_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will remove empty nested inputs from an Object Input or Array Input using a given Structure before persisting\nthem to your file.\n\nSetting this key to `true` will remove empty nested inputs from an Object Input or Array Input using a given Structure before persisting\nthem to your file. CloudCannon considers an input to be empty when its value is `null`, `' '`, or undefined. If this key is true, empty inputs will be visible in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/) but not the [Source\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). For this key to function, you must also configure `id_key` for the Structure, as removing inputs prevents CloudCannon from comparing Structure values.\n\nBy default, this key is `false` (i.e., CloudCannon does not remove empty inputs).\n\nYou can also configure this behavior for specific values of a Structure using structure.values.[*].remove_empty_inputs.\n\n## Examples\n\nIn this example, we want to delete any unnecessary nested inputs (i.e., input we choose not to provide a value for) from Object or Array inputs referenceing the `event_details` Structure.\n\n```yaml\n_structures:\n  event_details:\n    remove_empty_inputs: true\n    values:\n      - value:\n        name:\n        description:\n        url:\n        time:\n        place:\n        sponsor:\n```"
        },
        "remove_extra_inputs": {
          "description": "This key toggles whether CloudCannon will remove inputs that are not present in a Structure from a file before loading it in an Editing Interface.\n\nSetting this key to `true` will remove inputs that are not present in a Structure from a file before loading it in an Editing Interface. Non-Structure inputs will not be visible in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/), [Content\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/), or [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and saving the file\nwill remove them from the file before persisting the changes to your Git repository.\n\nYou can also configure this behavior for specific values of a Structure using `values[*].remove_extra_inputs`.\n\n## Examples\n\nIn this example, we want to delete old inputs that are not in the Structure from the associated file.\n\n```yaml\n_structures:\n  related_articles:\n    remove_extra_inputs: true\n    values:\n      - value:\n        name:\n        description:\n        url:\n```",
          "default": true,
          "type": "boolean",
          "documented": true,
          "title": "remove_extra_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will remove inputs that are not present in a Structure from a file before loading it in an Editing Interface.\n\nSetting this key to `true` will remove inputs that are not present in a Structure from a file before loading it in an Editing Interface. Non-Structure inputs will not be visible in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/), [Content\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/), or [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and saving the file\nwill remove them from the file before persisting the changes to your Git repository.\n\nYou can also configure this behavior for specific values of a Structure using `values[*].remove_extra_inputs`.\n\n## Examples\n\nIn this example, we want to delete old inputs that are not in the Structure from the associated file.\n\n```yaml\n_structures:\n  related_articles:\n    remove_extra_inputs: true\n    values:\n      - value:\n        name:\n        description:\n        url:\n```"
        },
        "values": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/type.structure.values.%5B*%5D"
          },
          "description": "This key defines the options available for a Structure.\n\nYou must define this key for the Structure to function.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to add the `title`, `subtitle`, `author`, `featured_image`, and `url` fields to Object or Array inputs that reference this Structure.\n\n```yaml\n_structures:\n  related_articles:\n    values:\n      - label: Blog\n        id:\n        default: true\n        tabbed: false\n        tags:\n          - blog\n        value:\n          title:\n          subtitle:\n          author:\n          featured_image:\n          url:\n        _inputs:\n          featured_image:\n            type: image\n            options:\n              width: 50\n              height: 50\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n              - image\n              - url\n        preview:\n          text:\n            - template: \"{title}\"\n          subtext:\n            - template: \"By {author}\"\n          image:\n            - key: image\n        picker_preview:\n          text: Blog\n          subtext: Add a related blog\n          icon: post_add\n```",
          "documented": true,
          "title": "values",
          "markdownDescription": "This key defines the options available for a Structure.\n\nYou must define this key for the Structure to function.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we want to add the `title`, `subtitle`, `author`, `featured_image`, and `url` fields to Object or Array inputs that reference this Structure.\n\n```yaml\n_structures:\n  related_articles:\n    values:\n      - label: Blog\n        id:\n        default: true\n        tabbed: false\n        tags:\n          - blog\n        value:\n          title:\n          subtitle:\n          author:\n          featured_image:\n          url:\n        _inputs:\n          featured_image:\n            type: image\n            options:\n              width: 50\n              height: 50\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n              - image\n              - url\n        preview:\n          text:\n            - template: \"{title}\"\n          subtext:\n            - template: \"By {author}\"\n          image:\n            - key: image\n        picker_preview:\n          text: Blog\n          subtext: Add a related blog\n          icon: post_add\n```"
        },
        "values_from_glob": {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "values_from_glob[*]",
            "description": "This key represents an individual glob pattern string in the `values_from_glob` array.\n\nThe value is a string that specifies a file path pattern relative to the root of your repository. The path must end in the file extension `.cloudcannon.structure-value.yml` (note the singular form of \"value\").\n\n## Examples\n\nIn this example, the `staff` Array Input uses inline *Structure* values from the main *Configuration File* and also references another value from the `boardMember.cloudcannon.structure-value.yml` in the `/.cloudcannon/structures/` folder.\n\n```yaml\n_inputs:\n  staff:\n    type: array\n    options:\n      structures:\n        values_from_glob:\n          - /.cloudcannon/structures/boardMember.cloudcannon.structure-value.yml\n        values:\n          - label: Employee\n            value:\n              name:\n              title:\n              profile_picture:\n          - label: Manager\n            value:\n              name:\n              title:\n              profile_picture:\n              url:\n```",
            "markdownDescription": "This key represents an individual glob pattern string in the `values_from_glob` array.\n\nThe value is a string that specifies a file path pattern relative to the root of your repository. The path must end in the file extension `.cloudcannon.structure-value.yml` (note the singular form of \"value\").\n\n## Examples\n\nIn this example, the `staff` Array Input uses inline *Structure* values from the main *Configuration File* and also references another value from the `boardMember.cloudcannon.structure-value.yml` in the `/.cloudcannon/structures/` folder.\n\n```yaml\n_inputs:\n  staff:\n    type: array\n    options:\n      structures:\n        values_from_glob:\n          - /.cloudcannon/structures/boardMember.cloudcannon.structure-value.yml\n        values:\n          - label: Employee\n            value:\n              name:\n              title:\n              profile_picture:\n          - label: Manager\n            value:\n              name:\n              title:\n              profile_picture:\n              url:\n```"
          },
          "documented": true,
          "title": "values_from_glob",
          "description": "This key defines globs that filter which files CloudCannon should use for *Structure* value configuration.\n\nValues in this array are relative to the root of your repository (i.e., `/`, not the value of `source`) and must end in the file extension\n`.cloudcannon.structure-value.yml` (note the singular form of \"value\").\n\nYou can use this key anywhere you would use the `_structures.*.values` key.\n\nPlease see our documentation on [structures_from_glob](https://cloudcannon.com/documentation/developer-reference/configuration-file/types/_structures_from_glob/) for defining a\n*Structure* in a split *Configuration File*.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `staff` Array Input uses inline *Structure* values from the main *Configuration File* and also references another value from the `boardMember.cloudcannon.structure_value.yml` in the `/.cloudcannon/structures/` folder.\n\n```yaml\n_inputs:\n  staff:\n    type: array\n    options:\n      structures:\n        values_from_glob:\n          - /.cloudcannon/structures/boardMember.cloudcannon.structure-value.yml\n        values:\n          - label: Employee\n            value:\n              name:\n              title:\n              profile_picture:\n          - label: Manager\n            value:\n              name:\n              title:\n              profile_picture:\n              url:\n```\n\n```yaml\nlabel: Board\nvalue:\n  name:\n  title:\n  profile_picture:\n  url:\n  description:\n```",
          "markdownDescription": "This key defines globs that filter which files CloudCannon should use for *Structure* value configuration.\n\nValues in this array are relative to the root of your repository (i.e., `/`, not the value of `source`) and must end in the file extension\n`.cloudcannon.structure-value.yml` (note the singular form of \"value\").\n\nYou can use this key anywhere you would use the `_structures.*.values` key.\n\nPlease see our documentation on [structures_from_glob](https://cloudcannon.com/documentation/developer-reference/configuration-file/types/_structures_from_glob/) for defining a\n*Structure* in a split *Configuration File*.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `staff` Array Input uses inline *Structure* values from the main *Configuration File* and also references another value from the `boardMember.cloudcannon.structure_value.yml` in the `/.cloudcannon/structures/` folder.\n\n```yaml\n_inputs:\n  staff:\n    type: array\n    options:\n      structures:\n        values_from_glob:\n          - /.cloudcannon/structures/boardMember.cloudcannon.structure-value.yml\n        values:\n          - label: Employee\n            value:\n              name:\n              title:\n              profile_picture:\n          - label: Manager\n            value:\n              name:\n              title:\n              profile_picture:\n              url:\n```\n\n```yaml\nlabel: Board\nvalue:\n  name:\n  title:\n  profile_picture:\n  url:\n  description:\n```"
        },
        "id_key": {
          "description": "This key defines which key within `values[*].value` CloudCannon should use to identify the Structure option.\n\nIf CloudCannon cannot find this key in a Structure value, it will compare all other key names in the Structure value to find the correct one.\n\nBy default, this key is `_type`.\n\n## Examples\n\nIn this example, we have change the `id_key` from the default `_type` to `component` to match our existing configuration in the `content_blocks` Array input.\n\n```yaml\n_inputs:\n  content_blocks___1___:\n    type: array\n    options:\n    structures: _structures.page_components\n_structures:\n  page_components:\n    id_key___2___: component\n    values:\n      - label: Hero Component\n        value:\n          component___3___: hero\n          title:\n          description:\n          image_path:\n          link:\n            text:\n            url:\n      - label: Feature Component\n        value:\n          component: feature\n          image_path:\n          title:\n          description:\n          button:\n            link:\n            text:\n          reversed_layout: false\n      - label: Video Component\n        value:\n          component: video\n          image_path:\n          videoUrl:\n```",
          "default": "_type",
          "type": "string",
          "documented": true,
          "title": "id_key",
          "markdownDescription": "This key defines which key within `values[*].value` CloudCannon should use to identify the Structure option.\n\nIf CloudCannon cannot find this key in a Structure value, it will compare all other key names in the Structure value to find the correct one.\n\nBy default, this key is `_type`.\n\n## Examples\n\nIn this example, we have change the `id_key` from the default `_type` to `component` to match our existing configuration in the `content_blocks` Array input.\n\n```yaml\n_inputs:\n  content_blocks___1___:\n    type: array\n    options:\n    structures: _structures.page_components\n_structures:\n  page_components:\n    id_key___2___: component\n    values:\n      - label: Hero Component\n        value:\n          component___3___: hero\n          title:\n          description:\n          image_path:\n          link:\n            text:\n            url:\n      - label: Feature Component\n        value:\n          component: feature\n          image_path:\n          title:\n          description:\n          button:\n            link:\n            text:\n          reversed_layout: false\n      - label: Video Component\n        value:\n          component: video\n          image_path:\n          videoUrl:\n```"
        },
        "style": {
          "description": "This key defines how CloudCannon shows Structure options to populate an Object or Array input.\n\nThis can be using a select-style search bar or a pop-up modal.\n\nModals are useful when you have several value options for your Structure.\n\nValues can be one of the following: `select`, or `modal`.\n\n## Examples\n\nIn this example, the `related_articles` Structure only has one option so a `select` searchbar is appropriate.\n\n```yaml\n_structures:\n  related_articles:\n    style: select\n    values:\n      - value:\n        name:\n        description:\n        url:\n```",
          "default": "select",
          "type": "string",
          "enum": [
            "select",
            "modal"
          ],
          "documented": true,
          "title": "style",
          "markdownDescription": "This key defines how CloudCannon shows Structure options to populate an Object or Array input.\n\nThis can be using a select-style search bar or a pop-up modal.\n\nModals are useful when you have several value options for your Structure.\n\nValues can be one of the following: `select`, or `modal`.\n\n## Examples\n\nIn this example, the `related_articles` Structure only has one option so a `select` searchbar is appropriate.\n\n```yaml\n_structures:\n  related_articles:\n    style: select\n    values:\n      - value:\n        name:\n        description:\n        url:\n```"
        }
      },
      "required": [
        "values"
      ],
      "markdownDescription": "This key defines data formats when adding new items to arrays and objects, with options for how editors choose from available values.",
      "title": "Structure",
      "description": "This key defines data formats when adding new items to arrays and objects, with options for how editors choose from available values.",
      "documented": true,
      "additionalProperties": false
    },
    "type.structure.values.[*]": {
      "type": "object",
      "properties": {
        "reorder_inputs": {
          "description": "This key toggles whether CloudCannon will reorder inputs in a file to match the order defined in a given value from a Structure.\n\nSetting this key to `false` will preserve the existing order of inputs in a file, regardless of the order defined in the Structure value.\n\nBy default, this key is `true` (i.e., inputs are reordered to match the Structure value).\n\nYou can also configure this behavior for all values of a Structure using `reorder_inputs` inside `_structures.*`.",
          "default": true,
          "type": "boolean",
          "documented": true,
          "title": "reorder_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will reorder inputs in a file to match the order defined in a given value from a Structure.\n\nSetting this key to `false` will preserve the existing order of inputs in a file, regardless of the order defined in the Structure value.\n\nBy default, this key is `true` (i.e., inputs are reordered to match the Structure value).\n\nYou can also configure this behavior for all values of a Structure using `reorder_inputs` inside `_structures.*`."
        },
        "hide_extra_inputs": {
          "description": "This key toggles whether CloudCannon will hide inputs that are not present in a given value from a Structure from the [Data\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\nSetting this key to `true` will hide inputs that are not present in a given value from a Structure from the Data Editor. Hiding these inputs does not delete the data. You can see non-structure data keys by opening a file in the [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). This key has no effect if `remove_extra_inputs` is `true`.\n\nYou can also configure this behavior for all values of a Structure using `hide_extra_inputs` inside `_structures.*`.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "hide_extra_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will hide inputs that are not present in a given value from a Structure from the [Data\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\nSetting this key to `true` will hide inputs that are not present in a given value from a Structure from the Data Editor. Hiding these inputs does not delete the data. You can see non-structure data keys by opening a file in the [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). This key has no effect if `remove_extra_inputs` is `true`.\n\nYou can also configure this behavior for all values of a Structure using `hide_extra_inputs` inside `_structures.*`."
        },
        "remove_empty_inputs": {
          "description": "This key toggles whether CloudCannon will remove empty nested inputs from an Object Input or Array Input using a given value from a Structure before\npersisting them to your file.\n\nSetting this key to `true` will remove empty nested inputs from an Object Input or Array Input using a given value from a Structure before\npersisting them to your file. CloudCannon considers an input to be empty when its value is `null`, `' '`, or undefined. If this key is true, empty inputs will be visible in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/) but not the [Source\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). For this key to function, you must also configure `id_key` for the Structure, as removing inputs prevents CloudCannon from comparing Structure values.\n\nYou can also configure this behavior for all values of a Structure using `remove_empty_inputs` inside `_structures.*`.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "remove_empty_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will remove empty nested inputs from an Object Input or Array Input using a given value from a Structure before\npersisting them to your file.\n\nSetting this key to `true` will remove empty nested inputs from an Object Input or Array Input using a given value from a Structure before\npersisting them to your file. CloudCannon considers an input to be empty when its value is `null`, `' '`, or undefined. If this key is true, empty inputs will be visible in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/) but not the [Source\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). For this key to function, you must also configure `id_key` for the Structure, as removing inputs prevents CloudCannon from comparing Structure values.\n\nYou can also configure this behavior for all values of a Structure using `remove_empty_inputs` inside `_structures.*`."
        },
        "remove_extra_inputs": {
          "description": "This key toggles whether CloudCannon will remove inputs that are not present in a given value from a Structure from a file before loading it in an\nEditing Interface.\n\nSetting this key to `true` will remove inputs that are not present in a given value from a Structure from a file before loading it in an Editing Interface. Non-Structure inputs will not be visible in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/), [Content\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/), or [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and saving the file\nwill remove them from the file before persisting the changes to your Git repository.\n\nYou can also configure this behavior for all values of a Structure using `remove_extra_inputs` inside `_structures.*`.",
          "default": true,
          "type": "boolean",
          "documented": true,
          "title": "remove_extra_inputs",
          "markdownDescription": "This key toggles whether CloudCannon will remove inputs that are not present in a given value from a Structure from a file before loading it in an\nEditing Interface.\n\nSetting this key to `true` will remove inputs that are not present in a given value from a Structure from a file before loading it in an Editing Interface. Non-Structure inputs will not be visible in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/), [Content\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/), or [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and saving the file\nwill remove them from the file before persisting the changes to your Git repository.\n\nYou can also configure this behavior for all values of a Structure using `remove_extra_inputs` inside `_structures.*`."
        },
        "preview": {
          "allOf": [
            {
              "$ref": "#/$defs/type.preview"
            }
          ],
          "documented": false,
          "title": "preview"
        },
        "picker_preview": {
          "allOf": [
            {
              "$ref": "#/$defs/type.picker_preview"
            }
          ],
          "documented": false,
          "title": "picker_preview"
        },
        "_inputs": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs"
            }
          ],
          "documented": false,
          "title": "_inputs"
        },
        "_inputs_from_glob": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs_from_glob"
            }
          ],
          "documented": false,
          "title": "_inputs_from_glob"
        },
        "_select_data": {
          "allOf": [
            {
              "$ref": "#/$defs/type._select_data"
            }
          ],
          "documented": false,
          "title": "_select_data"
        },
        "_structures": {
          "allOf": [
            {
              "$ref": "#/$defs/type._structures"
            }
          ],
          "documented": false,
          "title": "_structures"
        },
        "_structures_from_glob": {
          "allOf": [
            {
              "$ref": "#/$defs/type._structures_from_glob"
            }
          ],
          "documented": false,
          "title": "_structures_from_glob"
        },
        "id": {
          "description": "This key defines the string used to identify a given Structure value when refering to it from other input configuration.\n\n## Examples\n\nIn this example, we have configured the `blog_post` ID for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        id: blog_post\n```",
          "type": "string",
          "documented": true,
          "title": "id",
          "markdownDescription": "This key defines the string used to identify a given Structure value when refering to it from other input configuration.\n\n## Examples\n\nIn this example, we have configured the `blog_post` ID for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        id: blog_post\n```"
        },
        "default": {
          "description": "This key toggles whether CloudCannon should treat an entry in the `values` array as the default option for your Object or Array input.\n\nSetting this key to `true` will mark this entry as the default option for your Object or Array input. If multiple entries in the `values` array are set to `true`, CloudCannon will use the first entry. If CloudCannon cannot determine the type of an entry within the `values` array based on the `id_key` or matching inputs across `values[*].value` objects,\nit will fall back to the default entry.\n\n## Examples\n\nIn this example, we want the entry labelled `Employee` to be our default option for populating inputs configured with the `staff` Structure.\n\n```yaml\n_structures:\n  staff:\n    style: modal\n    values:\n      - label: Employee\n        default: true\n        value:\n          name:\n          job_description:\n          profile_picture:\n      - label: Manager\n        value:\n          name:\n          job_description:\n          profile_picture:\n          url:\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "default",
          "markdownDescription": "This key toggles whether CloudCannon should treat an entry in the `values` array as the default option for your Object or Array input.\n\nSetting this key to `true` will mark this entry as the default option for your Object or Array input. If multiple entries in the `values` array are set to `true`, CloudCannon will use the first entry. If CloudCannon cannot determine the type of an entry within the `values` array based on the `id_key` or matching inputs across `values[*].value` objects,\nit will fall back to the default entry.\n\n## Examples\n\nIn this example, we want the entry labelled `Employee` to be our default option for populating inputs configured with the `staff` Structure.\n\n```yaml\n_structures:\n  staff:\n    style: modal\n    values:\n      - label: Employee\n        default: true\n        value:\n          name:\n          job_description:\n          profile_picture:\n      - label: Manager\n        value:\n          name:\n          job_description:\n          profile_picture:\n          url:\n```"
        },
        "icon": {
          "description": "This key defines an icon used when displaying the structure (defaults to either `format_list_bulleted` for items in arrays, or `notes` otherwise).\n\n## Examples\n\nIn this example, CloudCannon will display the `article` icon for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        icon: article\n```",
          "allOf": [
            {
              "$ref": "#/$defs/icon"
            }
          ],
          "documented": true,
          "title": "icon",
          "markdownDescription": "This key defines an icon used when displaying the structure (defaults to either `format_list_bulleted` for items in arrays, or `notes` otherwise).\n\n## Examples\n\nIn this example, CloudCannon will display the `article` icon for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        icon: article\n```"
        },
        "image": {
          "description": "This key defines the path to an image in your source files used when displaying the structure value.\n\nCan be either a source (has priority) or output path.\n\n## Examples\n\nIn this example, we have configured the `/images/blog-icon.png` image for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        image: /images/blog-icon.png\n```",
          "type": "string",
          "documented": true,
          "title": "image",
          "markdownDescription": "This key defines the path to an image in your source files used when displaying the structure value.\n\nCan be either a source (has priority) or output path.\n\n## Examples\n\nIn this example, we have configured the `/images/blog-icon.png` image for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        image: /images/blog-icon.png\n```"
        },
        "label": {
          "description": "This key defines the display name for a given value in a Structure.\n\nThe name will appear in the *+ Add* button dropdown below an Object or Array input or in the Structures modal (if configured).\n\nBy default, this key falls back to `unknown`.\n\n## Examples\n\nIn this example, we want two value options for our `staff` structure: one called `Manager` and one called `Employee`.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - label: Employee\n        value:\n          name:\n          job_description:\n          profile_picture:\n      - label: Manager\n        value:\n          name:\n          job_description:\n          profile_picture:\n          url:\n```",
          "type": "string",
          "documented": true,
          "title": "label",
          "markdownDescription": "This key defines the display name for a given value in a Structure.\n\nThe name will appear in the *+ Add* button dropdown below an Object or Array input or in the Structures modal (if configured).\n\nBy default, this key falls back to `unknown`.\n\n## Examples\n\nIn this example, we want two value options for our `staff` structure: one called `Manager` and one called `Employee`.\n\n```yaml\n_structures:\n  staff:\n    values:\n      - label: Employee\n        value:\n          name:\n          job_description:\n          profile_picture:\n      - label: Manager\n        value:\n          name:\n          job_description:\n          profile_picture:\n          url:\n```"
        },
        "tags": {
          "description": "This key defines which tags are associated with a given value in a Structure.\n\nYou can use tags to group and filter Structure options when selecting from a modal.\n\nThis key has no default.\n\n## Examples\n\nIn this example we have three options for the `page_components` Structure: `Hero Component`, `Feature Component`, and `Video Component`. We can search the Structure modal using the `image`, `text`, `button`, and `video` tags to filter Structure values.\n\n```yaml\n_structures:\n  page_components:\n    style: modal\n    values:\n      - label: Hero Component\n        tags:\n          - image\n          - text\n        value:\n          title:\n          description:\n          image_path:\n          link:\n            text:\n            url:\n      - label: Feature Component\n        tags:\n          - image\n          - text\n          - button\n        value:\n          image_path:\n          title:\n          description:\n          button:\n            link:\n            text:\n          reversed_layout: false\n      - label: Video Component\n        tags:\n          - image\n          - video\n        value:\n          image_path:\n          videoUrl:\n```",
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "tags[*]",
            "description": "This key represents an individual tag string in the `values[*].tags` array.\n\nThe value is a string that specifies a tag associated with a structure value.\n\n## Examples\n\nIn this example, we have configured the `featured` and `news` tags for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        tags:\n          - featured\n          - news\n```",
            "markdownDescription": "This key represents an individual tag string in the `values[*].tags` array.\n\nThe value is a string that specifies a tag associated with a structure value.\n\n## Examples\n\nIn this example, we have configured the `featured` and `news` tags for the entry labeled `Blog` in the `article_information` Structure.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        tags:\n          - featured\n          - news\n```"
          },
          "documented": true,
          "title": "tags",
          "markdownDescription": "This key defines which tags are associated with a given value in a Structure.\n\nYou can use tags to group and filter Structure options when selecting from a modal.\n\nThis key has no default.\n\n## Examples\n\nIn this example we have three options for the `page_components` Structure: `Hero Component`, `Feature Component`, and `Video Component`. We can search the Structure modal using the `image`, `text`, `button`, and `video` tags to filter Structure values.\n\n```yaml\n_structures:\n  page_components:\n    style: modal\n    values:\n      - label: Hero Component\n        tags:\n          - image\n          - text\n        value:\n          title:\n          description:\n          image_path:\n          link:\n            text:\n            url:\n      - label: Feature Component\n        tags:\n          - image\n          - text\n          - button\n        value:\n          image_path:\n          title:\n          description:\n          button:\n            link:\n            text:\n          reversed_layout: false\n      - label: Video Component\n        tags:\n          - image\n          - video\n        value:\n          image_path:\n          videoUrl:\n```"
        },
        "groups": {
          "description": "This key defines the order and custom grouping for inputs within a Structure.\n\nThe value is an array of group objects. Each group object can contain a `heading`, `comment`, `collapsed`, and `inputs` array.\n\n## Examples\n\nIn this example, we want to separate the inputs into two groups with descriptive headings: `title` and `subtitle` under the `Titles` heading, and `author` under the `Details` heading.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "heading": {
                "description": "This key defines the main text for the group shown when collapsed or expanded.\n\nThe value is a string that specifies the heading text displayed for the group.\n\n## Examples\n\nIn this example, we have configured a group heading to organize structure inputs under the \"Titles\" heading.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
                "type": "string",
                "documented": true,
                "title": "heading",
                "markdownDescription": "This key defines the main text for the group shown when collapsed or expanded.\n\nThe value is a string that specifies the heading text displayed for the group.\n\n## Examples\n\nIn this example, we have configured a group heading to organize structure inputs under the \"Titles\" heading.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```"
              },
              "comment": {
                "description": "This key defines the subtext displayed below the `heading` for a group.\n\nThe value is a string that supports a limited set of Markdown: links, bold, italic, subscript, superscript, and inline code elements are allowed.\n\n## Examples\n\nIn this example, we have configured a group comment with Markdown formatting to provide additional context below the heading.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            comment: Make these SEO-friendly\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
                "type": "string",
                "documented": true,
                "title": "comment",
                "markdownDescription": "This key defines the subtext displayed below the `heading` for a group.\n\nThe value is a string that supports a limited set of Markdown: links, bold, italic, subscript, superscript, and inline code elements are allowed.\n\n## Examples\n\nIn this example, we have configured a group comment with Markdown formatting to provide additional context below the heading.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            comment: Make these SEO-friendly\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```"
              },
              "collapsed": {
                "description": "This key defines whether a group is collapsed or expanded when first viewed.\n\nThe value is a boolean. When `true`, CloudCannon displays the group in a collapsed state. When `false`, CloudCannon displays the group in an expanded state.\n\nBy default, CloudCannon displays groups in an expanded state.\n\n## Examples\n\nIn this example, we have configured the \"Details\" group to be collapsed by default.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            collapsed: true\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
                "default": false,
                "type": "boolean",
                "documented": true,
                "title": "collapsed",
                "markdownDescription": "This key defines whether a group is collapsed or expanded when first viewed.\n\nThe value is a boolean. When `true`, CloudCannon displays the group in a collapsed state. When `false`, CloudCannon displays the group in an expanded state.\n\nBy default, CloudCannon displays groups in an expanded state.\n\n## Examples\n\nIn this example, we have configured the \"Details\" group to be collapsed by default.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            collapsed: true\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```"
              },
              "inputs": {
                "description": "This key defines which inputs are included in a group within a structure value.\n\nThe value is an array of input key name strings that specify which inputs belong to this group.\n\n## Examples\n\nIn this example, we have configured a group to include the `title` and `subtitle` inputs.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
                "type": "array",
                "items": {
                  "type": "string",
                  "documented": true,
                  "title": "inputs[*]",
                  "description": "This key represents an individual input key name string in the `values[*].groups[*].inputs` array.\n\nThe value is a string that specifies the key name of an input to include in a group within a structure value.\n\n## Examples\n\nIn this example, we have configured a group to include the `title` input.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
                  "markdownDescription": "This key represents an individual input key name string in the `values[*].groups[*].inputs` array.\n\nThe value is a string that specifies the key name of an input to include in a group within a structure value.\n\n## Examples\n\nIn this example, we have configured a group to include the `title` input.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```"
                },
                "documented": true,
                "title": "inputs",
                "markdownDescription": "This key defines which inputs are included in a group within a structure value.\n\nThe value is an array of input key name strings that specify which inputs belong to this group.\n\n## Examples\n\nIn this example, we have configured a group to include the `title` and `subtitle` inputs.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```"
              },
              "documentation": {
                "description": "Provides a custom link for documentation for editors shown above the collection file list.",
                "allOf": [
                  {
                    "$ref": "#/$defs/type.documentation"
                  }
                ],
                "documented": false,
                "title": "documentation",
                "markdownDescription": "Provides a custom link for documentation for editors shown above the collection file list."
              }
            },
            "markdownDescription": "This key represents an individual group object in the `values[*].groups` array.\n\nThe value is an object that groups inputs together within a structure value without changing the data structure. Each group typically contains a `heading` and `inputs` array.\n\n## Examples\n\nIn this example, we have configured a group with a heading and inputs array to organize structure inputs.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
            "documented": true,
            "title": "groups[*]",
            "description": "This key represents an individual group object in the `values[*].groups` array.\n\nThe value is an object that groups inputs together within a structure value without changing the data structure. Each group typically contains a `heading` and `inputs` array.\n\n## Examples\n\nIn this example, we have configured a group with a heading and inputs array to organize structure inputs.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```",
            "additionalProperties": false
          },
          "documented": true,
          "title": "groups",
          "markdownDescription": "This key defines the order and custom grouping for inputs within a Structure.\n\nThe value is an array of group objects. Each group object can contain a `heading`, `comment`, `collapsed`, and `inputs` array.\n\n## Examples\n\nIn this example, we want to separate the inputs into two groups with descriptive headings: `title` and `subtitle` under the `Titles` heading, and `author` under the `Details` heading.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n        groups:\n          - heading: Titles\n            inputs:\n              - title\n              - subtitle\n          - heading: Details\n            inputs:\n              - author\n```"
        },
        "place_groups_below": {
          "description": "This key defines which order input groups and ungrouped inputs appear in.",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "place_groups_below",
          "markdownDescription": "This key defines which order input groups and ungrouped inputs appear in."
        },
        "tabbed": {
          "description": "This key toggles whether CloudCannon should create tabs in the Data Editor if you have two layers of nested object within your Structure.\n\nSetting this key to `true` will create tabs in the Data Editor for two layers of nested objects within your Structure.\n\nBy default, this key is `false` (i.e., Object and Array inputs using this Structure option are not tabbed).\n\n## Examples\n\nIn this example, we want the `content` and `style` keys in our Structure to be tabs at the top of the Data Editor, with the `title` and `text`, and `color` and `font` keys nested within those tabs respectively.\n\n```yaml\n_structures:\n  components:\n    values:\n      - label: Component\n        tabbed: true\n        value:\n          content:\n            title:\n            text:\n          style:\n            color:\n            font:\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "tabbed",
          "markdownDescription": "This key toggles whether CloudCannon should create tabs in the Data Editor if you have two layers of nested object within your Structure.\n\nSetting this key to `true` will create tabs in the Data Editor for two layers of nested objects within your Structure.\n\nBy default, this key is `false` (i.e., Object and Array inputs using this Structure option are not tabbed).\n\n## Examples\n\nIn this example, we want the `content` and `style` keys in our Structure to be tabs at the top of the Data Editor, with the `title` and `text`, and `color` and `font` keys nested within those tabs respectively.\n\n```yaml\n_structures:\n  components:\n    values:\n      - label: Component\n        tabbed: true\n        value:\n          content:\n            title:\n            text:\n          style:\n            color:\n            font:\n```"
        },
        "value": {
          "description": "This key defines which nested inputs the Structure value should add to an Object or Array input.\n\nYou must define this key for the Structure value to function.\n\nNested keys can be any [input](https://cloudcannon.com/documentation/articles/what-are-inputs/) you require in your Object or Array.\n\nFor more information, please read our documentation on [configuring an Object input](https://cloudcannon.com/documentation/articles/configure-an-object-input/) and\n[configuring and Array input](https://cloudcannon.com/documentation/articles/configure-an-array-input/).\n\n## Examples\n\nIn this example we want to populate the `details` Object input with the nested keys `title`, `subtitle`, and `author` we have defined under the `values.value` key.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n_inputs:\n  details:\n    type: object\n    options:\n      structures: _structures.article_information\n```",
          "documented": true,
          "title": "value",
          "markdownDescription": "This key defines which nested inputs the Structure value should add to an Object or Array input.\n\nYou must define this key for the Structure value to function.\n\nNested keys can be any [input](https://cloudcannon.com/documentation/articles/what-are-inputs/) you require in your Object or Array.\n\nFor more information, please read our documentation on [configuring an Object input](https://cloudcannon.com/documentation/articles/configure-an-object-input/) and\n[configuring and Array input](https://cloudcannon.com/documentation/articles/configure-an-array-input/).\n\n## Examples\n\nIn this example we want to populate the `details` Object input with the nested keys `title`, `subtitle`, and `author` we have defined under the `values.value` key.\n\n```yaml\n_structures:\n  article_information:\n    values:\n      - label: Blog\n        value:\n          title:\n          subtitle:\n          author:\n_inputs:\n  details:\n    type: object\n    options:\n      structures: _structures.article_information\n```"
        },
        "description": {
          "description": "This key defines short descriptive text for editors shown in the Data Editor for expanded values matching this Structure value.\n\nHas no default.\n\nSupports a limited set of Markdown: links, bold, italic, subscript, superscript, and inline code elements are allowed.",
          "type": "string",
          "documented": true,
          "title": "description",
          "markdownDescription": "This key defines short descriptive text for editors shown in the Data Editor for expanded values matching this Structure value.\n\nHas no default.\n\nSupports a limited set of Markdown: links, bold, italic, subscript, superscript, and inline code elements are allowed."
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown in the Data Editor for expanded values matching this Structure value. Has no default.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown in the Data Editor for expanded values matching this Structure value. Has no default."
        }
      },
      "required": [
        "value"
      ],
      "markdownDescription": "This key represents a single value option within a structure, defining the data format and appearance for content editors.",
      "title": "Structure Value",
      "description": "This key represents a single value option within a structure, defining the data format and appearance for content editors.",
      "documented": true,
      "additionalProperties": false
    },
    "type._inputs_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "_inputs_from_glob[*]",
        "description": "This key represents an individual glob pattern string in the `_inputs_from_glob` array.\n\nThe value is a string that specifies a file path pattern relative to the root of your repository. The path must end in the file extension `.cloudcannon.inputs.yml`.\n\n## Examples\n\nIn this example, we have several *Input Configuration Files* in the `.cloudcannon/inputs/` folder, with each file containing multiple *Input* definitions. The value of the `_inputs_from_glob` key tells CloudCannon to only use the `seo.cloudcannon.inputs.yml` and `blog-details.cloudcannon.inputs.yml` files in that folder.\n\n```yaml\ncollections_config:\n  posts:\n    path: content/posts\n    icon: event\n    inputs_from_glob:\n      - '/.cloudcannon/inputs/seo.cloudcannon.inputs.yml'\n      - '/.cloudcannon/inputs/blog-details.cloudcannon.inputs.yml'\n```",
        "markdownDescription": "This key represents an individual glob pattern string in the `_inputs_from_glob` array.\n\nThe value is a string that specifies a file path pattern relative to the root of your repository. The path must end in the file extension `.cloudcannon.inputs.yml`.\n\n## Examples\n\nIn this example, we have several *Input Configuration Files* in the `.cloudcannon/inputs/` folder, with each file containing multiple *Input* definitions. The value of the `_inputs_from_glob` key tells CloudCannon to only use the `seo.cloudcannon.inputs.yml` and `blog-details.cloudcannon.inputs.yml` files in that folder.\n\n```yaml\ncollections_config:\n  posts:\n    path: content/posts\n    icon: event\n    inputs_from_glob:\n      - '/.cloudcannon/inputs/seo.cloudcannon.inputs.yml'\n      - '/.cloudcannon/inputs/blog-details.cloudcannon.inputs.yml'\n```"
      },
      "documented": true,
      "title": "_inputs_from_glob",
      "description": "This key defines globs that filter which files CloudCannon should use for *Input* configuration.\n\nValues in this array are relative to the root of your repository (i.e., `/`, not the value of `source`) and must end in the file extension\n`.cloudcannon.inputs.yml`.\n\nYou can use this key anywhere you would use the `_inputs` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several *Input Configuration Files* in the `.cloudcannon/inputs/` folder, with each file containing multiple *Input* definitions. The value of the `_inputs_from_glob` key tells CloudCannon to only use the `seo.cloudcannon.inputs.yml` and `blog-details.cloudcannon.inputs.yml` files in that folder.\n\n```yaml\ncollections_config:\n  posts:\n    path: content/posts\n    icon: event\n    inputs_from_glob:\n      - '/.cloudcannon/inputs/seo.cloudcannon.inputs.yml'\n      - '/.cloudcannon/inputs/blogDetails.cloudcannon.inputs.yml'\n```\n\n```yaml\nseo_title:\n  type: text\n  options:\n    required: true\n    max_length: 50\nseo_description:\n  type: textarea\n  options:\n    show_count: true\n    required: true\n    max_length: 125\nseo_image:\n  type: image\n  options:\n    path:\n      uploads: images\n    accepts_mime_types:\n      - image/png\n      - image/jpeg\n    required: true\n    pattern: (?i)\\.(jpe?g|png)$\n    pattern_message: Please select a JPG or PNG image file\n```",
      "markdownDescription": "This key defines globs that filter which files CloudCannon should use for *Input* configuration.\n\nValues in this array are relative to the root of your repository (i.e., `/`, not the value of `source`) and must end in the file extension\n`.cloudcannon.inputs.yml`.\n\nYou can use this key anywhere you would use the `_inputs` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several *Input Configuration Files* in the `.cloudcannon/inputs/` folder, with each file containing multiple *Input* definitions. The value of the `_inputs_from_glob` key tells CloudCannon to only use the `seo.cloudcannon.inputs.yml` and `blog-details.cloudcannon.inputs.yml` files in that folder.\n\n```yaml\ncollections_config:\n  posts:\n    path: content/posts\n    icon: event\n    inputs_from_glob:\n      - '/.cloudcannon/inputs/seo.cloudcannon.inputs.yml'\n      - '/.cloudcannon/inputs/blogDetails.cloudcannon.inputs.yml'\n```\n\n```yaml\nseo_title:\n  type: text\n  options:\n    required: true\n    max_length: 50\nseo_description:\n  type: textarea\n  options:\n    show_count: true\n    required: true\n    max_length: 125\nseo_image:\n  type: image\n  options:\n    path:\n      uploads: images\n    accepts_mime_types:\n      - image/png\n      - image/jpeg\n    required: true\n    pattern: (?i)\\.(jpe?g|png)$\n    pattern_message: Please select a JPG or PNG image file\n```"
    },
    "type._select_data": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "This key defines defines fixed data sets to populate Select and Multiselect inputs at a given level of the configuration cascade.\n\nThis key has no default.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_select_data` will default to\nany values configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\nFor more information, please read our documentation on [Select and Multiselect inputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/#fixed-data-sets).\n\n## Examples\n\nIn this example, we have configured the `blog_tags` Multiselect input for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _select_data:\n      blog_topics:\n        - Opinion\n        - Feature\n        - Resource\n```",
      "title": "Select Data",
      "description": "This key defines defines fixed data sets to populate Select and Multiselect inputs at a given level of the configuration cascade.\n\nThis key has no default.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_select_data` will default to\nany values configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\nFor more information, please read our documentation on [Select and Multiselect inputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/#fixed-data-sets).\n\n## Examples\n\nIn this example, we have configured the `blog_tags` Multiselect input for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _select_data:\n      blog_topics:\n        - Opinion\n        - Feature\n        - Resource\n```",
      "documented": true,
      "additionalProperties": {
        "anyOf": [
          {
            "type": "array",
            "items": {
              "type": "string",
              "documented": true,
              "title": "*(text-array)[*]"
            },
            "title": "Text Array Select Data",
            "documented": true
          },
          {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "documented": true,
            "title": "Text Object Select Data",
            "additionalProperties": {
              "type": "string",
              "documented": true,
              "title": "*(text-object).*"
            }
          },
          {
            "type": "array",
            "items": {
              "type": "object",
              "propertyNames": {
                "type": "string"
              },
              "title": "*(object-array)[*]",
              "documented": true,
              "additionalProperties": {}
            },
            "title": "Object Array Select Data",
            "documented": true
          },
          {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "documented": true,
            "title": "Object Select Data",
            "additionalProperties": {}
          }
        ],
        "description": "This key defines data formats for populating select and multiselect input options, supporting arrays and objects.",
        "documented": true,
        "title": "_select_data.*",
        "markdownDescription": "This key defines data formats for populating select and multiselect input options, supporting arrays and objects."
      }
    },
    "type._structures": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "This key defines which structures are available for [Object inputs](https://cloudcannon.com/documentation/articles/what-is-an-object-input/) and [Array\ninputs](https://cloudcannon.com/documentation/articles/what-is-an-array-input/) at a given level of the configuration cascade.\n\nThis key has no default.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_structures` will default to\nany values configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\nFor more information, please read our documentation on [structures](https://cloudcannon.com/documentation/articles/what-is-a-structure/).\n\n## Examples\n\nIn this example, we want to populate an Array input in the `blog` Collection with Related Articles, including the `name`, `description`, and `url` fields.\n\n```yaml\ncollections_config:\n  blog:\n    _structures:\n      related_articles:\n        style: select\n        values:\n          - preview:\n              text:\n                - key: name\n              subtext:\n                - key: url\n            value:\n              name:\n              description:\n              url:\n```\n\nIn this example, we want to populate an Array input with Staff members, including the `name`, `job_description`, and `profile_picture` fields for all staff types, and the `url` field for Managers only.\n\n```yaml\n_structures:\n  staff:\n    style: modal\n    hide_extra_inputs: false\n    values:\n      - value:\n          _type: Employee\n          name:\n          job_description:\n          profile_picture:\n        preview:\n          text:\n            - key: name\n            - Employee\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: support_agent\n      - value:\n          _type: Manager\n          name:\n          job_description:\n          profile_picture:\n          url:\n        preview:\n          text:\n            - key: name\n            - Manager\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: face\n```",
      "title": "Structures",
      "description": "This key defines which structures are available for [Object inputs](https://cloudcannon.com/documentation/articles/what-is-an-object-input/) and [Array\ninputs](https://cloudcannon.com/documentation/articles/what-is-an-array-input/) at a given level of the configuration cascade.\n\nThis key has no default.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_structures` will default to\nany values configured in the [CloudCannon configuration file](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/).\n\nFor more information, please read our documentation on [structures](https://cloudcannon.com/documentation/articles/what-is-a-structure/).\n\n## Examples\n\nIn this example, we want to populate an Array input in the `blog` Collection with Related Articles, including the `name`, `description`, and `url` fields.\n\n```yaml\ncollections_config:\n  blog:\n    _structures:\n      related_articles:\n        style: select\n        values:\n          - preview:\n              text:\n                - key: name\n              subtext:\n                - key: url\n            value:\n              name:\n              description:\n              url:\n```\n\nIn this example, we want to populate an Array input with Staff members, including the `name`, `job_description`, and `profile_picture` fields for all staff types, and the `url` field for Managers only.\n\n```yaml\n_structures:\n  staff:\n    style: modal\n    hide_extra_inputs: false\n    values:\n      - value:\n          _type: Employee\n          name:\n          job_description:\n          profile_picture:\n        preview:\n          text:\n            - key: name\n            - Employee\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: support_agent\n      - value:\n          _type: Manager\n          name:\n          job_description:\n          profile_picture:\n          url:\n        preview:\n          text:\n            - key: name\n            - Manager\n          subtext:\n            - key: job_description\n            - Description of position\n          image:\n            - key: profile_picture\n          icon: face\n```",
      "documented": true,
      "additionalProperties": {
        "$ref": "#/$defs/type.structure"
      }
    },
    "type._structures_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "_structures_from_glob[*]",
        "description": "This key represents an individual glob pattern string in the `_structures_from_glob` array.\n\nThe value is a string that specifies a file path pattern relative to the root of your repository. The path must end in the file extension `.cloudcannon.structures.yml`.\n\n## Examples\n\nIn this example, we have several *Structure Configuration Files* in the `.cloudcannon/structures/` folder. The value of the `_structures_from_glob` key tells CloudCannon to use the `staffMembers.cloudcannon.structures.yml` file in that folder.\n\n```yaml\n_structures_from_glob:\n  - '/.cloudcannon/structures/staffMembers.cloudcannon.structures.yml'\n```",
        "markdownDescription": "This key represents an individual glob pattern string in the `_structures_from_glob` array.\n\nThe value is a string that specifies a file path pattern relative to the root of your repository. The path must end in the file extension `.cloudcannon.structures.yml`.\n\n## Examples\n\nIn this example, we have several *Structure Configuration Files* in the `.cloudcannon/structures/` folder. The value of the `_structures_from_glob` key tells CloudCannon to use the `staffMembers.cloudcannon.structures.yml` file in that folder.\n\n```yaml\n_structures_from_glob:\n  - '/.cloudcannon/structures/staffMembers.cloudcannon.structures.yml'\n```"
      },
      "documented": true,
      "title": "_structures_from_glob",
      "description": "This key defines globs that filter which files CloudCannon should use for *Structure* configuration.\n\nValues in this array are relative to the root of your repository (i.e., `/`, not the value of `source`) and must end in the file extension\n`.cloudcannon.structures.yml`.\n\nYou can use this key anywhere you would use the `_structures` key in the configuration cascade.\n\nPlease see our documentation on [values_from_glob](https://cloudcannon.com/documentation/developer-reference/configuration-file/types/structure/values_from_glob/) for defining individual\n*Structure* values in a split *Configuration File*.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several *Structure Configuration Files* in the `.cloudcannon/structures/` folder. The value of the `_structures_from_glob` key tells CloudCannon to use the `staffMembers.cloudcannon.structures.yml` file in that folder.\n\n```yaml\n_structures_from_glob:\n  - '/.cloudcannon/structures/staffMembers.cloudcannon.structures.yml'\n```\n\n```yaml\nstaff:\n  style: modal\n  values:\n    - label: Employee\n      value:\n        name:\n        job_description:\n        profile_picture:\n    - label: Manager\n      value:\n        name:\n        job_description:\n        profile_picture:\n        url:\n```",
      "markdownDescription": "This key defines globs that filter which files CloudCannon should use for *Structure* configuration.\n\nValues in this array are relative to the root of your repository (i.e., `/`, not the value of `source`) and must end in the file extension\n`.cloudcannon.structures.yml`.\n\nYou can use this key anywhere you would use the `_structures` key in the configuration cascade.\n\nPlease see our documentation on [values_from_glob](https://cloudcannon.com/documentation/developer-reference/configuration-file/types/structure/values_from_glob/) for defining individual\n*Structure* values in a split *Configuration File*.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several *Structure Configuration Files* in the `.cloudcannon/structures/` folder. The value of the `_structures_from_glob` key tells CloudCannon to use the `staffMembers.cloudcannon.structures.yml` file in that folder.\n\n```yaml\n_structures_from_glob:\n  - '/.cloudcannon/structures/staffMembers.cloudcannon.structures.yml'\n```\n\n```yaml\nstaff:\n  style: modal\n  values:\n    - label: Employee\n      value:\n        name:\n        job_description:\n        profile_picture:\n    - label: Manager\n      value:\n        name:\n        job_description:\n        profile_picture:\n        url:\n```"
    },
    "entries_comment": {
      "description": "This key defines the subtitle text above the key input when adding or renaming entries within a mutable *Object Input*.\n\nThe value is a string that supports a limited selection of Markdown formatting: links, bold, italic, subscript, superscript, and inline code elements are allowed.\n\nAvailable for Mutable Objects only.\n\n## Examples\n\nIn this example, we have configured a comment with Markdown formatting to provide help text above the key input.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        comment: Key names should be **lowercase** and use underscores (e.g., `article_title`)\n```",
      "type": "string",
      "documented": true,
      "title": "comment",
      "markdownDescription": "This key defines the subtitle text above the key input when adding or renaming entries within a mutable *Object Input*.\n\nThe value is a string that supports a limited selection of Markdown formatting: links, bold, italic, subscript, superscript, and inline code elements are allowed.\n\nAvailable for Mutable Objects only.\n\n## Examples\n\nIn this example, we have configured a comment with Markdown formatting to provide help text above the key input.\n\n```yaml\n_inputs:\n  metadata:\n    type: object\n    options:\n      allow_create: true\n      entries:\n        comment: Key names should be **lowercase** and use underscores (e.g., `article_title`)\n```"
    },
    "ArrayInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "array",
          "title": "Type",
          "description": "This key defines the input type, which controls how this input appears and behaves.",
          "documented": true,
          "markdownDescription": "This key defines the input type, which controls how this input appears and behaves."
        },
        "options": {
          "type": "object",
          "properties": {
            "required": {
              "$ref": "#/$defs/type._inputs.*.options.required"
            },
            "required_message": {
              "$ref": "#/$defs/type._inputs.*.options.required_message"
            },
            "max_items": {
              "$ref": "#/$defs/type._inputs.*.options.max_items"
            },
            "max_items_message": {
              "$ref": "#/$defs/type._inputs.*.options.max_items_message"
            },
            "min_items": {
              "$ref": "#/$defs/type._inputs.*.options.min_items"
            },
            "min_items_message": {
              "$ref": "#/$defs/type._inputs.*.options.min_items_message"
            },
            "unique_on": {
              "$ref": "#/$defs/type._inputs.*.options.unique_on"
            },
            "unique_on_message": {
              "$ref": "#/$defs/type._inputs.*.options.unique_on_message"
            },
            "disable_add": {
              "$ref": "#/$defs/ArrayInput.disable_add"
            },
            "disable_remove": {
              "$ref": "#/$defs/disable_remove"
            },
            "disable_reorder": {
              "$ref": "#/$defs/disable_reorder"
            },
            "empty_type": {
              "allOf": [
                {
                  "$ref": "#/$defs/type._inputs.*.options.empty_type(array)"
                }
              ],
              "documented": false,
              "title": "empty_type"
            },
            "structures": {
              "description": "This key defines data formats for value of this object.\n\nWhen choosing an item, team members are prompted to choose from a number of values you have defined.",
              "anyOf": [
                {
                  "$ref": "#/$defs/type.structure-reference"
                },
                {
                  "$ref": "#/$defs/type.structure"
                }
              ],
              "documented": true,
              "title": "structures",
              "markdownDescription": "This key defines data formats for value of this object.\n\nWhen choosing an item, team members are prompted to choose from a number of values you have defined."
            }
          },
          "markdownDescription": "This key defines options that are specific to Array Inputs.",
          "description": "This key defines options that are specific to Array Inputs.",
          "documented": true,
          "title": "options",
          "additionalProperties": false
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "This key defines a user interface for lists of inputs or input groups.",
      "title": "Array Input",
      "description": "This key defines a user interface for lists of inputs or input groups.",
      "documented": true,
      "additionalProperties": false
    },
    "ArrayInput.disable_add": {
      "description": "This key toggles whether CloudCannon will hide the add button, and context menu actions on each item for adding new items to this Input.\n\nSetting this key to `true` will hide the add button and context menu actions for adding new items.\n\nBy default, this key is `false` (i.e., the add button and context menu actions are displayed).",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "disable_add",
      "markdownDescription": "This key toggles whether CloudCannon will hide the add button, and context menu actions on each item for adding new items to this Input.\n\nSetting this key to `true` will hide the add button and context menu actions for adding new items.\n\nBy default, this key is `false` (i.e., the add button and context menu actions are displayed)."
    },
    "disable_remove": {
      "description": "This key toggles whether CloudCannon will hide the context menu actions on each item for removing them.\n\nSetting this key to `true` will hide the context menu actions for removing items.\n\nBy default, this key is `false` (i.e., the context menu actions for removing items are displayed).",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "disable_remove",
      "markdownDescription": "This key toggles whether CloudCannon will hide the context menu actions on each item for removing them.\n\nSetting this key to `true` will hide the context menu actions for removing items.\n\nBy default, this key is `false` (i.e., the context menu actions for removing items are displayed)."
    },
    "disable_reorder": {
      "description": "This key toggles whether CloudCannon will hide the controls on each item for moving them.\n\nSetting this key to `true` will hide the controls for moving items.\n\nBy default, this key is `false` (i.e., the controls for moving items are displayed).",
      "default": false,
      "type": "boolean",
      "documented": true,
      "title": "disable_reorder",
      "markdownDescription": "This key toggles whether CloudCannon will hide the controls on each item for moving them.\n\nSetting this key to `true` will hide the controls for moving items.\n\nBy default, this key is `false` (i.e., the controls for moving items are displayed)."
    },
    "AutoInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "type": {
          "type": "string",
          "const": "auto",
          "title": "Type",
          "description": "Sets an input type, which controls how this input appears and behaves.",
          "documented": false,
          "markdownDescription": "Sets an input type, which controls how this input appears and behaves."
        },
        "options": {
          "description": "Options that are specific to this `type` of input.",
          "documented": false,
          "title": "options",
          "markdownDescription": "Options that are specific to this `type` of input."
        }
      },
      "required": [
        "type"
      ],
      "markdownDescription": "Provides a default user interface based on the data contained.",
      "title": "Automatic Input",
      "description": "Provides a default user interface based on the data contained.",
      "excludeFromDocumentation": true,
      "documented": false,
      "additionalProperties": false
    },
    "UnknownInput": {
      "type": "object",
      "properties": {
        "comment": {
          "$ref": "#/$defs/type._inputs.*.comment"
        },
        "context": {
          "allOf": [
            {
              "$ref": "#/$defs/type._inputs.*.context"
            }
          ],
          "documented": false,
          "title": "context"
        },
        "documentation": {
          "description": "Provides a custom link for documentation for editors shown above input.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "Provides a custom link for documentation for editors shown above input."
        },
        "label": {
          "$ref": "#/$defs/type._inputs.*.label"
        },
        "hidden": {
          "$ref": "#/$defs/type._inputs.*.hidden"
        },
        "disabled": {
          "$ref": "#/$defs/type._inputs.*.disabled"
        },
        "instance_value": {
          "$ref": "#/$defs/type._inputs.*.instance_value"
        },
        "disable_instance_value_rehydration": {
          "$ref": "#/$defs/type._inputs.*.disable_instance_value_rehydration"
        },
        "cascade": {
          "$ref": "#/$defs/type._inputs.*.cascade"
        },
        "options": {
          "description": "Options that are specific to this `type` of input.",
          "documented": false,
          "title": "options",
          "markdownDescription": "Options that are specific to this `type` of input."
        }
      },
      "markdownDescription": "Provides a default user interface based on the data contained.",
      "title": "Unknown Input",
      "description": "Provides a default user interface based on the data contained.",
      "excludeFromDocumentation": true,
      "documented": false,
      "additionalProperties": false
    },
    "SnippetAlternateFormats": {
      "description": "This key defines alternate configurations for this snippet.",
      "type": "array",
      "items": {
        "$ref": "#/$defs/type.snippet"
      },
      "documented": true,
      "title": "alternate_formats",
      "markdownDescription": "This key defines alternate configurations for this snippet."
    },
    "type.snippet-model": {
      "title": "Snippet Model",
      "type": "object",
      "properties": {
        "source_key": {
          "type": "string",
          "documented": true,
          "title": "source_key",
          "description": "This key defines the key that the parser should look for in the source text.\n\nThis only needs to be set if it differs from the `editor_key`.\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models___1___:\n    - source_key: href\n      editor_key: link\n    - source_key: target\n      editor_key: link_target\n    - source_key: class\n      editor_key: classnames\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"my_link\"> ... </a>\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```\n\nWhen edited in CloudCannon, this will edit as the data model:\n\n{/* TODO: Use screenshot here instead */}\n\n```yaml\nlink: \"#link\"\nlink_target: \"_blank\"\nclassnames: \"my_link\"\n```",
          "markdownDescription": "This key defines the key that the parser should look for in the source text.\n\nThis only needs to be set if it differs from the `editor_key`.\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models___1___:\n    - source_key: href\n      editor_key: link\n    - source_key: target\n      editor_key: link_target\n    - source_key: class\n      editor_key: classnames\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"my_link\"> ... </a>\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```\n\nWhen edited in CloudCannon, this will edit as the data model:\n\n{/* TODO: Use screenshot here instead */}\n\n```yaml\nlink: \"#link\"\nlink_target: \"_blank\"\nclassnames: \"my_link\"\n```"
        },
        "editor_key": {
          "type": "string",
          "documented": true,
          "title": "editor_key",
          "description": "This key defines the key that a user in CloudCannon will see when editing this value.\n\nThis key will also be used if you want to specify any input configuration using `_inputs`.\n\nIf no `source_key` is set, this key will also be assumed to be the source key.\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models___1___:\n    - editor_key: href\n    - editor_key: class\n    - editor_key: target\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"my_link\"> ... </a>\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```\n\nWhen edited in CloudCannon, this will edit as the data model:\n\n{/* TODO: Use screenshot here instead */}\n\n```yaml\nhref: \"#link\"\ntarget: \"_blank\"\nclass: \"my_link\"\n```",
          "markdownDescription": "This key defines the key that a user in CloudCannon will see when editing this value.\n\nThis key will also be used if you want to specify any input configuration using `_inputs`.\n\nIf no `source_key` is set, this key will also be assumed to be the source key.\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models___1___:\n    - editor_key: href\n    - editor_key: class\n    - editor_key: target\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"my_link\"> ... </a>\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```\n\nWhen edited in CloudCannon, this will edit as the data model:\n\n{/* TODO: Use screenshot here instead */}\n\n```yaml\nhref: \"#link\"\ntarget: \"_blank\"\nclass: \"my_link\"\n```"
        },
        "remove_empty": {
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "remove_empty",
          "description": "This key toggles whether this key-value pair should be omitted altogether if the value is empty.\n\nSetting this key to `true` will omit the key-value pair if the value is empty. Requires that this key is also set as optional, as otherwise the snippet would not re-parse.\n\nBy default, this key is `false` (i.e., empty key-value pairs are not omitted).\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models:\n    - editor_key: href\n    - editor_key: target\n    - editor_key: class\n      optional: true\n      remove_empty: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"\"> ... </a> <!--1-->\n<a href=\"#link\" target=\"_blank\"> ... </a> <!--1--> <!--2-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
          "markdownDescription": "This key toggles whether this key-value pair should be omitted altogether if the value is empty.\n\nSetting this key to `true` will omit the key-value pair if the value is empty. Requires that this key is also set as optional, as otherwise the snippet would not re-parse.\n\nBy default, this key is `false` (i.e., empty key-value pairs are not omitted).\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models:\n    - editor_key: href\n    - editor_key: target\n    - editor_key: class\n      optional: true\n      remove_empty: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"\"> ... </a> <!--1-->\n<a href=\"#link\" target=\"_blank\"> ... </a> <!--1--> <!--2-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
        },
        "optional": {
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "optional",
          "description": "This key toggles whether a value must exist for this parser.\n\nSetting this key to `true` will make the value optional for this parser. Useful for long sets of key-value pairs that are not all required.\n\nBy default, this key is `false` (i.e., a value must exist for this parser).\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models:\n    - editor_key: href\n    - editor_key: target\n      optional: true\n    - editor_key: class\n      optional: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"my_link\"> ... </a> <!--1-->\n<a href=\"#link\" target=\"_blank\"> ... </a> <!--1-->\n<a href=\"#link\"> ... </a> <!--1-->\n\n<a target=\"_blank\"> ... </a> <!--2-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
          "markdownDescription": "This key toggles whether a value must exist for this parser.\n\nSetting this key to `true` will make the value optional for this parser. Useful for long sets of key-value pairs that are not all required.\n\nBy default, this key is `false` (i.e., a value must exist for this parser).\n\n## Examples\n\n```yaml\nparser: \"key_values\"\noptions:\n  models:\n    - editor_key: href\n    - editor_key: target\n      optional: true\n    - editor_key: class\n      optional: true\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<a href=\"#link\" target=\"_blank\" class=\"my_link\"> ... </a> <!--1-->\n<a href=\"#link\" target=\"_blank\"> ... </a> <!--1-->\n<a href=\"#link\"> ... </a> <!--1-->\n\n<a target=\"_blank\"> ... </a> <!--2-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
        },
        "type": {
          "type": "string",
          "enum": [
            "array",
            "object",
            "string",
            "boolean",
            "number"
          ],
          "documented": true,
          "title": "type",
          "description": "This key defines the data type for snippet parameter parsing.\n\nThe value can be `array`, `object`, `string`, `boolean`, or `number`. This specifies the expected data type when parsing snippet parameters.\n\n## Examples\n\nIn this example, we have configured a snippet model to expect a string type.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            type: string\n```",
          "markdownDescription": "This key defines the data type for snippet parameter parsing.\n\nThe value can be `array`, `object`, `string`, `boolean`, or `number`. This specifies the expected data type when parsing snippet parameters.\n\n## Examples\n\nIn this example, we have configured a snippet model to expect a string type.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          model:\n            type: string\n```"
        },
        "allowed_values": {
          "type": "array",
          "items": {},
          "documented": true,
          "title": "allowed_values",
          "description": "This key defines a list of valid values for the parser.\n\nIf specified, values not in the provided list will cause this snippet to be skipped,\nand a different snippet will be matched if possible.\nA user entering a different value while editing this snippet will cause it to error, so this option is\nbest paired with a select input configured on the `editor_key`.\n\n## Examples\n\n```yaml\nparser: \"argument\"\noptions:\n  model:\n    editor_key: video_id\n    allowed_values: [\"riXoAr6gO-E\", \"CZcNgDN81Sw\", \"0iwNjcFIHNM\"]\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<video \"CZcNgDN81Sw\">> <!--1-->\n\n<<video \"riXoAr6gO-E\">> <!--1-->\n\n<<video \"RuvMHkfOpvg\">> <!--2-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```",
          "markdownDescription": "This key defines a list of valid values for the parser.\n\nIf specified, values not in the provided list will cause this snippet to be skipped,\nand a different snippet will be matched if possible.\nA user entering a different value while editing this snippet will cause it to error, so this option is\nbest paired with a select input configured on the `editor_key`.\n\n## Examples\n\n```yaml\nparser: \"argument\"\noptions:\n  model:\n    editor_key: video_id\n    allowed_values: [\"riXoAr6gO-E\", \"CZcNgDN81Sw\", \"0iwNjcFIHNM\"]\n```\n\nExample usage:\n\n```markdown\n## My blog post\n\n<<video \"CZcNgDN81Sw\">> <!--1-->\n\n<<video \"riXoAr6gO-E\">> <!--1-->\n\n<<video \"RuvMHkfOpvg\">> <!--2-->\n\nMorbi leo risus, porta ac consectetur ac, vestibulum at eros.\n```"
        },
        "implied_boolean": {
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "implied_boolean",
          "description": "This key toggles whether any value in this argument will alias to `true`, and an empty value will alias to `false`.\n\nSetting this key to `true` will cause any value in this argument to alias to `true`, and an empty value to alias to `false`.\n\nBy default, this key is `false` (i.e., values are not aliased to boolean).\n\n## Examples\n\nIn this example, we have configured implied boolean so any value in this argument will alias to `true`, and an empty value will alias to `false`.\n\n```yaml\nparser: \"argument\"\noptions:\n  model:\n    editor_key: has_video_id\n    implied_boolean: true\n```",
          "markdownDescription": "This key toggles whether any value in this argument will alias to `true`, and an empty value will alias to `false`.\n\nSetting this key to `true` will cause any value in this argument to alias to `true`, and an empty value to alias to `false`.\n\nBy default, this key is `false` (i.e., values are not aliased to boolean).\n\n## Examples\n\nIn this example, we have configured implied boolean so any value in this argument will alias to `true`, and an empty value will alias to `false`.\n\n```yaml\nparser: \"argument\"\noptions:\n  model:\n    editor_key: has_video_id\n    implied_boolean: true\n```"
        },
        "default": {}
      },
      "markdownDescription": "This key defines the parsing configuration for this argument.",
      "documented": true,
      "description": "This key defines the parsing configuration for this argument.",
      "additionalProperties": false
    },
    "type.snippet-format": {
      "title": "Snippet Format",
      "type": "object",
      "properties": {
        "root_boundary": {
          "type": "object",
          "properties": {
            "start": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "start",
              "description": "This key defines the start token for root-level boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of the root-level structure in snippet parameter parsing. This works together with `root_boundary.end` to define paired tokens that enclose the root parameter structure.\n\n## Examples\n\nIn this example, we have configured root boundaries to use angle brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_boundary:\n              start: '<<'\n              end: '>>'\n```",
              "markdownDescription": "This key defines the start token for root-level boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of the root-level structure in snippet parameter parsing. This works together with `root_boundary.end` to define paired tokens that enclose the root parameter structure.\n\n## Examples\n\nIn this example, we have configured root boundaries to use angle brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_boundary:\n              start: '<<'\n              end: '>>'\n```"
            },
            "end": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "end",
              "description": "This key defines the end token for root-level boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of the root-level structure in snippet parameter parsing. This works together with `root_boundary.start` to define paired tokens that enclose the root parameter structure.\n\n## Examples\n\nIn this example, we have configured root boundaries to use angle brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_boundary:\n              start: '<<'\n              end: '>>'\n```",
              "markdownDescription": "This key defines the end token for root-level boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of the root-level structure in snippet parameter parsing. This works together with `root_boundary.start` to define paired tokens that enclose the root parameter structure.\n\n## Examples\n\nIn this example, we have configured root boundaries to use angle brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_boundary:\n              start: '<<'\n              end: '>>'\n```"
            }
          },
          "markdownDescription": "This key defines the boundary tokens required for key-value segments when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. This defines paired tokens that enclose the root parameter structure.\n\n## Examples\n\nIn this example, we have configured root boundaries to use angle brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_boundary:\n              start: '<<'\n              end: '>>'\n```",
          "documented": true,
          "title": "root_boundary",
          "description": "This key defines the boundary tokens required for key-value segments when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. This defines paired tokens that enclose the root parameter structure.\n\n## Examples\n\nIn this example, we have configured root boundaries to use angle brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_boundary:\n              start: '<<'\n              end: '>>'\n```",
          "additionalProperties": false
        },
        "root_value_boundary": {
          "type": "object",
          "properties": {
            "start": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "start",
              "description": "This key defines the start token for root value boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of a root-level value in snippet parameter parsing. This works together with `root_value_boundary.end` to define paired tokens that enclose root-level values.\n\n## Examples\n\nIn this example, we have configured root value boundaries to use double square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary:\n              start: '[['\n              end: ']]'\n```",
              "markdownDescription": "This key defines the start token for root value boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of a root-level value in snippet parameter parsing. This works together with `root_value_boundary.end` to define paired tokens that enclose root-level values.\n\n## Examples\n\nIn this example, we have configured root value boundaries to use double square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary:\n              start: '[['\n              end: ']]'\n```"
            },
            "end": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "end",
              "description": "This key defines the end token for root value boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of a root-level value in snippet parameter parsing. This works together with `root_value_boundary.start` to define paired tokens that enclose root-level values.\n\n## Examples\n\nIn this example, we have configured root value boundaries to use double square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary:\n              start: '[['\n              end: ']]'\n```",
              "markdownDescription": "This key defines the end token for root value boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of a root-level value in snippet parameter parsing. This works together with `root_value_boundary.start` to define paired tokens that enclose root-level values.\n\n## Examples\n\nIn this example, we have configured root value boundaries to use double square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary:\n              start: '[['\n              end: ']]'\n```"
            }
          },
          "markdownDescription": "This key defines the boundary tokens required for arguments and values when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. For example, MDX specifies `{ start: \"{\", end: \"}\" }`, which allows syntax such as `<Component flag={true} />`.\n\n## Examples\n\nIn this example, we have configured root value boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary:\n              start: '{'\n              end: '}'\n```",
          "documented": true,
          "title": "root_value_boundary",
          "description": "This key defines the boundary tokens required for arguments and values when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. For example, MDX specifies `{ start: \"{\", end: \"}\" }`, which allows syntax such as `<Component flag={true} />`.\n\n## Examples\n\nIn this example, we have configured root value boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary:\n              start: '{'\n              end: '}'\n```",
          "additionalProperties": false
        },
        "root_value_boundary_optional": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "markdownDescription": "This key defines which value types do not require root value boundaries when parsing snippet parameters.\n\nThe value is an object where each property key is a value type name and each property value is a boolean. When set to `true`, that value type does not require root value boundaries. For example, MDX specifies `{ string: true }`, which allows strings to exist as `<Component arg=\"true\" />` rather than `<Component arg={\"true\"} />`.\n\n## Examples\n\nIn this example, we have configured root value boundaries to be optional for strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary_optional:\n              string: true\n```",
          "documented": true,
          "title": "root_value_boundary_optional",
          "description": "This key defines which value types do not require root value boundaries when parsing snippet parameters.\n\nThe value is an object where each property key is a value type name and each property value is a boolean. When set to `true`, that value type does not require root value boundaries. For example, MDX specifies `{ string: true }`, which allows strings to exist as `<Component arg=\"true\" />` rather than `<Component arg={\"true\"} />`.\n\n## Examples\n\nIn this example, we have configured root value boundaries to be optional for strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary_optional:\n              string: true\n```",
          "additionalProperties": {
            "type": "boolean",
            "documented": true,
            "title": "root_value_boundary_optional.*",
            "description": "This key represents an individual optional root value boundary configuration in the `root_value_boundary_optional` object.\n\nThe value is a boolean that determines whether the root value boundary is optional for a specific parameter name. When set to `true`, the boundary tokens are optional for that parameter.\n\n## Examples\n\nIn this example, we have configured root value boundaries to be optional for the `title` parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary_optional:\n              title: true\n```",
            "markdownDescription": "This key represents an individual optional root value boundary configuration in the `root_value_boundary_optional` object.\n\nThe value is a boolean that determines whether the root value boundary is optional for a specific parameter name. When set to `true`, the boundary tokens are optional for that parameter.\n\n## Examples\n\nIn this example, we have configured root value boundaries to be optional for the `title` parameter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_boundary_optional:\n              title: true\n```"
          }
        },
        "root_value_delimiter": {
          "type": "string",
          "documented": true,
          "title": "root_value_delimiter",
          "description": "This key defines the delimiter that separates a key from its value in key-value pairs when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. For pairs such as `key=\"value\"`, this would be `=`. For pairs such as `key: \"value\"`, this would be `: `.\n\n## Examples\n\nIn this example, we have configured root value delimiter to use an equals sign.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_delimiter: '='\n```",
          "markdownDescription": "This key defines the delimiter that separates a key from its value in key-value pairs when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. For pairs such as `key=\"value\"`, this would be `=`. For pairs such as `key: \"value\"`, this would be `: `.\n\n## Examples\n\nIn this example, we have configured root value delimiter to use an equals sign.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_value_delimiter: '='\n```"
        },
        "root_pair_delimiter": {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "root_pair_delimiter[*]",
            "description": "This key represents an individual delimiter string in the `root_pair_delimiter` array.\n\nThe value is a string that specifies a delimiter token that separates key-value pairs when parsing snippet parameters.\n\n## Examples\n\nIn this example, we have configured a root pair delimiter to use a space.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_pair_delimiter:\n              - ' '\n```",
            "markdownDescription": "This key represents an individual delimiter string in the `root_pair_delimiter` array.\n\nThe value is a string that specifies a delimiter token that separates key-value pairs when parsing snippet parameters.\n\n## Examples\n\nIn this example, we have configured a root pair delimiter to use a space.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_pair_delimiter:\n              - ' '\n```"
          },
          "documented": true,
          "title": "root_pair_delimiter",
          "description": "This key defines the delimiters that separate each key-value pair from the next when parsing snippet parameters.\n\nThe value is an array of strings, where each string specifies a delimiter token. For segments such as `href=\"about\" title=\"Hello World\"`, this would be `[\" \"]` (a space). For segments such as `href: about, title: \"Hello World\"`, this would be `[\",\"]`.\n\n## Examples\n\nIn this example, we have configured root pair delimiter to use a space.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_pair_delimiter:\n              - ' '\n```",
          "markdownDescription": "This key defines the delimiters that separate each key-value pair from the next when parsing snippet parameters.\n\nThe value is an array of strings, where each string specifies a delimiter token. For segments such as `href=\"about\" title=\"Hello World\"`, this would be `[\" \"]` (a space). For segments such as `href: about, title: \"Hello World\"`, this would be `[\",\"]`.\n\n## Examples\n\nIn this example, we have configured root pair delimiter to use a space.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            root_pair_delimiter:\n              - ' '\n```"
        },
        "remove_empty_root_boundary": {
          "type": "boolean",
          "documented": true,
          "title": "remove_empty_root_boundary",
          "description": "This key toggles whether CloudCannon will remove root boundary tokens from the source code when a key-value segment is empty.\n\nSetting this key to `true` will remove root boundary tokens when the segment is empty.\n\nBy default, this key is `false` (i.e., root boundary tokens are not removed when segments are empty).\n\n## Examples\n\nIn this example, we have configured snippet format to remove empty root boundaries from source code.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            remove_empty_root_boundary: true\n```",
          "markdownDescription": "This key toggles whether CloudCannon will remove root boundary tokens from the source code when a key-value segment is empty.\n\nSetting this key to `true` will remove root boundary tokens when the segment is empty.\n\nBy default, this key is `false` (i.e., root boundary tokens are not removed when segments are empty).\n\n## Examples\n\nIn this example, we have configured snippet format to remove empty root boundaries from source code.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            remove_empty_root_boundary: true\n```"
        },
        "object_boundary": {
          "type": "object",
          "properties": {
            "start": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "start",
              "description": "This key defines the start token for object boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of an object in snippet parameter parsing. This works together with `object_boundary.end` to define paired tokens that enclose objects.\n\n## Examples\n\nIn this example, we have configured object boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n```",
              "markdownDescription": "This key defines the start token for object boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of an object in snippet parameter parsing. This works together with `object_boundary.end` to define paired tokens that enclose objects.\n\n## Examples\n\nIn this example, we have configured object boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n```"
            },
            "end": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "end",
              "description": "This key defines the end token for object boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of an object in snippet parameter parsing. This works together with `object_boundary.start` to define paired tokens that enclose objects.\n\n## Examples\n\nIn this example, we have configured object boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n```",
              "markdownDescription": "This key defines the end token for object boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of an object in snippet parameter parsing. This works together with `object_boundary.start` to define paired tokens that enclose objects.\n\n## Examples\n\nIn this example, we have configured object boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n```"
            }
          },
          "markdownDescription": "This key defines the characters that start and end object literals when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. For objects, this will usually be `{ start: \"{\", end: \"}\" }`.\n\n## Examples\n\nIn this example, we have configured object boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n```",
          "documented": true,
          "title": "object_boundary",
          "description": "This key defines the characters that start and end object literals when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. For objects, this will usually be `{ start: \"{\", end: \"}\" }`.\n\n## Examples\n\nIn this example, we have configured object boundaries to use curly braces.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n```",
          "additionalProperties": false
        },
        "object_value_delimiter": {
          "type": "string",
          "documented": true,
          "title": "object_value_delimiter",
          "description": "This key defines the delimiter that separates a key from its value within an object when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. If required, this will usually be `:`.\n\n## Examples\n\nIn this example, we have configured object value delimiter to use a colon.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n            object_value_delimiter: ':'\n```",
          "markdownDescription": "This key defines the delimiter that separates a key from its value within an object when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. If required, this will usually be `:`.\n\n## Examples\n\nIn this example, we have configured object value delimiter to use a colon.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n            object_value_delimiter: ':'\n```"
        },
        "object_pair_delimiter": {
          "type": "string",
          "documented": true,
          "title": "object_pair_delimiter",
          "description": "This key defines the delimiter that separates each key-value pair from the next within an object when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. If required, this will usually be `,`.\n\n## Examples\n\nIn this example, we have configured object pair delimiter to use a comma.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n            object_pair_delimiter: ','\n```",
          "markdownDescription": "This key defines the delimiter that separates each key-value pair from the next within an object when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. If required, this will usually be `,`.\n\n## Examples\n\nIn this example, we have configured object pair delimiter to use a comma.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            object_boundary:\n              start: '{'\n              end: '}'\n            object_pair_delimiter: ','\n```"
        },
        "array_boundary": {
          "type": "object",
          "properties": {
            "start": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "start",
              "description": "This key defines the start token for array boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of an array in snippet parameter parsing. This works together with `array_boundary.end` to define paired tokens that enclose arrays.\n\n## Examples\n\nIn this example, we have configured array boundaries to use square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n```",
              "markdownDescription": "This key defines the start token for array boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the start of an array in snippet parameter parsing. This works together with `array_boundary.end` to define paired tokens that enclose arrays.\n\n## Examples\n\nIn this example, we have configured array boundaries to use square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n```"
            },
            "end": {
              "default": "",
              "type": "string",
              "documented": true,
              "title": "end",
              "description": "This key defines the end token for array boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of an array in snippet parameter parsing. This works together with `array_boundary.start` to define paired tokens that enclose arrays.\n\n## Examples\n\nIn this example, we have configured array boundaries to use square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n```",
              "markdownDescription": "This key defines the end token for array boundaries when parsing snippet parameters.\n\nThe value is a string that specifies the token that marks the end of an array in snippet parameter parsing. This works together with `array_boundary.start` to define paired tokens that enclose arrays.\n\n## Examples\n\nIn this example, we have configured array boundaries to use square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n```"
            }
          },
          "markdownDescription": "This key defines the characters that start and end array literals when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. For arrays, this will usually be `{ start: \"[\", end: \"]\" }`.\n\n## Examples\n\nIn this example, we have configured array boundaries to use square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n```",
          "documented": true,
          "title": "array_boundary",
          "description": "This key defines the characters that start and end array literals when parsing snippet parameters.\n\nThe value is an object that contains `start` and `end` properties, each specifying a string token. For arrays, this will usually be `{ start: \"[\", end: \"]\" }`.\n\n## Examples\n\nIn this example, we have configured array boundaries to use square brackets.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n```",
          "additionalProperties": false
        },
        "array_delimiter": {
          "type": "string",
          "documented": true,
          "title": "array_delimiter",
          "description": "This key defines the delimiter that separates each value from the next within an array when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. If required, this will usually be `,`.\n\n## Examples\n\nIn this example, we have configured array delimiter to use a comma.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n            array_delimiter: ','\n```",
          "markdownDescription": "This key defines the delimiter that separates each value from the next within an array when parsing snippet parameters.\n\nThe value is a string that specifies the delimiter token. If required, this will usually be `,`.\n\n## Examples\n\nIn this example, we have configured array delimiter to use a comma.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            array_boundary:\n              start: '['\n              end: ']'\n            array_delimiter: ','\n```"
        },
        "string_boundary": {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "string_boundary[*]",
            "description": "This key represents an individual string boundary token in the `string_boundary` array.\n\nThe value is a string that specifies a valid boundary token for strings. The parser will ensure the matched end token is the same as the start token.\n\n## Examples\n\nIn this example, we have configured a string boundary to use double quotes.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            string_boundary:\n              - '\"'\n```",
            "markdownDescription": "This key represents an individual string boundary token in the `string_boundary` array.\n\nThe value is a string that specifies a valid boundary token for strings. The parser will ensure the matched end token is the same as the start token.\n\n## Examples\n\nIn this example, we have configured a string boundary to use double quotes.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            string_boundary:\n              - '\"'\n```"
          },
          "documented": true,
          "title": "string_boundary",
          "description": "This key defines the valid tokens that can bound a string when parsing snippet parameters.\n\nThe value is an array of strings, where each string specifies a valid boundary token. The parser will ensure the matched end token is the same as the start token. To handle common strings with either single or double quotes, this would usually be `[\"'\", \"\\\"\"]`.\n\n## Examples\n\nIn this example, we have configured string boundaries to allow single and double quotes.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            string_boundary:\n              - '\"'\n              - \"'\"\n```",
          "markdownDescription": "This key defines the valid tokens that can bound a string when parsing snippet parameters.\n\nThe value is an array of strings, where each string specifies a valid boundary token. The parser will ensure the matched end token is the same as the start token. To handle common strings with either single or double quotes, this would usually be `[\"'\", \"\\\"\"]`.\n\n## Examples\n\nIn this example, we have configured string boundaries to allow single and double quotes.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            string_boundary:\n              - '\"'\n              - \"'\"\n```"
        },
        "string_escape_character": {
          "type": "string",
          "documented": true,
          "title": "string_escape_character",
          "description": "This key defines the character that can be placed before a string boundary to escape it when parsing snippet parameters.\n\nThe value is a string that specifies the escape character. If required, this will usually be `\\`.\n\n## Examples\n\nIn this example, we have configured string escape character to use a backslash.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            string_escape_character: '\\\\'\n```",
          "markdownDescription": "This key defines the character that can be placed before a string boundary to escape it when parsing snippet parameters.\n\nThe value is a string that specifies the escape character. If required, this will usually be `\\`.\n\n## Examples\n\nIn this example, we have configured string escape character to use a backslash.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            string_escape_character: '\\\\'\n```"
        },
        "allow_booleans": {
          "type": "boolean",
          "documented": true,
          "title": "allow_booleans",
          "description": "This key toggles whether CloudCannon will allow unquoted boolean values like `true` and `false` when parsing snippet parameters.\n\nSetting this key to `true` will allow unquoted boolean values in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., unquoted boolean values are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow unquoted boolean values.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_booleans: true\n```",
          "markdownDescription": "This key toggles whether CloudCannon will allow unquoted boolean values like `true` and `false` when parsing snippet parameters.\n\nSetting this key to `true` will allow unquoted boolean values in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., unquoted boolean values are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow unquoted boolean values.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_booleans: true\n```"
        },
        "allow_numbers": {
          "type": "boolean",
          "documented": true,
          "title": "allow_numbers",
          "description": "This key toggles whether CloudCannon will allow unquoted numbers like `5` and `-0.4` when parsing snippet parameters.\n\nSetting this key to `true` will allow unquoted numeric values in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., unquoted numbers are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow unquoted numbers.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_numbers: true\n```",
          "markdownDescription": "This key toggles whether CloudCannon will allow unquoted numbers like `5` and `-0.4` when parsing snippet parameters.\n\nSetting this key to `true` will allow unquoted numeric values in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., unquoted numbers are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow unquoted numbers.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_numbers: true\n```"
        },
        "allow_implied_values": {
          "type": "boolean",
          "documented": true,
          "title": "allow_implied_values",
          "description": "This key toggles whether CloudCannon will allow keys without values to imply a value of `true` when parsing key-value pairs in snippet parameters.\n\nSetting this key to `true` will allow keys to be specified without values, which will be interpreted as `true`.\n\nBy default, this key is `false` (i.e., keys without values are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow implied values for keys without values.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_implied_values: true\n```",
          "markdownDescription": "This key toggles whether CloudCannon will allow keys without values to imply a value of `true` when parsing key-value pairs in snippet parameters.\n\nSetting this key to `true` will allow keys to be specified without values, which will be interpreted as `true`.\n\nBy default, this key is `false` (i.e., keys without values are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow implied values for keys without values.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_implied_values: true\n```"
        },
        "allow_null": {
          "type": "boolean",
          "documented": true,
          "title": "allow_null",
          "description": "This key toggles whether CloudCannon will allow `null` values when parsing snippet parameters.\n\nSetting this key to `true` will allow `null` values in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., `null` values are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow null values in parameter parsing.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_null: true\n```",
          "markdownDescription": "This key toggles whether CloudCannon will allow `null` values when parsing snippet parameters.\n\nSetting this key to `true` will allow `null` values in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., `null` values are not allowed).\n\n## Examples\n\nIn this example, we have configured snippet format to allow null values in parameter parsing.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allow_null: true\n```"
        },
        "forbidden_tokens": {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "forbidden_tokens[*]",
            "description": "This key represents an individual forbidden token string in the `forbidden_tokens` array.\n\nThe value is a string that specifies a token that will stop parsing content when encountered. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured a forbidden token to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          format:\n            forbidden_tokens:\n              - '<'\n```",
            "markdownDescription": "This key represents an individual forbidden token string in the `forbidden_tokens` array.\n\nThe value is a string that specifies a token that will stop parsing content when encountered. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured a forbidden token to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          format:\n            forbidden_tokens:\n              - '<'\n```"
          },
          "documented": true,
          "title": "forbidden_tokens",
          "description": "This key defines tokens that stop parsing content as soon as they are encountered when parsing snippet parameters.\n\nThe value is an array of strings, where each string specifies a forbidden token. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured forbidden tokens to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          format:\n            forbidden_tokens:\n              - '<'\n```",
          "markdownDescription": "This key defines tokens that stop parsing content as soon as they are encountered when parsing snippet parameters.\n\nThe value is an array of strings, where each string specifies a forbidden token. This is useful when the content parser is being greedy and consuming more input than intended.\n\n## Examples\n\nIn this example, we have configured forbidden tokens to stop parsing when encountering a less-than sign.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          editor_key: highlighted_text\n          format:\n            forbidden_tokens:\n              - '<'\n```"
        },
        "allowed_string_cases": {
          "type": "object",
          "properties": {
            "any": {
              "type": "boolean",
              "documented": true,
              "title": "any",
              "description": "This key toggles whether CloudCannon will allow any string case type when parsing snippet parameters.\n\nSetting this key to `true` will allow any case type (uppercase, lowercase, mixed case) in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., case restrictions apply based on other `allowed_string_cases` settings).\n\n## Examples\n\nIn this example, we have configured snippet format to allow any string case type.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              any: true\n```",
              "markdownDescription": "This key toggles whether CloudCannon will allow any string case type when parsing snippet parameters.\n\nSetting this key to `true` will allow any case type (uppercase, lowercase, mixed case) in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., case restrictions apply based on other `allowed_string_cases` settings).\n\n## Examples\n\nIn this example, we have configured snippet format to allow any string case type.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              any: true\n```"
            },
            "leading_upper": {
              "type": "boolean",
              "documented": true,
              "title": "leading_upper",
              "description": "This key toggles whether CloudCannon will allow strings starting with an uppercase letter when parsing snippet parameters.\n\nSetting this key to `true` will allow strings that begin with an uppercase letter in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., strings starting with uppercase are not allowed unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow strings starting with an uppercase letter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              leading_upper: true\n```",
              "markdownDescription": "This key toggles whether CloudCannon will allow strings starting with an uppercase letter when parsing snippet parameters.\n\nSetting this key to `true` will allow strings that begin with an uppercase letter in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., strings starting with uppercase are not allowed unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow strings starting with an uppercase letter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              leading_upper: true\n```"
            },
            "leading_lower": {
              "type": "boolean",
              "documented": true,
              "title": "leading_lower",
              "description": "This key toggles whether CloudCannon will allow strings starting with a lowercase letter when parsing snippet parameters.\n\nSetting this key to `true` will allow strings that begin with a lowercase letter in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., strings starting with lowercase are not allowed unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow strings starting with a lowercase letter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              leading_lower: true\n```",
              "markdownDescription": "This key toggles whether CloudCannon will allow strings starting with a lowercase letter when parsing snippet parameters.\n\nSetting this key to `true` will allow strings that begin with a lowercase letter in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., strings starting with lowercase are not allowed unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow strings starting with a lowercase letter.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              leading_lower: true\n```"
            },
            "lower": {
              "type": "boolean",
              "documented": true,
              "title": "lower",
              "description": "This key toggles whether CloudCannon will allow only lowercase strings when parsing snippet parameters.\n\nSetting this key to `true` will require all characters to be lowercase in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., lowercase-only strings are not required unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow only lowercase strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              lower: true\n```",
              "markdownDescription": "This key toggles whether CloudCannon will allow only lowercase strings when parsing snippet parameters.\n\nSetting this key to `true` will require all characters to be lowercase in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., lowercase-only strings are not required unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow only lowercase strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              lower: true\n```"
            },
            "upper": {
              "type": "boolean",
              "documented": true,
              "title": "upper",
              "description": "This key toggles whether CloudCannon will allow only uppercase strings when parsing snippet parameters.\n\nSetting this key to `true` will require all characters to be uppercase in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., uppercase-only strings are not required unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow only uppercase strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              upper: true\n```",
              "markdownDescription": "This key toggles whether CloudCannon will allow only uppercase strings when parsing snippet parameters.\n\nSetting this key to `true` will require all characters to be uppercase in snippet parameter parsing.\n\nBy default, this key is `false` (i.e., uppercase-only strings are not required unless `any` is enabled).\n\n## Examples\n\nIn this example, we have configured snippet format to allow only uppercase strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              upper: true\n```"
            }
          },
          "markdownDescription": "This key defines which string case types are allowed when parsing snippet parameters.\n\nThe value is an object that can contain `any`, `leading_upper`, `leading_lower`, `lower`, or `upper` properties. Each property is a boolean that enables or disables that case type.\n\n## Examples\n\nIn this example, we have configured snippet format to allow only lowercase strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              lower: true\n```",
          "documented": true,
          "title": "allowed_string_cases",
          "description": "This key defines which string case types are allowed when parsing snippet parameters.\n\nThe value is an object that can contain `any`, `leading_upper`, `leading_lower`, `lower`, or `upper` properties. Each property is a boolean that enables or disables that case type.\n\n## Examples\n\nIn this example, we have configured snippet format to allow only lowercase strings.\n\n```yaml\n_snippets:\n  example:\n    snippet: \"<<example [[param]]>>\"\n    params:\n      param:\n        parser: argument\n        options:\n          format:\n            allowed_string_cases:\n              lower: true\n```",
          "additionalProperties": false
        }
      },
      "markdownDescription": "This key defines formatting options for parsing snippet parameters.\n\nThe value is an object that can contain various options controlling how snippet parameters are parsed, including boundaries, delimiters, allowed value types, and string formatting options.\n\n## Examples\n\nA common option to configure for the\nargument parser is the `string_boundary`:\n\n```yaml\n_snippets:\n  video:\n    snippet: \"<<video [[video_arg]]>>\"\n    params:\n      video_arg:\n        parser: \"argument\"\n        options:\n          model:\n            editor_key: video_id\n          format:\n            string_boundary: ['\"', \"`\"]\n```\n\nThis would make our snippet match `<<video \"CZcNgDN81Sw\">>` or `` <<video `CZcNgDN81Sw`>> `` but not `<<video 'CZcNgDN81Sw'>>` or `<<video CZcNgDN81Sw>>`.\n\nAnother common requirement is specifying `forbidden_tokens`,\nespecially when defining an argument with no string boundary.\n\n```yaml\n_snippets:\n  video:\n    snippet: \"<<video [[video_arg]]>>\"\n    params:\n      video_arg:\n        parser: \"argument\"\n        options:\n          model:\n            editor_key: video_id\n          format:\n            forbidden_tokens:\n              - \">\"\n            string_boundary:\n              - \"\"\n```",
      "documented": true,
      "description": "This key defines formatting options for parsing snippet parameters.\n\nThe value is an object that can contain various options controlling how snippet parameters are parsed, including boundaries, delimiters, allowed value types, and string formatting options.\n\n## Examples\n\nA common option to configure for the\nargument parser is the `string_boundary`:\n\n```yaml\n_snippets:\n  video:\n    snippet: \"<<video [[video_arg]]>>\"\n    params:\n      video_arg:\n        parser: \"argument\"\n        options:\n          model:\n            editor_key: video_id\n          format:\n            string_boundary: ['\"', \"`\"]\n```\n\nThis would make our snippet match `<<video \"CZcNgDN81Sw\">>` or `` <<video `CZcNgDN81Sw`>> `` but not `<<video 'CZcNgDN81Sw'>>` or `<<video CZcNgDN81Sw>>`.\n\nAnother common requirement is specifying `forbidden_tokens`,\nespecially when defining an argument with no string boundary.\n\n```yaml\n_snippets:\n  video:\n    snippet: \"<<video [[video_arg]]>>\"\n    params:\n      video_arg:\n        parser: \"argument\"\n        options:\n          model:\n            editor_key: video_id\n          format:\n            forbidden_tokens:\n              - \">\"\n            string_boundary:\n              - \"\"\n```",
      "additionalProperties": false
    },
    "type.snippet-style": {
      "title": "Snippet Style",
      "type": "object",
      "properties": {
        "output": {
          "type": "string",
          "enum": [
            "legacy",
            "inline",
            "block"
          ],
          "documented": true,
          "title": "output",
          "description": "This key defines the output format style for snippet content.\n\nThe value can be `legacy`, `inline`, or `block`. This controls how snippet content is formatted when output to source code.\n\n## Examples\n\nIn this example, we have configured snippet output style to use block formatting.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            output: block\n```",
          "markdownDescription": "This key defines the output format style for snippet content.\n\nThe value can be `legacy`, `inline`, or `block`. This controls how snippet content is formatted when output to source code.\n\n## Examples\n\nIn this example, we have configured snippet output style to use block formatting.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            output: block\n```"
        },
        "inline": {
          "type": "object",
          "properties": {
            "leading": {
              "type": "string",
              "documented": true,
              "title": "leading",
              "description": "This key defines the leading whitespace string for inline snippet content.\n\nThe value is a string that specifies whitespace tokens (typically spaces) inserted before inline snippet content.\n\n## Examples\n\nIn this example, we have configured inline leading whitespace to use a space.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              leading: ' '\n```",
              "markdownDescription": "This key defines the leading whitespace string for inline snippet content.\n\nThe value is a string that specifies whitespace tokens (typically spaces) inserted before inline snippet content.\n\n## Examples\n\nIn this example, we have configured inline leading whitespace to use a space.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              leading: ' '\n```"
            },
            "trailing": {
              "type": "string",
              "documented": true,
              "title": "trailing",
              "description": "This key defines the trailing whitespace string for inline snippet content.\n\nThe value is a string that specifies whitespace tokens (typically spaces) inserted after inline snippet content.\n\n## Examples\n\nIn this example, we have configured inline trailing whitespace to use a space.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              trailing: ' '\n```",
              "markdownDescription": "This key defines the trailing whitespace string for inline snippet content.\n\nThe value is a string that specifies whitespace tokens (typically spaces) inserted after inline snippet content.\n\n## Examples\n\nIn this example, we have configured inline trailing whitespace to use a space.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              trailing: ' '\n```"
            }
          },
          "markdownDescription": "This key defines inline formatting options for snippet output.\n\nThe value is an object that can contain `leading` and `trailing` properties. These options control whitespace for single-line snippet content.\n\n## Examples\n\nIn this example, we have configured inline formatting with leading and trailing spaces.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              leading: ' '\n              trailing: ' '\n```",
          "documented": true,
          "title": "inline",
          "description": "This key defines inline formatting options for snippet output.\n\nThe value is an object that can contain `leading` and `trailing` properties. These options control whitespace for single-line snippet content.\n\n## Examples\n\nIn this example, we have configured inline formatting with leading and trailing spaces.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              leading: ' '\n              trailing: ' '\n```",
          "additionalProperties": false
        },
        "block": {
          "type": "object",
          "properties": {
            "leading": {
              "type": "string",
              "documented": true,
              "title": "leading",
              "description": "This key defines the leading whitespace string for block-level snippet content.\n\nThe value is a string that specifies whitespace tokens (typically newlines) inserted before block-level snippet content.\n\n## Examples\n\nIn this example, we have configured block leading whitespace to use a newline.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              leading: '\\n'\n```",
              "markdownDescription": "This key defines the leading whitespace string for block-level snippet content.\n\nThe value is a string that specifies whitespace tokens (typically newlines) inserted before block-level snippet content.\n\n## Examples\n\nIn this example, we have configured block leading whitespace to use a newline.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              leading: '\\n'\n```"
            },
            "trailing": {
              "type": "string",
              "documented": true,
              "title": "trailing",
              "description": "This key defines the trailing whitespace string for block-level snippet content.\n\nThe value is a string that specifies whitespace tokens (typically newlines) inserted after block-level snippet content.\n\n## Examples\n\nIn this example, we have configured block trailing whitespace to use a newline.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              trailing: '\\n'\n```",
              "markdownDescription": "This key defines the trailing whitespace string for block-level snippet content.\n\nThe value is a string that specifies whitespace tokens (typically newlines) inserted after block-level snippet content.\n\n## Examples\n\nIn this example, we have configured block trailing whitespace to use a newline.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              trailing: '\\n'\n```"
            },
            "indent": {
              "type": "string",
              "documented": true,
              "title": "indent",
              "description": "This key defines the indentation string used for block-level snippet content.\n\nThe value is a string that specifies the indentation tokens (typically spaces or tabs) applied to each line of block-level snippet content.\n\n## Examples\n\nIn this example, we have configured block indentation to use two spaces.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              indent: '  '\n```",
              "markdownDescription": "This key defines the indentation string used for block-level snippet content.\n\nThe value is a string that specifies the indentation tokens (typically spaces or tabs) applied to each line of block-level snippet content.\n\n## Examples\n\nIn this example, we have configured block indentation to use two spaces.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              indent: '  '\n```"
            }
          },
          "markdownDescription": "This key defines block-level formatting options for snippet output.\n\nThe value is an object that can contain `leading`, `trailing`, and `indent` properties. These options control whitespace and indentation for multi-line snippet content.\n\n## Examples\n\nIn this example, we have configured block formatting with leading, trailing, and indent options.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              leading: '\\n'\n              trailing: '\\n'\n              indent: '  '\n```",
          "documented": true,
          "title": "block",
          "description": "This key defines block-level formatting options for snippet output.\n\nThe value is an object that can contain `leading`, `trailing`, and `indent` properties. These options control whitespace and indentation for multi-line snippet content.\n\n## Examples\n\nIn this example, we have configured block formatting with leading, trailing, and indent options.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            block:\n              leading: '\\n'\n              trailing: '\\n'\n              indent: '  '\n```",
          "additionalProperties": false
        }
      },
      "required": [
        "output"
      ],
      "markdownDescription": "This key defines styling options for snippet output formatting.\n\nThe value is an object that can contain `output`, `inline`, and `block` properties. These options control how snippet content is parsed and formatted to produce cleaner source code.\n\n## Examples\n\nIn this example, we have configured snippet style with inline and block formatting options.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              leading: ' '\n              trailing: ' '\n            block:\n              leading: '\\n'\n              trailing: '\\n'\n              indent: '  '\n```",
      "documented": true,
      "description": "This key defines styling options for snippet output formatting.\n\nThe value is an object that can contain `output`, `inline`, and `block` properties. These options control how snippet content is parsed and formatted to produce cleaner source code.\n\n## Examples\n\nIn this example, we have configured snippet style with inline and block formatting options.\n\n```yaml\n_snippets:\n  highlight:\n    snippet: \"<<highlight>> [[content]] <</highlight>>\"\n    params:\n      content:\n        parser: content\n        options:\n          style:\n            inline:\n              leading: ' '\n              trailing: ' '\n            block:\n              leading: '\\n'\n              trailing: '\\n'\n              indent: '  '\n```",
      "additionalProperties": false
    }
  }
}
