{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://catalog.lintel.tools/schemas/schemastore/cloudcannon-configuration/_shared/latest--cloudcannon-config.latest.schema.json",
  "title": "Configuration",
  "description": "The main CloudCannon configuration.",
  "x-lintel": {
    "source": "https://github.com/cloudcannon/configuration-types/releases/latest/download/cloudcannon-config.latest.schema.json",
    "sourceSha256": "2f9323dac3ff18cb7849773ced4dff3359cef8b3a6daeedb426be1c37dd74417"
  },
  "type": "object",
  "properties": {
    "paths": {
      "allOf": [
        {
          "$ref": "#/$defs/type.paths"
        }
      ],
      "documented": false,
      "title": "paths"
    },
    "version": {
      "$ref": "#/$defs/version"
    },
    "source": {
      "$ref": "#/$defs/source"
    },
    "collections_config": {
      "$ref": "#/$defs/collections_config"
    },
    "collections_config_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "collections_config_from_glob[*]",
        "description": "This key represents an individual glob pattern string in the `collections_config_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.collections.yml`.\n\n## Examples\n\nIn this example, each *Collection* has its own *Configuration File* in the `.cloudcannon/collections/` folder. The value of the `collections_config_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.collections.yml`.\n\n```yaml\ncollections_config_from_glob:\n  - '/.cloudcannon/collections/*.cloudcannon.collections.yml'\n```",
        "markdownDescription": "This key represents an individual glob pattern string in the `collections_config_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.collections.yml`.\n\n## Examples\n\nIn this example, each *Collection* has its own *Configuration File* in the `.cloudcannon/collections/` folder. The value of the `collections_config_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.collections.yml`.\n\n```yaml\ncollections_config_from_glob:\n  - '/.cloudcannon/collections/*.cloudcannon.collections.yml'\n```"
      },
      "documented": true,
      "title": "collections_config_from_glob",
      "description": "This key defines globs that filter which files CloudCannon should use for *Collection* 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.collections.yml`.\n\n## Examples\n\nIn this example, each *Collection* has its own *Configuration File* in the `.cloudcannon/collections/` folder. The value of the `collections_config_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.collections.yml`.\n\n```yaml\ncollections_config_from_glob:\n  - '/.cloudcannon/collections/*.cloudcannon.collections.yml'\n```\n\n```yaml\nposts:\n  path: content/posts\n  icon: event\n```",
      "markdownDescription": "This key defines globs that filter which files CloudCannon should use for *Collection* 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.collections.yml`.\n\n## Examples\n\nIn this example, each *Collection* has its own *Configuration File* in the `.cloudcannon/collections/` folder. The value of the `collections_config_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.collections.yml`.\n\n```yaml\ncollections_config_from_glob:\n  - '/.cloudcannon/collections/*.cloudcannon.collections.yml'\n```\n\n```yaml\nposts:\n  path: content/posts\n  icon: event\n```"
    },
    "collection_groups": {
      "$ref": "#/$defs/collection_groups"
    },
    "base_url": {
      "$ref": "#/$defs/base_url"
    },
    "data_config": {
      "$ref": "#/$defs/data_config"
    },
    "file_config": {
      "$ref": "#/$defs/file_config"
    },
    "editor": {
      "$ref": "#/$defs/editor"
    },
    "source_editor": {
      "$ref": "#/$defs/source_editor"
    },
    "pull_request_templates": {
      "description": "This key defines the Pull Request templates available on your *Site*.\n\nThe value is an array of template objects. Each template object can contain optional `label`, `title`, `body`, `template_path`, and `_inputs` keys.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have two Pull Request templates in the `pull_request_templates` array.\n\n```yaml\npull_request_templates:\n  - label: General changes\n    _inputs:\n      title:\n        options:\n          required: true\n      body:\n        type: markdown\n        options:\n          bold: true\n          italic: true\n          link: true\n          format: p h1 h2 h3\n  - label: Delete content\n    title: Delete content\n    _inputs:\n      title:\n        options:\n          disabled: true\n    template_path: .github/templates/delete-content.md\n```",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "description": "This key defines the name of a Pull Request template, which appears in the dropdown menu on the *Publishing* page.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the name of the Pull Request template in the dropdown menu on the *Publishing* page will be \"Content Update\".\n\n```yaml\npull_request_templates:\n  - label: Content Update\n    title: Updates to...\n    body: In this update, I have made the following changes...\n```",
            "type": "string",
            "documented": true,
            "title": "label",
            "markdownDescription": "This key defines the name of a Pull Request template, which appears in the dropdown menu on the *Publishing* page.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the name of the Pull Request template in the dropdown menu on the *Publishing* page will be \"Content Update\".\n\n```yaml\npull_request_templates:\n  - label: Content Update\n    title: Updates to...\n    body: In this update, I have made the following changes...\n```"
          },
          "title": {
            "description": "This key defines the default value of the \"Title\" field in your Pull Request.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `title` field of our Pull Request template is populated by the string \"Updates to...\" by default.\n\n```yaml\npull_request_templates:\n  - label: Content Update\n    title: Updates to...\n    body: In this update, I have made the following changes...\n```",
            "type": "string",
            "documented": true,
            "title": "title",
            "markdownDescription": "This key defines the default value of the \"Title\" field in your Pull Request.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `title` field of our Pull Request template is populated by the string \"Updates to...\" by default.\n\n```yaml\npull_request_templates:\n  - label: Content Update\n    title: Updates to...\n    body: In this update, I have made the following changes...\n```"
          },
          "body": {
            "description": "This key defines the default value of the \"Body\" field in your Pull Request.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `body` field of our Pull Request template is populated by the string \"In this update, I have made the following changes...\" by default.\n\n```yaml\npull_request_templates:\n  - label: Content Update\n    title: Updates to...\n    body: In this update, I have made the following changes...\n```",
            "type": "string",
            "documented": true,
            "title": "body",
            "markdownDescription": "This key defines the default value of the \"Body\" field in your Pull Request.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `body` field of our Pull Request template is populated by the string \"In this update, I have made the following changes...\" by default.\n\n```yaml\npull_request_templates:\n  - label: Content Update\n    title: Updates to...\n    body: In this update, I have made the following changes...\n```"
          },
          "template_path": {
            "description": "This key defines the path to the file CloudCannon should use as the value of the `body` field in a Pull Request template. This file path must be relative to the root of your repository (i.e., `/`, not the value of `source`). This allows you to create more complex default content for your Pull Request.\n\nCloudCannon will not use the content of this file if the `body` key is also defined for the Pull Request template.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `body` field of our Pull Request template is populated by the contents of `.github/templates/delete-content.md` by default.\n\n```yaml\npull_request_templates:\n  - label: Delete content\n    title: Delete content\n    _inputs:\n      title:\n        options:\n          disabled: true\n    template_path: .github/templates/delete-content.md\n```",
            "type": "string",
            "documented": true,
            "title": "template_path",
            "markdownDescription": "This key defines the path to the file CloudCannon should use as the value of the `body` field in a Pull Request template. This file path must be relative to the root of your repository (i.e., `/`, not the value of `source`). This allows you to create more complex default content for your Pull Request.\n\nCloudCannon will not use the content of this file if the `body` key is also defined for the Pull Request template.\n\nThis key has no default.\n\n## Examples\n\nIn this example, the `body` field of our Pull Request template is populated by the contents of `.github/templates/delete-content.md` by default.\n\n```yaml\npull_request_templates:\n  - label: Delete content\n    title: Delete content\n    _inputs:\n      title:\n        options:\n          disabled: true\n    template_path: .github/templates/delete-content.md\n```"
          },
          "_inputs": {
            "allOf": [
              {
                "$ref": "#/$defs/type._inputs"
              }
            ],
            "documented": false,
            "title": "_inputs"
          }
        },
        "markdownDescription": "This key represents an individual pull request template object in the `pull_request_templates` array.\n\nThe value is an object that defines a template for pull requests. Each template can contain `label`, `title`, `body`, `template_path`, and `_inputs` keys.\n\n## Examples\n\nIn this example, we have configured a Pull Request template with a label, title, body, and input configuration.\n\n```yaml\npull_request_templates:\n  - label: General changes\n    title: Updates to...\n    body: In this update, I have made the following changes...\n    _inputs:\n      title:\n        options:\n          required: true\n      body:\n        type: markdown\n        options:\n          bold: true\n          italic: true\n          link: true\n          format: p h1 h2 h3\n```",
        "documented": true,
        "title": "pull_request_templates[*]",
        "description": "This key represents an individual pull request template object in the `pull_request_templates` array.\n\nThe value is an object that defines a template for pull requests. Each template can contain `label`, `title`, `body`, `template_path`, and `_inputs` keys.\n\n## Examples\n\nIn this example, we have configured a Pull Request template with a label, title, body, and input configuration.\n\n```yaml\npull_request_templates:\n  - label: General changes\n    title: Updates to...\n    body: In this update, I have made the following changes...\n    _inputs:\n      title:\n        options:\n          required: true\n      body:\n        type: markdown\n        options:\n          bold: true\n          italic: true\n          link: true\n          format: p h1 h2 h3\n```",
        "additionalProperties": false
      },
      "documented": true,
      "title": "pull_request_templates",
      "markdownDescription": "This key defines the Pull Request templates available on your *Site*.\n\nThe value is an array of template objects. Each template object can contain optional `label`, `title`, `body`, `template_path`, and `_inputs` keys.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have two Pull Request templates in the `pull_request_templates` array.\n\n```yaml\npull_request_templates:\n  - label: General changes\n    _inputs:\n      title:\n        options:\n          required: true\n      body:\n        type: markdown\n        options:\n          bold: true\n          italic: true\n          link: true\n          format: p h1 h2 h3\n  - label: Delete content\n    title: Delete content\n    _inputs:\n      title:\n        options:\n          disabled: true\n    template_path: .github/templates/delete-content.md\n```"
    },
    "commit_templates": {
      "$ref": "#/$defs/commit_templates"
    },
    "upstream_commit_template": {
      "$ref": "#/$defs/upstream_commit_template"
    },
    "markdown": {
      "$ref": "#/$defs/markdown"
    },
    "timezone": {
      "default": "Etc/UTC",
      "allOf": [
        {
          "$ref": "#/$defs/type.timezone"
        }
      ],
      "documented": false,
      "title": "timezone"
    },
    "_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"
    },
    "_enabled_editors": {
      "$ref": "#/$defs/type._enabled_editors"
    },
    "_editables": {
      "$ref": "#/$defs/type._editables"
    },
    "_editables_from_glob": {
      "allOf": [
        {
          "$ref": "#/$defs/type._editables_from_glob"
        }
      ],
      "documented": false,
      "title": "_editables_from_glob"
    },
    "_snippets": {
      "$ref": "#/$defs/type._snippets"
    },
    "_snippets_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "_snippets_from_glob[*]",
        "description": "This key represents an individual glob pattern string in the `_snippets_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.snippets.yml`.\n\n## Examples\n\nIn this example, each Custom Snippet has its own *Configuration File* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_from_glob` key tells CloudCannon to use the `callout.cloudcannon.snippets.yml` file in that folder.\n\n```yaml\n_snippets_imports:\n  eleventy_liquid: true\n_snippets_from_glob:\n  - '/.cloudcannon/snippets/callout.cloudcannon.snippets.yml'\n```",
        "markdownDescription": "This key represents an individual glob pattern string in the `_snippets_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.snippets.yml`.\n\n## Examples\n\nIn this example, each Custom Snippet has its own *Configuration File* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_from_glob` key tells CloudCannon to use the `callout.cloudcannon.snippets.yml` file in that folder.\n\n```yaml\n_snippets_imports:\n  eleventy_liquid: true\n_snippets_from_glob:\n  - '/.cloudcannon/snippets/callout.cloudcannon.snippets.yml'\n```"
      },
      "documented": true,
      "title": "_snippets_from_glob",
      "description": "This key defines globs that filter which files CloudCannon should use for Snippet 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.snippets.yml`.\n\nYou can use this key anywhere you would use the `_snippets` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, each Custom Snippet has its own *Configuration File* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_from_glob` key tells CloudCannon to use the `callout.cloudcannon.snippets.yml` file in that folder.\n\n```yaml\n_snippets_imports:\n  eleventy_liquid: true\n_snippets_from_glob:\n  - '/.cloudcannon/snippets/callout.cloudcannon.snippets.yml'\n```\n\n```yaml\ncallout:\n  template: eleventy_liquid_include\n  inline: false\n  preview:\n    text: Callout\n  definitions:\n    include_name: callout\n    named_args:\n      - source_key: type\n        editor_key: label\n        type: string\n      - editor_key: message\n        type: string\n  _inputs:\n    label:\n      type: select\n      options:\n        values:\n          - info\n          - warning\n          - error\n```",
      "markdownDescription": "This key defines globs that filter which files CloudCannon should use for Snippet 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.snippets.yml`.\n\nYou can use this key anywhere you would use the `_snippets` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, each Custom Snippet has its own *Configuration File* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_from_glob` key tells CloudCannon to use the `callout.cloudcannon.snippets.yml` file in that folder.\n\n```yaml\n_snippets_imports:\n  eleventy_liquid: true\n_snippets_from_glob:\n  - '/.cloudcannon/snippets/callout.cloudcannon.snippets.yml'\n```\n\n```yaml\ncallout:\n  template: eleventy_liquid_include\n  inline: false\n  preview:\n    text: Callout\n  definitions:\n    include_name: callout\n    named_args:\n      - source_key: type\n        editor_key: label\n        type: string\n      - editor_key: message\n        type: string\n  _inputs:\n    label:\n      type: select\n      options:\n        values:\n          - info\n          - warning\n          - error\n```"
    },
    "_snippets_imports": {
      "allOf": [
        {
          "$ref": "#/$defs/type._snippets_imports"
        }
      ],
      "documented": false,
      "title": "_snippets_imports"
    },
    "_snippets_imports_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "_snippets_imports_from_glob[*]",
        "description": "This key represents an individual glob pattern string in the `_snippets_imports_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.snippets-imports.yml`.\n\n## Examples\n\nIn this example, we have several Snippet *Configuration Files* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_import_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.snippets-import.yml`.\n\n```yaml\n_snippets_imports_from_glob:\n  - '/.cloudcannon/snippets/*.cloudcannon.snippets-imports.yml'\n```",
        "markdownDescription": "This key represents an individual glob pattern string in the `_snippets_imports_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.snippets-imports.yml`.\n\n## Examples\n\nIn this example, we have several Snippet *Configuration Files* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_import_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.snippets-import.yml`.\n\n```yaml\n_snippets_imports_from_glob:\n  - '/.cloudcannon/snippets/*.cloudcannon.snippets-imports.yml'\n```"
      },
      "documented": true,
      "title": "_snippets_imports_from_glob",
      "description": "This key defines globs that filter which files CloudCannon should use for *Collection* 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.snippets-imports.yml`.\n\nYou can use this key anywhere you would use the `_snippets_imports` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several Snippet *Configuration Files* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_import_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.snippets-import.yml`.\n\n```yaml\n_snippets_imports_from_glob:\n  - '/.cloudcannon/snippets/*.cloudcannon.snippets-imports.yml'\n```\n\n```yaml\nmdx: true\ndocusaurus_mdx:\n  exclude:\n    - docusaurus_mdx_truncate\n```",
      "markdownDescription": "This key defines globs that filter which files CloudCannon should use for *Collection* 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.snippets-imports.yml`.\n\nYou can use this key anywhere you would use the `_snippets_imports` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several Snippet *Configuration Files* in the `.cloudcannon/snippets/` folder. The value of the `_snippets_import_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.snippets-import.yml`.\n\n```yaml\n_snippets_imports_from_glob:\n  - '/.cloudcannon/snippets/*.cloudcannon.snippets-imports.yml'\n```\n\n```yaml\nmdx: true\ndocusaurus_mdx:\n  exclude:\n    - docusaurus_mdx_truncate\n```"
    },
    "_snippets_templates": {
      "$ref": "#/$defs/type._snippets_templates"
    },
    "_snippets_templates_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "_snippets_templates_from_glob[*]"
      },
      "documented": true,
      "title": "_snippets_templates_from_glob"
    },
    "_snippets_definitions": {
      "$ref": "#/$defs/type._snippets_definitions"
    },
    "_snippets_definitions_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "_snippets_definitions_from_glob[*]"
      },
      "documented": true,
      "title": "_snippets_definitions_from_glob"
    }
  },
  "additionalProperties": false,
  "markdownDescription": "The main CloudCannon configuration.",
  "documented": false,
  "$defs": {
    "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```"
    },
    "version": {
      "excludeFromDocumentation": true,
      "type": "string",
      "const": "latest",
      "documented": false,
      "title": "version"
    },
    "source": {
      "type": "string",
      "documented": true,
      "title": "source",
      "description": "This key defines the base path for your source files, relative to the root folder of your repository.\n\nUnless you use a nested folder as the source for your Site you can leave this key empty or set it to `/`.\n\nFor more information, please read our documentation on the [Site source](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/#the-source-folder) folder in your configuration file.\n\n## Examples\n\nIn this example, we have configured the source path to `src` so CloudCannon will look for source files in the `src` folder.\n\n```yaml\nsource: src\n```",
      "markdownDescription": "This key defines the base path for your source files, relative to the root folder of your repository.\n\nUnless you use a nested folder as the source for your Site you can leave this key empty or set it to `/`.\n\nFor more information, please read our documentation on the [Site source](https://cloudcannon.com/documentation/articles/what-is-the-cloudcannon-configuration-file/#the-source-folder) folder in your configuration file.\n\n## Examples\n\nIn this example, we have configured the source path to `src` so CloudCannon will look for source files in the `src` folder.\n\n```yaml\nsource: src\n```"
    },
    "collections_config": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "This key defines your Collections.\n\n## Examples\n\nIn this example, we have configured a `blog` Collection. Key settings include two Schemas to populate files with different content, a Blog Tags input populated by a fixed data set, and a custom Create Path to generate file names from structured data.\n\n```yaml\ncollections_config:\n  blog:\n    path: content/blog\n    glob:\n      - '!_index.md'\n    name: Blog\n    icon: post_add\n    url: /blog/[full_slug]/\n    documentation:\n      url: https://example.com/travel-blog-style-guide\n      text: Documentation\n      icon: auto_stories\n    description: |-\n      This Collection is for *Travel blogs* and *Customer stories*.\n\n      If your have any questions, please contact Heather.\n    _editables:\n    _enabled_editors:\n      - content\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: _select_data.blog_topics\n    _select_data:\n      blog_topics:\n        - Opinion\n        - Feature\n        - Resource\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n    disable_add: false\n    disable_add_folder: false\n    disable_file_actions: false\n    schemas:\n      blog:\n        path: schemas/travel_blog.md\n        name: Blog Post\n        icon: post_add\n      customer_story:\n        path: schemas/customer_story.md\n        name: Customer Story\n        icon: post_add\n    schema_key: _blog_template\n    include_developer_files: false\n```\n\nIn this example, we have configured a `team` Collection. Key settings include custom sorting options, add options, and Card previews.\n\n```yaml\ncollections_config:\n  team:\n    path: _data/team\n    name: Our Team\n    singular_name: Team Member\n    icon: groups\n    disable_url: true\n    description: |-\n      This Collection has a file for every member of our team!\n    preview:\n      text:\n        - key: name\n      subtext:\n        - key: job_title\n      icon:\n        - key: profile_picture\n    sort:\n      key: name\n      order: ascending\n    sort_options:\n      - key: name\n        order: ascending\n        label: Name (A-Z)\n      - key: name\n        order: descending\n        label: Name (Z-A)\n      - key: job_title\n        order: ascending\n        label: Job Title (A-Z)\n      - key: date\n        order: descending\n        label: Job Title (Z-A)\n    _enabled_editors:\n      - data\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n    schemas:\n      manager:\n        path: schemas/manager.yml\n        name: Manager\n        icon: face\n      employee:\n        path: schemas/employee.yml\n        name: Employee\n        icon: support_agent\n```",
      "documented": true,
      "title": "collections_config",
      "description": "This key defines your Collections.\n\n## Examples\n\nIn this example, we have configured a `blog` Collection. Key settings include two Schemas to populate files with different content, a Blog Tags input populated by a fixed data set, and a custom Create Path to generate file names from structured data.\n\n```yaml\ncollections_config:\n  blog:\n    path: content/blog\n    glob:\n      - '!_index.md'\n    name: Blog\n    icon: post_add\n    url: /blog/[full_slug]/\n    documentation:\n      url: <https://example.com/travel-blog-style-guide>\n      text: Documentation\n      icon: auto_stories\n    description: |-\n      This Collection is for *Travel blogs* and *Customer stories*.\n\n      If your have any questions, please contact Heather.\n    _editables:\n    _enabled_editors:\n      - content\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: _select_data.blog_topics\n    _select_data:\n      blog_topics:\n        - Opinion\n        - Feature\n        - Resource\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n    disable_add: false\n    disable_add_folder: false\n    disable_file_actions: false\n    schemas:\n      blog:\n        path: schemas/travel_blog.md\n        name: Blog Post\n        icon: post_add\n      customer_story:\n        path: schemas/customer_story.md\n        name: Customer Story\n        icon: post_add\n    schema_key: _blog_template\n    include_developer_files: false\n```\n\nIn this example, we have configured a `team` Collection. Key settings include custom sorting options, add options, and Card previews.\n\n```yaml\ncollections_config:\n  team:\n    path: _data/team\n    name: Our Team\n    singular_name: Team Member\n    icon: groups\n    disable_url: true\n    description: |-\n      This Collection has a file for every member of our team!\n    preview:\n      text:\n        - key: name\n      subtext:\n        - key: job_title\n      icon:\n        - key: profile_picture\n    sort:\n      key: name\n      order: ascending\n    sort_options:\n      - key: name\n        order: ascending\n        label: Name (A-Z)\n      - key: name\n        order: descending\n        label: Name (Z-A)\n      - key: job_title\n        order: ascending\n        label: Job Title (A-Z)\n      - key: date\n        order: descending\n        label: Job Title (Z-A)\n    _enabled_editors:\n      - data\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n    schemas:\n      manager:\n        path: schemas/manager.yml\n        name: Manager\n        icon: face\n      employee:\n        path: schemas/employee.yml\n        name: Employee\n        icon: support_agent\n```",
      "additionalProperties": {
        "$ref": "#/$defs/collections_config.*"
      }
    },
    "collections_config.*": {
      "type": "object",
      "properties": {
        "path": {
          "$ref": "#/$defs/path"
        },
        "glob": {
          "$ref": "#/$defs/glob"
        },
        "url": {
          "description": "This key defines the output URL for files in a given Collection.\n\nCloudCannon uses the output URL in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/), and on your [Testing\nDomain](https://cloudcannon.com/documentation/articles/what-is-a-testing-domain/) and [Custom Domain](https://cloudcannon.com/documentation/articles/what-is-a-custom-domain/).\n\nValues for this key can be a mix of plain text and template strings, and should begin and end with the `/` character.\n\nTemplate strings can contain data placeholders and fixed placeholders, which CloudCannon will replace with the data it references when generating the\noutput URL.\n\n> For more information about data placeholders and fixed placeholders, please read our documentation on [configuring your template\nstrings](https://cloudcannon.com/documentation/articles/configure-your-template-strings/).\n\n## Examples\n\nIn this example, the output URL for files in this Collection will be `/travel/` rather than the default `/blog/`.\n\n```yaml\ncollections_config:\n  blog:\n    url: /travel/[slug]/\n```",
          "type": "string",
          "documented": true,
          "title": "url",
          "markdownDescription": "This key defines the output URL for files in a given Collection.\n\nCloudCannon uses the output URL in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/), and on your [Testing\nDomain](https://cloudcannon.com/documentation/articles/what-is-a-testing-domain/) and [Custom Domain](https://cloudcannon.com/documentation/articles/what-is-a-custom-domain/).\n\nValues for this key can be a mix of plain text and template strings, and should begin and end with the `/` character.\n\nTemplate strings can contain data placeholders and fixed placeholders, which CloudCannon will replace with the data it references when generating the\noutput URL.\n\n> For more information about data placeholders and fixed placeholders, please read our documentation on [configuring your template\nstrings](https://cloudcannon.com/documentation/articles/configure-your-template-strings/).\n\n## Examples\n\nIn this example, the output URL for files in this Collection will be `/travel/` rather than the default `/blog/`.\n\n```yaml\ncollections_config:\n  blog:\n    url: /travel/[slug]/\n```"
        },
        "disable_url": {
          "description": "This key toggles whether CloudCannon will generate an output URL for a given Collection.\n\nSetting this key to `true` will prevent CloudCannon from generating an output URL for a Collection.\n\n## Examples\n\nIn this example, `data` is an non-output Collection and we don't want output URLs generated.\n\n```yaml\ncollections_config:\n  data:\n    disable_url: true\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "disable_url",
          "markdownDescription": "This key toggles whether CloudCannon will generate an output URL for a given Collection.\n\nSetting this key to `true` will prevent CloudCannon from generating an output URL for a Collection.\n\n## Examples\n\nIn this example, `data` is an non-output Collection and we don't want output URLs generated.\n\n```yaml\ncollections_config:\n  data:\n    disable_url: true\n```"
        },
        "include_developer_files": {
          "description": "This key toggles whether CloudCannon removes developer files from your *Collection browser*. CloudCannon excludes files that probably shouldn't be edited in a CMS from your *Collection browser*, for example files like `README.md` or\n`package.json`. CloudCannon excludes these files even if you have configured globs to allow them.\n\nSetting this key to `true` will allow CloudCannon to show developer files,\nassuming they are not filtered out by any configured\n[globs](https://cloudcannon.com/documentation/developer-reference/configuration-file/collections_config/*/glob/). \n\n## Examples\n\nIn this example, we want to see developer files in the *Collection browser* for the `data` Collection.\n\n```yaml\ncollections_config:\n  data:\n    include_developer_files: true\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "include_developer_files",
          "markdownDescription": "This key toggles whether CloudCannon removes developer files from your *Collection browser*. CloudCannon excludes files that probably shouldn't be edited in a CMS from your *Collection browser*, for example files like `README.md` or\n`package.json`. CloudCannon excludes these files even if you have configured globs to allow them.\n\nSetting this key to `true` will allow CloudCannon to show developer files,\nassuming they are not filtered out by any configured\n[globs](https://cloudcannon.com/documentation/developer-reference/configuration-file/collections_config/*/glob/). \n\n## Examples\n\nIn this example, we want to see developer files in the *Collection browser* for the `data` Collection.\n\n```yaml\ncollections_config:\n  data:\n    include_developer_files: true\n```"
        },
        "name": {
          "description": "This key defines the display name for a Collection.\n\nThe name appears in the *Site Navigation* and at the top of the *Collection browser*.\n\nChanging the display name does not affect the Collection key name.\n\nBy default, CloudCannon uses the Collection key name in title case (i.e., `blog_files` becomes \"Blog Files\").\n\n## Examples\n\nIn this example, CloudCannon will call the `blog` Collection \"Travel Blog\" in the *Site Navigation* and the *Collection browser*.\n\n```yaml\ncollections_config:\n  blog:\n    name: Travel Blog\n```",
          "type": "string",
          "documented": true,
          "title": "name",
          "markdownDescription": "This key defines the display name for a Collection.\n\nThe name appears in the *Site Navigation* and at the top of the *Collection browser*.\n\nChanging the display name does not affect the Collection key name.\n\nBy default, CloudCannon uses the Collection key name in title case (i.e., `blog_files` becomes \"Blog Files\").\n\n## Examples\n\nIn this example, CloudCannon will call the `blog` Collection \"Travel Blog\" in the *Site Navigation* and the *Collection browser*.\n\n```yaml\ncollections_config:\n  blog:\n    name: Travel Blog\n```"
        },
        "description": {
          "description": "This key defines the description text that appears on the *Collection browser* page.\n\nCollection descriptions are useful for adding extra context for your team members.\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 have configured a description for the `blog` Collection with markdown formatting.\n\n```yaml\ncollections_config:\n  blog:\n    description:|-\n      This Collection is for *Travel blogs* and *Customer stories*.\n\n      If your have any questions, please contact Heather.\n```",
          "type": "string",
          "documented": true,
          "title": "description",
          "markdownDescription": "This key defines the description text that appears on the *Collection browser* page.\n\nCollection descriptions are useful for adding extra context for your team members.\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 have configured a description for the `blog` Collection with markdown formatting.\n\n```yaml\ncollections_config:\n  blog:\n    description:|-\n      This Collection is for *Travel blogs* and *Customer stories*.\n\n      If your have any questions, please contact Heather.\n```"
        },
        "icon": {
          "description": "This key defines the icon for a Collection.\n\nCollection icons appear in the *Site Navigation* and are the default icon for Collection file [Cards](https://cloudcannon.com/documentation/articles/configure-your-card-previews/) if you have not defined `preview.icon`.\n\nFor more information about the preview icon, please read our documentation on the [preview](https://cloudcannon.com/documentation/articles/configure-your-card-previews/)\nkey.\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 `post_add` icon for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    icon: post_add\n```",
          "default": "notes",
          "allOf": [
            {
              "$ref": "#/$defs/icon"
            }
          ],
          "documented": true,
          "title": "icon",
          "markdownDescription": "This key defines the icon for a Collection.\n\nCollection icons appear in the *Site Navigation* and are the default icon for Collection file [Cards](https://cloudcannon.com/documentation/articles/configure-your-card-previews/) if you have not defined `preview.icon`.\n\nFor more information about the preview icon, please read our documentation on the [preview](https://cloudcannon.com/documentation/articles/configure-your-card-previews/)\nkey.\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 `post_add` icon for the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    icon: post_add\n```"
        },
        "documentation": {
          "description": "This key defines the documentation link at the top of a _Collection browser_. Collection documentation is useful for assisting your team members.",
          "allOf": [
            {
              "$ref": "#/$defs/type.documentation"
            }
          ],
          "documented": false,
          "title": "documentation",
          "markdownDescription": "This key defines the documentation link at the top of a _Collection browser_. Collection documentation is useful for assisting your team members."
        },
        "sort_options": {
          "description": "This key defines the options for the *Sort* dropdown in a *Collection browser*.\n\nConfiguring sort options for a Collection will remove CloudCannon's default sorting options from the *Sort* dropdown.\n\nBy default, CloudCannon provides sorting options for path, file size, file creation time, and last modified, in ascending and descending order.\n\nCloudCannon will also read data keys from your early Collection files and provide options to sort by those key values.\n\n## Examples\n\nIn this example, the *Sort* dropdown in the `blog` *Collection browser* only contains options for sorting by `author` and `date` in ascending and descending order.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n      - key: author\n        order: descending\n        label: Author (Z-A)\n      - key: date\n        order: ascending\n        label: Date (Newest First)\n      - key: date\n        order: descending\n        label: Date (Oldest First)\n```",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "label": {
                "description": "This key defines the label used for a file sorting option in the *Sort* dropdown.\n\n## Examples\n\nIn this example, the sorting method which uses the `author` key is called \"Author (A-Z)\" in the *Sort* dropdown.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n```",
                "type": "string",
                "documented": true,
                "title": "label",
                "markdownDescription": "This key defines the label used for a file sorting option in the *Sort* dropdown.\n\n## Examples\n\nIn this example, the sorting method which uses the `author` key is called \"Author (A-Z)\" in the *Sort* dropdown.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n```"
              },
              "key": {
                "type": "string",
                "description": "This key defines which key an option in the *Sort* dropdown should use to sort files in your *Collection browser*.\n\nYou must define this key for every entry in the `sort_options` array for the object to function.\n\nValue must be the name of a structured data key in your Collection files.\n\nIf some files in your Collection do not have this data key, CloudCannon will sort those in ascending alphabetical order, after the file sorted by your\ndata key in the *Collection browser*.\n\n## Examples\n\nIn this example, the \"Author (A-Z)\" option in the *Sort* dropdown will use the `author` key to sort files in the `blog` *Collection browser*.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n```",
                "documented": true,
                "title": "key",
                "markdownDescription": "This key defines which key an option in the *Sort* dropdown should use to sort files in your *Collection browser*.\n\nYou must define this key for every entry in the `sort_options` array for the object to function.\n\nValue must be the name of a structured data key in your Collection files.\n\nIf some files in your Collection do not have this data key, CloudCannon will sort those in ascending alphabetical order, after the file sorted by your\ndata key in the *Collection browser*.\n\n## Examples\n\nIn this example, the \"Author (A-Z)\" option in the *Sort* dropdown will use the `author` key to sort files in the `blog` *Collection browser*.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n```"
              },
              "order": {
                "description": "This key defines which order an option in the *Sort* dropdown should use to sort files in your *Collection browser*.\n\nCloudCannon will sort files according to the value of `sort_options[*].key` for each option in the *Sort* dropdown.\n\n## Examples\n\nIn this example, the \"Author (A-Z)\" option in the *Sort* dropdown will sort files in the `blog` *Collection browser* in ascending order.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n```",
                "default": "ascending",
                "type": "string",
                "enum": [
                  "ascending",
                  "descending",
                  "asc",
                  "desc"
                ],
                "documented": true,
                "title": "order",
                "markdownDescription": "This key defines which order an option in the *Sort* dropdown should use to sort files in your *Collection browser*.\n\nCloudCannon will sort files according to the value of `sort_options[*].key` for each option in the *Sort* dropdown.\n\n## Examples\n\nIn this example, the \"Author (A-Z)\" option in the *Sort* dropdown will sort files in the `blog` *Collection browser* in ascending order.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n```"
              }
            },
            "required": [
              "key"
            ],
            "markdownDescription": "This key represents a sort option for a Collection.",
            "title": "SortOption",
            "description": "This key represents a sort option for a Collection.",
            "documented": true,
            "additionalProperties": false
          },
          "documented": true,
          "title": "sort_options",
          "markdownDescription": "This key defines the options for the *Sort* dropdown in a *Collection browser*.\n\nConfiguring sort options for a Collection will remove CloudCannon's default sorting options from the *Sort* dropdown.\n\nBy default, CloudCannon provides sorting options for path, file size, file creation time, and last modified, in ascending and descending order.\n\nCloudCannon will also read data keys from your early Collection files and provide options to sort by those key values.\n\n## Examples\n\nIn this example, the *Sort* dropdown in the `blog` *Collection browser* only contains options for sorting by `author` and `date` in ascending and descending order.\n\n```yaml\ncollections_config:\n  blog:\n    sort_options:\n      - key: author\n        order: ascending\n        label: Author (A-Z)\n      - key: author\n        order: descending\n        label: Author (Z-A)\n      - key: date\n        order: ascending\n        label: Date (Newest First)\n      - key: date\n        order: descending\n        label: Date (Oldest First)\n```"
        },
        "view_options": {
          "uniqueItems": true,
          "description": "This key defines the options for the View dropdown in the *Collection browser*.\n\nThe value is an array of view option strings. The first option listed is used as the default view.\n\n## Examples\n\nIn this example, we have configured three view options for the `developer_articles` Collection, with `card` as the default view.\n\n```yaml\ncollections_config:\n  developer_articles:\n    path: developer/articles\n    icon: article\n    view_options:\n      - card\n      - list\n      - gallery\n```",
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "card",
              "list",
              "gallery"
            ],
            "documented": true,
            "title": "view_options[*]",
            "description": "This key represents an individual view option string in the `collections_config.*.view_options` array.\n\nThe value is a string that specifies a view option for the View dropdown in the *Collection browser*. The first option listed is used as the default view.\n\n## Examples\n\nIn this example, we have configured a view option for the `developer_articles` Collection.\n\n```yaml\ncollections_config:\n  developer_articles:\n    path: developer/articles\n    icon: article\n    view_options:\n      - card\n```",
            "markdownDescription": "This key represents an individual view option string in the `collections_config.*.view_options` array.\n\nThe value is a string that specifies a view option for the View dropdown in the *Collection browser*. The first option listed is used as the default view.\n\n## Examples\n\nIn this example, we have configured a view option for the `developer_articles` Collection.\n\n```yaml\ncollections_config:\n  developer_articles:\n    path: developer/articles\n    icon: article\n    view_options:\n      - card\n```"
          },
          "documented": true,
          "title": "view_options",
          "markdownDescription": "This key defines the options for the View dropdown in the *Collection browser*.\n\nThe value is an array of view option strings. The first option listed is used as the default view.\n\n## Examples\n\nIn this example, we have configured three view options for the `developer_articles` Collection, with `card` as the default view.\n\n```yaml\ncollections_config:\n  developer_articles:\n    path: developer/articles\n    icon: article\n    view_options:\n      - card\n      - list\n      - gallery\n```"
        },
        "singular_name": {
          "description": "This key defines the singular noun for your Collection name.\n\nCloudCannon uses the singular noun in the *\\+ Add* button in the top right of the *Collection browser* when you select the option to add a new file.\n\nThis is useful if your Collection name is an irregular plural (e.g., \"syllabi\" or \"syllabuses\" to \"syllabus\").\n\n## Examples\n\nIn this example, the *\\+ Add* button option to add a Collection file will read \"Add Team Member\" rather that \"Add Team\".\n\n```yaml\ncollections_config:\n  team:\n    singular_name: Team Member\n```",
          "type": "string",
          "documented": true,
          "title": "singular_name",
          "markdownDescription": "This key defines the singular noun for your Collection name.\n\nCloudCannon uses the singular noun in the *\\+ Add* button in the top right of the *Collection browser* when you select the option to add a new file.\n\nThis is useful if your Collection name is an irregular plural (e.g., \"syllabi\" or \"syllabuses\" to \"syllabus\").\n\n## Examples\n\nIn this example, the *\\+ Add* button option to add a Collection file will read \"Add Team Member\" rather that \"Add Team\".\n\n```yaml\ncollections_config:\n  team:\n    singular_name: Team Member\n```"
        },
        "add_options": {
          "description": "This key defines the options available in the *\\+ Add* button dropdown at the top right of your *Collection browser*.\n\nConfiguring add options for a Collection will remove CloudCannon's default \"Add a file\" option from the *\\+ Add* button dropdown.\n\nAdditionally, any Schemas you have configured for a Collection will also appear in the *\\+ Add* dropdown.\n\n## Examples\n\nIn this example, we have configured two standard add options for the `people` Collection. The first option uses the `employee` Schema, and the second option uses the `contractor` Schema and opens files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n      - name: Add Contractor\n        icon: support_agent\n        schema: contractor\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n      contractor:\n        path: /.cloudcannon/schemas/contractor.yml\n```\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* has a link to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```",
          "type": "array",
          "items": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "name": {
                    "description": "This key defines the text displayed for a standard add option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies the label text for the menu item.\n\nBy default, this key uses the name of the matching Schema if `add_options.schema` is configured. Otherwise, this key has no default value.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection with the custom name \"Add Staff Member\".\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```",
                    "type": "string",
                    "documented": true,
                    "title": "name",
                    "markdownDescription": "This key defines the text displayed for a standard add option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies the label text for the menu item.\n\nBy default, this key uses the name of the matching Schema if `add_options.schema` is configured. Otherwise, this key has no default value.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection with the custom name \"Add Staff Member\".\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```"
                  },
                  "icon": {
                    "description": "This key defines the icon displayed next to the text for a standard add option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies an icon name from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded).\n\nBy default, this key uses the icon of the matching Schema if `add_options.schema` is configured. Otherwise, this key defaults to `add`.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection with the custom icon `support_agent`.\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Contractor\n        icon: support_agent\n        schema: contractor\n        editor: data\n    schemas:\n      contractor:\n        path: /.cloudcannon/schemas/contractor.yml\n```",
                    "allOf": [
                      {
                        "$ref": "#/$defs/icon"
                      }
                    ],
                    "documented": true,
                    "title": "icon",
                    "markdownDescription": "This key defines the icon displayed next to the text for a standard add option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies an icon name from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded).\n\nBy default, this key uses the icon of the matching Schema if `add_options.schema` is configured. Otherwise, this key defaults to `add`.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection with the custom icon `support_agent`.\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Contractor\n        icon: support_agent\n        schema: contractor\n        editor: data\n    schemas:\n      contractor:\n        path: /.cloudcannon/schemas/contractor.yml\n```"
                  },
                  "editor": {
                    "description": "This key defines which editing interface CloudCannon will use when you select an option from the *\\+ Add* button dropdown.\n\nValues can be one of the following: `visual`, `content`, or `data`.\n\nBy default, CloudCannon will open the new file in an appropriate editing interface for that file type.\n\nIf CloudCannon cannot determine an appropriate editing interface, it will show a warning.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that opens new files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```",
                    "allOf": [
                      {
                        "$ref": "#/$defs/EditorKey"
                      }
                    ],
                    "documented": true,
                    "title": "editor",
                    "markdownDescription": "This key defines which editing interface CloudCannon will use when you select an option from the *\\+ Add* button dropdown.\n\nValues can be one of the following: `visual`, `content`, or `data`.\n\nBy default, CloudCannon will open the new file in an appropriate editing interface for that file type.\n\nIf CloudCannon cannot determine an appropriate editing interface, it will show a warning.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that opens new files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```"
                  },
                  "base_path": {
                    "description": "This key defines a path for files created using an option in the *\\+ Add* button dropdown.\n\nThis path overrides the path for the current Collection and subfolder open in the *Collection browser*.\n\nThis key is useful if you need to specify a specific subfolder within a Collection.\n\n## Examples\n\nIn this example, we want team members in the `_posts` Collection to create new files in the`blog` subfolder of the `_drafts` Collection rather than the current *Collection browser* they have open. By configuring the `base_path` value to `/../_drafts/blog`, new files will be created in a different Collection subfolder (i.e., `_drafts`) when a team member selects this option from the *\\+ Add* button dropdown.\n\n```yaml\ncollections_config:\n  _posts:\n    add_options:\n      - name: Add draft blog\n        icon: post_add\n        editor: content\n        base_path: /../_drafts/blog\n```",
                    "type": "string",
                    "documented": true,
                    "title": "base_path",
                    "markdownDescription": "This key defines a path for files created using an option in the *\\+ Add* button dropdown.\n\nThis path overrides the path for the current Collection and subfolder open in the *Collection browser*.\n\nThis key is useful if you need to specify a specific subfolder within a Collection.\n\n## Examples\n\nIn this example, we want team members in the `_posts` Collection to create new files in the`blog` subfolder of the `_drafts` Collection rather than the current *Collection browser* they have open. By configuring the `base_path` value to `/../_drafts/blog`, new files will be created in a different Collection subfolder (i.e., `_drafts`) when a team member selects this option from the *\\+ Add* button dropdown.\n\n```yaml\ncollections_config:\n  _posts:\n    add_options:\n      - name: Add draft blog\n        icon: post_add\n        editor: content\n        base_path: /../_drafts/blog\n```"
                  },
                  "collection": {
                    "description": "This key defines the Collection for files created using an option in the *\\+ Add* button dropdown.\n\nThis Collections overrides the current Collection open in the *Collection browser*.\n\nThe value for this key should be the key name of a Collection.\n\nBy default, this key is the current Collection open in the *Collection browser*.\n\n## Examples\n\nIn this example, we want team members in the articles Collection to create new files in the `new_articles` Collection rather than the current Collection browser they have open. By configuring the `collection` value to `new_articles`, new files will be created in a different Collection (i.e., `new_articles`) when a team member selects this option from the + Add button dropdown.\n\n```yaml\ncollections_config:\n  articles:\n    add_options:\n      - name: Add articles\n        collection: new_articles\n        schema: articles\n```",
                    "type": "string",
                    "documented": true,
                    "title": "collection",
                    "markdownDescription": "This key defines the Collection for files created using an option in the *\\+ Add* button dropdown.\n\nThis Collections overrides the current Collection open in the *Collection browser*.\n\nThe value for this key should be the key name of a Collection.\n\nBy default, this key is the current Collection open in the *Collection browser*.\n\n## Examples\n\nIn this example, we want team members in the articles Collection to create new files in the `new_articles` Collection rather than the current Collection browser they have open. By configuring the `collection` value to `new_articles`, new files will be created in a different Collection (i.e., `new_articles`) when a team member selects this option from the + Add button dropdown.\n\n```yaml\ncollections_config:\n  articles:\n    add_options:\n      - name: Add articles\n        collection: new_articles\n        schema: articles\n```"
                  },
                  "schema": {
                    "description": "This key defines which *Schema* CloudCannon should use to populate a file created with a standard add option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies the key name of a *Schema* defined in `schemas` to use as the default content for the new file.\n\nConfiguring this key will override `add_options.default_content_file`.\n\nBy default, this key uses the default *Schema* in the Collection configured in `add_options.collection` (or the containing collection if `collection` is not specified), if *Schemas* are configured for that collection. Otherwise, this key has no default value.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that uses the `employee` *Schema* to populate new files.\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```",
                    "type": "string",
                    "documented": true,
                    "title": "schema",
                    "markdownDescription": "This key defines which *Schema* CloudCannon should use to populate a file created with a standard add option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies the key name of a *Schema* defined in `schemas` to use as the default content for the new file.\n\nConfiguring this key will override `add_options.default_content_file`.\n\nBy default, this key uses the default *Schema* in the Collection configured in `add_options.collection` (or the containing collection if `collection` is not specified), if *Schemas* are configured for that collection. Otherwise, this key has no default value.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that uses the `employee` *Schema* to populate new files.\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```"
                  },
                  "default_content_file": {
                    "description": "This key defines which file CloudCannon should use to populate a file created with an option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies a file path relative to the root of your repository. This file is used to populate the initial contents of a new file if the Collection defined in `add_options.collection` has no Schemas configured.\n\nThe `add_options.schema` key will override `default_content_file` if configured.\n\n## Examples\n\nIn this example, we want CloudCannon to populate the initial contents of new files with `event_template.yml`.\n\n```yaml\ncollections_config:\n  events:\n    add_options:\n      name: Add new event\n      collection: upcoming_events\n      default_content_file: event_template.yml\n```",
                    "type": "string",
                    "documented": true,
                    "title": "default_content_file",
                    "markdownDescription": "This key defines which file CloudCannon should use to populate a file created with an option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies a file path relative to the root of your repository. This file is used to populate the initial contents of a new file if the Collection defined in `add_options.collection` has no Schemas configured.\n\nThe `add_options.schema` key will override `default_content_file` if configured.\n\n## Examples\n\nIn this example, we want CloudCannon to populate the initial contents of new files with `event_template.yml`.\n\n```yaml\ncollections_config:\n  events:\n    add_options:\n      name: Add new event\n      collection: upcoming_events\n      default_content_file: event_template.yml\n```"
                  }
                },
                "markdownDescription": "This key represents the standard add option entry in a `collections_config.*.add_options` array.\n\nThe value is an object that defines an option available in the *+ Add* button dropdown at the top right of the *Collection browser*. Standard add options can contain optional `name`, `icon`, `editor`, `base_path`, `collection`, `schema`, and `default_content_file` keys.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that uses the `employee` Schema and opens files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```",
                "title": "Add Option",
                "description": "This key represents the standard add option entry in a `collections_config.*.add_options` array.\n\nThe value is an object that defines an option available in the *+ Add* button dropdown at the top right of the *Collection browser*. Standard add options can contain optional `name`, `icon`, `editor`, `base_path`, `collection`, `schema`, and `default_content_file` keys.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that uses the `employee` Schema and opens files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```",
                "documented": true,
                "additionalProperties": false
              },
              {
                "type": "object",
                "properties": {
                  "name": {
                    "description": "This key defines the text displayed for a URL option in the *\\+ Add* button dropdown.\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* uses a link option with the text \"Office Locations\" to navigate to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```",
                    "type": "string",
                    "documented": true,
                    "title": "name",
                    "markdownDescription": "This key defines the text displayed for a URL option in the *\\+ Add* button dropdown.\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* uses a link option with the text \"Office Locations\" to navigate to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```"
                  },
                  "icon": {
                    "description": "This key defines the icon displayed next to the text for a URL option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies an icon name from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded).\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* uses a link option with the icon `map` to navigate to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```",
                    "default": "add",
                    "allOf": [
                      {
                        "$ref": "#/$defs/icon"
                      }
                    ],
                    "documented": true,
                    "title": "icon",
                    "markdownDescription": "This key defines the icon displayed next to the text for a URL option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies an icon name from [Google's Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded).\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* uses a link option with the icon `map` to navigate to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```"
                  },
                  "href": {
                    "type": "string",
                    "description": "This key defines the link for a URL option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies a URL. Values can be an external URL or an internal URL relative to the current Site.\n\nThis key is required for URL add options in the `collections_config.*.add_options` array.\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* uses a link option with the URL `<https://forms.gle/xxxxxxx>`.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Submit Form\n        icon: assignment_add\n        href: <https://forms.gle/xxxxxxx>\n```",
                    "documented": true,
                    "title": "href",
                    "markdownDescription": "This key defines the link for a URL option in the *\\+ Add* button dropdown.\n\nThe value is a string that specifies a URL. Values can be an external URL or an internal URL relative to the current Site.\n\nThis key is required for URL add options in the `collections_config.*.add_options` array.\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* uses a link option with the URL `https://forms.gle/xxxxxxx`.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Submit Form\n        icon: assignment_add\n        href: https://forms.gle/xxxxxxx\n```"
                  }
                },
                "required": [
                  "href"
                ],
                "markdownDescription": "This key represents the URL add option object in a `collections_config.*.add_options` array.\n\nThe value is an object that defines an option available in the *+ Add* button dropdown at the top right of the *Collection browser*. URL add options must contain a required `href` key and can contain optional `name` and `icon` keys.\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* has a link to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```",
                "title": "HREF Add Option",
                "description": "This key represents the URL add option object in a `collections_config.*.add_options` array.\n\nThe value is an object that defines an option available in the *+ Add* button dropdown at the top right of the *Collection browser*. URL add options must contain a required `href` key and can contain optional `name` and `icon` keys.\n\n## Examples\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* has a link to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```",
                "documented": true,
                "additionalProperties": false
              }
            ],
            "documented": true,
            "title": "add_options[*]",
            "description": "This key represents an individual add option object in the `collections_config.*.add_options` array.\n\nThe value is an object that defines an option available in the *+ Add* button dropdown at the top right of the *Collection browser*. Each add option can be a standard entry or a URL entry, each with their own properties.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that uses the `employee` Schema and opens files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* has a link to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```",
            "markdownDescription": "This key represents an individual add option object in the `collections_config.*.add_options` array.\n\nThe value is an object that defines an option available in the *+ Add* button dropdown at the top right of the *Collection browser*. Each add option can be a standard entry or a URL entry, each with their own properties.\n\n## Examples\n\nIn this example, we have configured a standard add option for the `people` Collection that uses the `employee` Schema and opens files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n```\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* has a link to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```"
          },
          "documented": true,
          "title": "add_options",
          "markdownDescription": "This key defines the options available in the *\\+ Add* button dropdown at the top right of your *Collection browser*.\n\nConfiguring add options for a Collection will remove CloudCannon's default \"Add a file\" option from the *\\+ Add* button dropdown.\n\nAdditionally, any Schemas you have configured for a Collection will also appear in the *\\+ Add* dropdown.\n\n## Examples\n\nIn this example, we have configured two standard add options for the `people` Collection. The first option uses the `employee` Schema, and the second option uses the `contractor` Schema and opens files in the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/).\n\n```yaml\ncollections_config:\n  people:\n    add_options:\n      - name: Add Staff Member\n        schema: employee\n        icon: face\n        editor: data\n      - name: Add Contractor\n        icon: support_agent\n        schema: contractor\n        editor: data\n    schemas:\n      employee:\n        path: /.cloudcannon/schemas/employee.yml\n      contractor:\n        path: /.cloudcannon/schemas/contractor.yml\n```\n\nIn this example, the *\\+ Add* button dropdown in the `team` *Collection browser* has a link to the Office Locations page on our live website.\n\n```yaml\ncollections_config:\n  team:\n    add_options:\n      - name: Office Locations\n        icon: map\n        href: /our-offices\n```"
        },
        "create": {
          "allOf": [
            {
              "$ref": "#/$defs/type.create"
            }
          ],
          "documented": false,
          "title": "create"
        },
        "disable_add": {
          "description": "This key toggles whether team members can use the *+ Add* button in the top right of the *Collection browser* to add files to a Collection.\n\nSetting this key to `true` will prevent team members from adding new files through the *Collection browser*. This key does not affect your ability to add files using the *File browser*.\n\nIf both `disable_add` and `disable_add_folder` are set to `true`, the *\\+ Add* button will not\nappear in the top right of the *Collection browser*.\n\n## Examples\n\nIn this example, we want to prevent team members from adding new files to the `data` Collection through the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    disable_add: true\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "disable_add",
          "markdownDescription": "This key toggles whether team members can use the *+ Add* button in the top right of the *Collection browser* to add files to a Collection.\n\nSetting this key to `true` will prevent team members from adding new files through the *Collection browser*. This key does not affect your ability to add files using the *File browser*.\n\nIf both `disable_add` and `disable_add_folder` are set to `true`, the *\\+ Add* button will not\nappear in the top right of the *Collection browser*.\n\n## Examples\n\nIn this example, we want to prevent team members from adding new files to the `data` Collection through the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    disable_add: true\n```"
        },
        "disable_add_folder": {
          "description": "This key toggles whether team members can use the *\\+ Add* button in the top right of the *Collection browser* to add subfolders to a Collection.\n\nSetting this key to `true` will prevent team members from adding new subfolders through the *Collection browser*. This key does not affect your ability to add subfolders using the *File browser*.\n\n\nIf both `disable_add` and `disable_add_folder` are set to `true`, the *\\+ Add* button will not\nappear in the top right of the *Collection browser*.\n\n## Examples\n\nIn this example, we want to prevent team members from adding new subfolders to the `data` Collection through the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    disable_add_folder: true\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "disable_add_folder",
          "markdownDescription": "This key toggles whether team members can use the *\\+ Add* button in the top right of the *Collection browser* to add subfolders to a Collection.\n\nSetting this key to `true` will prevent team members from adding new subfolders through the *Collection browser*. This key does not affect your ability to add subfolders using the *File browser*.\n\n\nIf both `disable_add` and `disable_add_folder` are set to `true`, the *\\+ Add* button will not\nappear in the top right of the *Collection browser*.\n\n## Examples\n\nIn this example, we want to prevent team members from adding new subfolders to the `data` Collection through the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    disable_add_folder: true\n```"
        },
        "disable_file_actions": {
          "description": "This key toggles whether team members can use the *Move*, *Clone*, *Rename*, and *Delete* file actions in a Collection. You can normally access these file actions in the *Context Menu* at the top right of a file [Card](https://cloudcannon.com/documentation/articles/configure-your-card-previews/) in\nthe *Collection browser* or in an editing interface.\n\nSetting this key to `true` will prevent team members from using file actions in the *Collection browser*.  This key does not affect file actions in the *File browser*.\n\n## Examples\n\nIn this example, we want to prevent team members from using file actions in the `data` Collection through the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    disable_file_actions: true\n```",
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "disable_file_actions",
          "markdownDescription": "This key toggles whether team members can use the *Move*, *Clone*, *Rename*, and *Delete* file actions in a Collection. You can normally access these file actions in the *Context Menu* at the top right of a file [Card](https://cloudcannon.com/documentation/articles/configure-your-card-previews/) in\nthe *Collection browser* or in an editing interface.\n\nSetting this key to `true` will prevent team members from using file actions in the *Collection browser*.  This key does not affect file actions in the *File browser*.\n\n## Examples\n\nIn this example, we want to prevent team members from using file actions in the `data` Collection through the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    disable_file_actions: true\n```"
        },
        "new_preview_url": {
          "description": "This key defines a new URL for previewing your unbuilt pages in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/).\n\nThe Visual Editor will load the new preview URL and use Editable Regions, or Data Bindings and Previews, to render your page without saving or building.\n\nThis key does not affect the URL for your [Testing Domain](https://cloudcannon.com/documentation/articles/what-is-a-testing-domain/) or [Custom\nDomain](https://cloudcannon.com/documentation/articles/what-is-a-custom-domain/).\n\n## Examples\n\nIn this example, the Visual Editor will open the `/about/` page when you open an unbuilt page from the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    new_preview_url: /about/\n```",
          "type": "string",
          "documented": true,
          "title": "new_preview_url",
          "markdownDescription": "This key defines a new URL for previewing your unbuilt pages in the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/).\n\nThe Visual Editor will load the new preview URL and use Editable Regions, or Data Bindings and Previews, to render your page without saving or building.\n\nThis key does not affect the URL for your [Testing Domain](https://cloudcannon.com/documentation/articles/what-is-a-testing-domain/) or [Custom\nDomain](https://cloudcannon.com/documentation/articles/what-is-a-custom-domain/).\n\n## Examples\n\nIn this example, the Visual Editor will open the `/about/` page when you open an unbuilt page from the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    new_preview_url: /about/\n```"
        },
        "schemas": {
          "description": "This key defines which Schemas are available to populate files in this Collection.\n\nDefining a Schema for a collection will add it to the *\\+ Add* button dropdown at the top right of the *Collection browser*.\n\nIf undefined, clicking the *\\+ Add* button to add a new file to a Collection will clone the last file in the Collection and clear any markup content\nand the values of any structured data keys.\n\n## Examples\n\nIn this example, the *\\+ Add* button in the *Collection browser* has an option for `Customer Story` which will populate a new file in the `blog` Collection with the contents of the `customer_story.mdx` file. If the Schema file is updated, CloudCannon will preserve the old inputs to prevent you from losing structured data in older files.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      customer_story:\n        path: /schemas/customer_story.mdx\n        reorder_inputs: true\n        hide_extra_inputs: false\n        remove_empty_inputs: false\n        remove_extra_inputs: false\n        name: Customer Story\n        icon: notes\n```\n\nIn this example, the *\\+ Add* button in the *Collection browser* has an option for `Term Definition` which will populate a new file in the `glossary` Collection with the contents of the `glossary_term.yml` file. The `term_description` input is configured specifically for files created with this Schema.\n\n```yaml\ncollections_config:\n  glossary:\n    schemas:\n      term_definition:\n        path: /schemas/glossary_term.yml\n        name: Term Definition\n        icon: abc\n        _enabled_editors:\n          - data\n        _inputs:\n          term_description:\n            type: textarea\n            comment: Keep this as short as possible (i.e., 125 characters).\n            context:\n              open: false\n              title: Help\n              icon: help\n              content: Try not to use the term name in the description.\n            options:\n              show_count: true\n```",
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "markdownDescription": "This key defines which Schemas are available to populate files in this Collection.\n\nDefining a Schema for a collection will add it to the *\\+ Add* button dropdown at the top right of the *Collection browser*.\n\nIf undefined, clicking the *\\+ Add* button to add a new file to a Collection will clone the last file in the Collection and clear any markup content\nand the values of any structured data keys.\n\n## Examples\n\nIn this example, the *\\+ Add* button in the *Collection browser* has an option for `Customer Story` which will populate a new file in the `blog` Collection with the contents of the `customer_story.mdx` file. If the Schema file is updated, CloudCannon will preserve the old inputs to prevent you from losing structured data in older files.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      customer_story:\n        path: /schemas/customer_story.mdx\n        reorder_inputs: true\n        hide_extra_inputs: false\n        remove_empty_inputs: false\n        remove_extra_inputs: false\n        name: Customer Story\n        icon: notes\n```\n\nIn this example, the *\\+ Add* button in the *Collection browser* has an option for `Term Definition` which will populate a new file in the `glossary` Collection with the contents of the `glossary_term.yml` file. The `term_description` input is configured specifically for files created with this Schema.\n\n```yaml\ncollections_config:\n  glossary:\n    schemas:\n      term_definition:\n        path: /schemas/glossary_term.yml\n        name: Term Definition\n        icon: abc\n        _enabled_editors:\n          - data\n        _inputs:\n          term_description:\n            type: textarea\n            comment: Keep this as short as possible (i.e., 125 characters).\n            context:\n              open: false\n              title: Help\n              icon: help\n              content: Try not to use the term name in the description.\n            options:\n              show_count: true\n```",
          "documented": true,
          "title": "schemas",
          "additionalProperties": {
            "type": "object",
            "properties": {
              "path": {
                "type": "string",
                "description": "This key defines the path to the schema file relative to the root folder of the site.",
                "documented": true,
                "title": "path",
                "markdownDescription": "This key defines the path to the schema file relative to the root folder of the site."
              },
              "name": {
                "description": "This key defines the name displayed in the add menu when creating new files.\n\nDefaults to a formatted version of the key.",
                "type": "string",
                "documented": true,
                "title": "name",
                "markdownDescription": "This key defines the name displayed in the add menu when creating new files.\n\nDefaults to a formatted version of the key."
              },
              "icon": {
                "description": "This key defines the icon displayed in the add menu when creating new files, also used as the icon for collection files if no other preview is found.\n\nMust be a [Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded) name.\n\n## Examples\n\nIn this example, we have configured a custom icon for the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        icon: article\n```",
                "default": "notes",
                "allOf": [
                  {
                    "$ref": "#/$defs/icon"
                  }
                ],
                "documented": true,
                "title": "icon",
                "markdownDescription": "This key defines the icon displayed in the add menu when creating new files, also used as the icon for collection files if no other preview is found.\n\nMust be a [Material Symbols](https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded) name.\n\n## Examples\n\nIn this example, we have configured a custom icon for the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        icon: article\n```"
              },
              "create": {
                "allOf": [
                  {
                    "$ref": "#/$defs/type.create"
                  }
                ],
                "documented": false,
                "title": "create"
              },
              "new_preview_url": {
                "description": "This key defines the preview URL for unbuilt pages (e.g. drafts) to another page's output URL.\n\nThe Visual Editor will load that set preview URL and use Editable Regions, or Data Bindings and Previews, to render your new page without saving.\n\nFor example `new_preview_url: /about/` will load the `/about/` URL on new or unbuilt pages in the Visual Editor.",
                "type": "string",
                "documented": true,
                "title": "new_preview_url",
                "markdownDescription": "This key defines the preview URL for unbuilt pages (e.g. drafts) to another page's output URL.\n\nThe Visual Editor will load that set preview URL and use Editable Regions, or Data Bindings and Previews, to render your new page without saving.\n\nFor example `new_preview_url: /about/` will load the `/about/` URL on new or unbuilt pages in the Visual Editor."
              },
              "reorder_inputs": {
                "description": "This key toggles whether CloudCannon will reorder inputs in a file to match the order defined in a given Schema.\n\nSetting this key to `false` will preserve the existing order of inputs in a file, regardless of the order defined in the Schema.",
                "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 Schema.\n\nSetting this key to `false` will preserve the existing order of inputs in a file, regardless of the order defined in the Schema."
              },
              "hide_extra_inputs": {
                "description": "This key toggles whether CloudCannon will hide inputs that are not present in a Schema from the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/) and the sidebar of the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/) and [Content Editor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/).\n\nSetting this key to `true` will hide inputs that are not present in a Schema from the Data Editor and the sidebar of the Visual Editor and Content Editor. Hiding these inputs does not delete the data. You can see non-schema 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\n## Examples\n\nIn this example, CloudCannon will hide non-schema inputs in files using the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        hide_extra_inputs: true\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 Schema from the [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/) and the sidebar of the [Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/) and [Content Editor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/).\n\nSetting this key to `true` will hide inputs that are not present in a Schema from the Data Editor and the sidebar of the Visual Editor and Content Editor. Hiding these inputs does not delete the data. You can see non-schema 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\n## Examples\n\nIn this example, CloudCannon will hide non-schema inputs in files using the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        hide_extra_inputs: true\n```"
              },
              "remove_empty_inputs": {
                "description": "This key toggles whether CloudCannon will remove empty inputs from a file using a given Schema before persisting them to your file.\n\nSetting this key to `true` will remove empty inputs from a file using a given Schema before persisting 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/) and the sidebar of the\n[Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/) and [Content Editor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/), but not\nthe [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). For this key to function, you must also define `_schema` in your file.\n\n## Examples\n\nIn this example, CloudCannon will remove empty inputs in files using the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        remove_empty_inputs: true\n```",
                "default": false,
                "type": "boolean",
                "documented": true,
                "title": "remove_empty_inputs",
                "markdownDescription": "This key toggles whether CloudCannon will remove empty inputs from a file using a given Schema before persisting them to your file.\n\nSetting this key to `true` will remove empty inputs from a file using a given Schema before persisting 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/) and the sidebar of the\n[Visual Editor](https://cloudcannon.com/documentation/articles/what-is-the-visual-editor/) and [Content Editor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/), but not\nthe [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/). For this key to function, you must also define `_schema` in your file.\n\n## Examples\n\nIn this example, CloudCannon will remove empty inputs in files using the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        remove_empty_inputs: true\n```"
              },
              "remove_extra_inputs": {
                "description": "This key toggles whether CloudCannon will remove inputs that are not present in a Schema from a file before loading it in an Editing Interface.\n\nSetting this key to `false` will preserve inputs that are not present in a Schema, making them 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/), and [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and they will be saved to your Git repository.\n\n## Examples\n\nIn this example, CloudCannon will preserve extra inputs in files using the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        remove_extra_inputs: false\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 Schema from a file before loading it in an Editing Interface.\n\nSetting this key to `false` will preserve inputs that are not present in a Schema, making them 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/), and [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and they will be saved to your Git repository.\n\n## Examples\n\nIn this example, CloudCannon will preserve extra inputs in files using the `article` schema in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    schemas:\n      article:\n        remove_extra_inputs: false\n```"
              },
              "preview": {
                "allOf": [
                  {
                    "$ref": "#/$defs/type.preview"
                  }
                ],
                "documented": false,
                "title": "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"
              },
              "_enabled_editors": {
                "$ref": "#/$defs/type._enabled_editors"
              },
              "_editables": {
                "$ref": "#/$defs/type._editables"
              },
              "_editables_from_glob": {
                "allOf": [
                  {
                    "$ref": "#/$defs/type._editables_from_glob"
                  }
                ],
                "documented": false,
                "title": "_editables_from_glob"
              }
            },
            "required": [
              "path"
            ],
            "markdownDescription": "This key defines your schemas, which are the structured data formats for your content files.",
            "title": "Schema",
            "description": "This key defines your schemas, which are the structured data formats for your content files.",
            "documented": true,
            "additionalProperties": false
          }
        },
        "schemas_from_glob": {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "schemas_from_glob[*]",
            "description": "This key represents an individual glob pattern string in the `collections_config.*.schemas_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.schemas.yml`.\n\n## Examples\n\nIn this example, we have several *Schema Configuration Files* in the `.cloudcannon/schemas/` folder. The value of the `schemas_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.schemas.yml` except for `pages.cloudcannon.schemas.yml` due to the negative glob.\n\n```yaml\nposts:\n  path: content/posts\n  icon: event\n  schemas_from_glob:\n    - '/.cloudcannon/schemas/*.cloudcannon.schemas.yml'\n    - '!/.cloudcannon/schemas/pages.cloudcannon.schemas.yml'\n```",
            "markdownDescription": "This key represents an individual glob pattern string in the `collections_config.*.schemas_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.schemas.yml`.\n\n## Examples\n\nIn this example, we have several *Schema Configuration Files* in the `.cloudcannon/schemas/` folder. The value of the `schemas_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.schemas.yml` except for `pages.cloudcannon.schemas.yml` due to the negative glob.\n\n```yaml\nposts:\n  path: content/posts\n  icon: event\n  schemas_from_glob:\n    - '/.cloudcannon/schemas/*.cloudcannon.schemas.yml'\n    - '!/.cloudcannon/schemas/pages.cloudcannon.schemas.yml'\n```"
          },
          "documented": true,
          "title": "schemas_from_glob",
          "description": "This key defines globs that filter which files CloudCannon should use for *Schema* 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.schemas.yml`.\n\nYou can use this key anywhere you would use the `schemas` key.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several *Schemas Configuration Files* in the `.cloudcannon/schemas/` folder. The value of the `schemas_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.schemas.yml` except for `pages.cloudcannon.schemas.yml` due to the negative glob.\n\n```yaml\nposts:\n  path: content/posts\n  icon: event\n  schemas_from_glob:\n    - '/.cloudcannon/schemas/*.cloudcannon.schemas.yml'\n    - '!/.cloudcannon/schemas/pages.cloudcannon.schemas.yml'\n```",
          "markdownDescription": "This key defines globs that filter which files CloudCannon should use for *Schema* 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.schemas.yml`.\n\nYou can use this key anywhere you would use the `schemas` key.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several *Schemas Configuration Files* in the `.cloudcannon/schemas/` folder. The value of the `schemas_from_glob` key tells CloudCannon to use all files in that folder that match the glob `*.cloudcannon.schemas.yml` except for `pages.cloudcannon.schemas.yml` due to the negative glob.\n\n```yaml\nposts:\n  path: content/posts\n  icon: event\n  schemas_from_glob:\n    - '/.cloudcannon/schemas/*.cloudcannon.schemas.yml'\n    - '!/.cloudcannon/schemas/pages.cloudcannon.schemas.yml'\n```"
        },
        "schema_key": {
          "description": "This key defines the name for the structured data key that references the Schema a file uses.\n\nCloudCannon automatically adds this key to the top of your file when you create it using a Schema.\n\nValues which beginning with the `_` character are hidden from the Data Editor and the sidebar of the Content and Visual Editors.\n\n## Examples\n\nIn this example, we want to make Schemas more friendly for our non-technical team members, so we have configured the schema key in the front matter of files in the `blog` Collection to be `blog_template`.\n\n```yaml\ncollections_config:\n  blog:\n    schema_key: _blog_template\n```",
          "type": "string",
          "documented": true,
          "title": "schema_key",
          "markdownDescription": "This key defines the name for the structured data key that references the Schema a file uses.\n\nCloudCannon automatically adds this key to the top of your file when you create it using a Schema.\n\nValues which beginning with the `_` character are hidden from the Data Editor and the sidebar of the Content and Visual Editors.\n\n## Examples\n\nIn this example, we want to make Schemas more friendly for our non-technical team members, so we have configured the schema key in the front matter of files in the `blog` Collection to be `blog_template`.\n\n```yaml\ncollections_config:\n  blog:\n    schema_key: _blog_template\n```"
        },
        "preview": {
          "allOf": [
            {
              "$ref": "#/$defs/type.preview"
            }
          ],
          "documented": false,
          "title": "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"
        },
        "_enabled_editors": {
          "$ref": "#/$defs/type._enabled_editors"
        },
        "_editables": {
          "$ref": "#/$defs/type._editables"
        },
        "_editables_from_glob": {
          "allOf": [
            {
              "$ref": "#/$defs/type._editables_from_glob"
            }
          ],
          "documented": false,
          "title": "_editables_from_glob"
        }
      },
      "required": [
        "path"
      ],
      "markdownDescription": "This key defines your Collections, which are the sets of content files for your site grouped by folder.",
      "title": "Collection Config",
      "documented": true,
      "description": "This key defines your Collections, which are the sets of content files for your site grouped by folder.",
      "additionalProperties": false
    },
    "path": {
      "type": "string",
      "description": "This key defines the folder path for the collection key in which it is nested.\n\nThe value for this key is relative to your [Site source](https://cloudcannon.com/documentation/developer-reference/configuration-file/source/).\n\nEach Collection must have a unique path.\n\n## Examples\n\nIn this example, the files for the `blog` Collection are located in the `content/blog` folder.\n\n```yaml\ncollections_config:\n  blog:\n    path: content/blog\n```",
      "documented": true,
      "title": "path",
      "markdownDescription": "This key defines the folder path for the collection key in which it is nested.\n\nThe value for this key is relative to your [Site source](https://cloudcannon.com/documentation/developer-reference/configuration-file/source/).\n\nEach Collection must have a unique path.\n\n## Examples\n\nIn this example, the files for the `blog` Collection are located in the `content/blog` folder.\n\n```yaml\ncollections_config:\n  blog:\n    path: content/blog\n```"
    },
    "glob": {
      "description": "This key defines globs which filter the files visible in the *Collection browser* for a given Collection.\n\nGlobs can be positive (e.g. `*.yml`), or negative (e.g. `!**/*.json`).\n\nFiles are included in a Collection if they match any positive globs and do not match any negative globs.\n\nIf you do not define any positive globs, CloudCannon will include all non-developer files in a Collection unless they match a negative\nglob.\n\nDefining a negative glob for a Collection does not remove a file from the associated Collection folder in your Git repository.\n\nSimilarly, defining a positive glob for a file in a folder outside your Collection path does not move the file.\n\n## Examples\n\nIn this example, the *Collection browser* will show all files in the `data` folder except for the `secret.yml` file.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '!secret.yml'\n```\n\nIn this example, the *Collection browser* will show only `.yml` files in the `data` folder or any nested folders.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob: '**/*.yml'\n```\n\nIn this example, the *Collection browser* will show only `.yml` files in the `data` folder, except for the `secret.yml` file.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '**/*.yml'\n      - '!secret.yml'\n```",
      "anyOf": [
        {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "glob(glob-array)[*]",
            "description": "This key represents an individual glob pattern string in the `collections_config.*.glob` array.\n\nThe value is a string that specifies a file path pattern relative to the Collection path. Globs can be positive (e.g., `*.yml`) or negative (e.g., `!**/*.json`).\n\n## Examples\n\nIn this example, the `data` Collection uses a negative glob pattern to exclude the `secret.yml` file from the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '!secret.yml'\n```",
            "markdownDescription": "This key represents an individual glob pattern string in the `collections_config.*.glob` array.\n\nThe value is a string that specifies a file path pattern relative to the Collection path. Globs can be positive (e.g., `*.yml`) or negative (e.g., `!**/*.json`).\n\n## Examples\n\nIn this example, the `data` Collection uses a negative glob pattern to exclude the `secret.yml` file from the *Collection browser*.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '!secret.yml'\n```"
          },
          "title": "Glob Array",
          "documented": true,
          "description": "This key represents an array format for the `collections_config.*.glob` key.\n\nThe value is an array of glob pattern strings. Each string specifies a file path pattern relative to the Collection path. Globs can be positive (e.g., `*.yml`) or negative (e.g., `!**/*.json`).\n\nFiles are included in a Collection if they match any positive globs and do not match any negative globs.\n\n## Examples\n\nIn this example, the `data` Collection uses an array of glob patterns to show only `.yml` files, except for the `secret.yml` file.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '**/*.yml'\n      - '!secret.yml'\n```",
          "markdownDescription": "This key represents an array format for the `collections_config.*.glob` key.\n\nThe value is an array of glob pattern strings. Each string specifies a file path pattern relative to the Collection path. Globs can be positive (e.g., `*.yml`) or negative (e.g., `!**/*.json`).\n\nFiles are included in a Collection if they match any positive globs and do not match any negative globs.\n\n## Examples\n\nIn this example, the `data` Collection uses an array of glob patterns to show only `.yml` files, except for the `secret.yml` file.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '**/*.yml'\n      - '!secret.yml'\n```"
        },
        {
          "type": "string",
          "title": "Glob",
          "documented": true,
          "description": "This key represents a single glob pattern string format for the `collections_config.*.glob` key.\n\nThe value is a string that specifies a file path pattern relative to the Collection path. Globs can be positive (e.g., `*.yml`) or negative (e.g., `!**/*.json`).\n\nFiles are included in a Collection if they match any positive globs and do not match any negative globs.\n\n## Examples\n\nIn this example, the `data` Collection uses a single glob pattern to show only `.yml` files in the `data` folder or any nested folders.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob: '**/*.yml'\n```",
          "markdownDescription": "This key represents a single glob pattern string format for the `collections_config.*.glob` key.\n\nThe value is a string that specifies a file path pattern relative to the Collection path. Globs can be positive (e.g., `*.yml`) or negative (e.g., `!**/*.json`).\n\nFiles are included in a Collection if they match any positive globs and do not match any negative globs.\n\n## Examples\n\nIn this example, the `data` Collection uses a single glob pattern to show only `.yml` files in the `data` folder or any nested folders.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob: '**/*.yml'\n```"
        }
      ],
      "documented": true,
      "title": "glob",
      "markdownDescription": "This key defines globs which filter the files visible in the *Collection browser* for a given Collection.\n\nGlobs can be positive (e.g. `*.yml`), or negative (e.g. `!**/*.json`).\n\nFiles are included in a Collection if they match any positive globs and do not match any negative globs.\n\nIf you do not define any positive globs, CloudCannon will include all non-developer files in a Collection unless they match a negative\nglob.\n\nDefining a negative glob for a Collection does not remove a file from the associated Collection folder in your Git repository.\n\nSimilarly, defining a positive glob for a file in a folder outside your Collection path does not move the file.\n\n## Examples\n\nIn this example, the *Collection browser* will show all files in the `data` folder except for the `secret.yml` file.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '!secret.yml'\n```\n\nIn this example, the *Collection browser* will show only `.yml` files in the `data` folder or any nested folders.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob: '**/*.yml'\n```\n\nIn this example, the *Collection browser* will show only `.yml` files in the `data` folder, except for the `secret.yml` file.\n\n```yaml\ncollections_config:\n  data:\n    path: data\n    glob:\n      - '**/*.yml'\n      - '!secret.yml'\n```"
    },
    "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
    },
    "EditorKey": {
      "type": "string",
      "enum": [
        "visual",
        "content",
        "data"
      ],
      "title": "Editor Key",
      "description": "The available editors in CloudCannon: visual, content, and data editors.",
      "documented": false,
      "markdownDescription": "The available editors in CloudCannon: visual, content, and data editors."
    },
    "type.create": {
      "type": "object",
      "properties": {
        "path": {
          "description": "This key defines the raw template to be processed when creating files. Relative to the containing collection's path.\n\n## Examples\n\nIn this example, we have configured a create path template for the `blog` Collection using the `date` and `title` fields.\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      path: '[relative_base_path]/{date|year}-{date|month}-{date|day}-{title|slugify}.[ext]'\n```",
          "type": "string",
          "documented": true,
          "title": "path",
          "markdownDescription": "This key defines the raw template to be processed when creating files. Relative to the containing collection's path.\n\n## Examples\n\nIn this example, we have configured a create path template for the `blog` Collection using the `date` and `title` fields.\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      path: '[relative_base_path]/{date|year}-{date|month}-{date|day}-{title|slugify}.[ext]'\n```"
        },
        "extra_data": {
          "description": "This key defines additional data placeholders for use in create path templates.\n\nThe value is an object where each property is a string that specifies a data placeholder. Entry values follow the same format as `path`, and are processed sequentially before `path`. These values are not saved back to your file.\n\nFor more information, please read our documentation on [Create Paths](https://cloudcannon.com/documentation/articles/set-the-path-for-new-files/).\n\n## Examples\n\nIn this example, we have configured extra data placeholders to generate a filename from date and title fields for use in the create path.\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n```",
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "markdownDescription": "This key defines additional data placeholders for use in create path templates.\n\nThe value is an object where each property is a string that specifies a data placeholder. Entry values follow the same format as `path`, and are processed sequentially before `path`. These values are not saved back to your file.\n\nFor more information, please read our documentation on [Create Paths](https://cloudcannon.com/documentation/articles/set-the-path-for-new-files/).\n\n## Examples\n\nIn this example, we have configured extra data placeholders to generate a filename from date and title fields for use in the create path.\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n```",
          "documented": true,
          "title": "extra_data",
          "additionalProperties": {
            "type": "string",
            "documented": true,
            "title": "extra_data.*",
            "description": "This key represents an individual extra data property in the `create.extra_data` object.\n\nThe value is a string that specifies a data placeholder for use in create path templates. Entry values follow the same format as `path`, and are processed sequentially before `path`. These values are not saved back to your file.\n\n## Examples\n\nIn this example, we have configured an extra data property `filename` that combines date and title fields for use in the create path.\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n```",
            "markdownDescription": "This key represents an individual extra data property in the `create.extra_data` object.\n\nThe value is a string that specifies a data placeholder for use in create path templates. Entry values follow the same format as `path`, and are processed sequentially before `path`. These values are not saved back to your file.\n\n## Examples\n\nIn this example, we have configured an extra data property `filename` that combines date and title fields for use in the create path.\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n```"
          }
        },
        "publish_to": {
          "description": "This key defines a target collection when publishing.\n\nWhen a file is published, the target collection's create definition is used instead.",
          "type": "string",
          "documented": true,
          "title": "publish_to",
          "markdownDescription": "This key defines a target collection when publishing.\n\nWhen a file is published, the target collection's create definition is used instead."
        },
        "_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"
        }
      },
      "markdownDescription": "This key defines the path to which CloudCannon will save new files in a Collection.\n\nCloudCannon generates \"Create Paths\" when you open the *Review changes* modal.\n\nFor more information, please read our documentation on [Create Paths](https://cloudcannon.com/documentation/articles/set-the-path-for-new-files/).\n\n## Examples\n\nIn this example, CloudCannon will generate a Create Path for new files in the `blog` Collection using the `date` and `title` structured data keys. For example, CloudCannon will generate a create path of `blog/2024-10-31-spooky-getaway.md` for a file with the date 31st October 2024 and the title \"Spooky Getaway\".\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n```",
      "title": "Create",
      "description": "This key defines the path to which CloudCannon will save new files in a Collection.\n\nCloudCannon generates \"Create Paths\" when you open the *Review changes* modal.\n\nFor more information, please read our documentation on [Create Paths](https://cloudcannon.com/documentation/articles/set-the-path-for-new-files/).\n\n## Examples\n\nIn this example, CloudCannon will generate a Create Path for new files in the `blog` Collection using the `date` and `title` structured data keys. For example, CloudCannon will generate a create path of `blog/2024-10-31-spooky-getaway.md` for a file with the date 31st October 2024 and the title \"Spooky Getaway\".\n\n```yaml\ncollections_config:\n  blog:\n    create:\n      extra_data:\n        filename: '{date|year}-{date|month}-{date|day}-{title}'\n      path: '[relative_base_path]/{filename|slugify}.[ext]'\n```",
      "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
    },
    "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._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
    },
    "type._enabled_editors": {
      "title": "Enabled Editors",
      "description": "This key defines which editing interfaces are available by default for files at a given level of the configuration cascade.\n\nWhether an editing interface is available for a specific file is determined by other factors.\n\nValues can be one of the following: `visual`, `content`, or `data`.\n\nSpecifying one or more editing interfaces will disable all unspecified editing interfaces.\n\nYou cannot disable the Source Editor with this key.\n\nBy default, this key is set to `visual`, `content`, and `data`.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_enabled_editables` will\ndefault to any 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 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/), [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and [Source\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/).\n\n## Examples\n\nIn this example, we have enabled only the [Content Editor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/) in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _enabled_editors:\n      - content\n```",
      "uniqueItems": true,
      "type": "array",
      "items": {
        "$ref": "#/$defs/EditorKey"
      },
      "documented": true,
      "markdownDescription": "This key defines which editing interfaces are available by default for files at a given level of the configuration cascade.\n\nWhether an editing interface is available for a specific file is determined by other factors.\n\nValues can be one of the following: `visual`, `content`, or `data`.\n\nSpecifying one or more editing interfaces will disable all unspecified editing interfaces.\n\nYou cannot disable the Source Editor with this key.\n\nBy default, this key is set to `visual`, `content`, and `data`.\n\nIf undefined at higher levels of the [configuration cascade](https://cloudcannon.com/documentation/articles/using-the-configuration-cascade/), `_enabled_editables` will\ndefault to any 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 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/), [Data Editor](https://cloudcannon.com/documentation/articles/what-is-the-data-editor/), and [Source\nEditor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/).\n\n## Examples\n\nIn this example, we have enabled only the [Content Editor](https://cloudcannon.com/documentation/articles/what-is-the-content-editor/) in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _enabled_editors:\n      - content\n```"
    },
    "type._editables": {
      "title": "Editables",
      "description": "This key defines which Rich Text editors have custom configuration for the associated WYSIWYG toolbar.\n\nFor more information, please read our documentation on [Rich Text editors](https://cloudcannon.com/documentation/articles/what-are-rich-text-editors/).\n\n## Examples\n\nIn this example, we have configured the Snippet tool for WYSIWYG toolbars in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _editables:\n      content:\n        snippet: true\n```",
      "type": "object",
      "properties": {
        "content": {
          "$ref": "#/$defs/ContentEditable"
        },
        "block": {
          "$ref": "#/$defs/BlockEditable"
        },
        "link": {
          "$ref": "#/$defs/LinkEditable"
        },
        "image": {
          "$ref": "#/$defs/ImageEditable"
        },
        "text": {
          "$ref": "#/$defs/TextEditable"
        }
      },
      "markdownDescription": "This key defines which Rich Text editors have custom configuration for the associated WYSIWYG toolbar.\n\nFor more information, please read our documentation on [Rich Text editors](https://cloudcannon.com/documentation/articles/what-are-rich-text-editors/).\n\n## Examples\n\nIn this example, we have configured the Snippet tool for WYSIWYG toolbars in the `blog` Collection.\n\n```yaml\ncollections_config:\n  blog:\n    _editables:\n      content:\n        snippet: true\n```",
      "documented": true,
      "additionalProperties": false
    },
    "ContentEditable": {
      "title": "Content Editable",
      "description": "This key defines input options for the Content Editor.",
      "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"
        }
      },
      "markdownDescription": "This key defines input options for the Content Editor.",
      "documented": true,
      "additionalProperties": false
    },
    "BlockEditable": {
      "title": "Block Editable",
      "description": "This key defines input options for block Editable Regions.",
      "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"
        }
      },
      "markdownDescription": "This key defines input options for block Editable Regions.",
      "documented": true,
      "additionalProperties": false
    },
    "LinkEditable": {
      "title": "Link Editable",
      "description": "This key defines input options for link Editable Regions.",
      "type": "object",
      "properties": {
        "paths": {
          "allOf": [
            {
              "$ref": "#/$defs/type.paths"
            }
          ],
          "documented": false,
          "title": "paths"
        }
      },
      "markdownDescription": "This key defines input options for link Editable Regions.",
      "documented": true,
      "additionalProperties": false
    },
    "ImageEditable": {
      "title": "Image Editable",
      "description": "This key defines input options for image Editable Regions.",
      "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"
        }
      },
      "markdownDescription": "This key defines input options for image Editable Regions.",
      "documented": true,
      "additionalProperties": false
    },
    "TextEditable": {
      "title": "Text Editable",
      "description": "This key defines input options for text Editable Regions.",
      "type": "object",
      "properties": {
        "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"
        }
      },
      "markdownDescription": "This key defines input options for text Editable Regions.",
      "documented": true,
      "additionalProperties": false
    },
    "type._editables_from_glob": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "_editables_from_glob[*]",
        "description": "This key represents an individual glob pattern string in the `_editables_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.editables.yml`.\n\n## Examples\n\nIn this example, we have several WYSIWYG Toolbar *Configuration Files* in the `.cloudcannon/editables/` folder, with each file containing multiple definitions. The value of the `_editables_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.editables.yml`.\n\n```yaml\n_editables_from_glob:\n  - '/.cloudcannon/editables/*.cloudcannon.editables.yml'\n```",
        "markdownDescription": "This key represents an individual glob pattern string in the `_editables_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.editables.yml`.\n\n## Examples\n\nIn this example, we have several WYSIWYG Toolbar *Configuration Files* in the `.cloudcannon/editables/` folder, with each file containing multiple definitions. The value of the `_editables_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.editables.yml`.\n\n```yaml\n_editables_from_glob:\n  - '/.cloudcannon/editables/*.cloudcannon.editables.yml'\n```"
      },
      "documented": true,
      "title": "_editables_from_glob",
      "description": "This key defines globs that filter which files CloudCannon should use for configuring Rich Text formatting.\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.editables.yml`.\n\nYou can use this key anywhere you would use the `_editables` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several WYSIWYG Toolbar *Configuration Files* in the `.cloudcannon/editables/` folder, with each file containing multiple definitions. The value of the `_editables_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.editables.yml`.\n\n```yaml\n_editables_from_glob:\n  - '/.cloudcannon/editables/*.cloudcannon.editables.yml'\n```\n\n```yaml\ntext:\n  bold: true\n  italic: true\n  underline: true\nblock:\n  format: p h3\n  undo: true\n  redo: true\nlink:\n  bold: true\n  italic: true\n  underline: true\n```",
      "markdownDescription": "This key defines globs that filter which files CloudCannon should use for configuring Rich Text formatting.\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.editables.yml`.\n\nYou can use this key anywhere you would use the `_editables` key in the configuration cascade.\n\nThis key has no default.\n\n## Examples\n\nIn this example, we have several WYSIWYG Toolbar *Configuration Files* in the `.cloudcannon/editables/` folder, with each file containing multiple definitions. The value of the `_editables_from_glob` key tells CloudCannon all files in that folder that match the glob `*.cloudcannon.editables.yml`.\n\n```yaml\n_editables_from_glob:\n  - '/.cloudcannon/editables/*.cloudcannon.editables.yml'\n```\n\n```yaml\ntext:\n  bold: true\n  italic: true\n  underline: true\nblock:\n  format: p h3\n  undo: true\n  redo: true\nlink:\n  bold: true\n  italic: true\n  underline: true\n```"
    },
    "collection_groups": {
      "title": "Collection Groups",
      "type": "array",
      "items": {
        "$ref": "#/$defs/CollectionGroup"
      },
      "documented": true,
      "description": "This key defines custom order and grouping for Collections in your *Site Navigation*.\n\nThe value is an array of group objects. Each group object must contain a `heading` key and a `collections` key.\n\nIf undefined, CloudCannon will sort your Collections in the order they are defined under the `collections_config` key.\n\n## Examples\n\nIn this example, we have configured Collection groups to organize Collections into \"Content\" and \"Data Files\" sections in the *Site Navigation*.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```",
      "markdownDescription": "This key defines custom order and grouping for Collections in your *Site Navigation*.\n\nThe value is an array of group objects. Each group object must contain a `heading` key and a `collections` key.\n\nIf undefined, CloudCannon will sort your Collections in the order they are defined under the `collections_config` key.\n\n## Examples\n\nIn this example, we have configured Collection groups to organize Collections into \"Content\" and \"Data Files\" sections in the *Site Navigation*.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```"
    },
    "CollectionGroup": {
      "type": "object",
      "properties": {
        "heading": {
          "type": "string",
          "description": "This key defines a short, descriptive label for a group of Collections displayed in the *Site Navigation*.\n\nThis key is required for each group entry in the `collection_groups` array.\n\n## Examples\n\nIn this example, we have configured two Collection groups with a heading that labels the group in the *Site Navigation*.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```",
          "documented": true,
          "title": "heading",
          "markdownDescription": "This key defines a short, descriptive label for a group of Collections displayed in the *Site Navigation*.\n\nThis key is required for each group entry in the `collection_groups` array.\n\n## Examples\n\nIn this example, we have configured two Collection groups with a heading that labels the group in the *Site Navigation*.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```"
        },
        "collections": {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "collections[*]",
            "description": "This key represents an individual Collection key name string in the `collection_groups.[*].collections` array.\n\nThe value is a string that specifies the key name of a Collection defined in `collections_config` to include in a group in the *Site Navigation*.\n\n## Examples\n\nIn this example, we have configured a Collection group with multiple Collection key names in the collections array.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```",
            "markdownDescription": "This key represents an individual Collection key name string in the `collection_groups.[*].collections` array.\n\nThe value is a string that specifies the key name of a Collection defined in `collections_config` to include in a group in the *Site Navigation*.\n\n## Examples\n\nIn this example, we have configured a Collection group with multiple Collection key names in the collections array.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```"
          },
          "description": "This key defines the Collections displayed in a group in the *Site Navigation*.\n\nThe value is an array of Collection key name strings, matching the keys defined in `collections_config`.\n\nThis key is required for each group entry in the `collection_groups` array.\n\n## Examples\n\nIn this example, we have configured two Collection groups with collections arrays.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```",
          "documented": true,
          "title": "collections",
          "markdownDescription": "This key defines the Collections displayed in a group in the *Site Navigation*.\n\nThe value is an array of Collection key name strings, matching the keys defined in `collections_config`.\n\nThis key is required for each group entry in the `collection_groups` array.\n\n## Examples\n\nIn this example, we have configured two Collection groups with collections arrays.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```"
        }
      },
      "required": [
        "heading",
        "collections"
      ],
      "markdownDescription": "This key represents an individual group entry in the `collection_groups` array.\n\nThe value defines a group of Collections displayed in the *Site Navigation*. Each group entry must contain a `heading` key and a `collections` key.\n\n## Examples\n\nIn this example, we have configured two Collection groups with a heading and collections array.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```",
      "title": "Collection Group",
      "documented": true,
      "description": "This key represents an individual group entry in the `collection_groups` array.\n\nThe value defines a group of Collections displayed in the *Site Navigation*. Each group entry must contain a `heading` key and a `collections` key.\n\n## Examples\n\nIn this example, we have configured two Collection groups with a heading and collections array.\n\n```yaml\ncollection_groups:\n  - heading: Content\n    collections:\n      - pages\n      - blog\n  - heading: Data Files\n    collections:\n      - data\n```",
      "additionalProperties": false
    },
    "base_url": {
      "type": "string",
      "documented": true,
      "title": "base_url",
      "description": "This key defines which base URL (or subpath) CloudCannon should use when matching output URLs for your *Site*.\n\nThe base URL will prefix the output URL of each file.\n\n## Examples\n\nIn this example, we have configured the base URL to `/documentation/` so all output URLs will be prefixed with this path.\n\n```yaml\nbase_url: /documentation/\n```",
      "markdownDescription": "This key defines which base URL (or subpath) CloudCannon should use when matching output URLs for your *Site*.\n\nThe base URL will prefix the output URL of each file.\n\n## Examples\n\nIn this example, we have configured the base URL to `/documentation/` so all output URLs will be prefixed with this path.\n\n```yaml\nbase_url: /documentation/\n```"
    },
    "data_config": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "This key defines which file or folder data in your Site is available to populate [Select Inputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/).\n\n## Examples\n\nIn this example, we have configured data config to make data files available for *Select Inputs* and *Multiselect Inputs*.\n\n```yaml\ndata_config___1___:\n  authors:\n    path___2___: data/authors.csv\n  offices:\n    path___3___: data/offices\n```",
      "documented": true,
      "title": "data_config",
      "description": "This key defines which file or folder data in your Site is available to populate [Select Inputs](https://cloudcannon.com/documentation/articles/what-is-a-select-input/).\n\n## Examples\n\nIn this example, we have configured data config to make data files available for *Select Inputs* and *Multiselect Inputs*.\n\n```yaml\ndata_config___1___:\n  authors:\n    path___2___: data/authors.csv\n  offices:\n    path___3___: data/offices\n```",
      "additionalProperties": {
        "$ref": "#/$defs/DataConfigEntry"
      }
    },
    "DataConfigEntry": {
      "type": "object",
      "properties": {
        "path": {
          "type": "string",
          "documented": true,
          "title": "path",
          "description": "This key defines the path to a file or folder of files containing data.\n\n## Examples\n\nIn this example, we have configured data config paths for both a CSV file and a folder of files.\n\n```yaml\ndata_config___1___:\n  authors:\n    path___2___: data/authors.csv\n  offices:\n    path___3___: data/offices\n```",
          "markdownDescription": "This key defines the path to a file or folder of files containing data.\n\n## Examples\n\nIn this example, we have configured data config paths for both a CSV file and a folder of files.\n\n```yaml\ndata_config___1___:\n  authors:\n    path___2___: data/authors.csv\n  offices:\n    path___3___: data/offices\n```"
        }
      },
      "required": [
        "path"
      ],
      "markdownDescription": "This key defines what data sets are available to populate *Select Inputs*.\n\n## Examples\n\nIn this example, we have configured data config entries for both a CSV file and a folder of files.\n\n```yaml\ndata_config___1___:\n  authors:\n    path___2___: data/authors.csv\n  offices:\n    path___3___: data/offices\n```",
      "documented": true,
      "title": "data_config.*",
      "description": "This key defines what data sets are available to populate *Select Inputs*.\n\n## Examples\n\nIn this example, we have configured data config entries for both a CSV file and a folder of files.\n\n```yaml\ndata_config___1___:\n  authors:\n    path___2___: data/authors.csv\n  offices:\n    path___3___: data/offices\n```",
      "additionalProperties": false
    },
    "file_config": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/FileConfigEntry"
      },
      "documented": true,
      "title": "file_config",
      "description": "This key defines file-specific configuration without configuring a collection or modifying files.\n\nThis key has no default.",
      "markdownDescription": "This key defines file-specific configuration without configuring a collection or modifying files.\n\nThis key has no default."
    },
    "FileConfigEntry": {
      "type": "object",
      "properties": {
        "glob": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string",
                "documented": true,
                "title": "glob(glob-array)[*]"
              },
              "title": "Glob Array",
              "documented": true
            },
            {
              "type": "string",
              "title": "Glob",
              "documented": true
            }
          ],
          "description": "This key defines the glob pattern(s) targeting a path to one or more files.\n\n## Examples\n\nIn this example, we have configured a file config to target the `data/tabs.yml` file with object input configuration.\n\n```yaml\nfile_config:\n  - glob: data/tabs.yml\n    _inputs:\n      $:\n        type: object\n        options:\n          subtype: tabbed\n```",
          "documented": true,
          "title": "glob",
          "markdownDescription": "This key defines the glob pattern(s) targeting a path to one or more files.\n\n## Examples\n\nIn this example, we have configured a file config to target the `data/tabs.yml` file with object input configuration.\n\n```yaml\nfile_config:\n  - glob: data/tabs.yml\n    _inputs:\n      $:\n        type: object\n        options:\n          subtype: tabbed\n```"
        },
        "_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"
        },
        "_enabled_editors": {
          "$ref": "#/$defs/type._enabled_editors"
        },
        "_editables": {
          "$ref": "#/$defs/type._editables"
        },
        "_editables_from_glob": {
          "allOf": [
            {
              "$ref": "#/$defs/type._editables_from_glob"
            }
          ],
          "documented": false,
          "title": "_editables_from_glob"
        }
      },
      "required": [
        "glob"
      ],
      "markdownDescription": "This key defines scope to configure at a file level, without adding configuration to files.",
      "documented": true,
      "title": "file_config[*]",
      "description": "This key defines scope to configure at a file level, without adding configuration to files.",
      "additionalProperties": false
    },
    "editor": {
      "type": "object",
      "properties": {
        "default_path": {
          "$ref": "#/$defs/editor.default_path"
        }
      },
      "required": [
        "default_path"
      ],
      "markdownDescription": "This key defines settings for the default editor actions on your site.",
      "documented": true,
      "title": "editor",
      "description": "This key defines settings for the default editor actions on your site.",
      "additionalProperties": false
    },
    "editor.default_path": {
      "default": "/",
      "type": "string",
      "documented": true,
      "title": "default_path",
      "description": "This key defines the link for the *Home* button on the *Dashboard* page.\n\n## Examples\n\nIn this example, we have configured the Home button to link to `/blog/` instead of the default `/`.\n\n```yaml\neditor:\n  default_path: /blog/\n```",
      "markdownDescription": "This key defines the link for the *Home* button on the *Dashboard* page.\n\n## Examples\n\nIn this example, we have configured the Home button to link to `/blog/` instead of the default `/`.\n\n```yaml\neditor:\n  default_path: /blog/\n```"
    },
    "source_editor": {
      "type": "object",
      "properties": {
        "tab_size": {
          "default": 2,
          "type": "number",
          "documented": true,
          "title": "tab_size",
          "description": "This key defines the auto-indentation of each line and how many spaces a tab indentation counts as.\n\n## Examples\n\nIn this example, we have configured the Source Editor to use 2 spaces for tab indentation.\n\n```yaml\nsource_editor:\n  tab_size: 2\n```",
          "markdownDescription": "This key defines the auto-indentation of each line and how many spaces a tab indentation counts as.\n\n## Examples\n\nIn this example, we have configured the Source Editor to use 2 spaces for tab indentation.\n\n```yaml\nsource_editor:\n  tab_size: 2\n```"
        },
        "theme": {
          "default": "basic_dark",
          "allOf": [
            {
              "$ref": "#/$defs/Theme"
            }
          ],
          "documented": true,
          "title": "theme",
          "description": "This key defines the color theme for syntax highlighting.\n\n## Examples\n\nIn this example, we have configured the Source Editor to use the `dark` theme for syntax highlighting.\n\n```yaml\nsource_editor:\n  theme: dark\n```",
          "markdownDescription": "This key defines the color theme for syntax highlighting.\n\n## Examples\n\nIn this example, we have configured the Source Editor to use the `dark` theme for syntax highlighting.\n\n```yaml\nsource_editor:\n  theme: dark\n```"
        },
        "show_gutter": {
          "default": true,
          "type": "boolean",
          "documented": true,
          "title": "show_gutter",
          "description": "This key toggles the gutter on the left of the editing interface, displaying line numbers and code folding controls.\n\n## Examples\n\nIn this example, CloudCannon will show the gutter with line numbers in the Source Editor.\n\n```yaml\nsource_editor:\n  show_gutter: true\n```",
          "markdownDescription": "This key toggles the gutter on the left of the editing interface, displaying line numbers and code folding controls.\n\n## Examples\n\nIn this example, CloudCannon will show the gutter with line numbers in the Source Editor.\n\n```yaml\nsource_editor:\n  show_gutter: true\n```"
        },
        "soft_wrap": {
          "default": false,
          "type": "boolean",
          "documented": true,
          "title": "soft_wrap",
          "description": "This key toggles whether CloudCannon will enable soft wrapping of code in the Source Editor.\n\nSetting this key to `true` will enable soft wrapping of code, allowing long lines to wrap to the next line without horizontal scrolling.\n\n## Examples\n\nIn this example, CloudCannon will enable soft wrapping of code in the Source Editor.\n\n```yaml\nsource_editor:\n  soft_wrap: true\n```",
          "markdownDescription": "This key toggles whether CloudCannon will enable soft wrapping of code in the Source Editor.\n\nSetting this key to `true` will enable soft wrapping of code, allowing long lines to wrap to the next line without horizontal scrolling.\n\n## Examples\n\nIn this example, CloudCannon will enable soft wrapping of code in the Source Editor.\n\n```yaml\nsource_editor:\n  soft_wrap: true\n```"
        }
      },
      "markdownDescription": "This key defines the appearance and behavior of the Source Editor.\n\nFor more information, please read our documentation on the [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/).\n\n## Examples\n\nIn this example, we have configured the Source Editor with custom theme, tab size, and gutter settings.\n\n```yaml\nsource_editor:\n  theme: basic_dark\n  tab_size: 2\n  show_gutter: true\n```",
      "documented": true,
      "title": "source_editor",
      "description": "This key defines the appearance and behavior of the Source Editor.\n\nFor more information, please read our documentation on the [Source Editor](https://cloudcannon.com/documentation/articles/what-is-the-source-editor/).\n\n## Examples\n\nIn this example, we have configured the Source Editor with custom theme, tab size, and gutter settings.\n\n```yaml\nsource_editor:\n  theme: basic_dark\n  tab_size: 2\n  show_gutter: true\n```",
      "additionalProperties": false
    },
    "commit_templates": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "description": "This key defines the name of a commit template, which appears in the dropdown menu when saving changes.\n\nThe value is a string that specifies the label text for the template.\n\n## Examples\n\nIn this example, we have configured a commit template with the label \"Default\".\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n```",
            "type": "string",
            "documented": true,
            "title": "label",
            "markdownDescription": "This key defines the name of a commit template, which appears in the dropdown menu when saving changes.\n\nThe value is a string that specifies the label text for the template.\n\n## Examples\n\nIn this example, we have configured a commit template with the label \"Default\".\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n```"
          },
          "template_string": {
            "description": "This key defines the template string for the commit message.\n\nThe value is a string that specifies the commit message template. This template can include template variables and filters.\n\nCloudCannon will only use this template string if `template_path` is not set for the commit template.\n\n## Examples\n\nIn this example, we have configured a commit template with a template string that includes template variables.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n    _inputs:\n      commit_type:\n        type: select\n        options:\n          values:\n            - feature\n            - fix\n```",
            "type": "string",
            "documented": true,
            "title": "template_string",
            "markdownDescription": "This key defines the template string for the commit message.\n\nThe value is a string that specifies the commit message template. This template can include template variables and filters.\n\nCloudCannon will only use this template string if `template_path` is not set for the commit template.\n\n## Examples\n\nIn this example, we have configured a commit template with a template string that includes template variables.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n    _inputs:\n      commit_type:\n        type: select\n        options:\n          values:\n            - feature\n            - fix\n```"
          },
          "template_path": {
            "description": "This key defines the path to a file containing your commit template.\n\nThe value is a string that specifies a file path relative to the root directory. CloudCannon will use the contents of this file as the commit template.\n\nCloudCannon will not use this file if `template_string` is also defined for the commit template.\n\n## Examples\n\nIn this example, we have configured a commit template to use a file at `/.git/commit-message.txt`.\n\n```yaml\ncommit_templates:\n  - label: Commit message from file\n    template_path: /.git/commit-message.txt\n```",
            "type": "string",
            "documented": true,
            "title": "template_path",
            "markdownDescription": "This key defines the path to a file containing your commit template.\n\nThe value is a string that specifies a file path relative to the root directory. CloudCannon will use the contents of this file as the commit template.\n\nCloudCannon will not use this file if `template_string` is also defined for the commit template.\n\n## Examples\n\nIn this example, we have configured a commit template to use a file at `/.git/commit-message.txt`.\n\n```yaml\ncommit_templates:\n  - label: Commit message from file\n    template_path: /.git/commit-message.txt\n```"
          },
          "_inputs": {
            "allOf": [
              {
                "$ref": "#/$defs/type._inputs"
              }
            ],
            "documented": false,
            "title": "_inputs"
          },
          "extra_data": {
            "description": "This key defines additional template strings for building nested templates.\n\nThe value is an object that can contain any properties. Each property value can be any data type and specifies additional data to include in commit message templates.\n\n## Examples\n\nIn this example, we have configured a commit template with extra data to include a breaking change message.\n\n```yaml\ncommit_templates:\n  - label: Breaking change\n    template_string: '{message}{breaking_change|if=breaking_change_message}'\n    _inputs:\n      breaking_change_message:\n        type: text\n    extra_data:\n      breaking_change: '⚠️ {breaking_change_message}'\n```",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "markdownDescription": "This key defines additional template strings for building nested templates.\n\nThe value is an object that can contain any properties. Each property value can be any data type and specifies additional data to include in commit message templates.\n\n## Examples\n\nIn this example, we have configured a commit template with extra data to include a breaking change message.\n\n```yaml\ncommit_templates:\n  - label: Breaking change\n    template_string: '{message}{breaking_change|if=breaking_change_message}'\n    _inputs:\n      breaking_change_message:\n        type: text\n    extra_data:\n      breaking_change: '⚠️ {breaking_change_message}'\n```",
            "documented": true,
            "title": "extra_data",
            "additionalProperties": {
              "type": "string",
              "documented": true,
              "title": "extra_data.*",
              "description": "This key represents an individual extra data property in the `commit_templates.[*].extra_data` object.\n\nThe value can be any data type and specifies additional data to include in commit message templates.\n\n## Examples\n\nIn this example, we have configured an extra data property `breaking_change` with a template string.\n\n```yaml\ncommit_templates:\n  - label: Breaking change\n    template_string: '{message}{breaking_change|if=breaking_change_message}'\n    _inputs:\n      breaking_change_message:\n        type: text\n    extra_data:\n      breaking_change: |-\n        ⚠️ {breaking_change_message}\n```",
              "markdownDescription": "This key represents an individual extra data property in the `commit_templates.[*].extra_data` object.\n\nThe value can be any data type and specifies additional data to include in commit message templates.\n\n## Examples\n\nIn this example, we have configured an extra data property `breaking_change` with a template string.\n\n```yaml\ncommit_templates:\n  - label: Breaking change\n    template_string: '{message}{breaking_change|if=breaking_change_message}'\n    _inputs:\n      breaking_change_message:\n        type: text\n    extra_data:\n      breaking_change: |-\n        ⚠️ {breaking_change_message}\n```"
            }
          },
          "wrap_width": {
            "description": "This key defines the width of the text wrap in the commit message editor.\n\nThe value is a number that specifies the character width at which text wraps in the editor.\n\n## Examples\n\nIn this example, we have configured a commit template with a wrap width of 72 characters.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{message}'\n    wrap_width: 72\n```",
            "type": "number",
            "documented": true,
            "title": "wrap_width",
            "markdownDescription": "This key defines the width of the text wrap in the commit message editor.\n\nThe value is a number that specifies the character width at which text wraps in the editor.\n\n## Examples\n\nIn this example, we have configured a commit template with a wrap width of 72 characters.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{message}'\n    wrap_width: 72\n```"
          }
        },
        "markdownDescription": "This key represents an individual commit template object in the `commit_templates` array.\n\nThe value is an object that defines a template for commit messages when saving changes. Each template object can contain optional `label`, `template_path`, `template_string`, `wrap_width`, `extra_data`, and `_inputs` keys.\n\n## Examples\n\nIn this example, we have configured a commit template with a template string and input configuration.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n    _inputs:\n      commit_type:\n        type: select\n        options:\n          allow_empty: true\n          values:\n            - feature\n            - fix\n            - test\n        cascade: true\n```",
        "title": "Commit Template",
        "description": "This key represents an individual commit template object in the `commit_templates` array.\n\nThe value is an object that defines a template for commit messages when saving changes. Each template object can contain optional `label`, `template_path`, `template_string`, `wrap_width`, `extra_data`, and `_inputs` keys.\n\n## Examples\n\nIn this example, we have configured a commit template with a template string and input configuration.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n    _inputs:\n      commit_type:\n        type: select\n        options:\n          allow_empty: true\n          values:\n            - feature\n            - fix\n            - test\n        cascade: true\n```",
        "documented": true,
        "additionalProperties": false
      },
      "documented": true,
      "title": "commit_templates",
      "description": "This key defines commit message templates available when saving changes.\n\nThe value is an array of template objects. Each template object can contain optional `label`, `template_path`, `template_string`, `wrap_width`, `extra_data`, and `_inputs` keys.\n\nCommit messages appear on the *Review changes* modal when you save your changes.\n\n## Examples\n\nIn this example, we have configured a commit template with a template string and input configuration.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n    _inputs:\n      commit_type:\n        type: select\n        options:\n          allow_empty: true\n          values:\n            - feature\n            - fix\n            - test\n        cascade: true\n```\n\nIn this example, we have configured a commit template that uses a file for the template content.\n\n```yaml\ncommit_templates:\n  - label: Commit message from file\n    template_path: /.git/commit-message.txt\n```\n\nIn this example, we have configured a commit template with a template string, input configuration, and extra data for nested templates.\n\n```yaml\ncommit_templates:\n  - label: Breaking change\n    template_string: '{message}{breaking_change|if=breaking_change_message}'\n    _inputs:\n      breaking_change_message:\n        type: text\n    extra_data:\n      breaking_change: '⚠️ {breaking_change_message}'\n```",
      "markdownDescription": "This key defines commit message templates available when saving changes.\n\nThe value is an array of template objects. Each template object can contain optional `label`, `template_path`, `template_string`, `wrap_width`, `extra_data`, and `_inputs` keys.\n\nCommit messages appear on the *Review changes* modal when you save your changes.\n\n## Examples\n\nIn this example, we have configured a commit template with a template string and input configuration.\n\n```yaml\ncommit_templates:\n  - label: Default\n    template_string: '{commit_type}: {message|trim}'\n    _inputs:\n      commit_type:\n        type: select\n        options:\n          allow_empty: true\n          values:\n            - feature\n            - fix\n            - test\n        cascade: true\n```\n\nIn this example, we have configured a commit template that uses a file for the template content.\n\n```yaml\ncommit_templates:\n  - label: Commit message from file\n    template_path: /.git/commit-message.txt\n```\n\nIn this example, we have configured a commit template with a template string, input configuration, and extra data for nested templates.\n\n```yaml\ncommit_templates:\n  - label: Breaking change\n    template_string: '{message}{breaking_change|if=breaking_change_message}'\n    _inputs:\n      breaking_change_message:\n        type: text\n    extra_data:\n      breaking_change: '⚠️ {breaking_change_message}'\n```"
    },
    "upstream_commit_template": {
      "type": "string",
      "documented": true,
      "title": "upstream_commit_template",
      "description": "This key defines the commit template to use when pulling changes from the upstream repository.\n\nAn upstream commit message template can contain plain text and placeholders. Placeholders insert data related to the commit and use `[ ]` brackets. CloudCannon supports the following commit placeholders:\n\n* `[branch]` — the name of the current branch.\n* `[publish_branch]` — the name of the Publish Branch from which you merge upstream changes.\n* `[author]` — the email address of the person responsible for the upstream merge.\n* `[date]` — the date of the upstream merge in the format \"Tue Nov 28 2023 21:46:17 GMT+0000\".\n\n## Examples\n\nIn this example, we have configured a commit template with placeholders for upstream pulls.\n\n```yaml\nupstream_commit_template: \"Merge branch [publish_branch] into develop of [branch] by [author] at [date]\"\n```",
      "markdownDescription": "This key defines the commit template to use when pulling changes from the upstream repository.\n\nAn upstream commit message template can contain plain text and placeholders. Placeholders insert data related to the commit and use `[ ]` brackets. CloudCannon supports the following commit placeholders:\n\n* `[branch]` — the name of the current branch.\n* `[publish_branch]` — the name of the Publish Branch from which you merge upstream changes.\n* `[author]` — the email address of the person responsible for the upstream merge.\n* `[date]` — the date of the upstream merge in the format \"Tue Nov 28 2023 21:46:17 GMT+0000\".\n\n## Examples\n\nIn this example, we have configured a commit template with placeholders for upstream pulls.\n\n```yaml\nupstream_commit_template: \"Merge branch [publish_branch] into develop of [branch] by [author] at [date]\"\n```"
    },
    "markdown": {
      "type": "object",
      "properties": {
        "engine": {
          "description": "This key defines which Markdown processing engine CloudCannon will use to convert between HTML and Markdown.\n\n## Examples\n\nIn this example, we have configured CloudCannon to use the `kramdown` Markdown engine.\n\n```yaml\nmarkdown:\n  engine: kramdown\n```\n\nIn this example, we have configured CloudCannon to use the `commonmark` Markdown engine with custom options.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    html: true\n    breaks: true\n```",
          "default": "commonmark",
          "type": "string",
          "enum": [
            "commonmark",
            "kramdown"
          ],
          "documented": true,
          "title": "engine",
          "markdownDescription": "This key defines which Markdown processing engine CloudCannon will use to convert between HTML and Markdown.\n\n## Examples\n\nIn this example, we have configured CloudCannon to use the `kramdown` Markdown engine.\n\n```yaml\nmarkdown:\n  engine: kramdown\n```\n\nIn this example, we have configured CloudCannon to use the `commonmark` Markdown engine with custom options.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    html: true\n    breaks: true\n```"
        },
        "options": {
          "type": "object",
          "properties": {
            "html": {
              "description": "This key toggles whether CloudCannon will output HTML tags from source when converting Markdown to HTML.\n\nSetting this key to `true` will allow HTML tags in the Markdown source to be output in the resulting HTML.\n\nBy default, this key is `false` (i.e., HTML tags in Markdown source are not output).\n\n## Examples\n\nIn this example, we have configured Markdown to output HTML tags from source.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    html: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "html",
              "markdownDescription": "This key toggles whether CloudCannon will output HTML tags from source when converting Markdown to HTML.\n\nSetting this key to `true` will allow HTML tags in the Markdown source to be output in the resulting HTML.\n\nBy default, this key is `false` (i.e., HTML tags in Markdown source are not output).\n\n## Examples\n\nIn this example, we have configured Markdown to output HTML tags from source.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    html: true\n```"
            },
            "xhtml": {
              "description": "This key toggles whether CloudCannon will use XHTML-style closing for single tags when converting Markdown to HTML.\n\nSetting this key to `true` will use `/` to close single tags (e.g., `<br />` instead of `<br>`).\n\nBy default, this key is `false` (i.e., single tags are not closed with `/`).\n\n## Examples\n\nIn this example, we have configured Markdown to use XHTML-style closing for single tags.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    xhtml: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "xhtml",
              "markdownDescription": "This key toggles whether CloudCannon will use XHTML-style closing for single tags when converting Markdown to HTML.\n\nSetting this key to `true` will use `/` to close single tags (e.g., `<br />` instead of `<br>`).\n\nBy default, this key is `false` (i.e., single tags are not closed with `/`).\n\n## Examples\n\nIn this example, we have configured Markdown to use XHTML-style closing for single tags.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    xhtml: true\n```"
            },
            "breaks": {
              "description": "This key toggles whether CloudCannon will convert line breaks (`\\n`) in paragraphs into `<br>` tags when converting Markdown to HTML.\n\nSetting this key to `true` will convert line breaks within paragraphs into `<br>` tags.\n\nBy default, this key is `false` (i.e., line breaks in paragraphs are not converted to `<br>` tags).\n\n## Examples\n\nIn this example, we have configured Markdown to convert line breaks in paragraphs into `<br>` tags.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    breaks: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "breaks",
              "markdownDescription": "This key toggles whether CloudCannon will convert line breaks (`\\n`) in paragraphs into `<br>` tags when converting Markdown to HTML.\n\nSetting this key to `true` will convert line breaks within paragraphs into `<br>` tags.\n\nBy default, this key is `false` (i.e., line breaks in paragraphs are not converted to `<br>` tags).\n\n## Examples\n\nIn this example, we have configured Markdown to convert line breaks in paragraphs into `<br>` tags.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    breaks: true\n```"
            },
            "linkify": {
              "description": "This key toggles whether CloudCannon will automatically convert URL-like text to links when converting Markdown to HTML.\n\nSetting this key to `true` will automatically convert text that looks like URLs into clickable links.\n\nBy default, this key is `false` (i.e., URL-like text is not automatically converted to links).\n\n## Examples\n\nIn this example, we have configured Markdown to automatically convert URL-like text to links.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    linkify: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "linkify",
              "markdownDescription": "This key toggles whether CloudCannon will automatically convert URL-like text to links when converting Markdown to HTML.\n\nSetting this key to `true` will automatically convert text that looks like URLs into clickable links.\n\nBy default, this key is `false` (i.e., URL-like text is not automatically converted to links).\n\n## Examples\n\nIn this example, we have configured Markdown to automatically convert URL-like text to links.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    linkify: true\n```"
            },
            "typographer": {
              "description": "This key toggles whether CloudCannon will enable typographic replacements and quote beautification when converting Markdown to HTML.\n\nSetting this key to `true` will enable language-neutral replacements (such as dashes and ellipses) and beautify quotes based on the `quotes` configuration.\n\nBy default, this key is `false` (i.e., typographic replacements and quote beautification are disabled).\n\n## Examples\n\nIn this example, we have configured Markdown to enable typographic replacements and quote beautification.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    typographer: true\n    quotes: '«»„\"\"'\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "typographer",
              "markdownDescription": "This key toggles whether CloudCannon will enable typographic replacements and quote beautification when converting Markdown to HTML.\n\nSetting this key to `true` will enable language-neutral replacements (such as dashes and ellipses) and beautify quotes based on the `quotes` configuration.\n\nBy default, this key is `false` (i.e., typographic replacements and quote beautification are disabled).\n\n## Examples\n\nIn this example, we have configured Markdown to enable typographic replacements and quote beautification.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    typographer: true\n    quotes: '«»„\"\"'\n```"
            },
            "quotes": {
              "description": "This key defines double and single quotes replacement pairs for quote beautification when `typographer` is enabled.\n\nThe value is a string that specifies quote pairs. For example, you can use `\"«»„\"\"` for Russian, `\"\"„\"‚\"\"` for German, and `[\"«\\xA0\", \"\\xA0»\", \"‹\\xA0\", \"\\xA0›\"]` for French (including `nbsp`).\n\nThis key only takes effect when `typographer` is enabled.\n\n## Examples\n\nIn this example, we have configured quote replacement pairs for Russian typography.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    typographer: true\n    quotes: '«»„\"\"'\n```",
              "type": "string",
              "documented": true,
              "title": "quotes",
              "markdownDescription": "This key defines double and single quotes replacement pairs for quote beautification when `typographer` is enabled.\n\nThe value is a string that specifies quote pairs. For example, you can use `\"«»„\"\"` for Russian, `\"\"„\"‚\"\"` for German, and `[\"«\\xA0\", \"\\xA0»\", \"‹\\xA0\", \"\\xA0›\"]` for French (including `nbsp`).\n\nThis key only takes effect when `typographer` is enabled.\n\n## Examples\n\nIn this example, we have configured quote replacement pairs for Russian typography.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    typographer: true\n    quotes: '«»„\"\"'\n```"
            },
            "spaced_lists": {
              "description": "This key toggles whether CloudCannon will output lists with an extra space when converting HTML to Markdown.\n\nSetting this key to `true` will add an extra space in list items when outputting Markdown.\n\nBy default, this key is `false` (i.e., lists are output without an extra space).\n\n## Examples\n\nIn this example, we have configured Markdown to output lists with an extra space.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    spaced_lists: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "spaced_lists",
              "markdownDescription": "This key toggles whether CloudCannon will output lists with an extra space when converting HTML to Markdown.\n\nSetting this key to `true` will add an extra space in list items when outputting Markdown.\n\nBy default, this key is `false` (i.e., lists are output without an extra space).\n\n## Examples\n\nIn this example, we have configured Markdown to output lists with an extra space.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    spaced_lists: true\n```"
            },
            "sentence_per_line": {
              "description": "This key toggles whether CloudCannon will add line breaks between sentences when converting HTML to Markdown.\n\nSetting this key to `true` will add line breaks between sentences in the output Markdown.\n\nBy default, this key is `false` (i.e., line breaks are not added between sentences).\n\n## Examples\n\nIn this example, we have configured Markdown to add line breaks between sentences.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    sentence_per_line: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "sentence_per_line",
              "markdownDescription": "This key toggles whether CloudCannon will add line breaks between sentences when converting HTML to Markdown.\n\nSetting this key to `true` will add line breaks between sentences in the output Markdown.\n\nBy default, this key is `false` (i.e., line breaks are not added between sentences).\n\n## Examples\n\nIn this example, we have configured Markdown to add line breaks between sentences.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    sentence_per_line: true\n```"
            },
            "gfm": {
              "description": "This key toggles whether CloudCannon will enable GitHub Flavored Markdown (GFM) mode when processing Markdown.\n\nSetting this key to `true` will enable GFM mode, which includes features like tables, strikethrough, task lists, and autolinks.\n\nBy default, this key is `false` (i.e., GFM mode is disabled).\n\n## Examples\n\nIn this example, we have configured Markdown to enable GitHub Flavored Markdown mode.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    gfm: true\n```",
              "type": "boolean",
              "documented": true,
              "title": "gfm",
              "markdownDescription": "This key toggles whether CloudCannon will enable GitHub Flavored Markdown (GFM) mode when processing Markdown.\n\nSetting this key to `true` will enable GFM mode, which includes features like tables, strikethrough, task lists, and autolinks.\n\nBy default, this key is `false` (i.e., GFM mode is disabled).\n\n## Examples\n\nIn this example, we have configured Markdown to enable GitHub Flavored Markdown mode.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    gfm: true\n```"
            },
            "code_block_fences": {
              "description": "This key defines which style of code block fences CloudCannon will use when converting HTML to Markdown.\n\nThe value can be `\\`\\`\\`` (three backticks) or `~~~` (three tildes).\n\n## Examples\n\nIn this example, we have configured Markdown to use tildes for code block fences.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    code_block_fences: '~~~'\n```",
              "type": "string",
              "enum": [
                "```",
                "~~~"
              ],
              "documented": true,
              "title": "code_block_fences",
              "markdownDescription": "This key defines which style of code block fences CloudCannon will use when converting HTML to Markdown.\n\nThe value can be `\\`\\`\\`` (three backticks) or `~~~` (three tildes).\n\n## Examples\n\nIn this example, we have configured Markdown to use tildes for code block fences.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    code_block_fences: '~~~'\n```"
            },
            "treat_indentation_as_code": {
              "description": "This key toggles whether CloudCannon will treat 4 spaces of indentation as a code block when processing Markdown.\n\nSetting this key to `true` will read indented blocks (4 spaces) as code blocks.\n\nBy default, this key is `false` (i.e., indented blocks are not treated as code blocks).\n\n## Examples\n\nIn this example, we have configured Markdown to treat 4 spaces of indentation as code blocks.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    treat_indentation_as_code: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "treat_indentation_as_code",
              "markdownDescription": "This key toggles whether CloudCannon will treat 4 spaces of indentation as a code block when processing Markdown.\n\nSetting this key to `true` will read indented blocks (4 spaces) as code blocks.\n\nBy default, this key is `false` (i.e., indented blocks are not treated as code blocks).\n\n## Examples\n\nIn this example, we have configured Markdown to treat 4 spaces of indentation as code blocks.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    treat_indentation_as_code: true\n```"
            },
            "escape_snippets_in_code_blocks": {
              "description": "This key toggles whether CloudCannon will render snippets as plain text within code blocks when processing Markdown.\n\nSetting this key to `true` will prevent snippets from being processed within code blocks, rendering them as plain text instead.\n\nBy default, this key is `false` (i.e., snippets within code blocks may be processed).\n\n## Examples\n\nIn this example, we have configured Markdown to render snippets as plain text within code blocks.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    escape_snippets_in_code_blocks: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "escape_snippets_in_code_blocks",
              "markdownDescription": "This key toggles whether CloudCannon will render snippets as plain text within code blocks when processing Markdown.\n\nSetting this key to `true` will prevent snippets from being processed within code blocks, rendering them as plain text instead.\n\nBy default, this key is `false` (i.e., snippets within code blocks may be processed).\n\n## Examples\n\nIn this example, we have configured Markdown to render snippets as plain text within code blocks.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    escape_snippets_in_code_blocks: true\n```"
            },
            "table": {
              "description": "This key toggles whether CloudCannon will output tables in Markdown format when converting HTML to Markdown.\n\nSetting this key to `true` will convert HTML tables to Markdown table format.\n\nBy default, this key is `false` (i.e., tables are not output in Markdown format).\n\n## Examples\n\nIn this example, we have configured Markdown to output tables in Markdown format.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    table: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "table",
              "markdownDescription": "This key toggles whether CloudCannon will output tables in Markdown format when converting HTML to Markdown.\n\nSetting this key to `true` will convert HTML tables to Markdown table format.\n\nBy default, this key is `false` (i.e., tables are not output in Markdown format).\n\n## Examples\n\nIn this example, we have configured Markdown to output tables in Markdown format.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    table: true\n```"
            },
            "strikethrough": {
              "description": "This key toggles whether CloudCannon will output strikethrough text wrapped in double tildes when converting HTML to Markdown.\n\nSetting this key to `true` will output strikethrough text as `~~strike~~` in Markdown.\n\nBy default, this key is `false` (i.e., strikethrough text is not output in double tildes format).\n\n## Examples\n\nIn this example, we have configured Markdown to output strikethrough text wrapped in double tildes.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    strikethrough: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "strikethrough",
              "markdownDescription": "This key toggles whether CloudCannon will output strikethrough text wrapped in double tildes when converting HTML to Markdown.\n\nSetting this key to `true` will output strikethrough text as `~~strike~~` in Markdown.\n\nBy default, this key is `false` (i.e., strikethrough text is not output in double tildes format).\n\n## Examples\n\nIn this example, we have configured Markdown to output strikethrough text wrapped in double tildes.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    strikethrough: true\n```"
            },
            "subscript": {
              "description": "This key toggles whether CloudCannon will output subscript text wrapped in tildes when converting HTML to Markdown.\n\nSetting this key to `true` will output subscript text as `~sub~` in Markdown.\n\nBy default, this key is `false` (i.e., subscript text is not output in tildes format).\n\n## Examples\n\nIn this example, we have configured Markdown to output subscript text wrapped in tildes.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    subscript: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "subscript",
              "markdownDescription": "This key toggles whether CloudCannon will output subscript text wrapped in tildes when converting HTML to Markdown.\n\nSetting this key to `true` will output subscript text as `~sub~` in Markdown.\n\nBy default, this key is `false` (i.e., subscript text is not output in tildes format).\n\n## Examples\n\nIn this example, we have configured Markdown to output subscript text wrapped in tildes.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    subscript: true\n```"
            },
            "superscript": {
              "description": "This key toggles whether CloudCannon will output superscript text wrapped in carets when converting HTML to Markdown.\n\nSetting this key to `true` will output superscript text as `^super^` in Markdown.\n\nBy default, this key is `false` (i.e., superscript text is not output in carets format).\n\n## Examples\n\nIn this example, we have configured Markdown to output superscript text wrapped in carets.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    superscript: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "superscript",
              "markdownDescription": "This key toggles whether CloudCannon will output superscript text wrapped in carets when converting HTML to Markdown.\n\nSetting this key to `true` will output superscript text as `^super^` in Markdown.\n\nBy default, this key is `false` (i.e., superscript text is not output in carets format).\n\n## Examples\n\nIn this example, we have configured Markdown to output superscript text wrapped in carets.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    superscript: true\n```"
            },
            "heading_ids": {
              "description": "This key toggles whether CloudCannon will generate IDs for headings when converting Markdown to HTML.\n\nSetting this key to `true` will automatically generate ID attributes for heading elements based on their text content.\n\nBy default, this key is `false` (i.e., IDs are not generated for headings).\n\n## Examples\n\nIn this example, we have configured Markdown to generate IDs for headings.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    heading_ids: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "heading_ids",
              "markdownDescription": "This key toggles whether CloudCannon will generate IDs for headings when converting Markdown to HTML.\n\nSetting this key to `true` will automatically generate ID attributes for heading elements based on their text content.\n\nBy default, this key is `false` (i.e., IDs are not generated for headings).\n\n## Examples\n\nIn this example, we have configured Markdown to generate IDs for headings.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    heading_ids: true\n```"
            },
            "attributes": {
              "description": "This key toggles whether CloudCannon will save element attributes in Markdown format instead of converting them to HTML when converting HTML to Markdown.\n\nSetting this key to `true` will preserve element attributes in Markdown format (using attribute lists) rather than converting them to HTML.\n\nBy default, this key is `false` (i.e., element attributes are converted to HTML).\n\n## Examples\n\nIn this example, we have configured Markdown to save element attributes in Markdown format.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n```",
              "default": false,
              "type": "boolean",
              "documented": true,
              "title": "attributes",
              "markdownDescription": "This key toggles whether CloudCannon will save element attributes in Markdown format instead of converting them to HTML when converting HTML to Markdown.\n\nSetting this key to `true` will preserve element attributes in Markdown format (using attribute lists) rather than converting them to HTML.\n\nBy default, this key is `false` (i.e., element attributes are converted to HTML).\n\n## Examples\n\nIn this example, we have configured Markdown to save element attributes in Markdown format.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n```"
            },
            "attribute_elements": {
              "description": "This key defines positioning behavior of Markdown attributes for different element types when converting HTML to Markdown.\n\nThe value is an object that can contain `inline`, `block`, or element-specific properties. Each property value specifies where attribute lists should be positioned for that element type. Valid values are `none`, `right`, `space right`, `below`, `newline below`, or `right-of-prefix`.\n\nThis key only takes effect when `attributes` is enabled.\n\n## Examples\n\nIn this example, we have configured attribute positioning for inline and block elements.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attribute_elements:\n      inline: right\n      block: below\n```",
              "type": "object",
              "properties": {
                "inline": {
                  "allOf": [
                    {
                      "$ref": "#/$defs/AttributeListPosition"
                    }
                  ],
                  "documented": true,
                  "title": "inline",
                  "description": "This key defines where attribute lists are positioned for inline elements when converting HTML to Markdown.\n\nThe value can be `none`, `right`, `space right`, `below`, `newline below`, or `right-of-prefix`. This applies to all inline elements unless overridden by element-specific configuration.\n\nThis key only takes effect when `attributes` is enabled.\n\n## Examples\n\nIn this example, we have configured inline elements to place attributes on the right.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attribute_elements:\n      inline: right\n```",
                  "markdownDescription": "This key defines where attribute lists are positioned for inline elements when converting HTML to Markdown.\n\nThe value can be `none`, `right`, `space right`, `below`, `newline below`, or `right-of-prefix`. This applies to all inline elements unless overridden by element-specific configuration.\n\nThis key only takes effect when `attributes` is enabled.\n\n## Examples\n\nIn this example, we have configured inline elements to place attributes on the right.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attribute_elements:\n      inline: right\n```"
                },
                "block": {
                  "allOf": [
                    {
                      "$ref": "#/$defs/AttributeListPosition"
                    }
                  ],
                  "documented": true,
                  "title": "block",
                  "description": "This key defines where attribute lists are positioned for block-level elements when converting HTML to Markdown.\n\nThe value can be `none`, `right`, `space right`, `below`, `newline below`, or `right-of-prefix`. This applies to all block-level elements unless overridden by element-specific configuration.\n\nThis key only takes effect when `attributes` is enabled.\n\n## Examples\n\nIn this example, we have configured block-level elements to place attributes below the element.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attribute_elements:\n      block: below\n```",
                  "markdownDescription": "This key defines where attribute lists are positioned for block-level elements when converting HTML to Markdown.\n\nThe value can be `none`, `right`, `space right`, `below`, `newline below`, or `right-of-prefix`. This applies to all block-level elements unless overridden by element-specific configuration.\n\nThis key only takes effect when `attributes` is enabled.\n\n## Examples\n\nIn this example, we have configured block-level elements to place attributes below the element.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attribute_elements:\n      block: below\n```"
                }
              },
              "markdownDescription": "This key defines positioning behavior of Markdown attributes for different element types when converting HTML to Markdown.\n\nThe value is an object that can contain `inline`, `block`, or element-specific properties. Each property value specifies where attribute lists should be positioned for that element type. Valid values are `none`, `right`, `space right`, `below`, `newline below`, or `right-of-prefix`.\n\nThis key only takes effect when `attributes` is enabled.\n\n## Examples\n\nIn this example, we have configured attribute positioning for inline and block elements.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attribute_elements:\n      inline: right\n      block: below\n```",
              "title": "Markdown Attribute Element Options",
              "documented": true,
              "additionalProperties": {
                "$ref": "#/$defs/AttributeListPosition"
              }
            }
          },
          "markdownDescription": "This key defines configuration options for the Markdown processing engine.\n\nThe value is an object that can contain various options controlling how Markdown is converted to HTML and vice versa.\n\n## Examples\n\nIn this example, we have configured Markdown options to enable HTML output, convert line breaks, and enable GitHub Flavored Markdown.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    html: true\n    breaks: true\n    gfm: true\n```",
          "documented": true,
          "title": "options",
          "description": "This key defines configuration options for the Markdown processing engine.\n\nThe value is an object that can contain various options controlling how Markdown is converted to HTML and vice versa.\n\n## Examples\n\nIn this example, we have configured Markdown options to enable HTML output, convert line breaks, and enable GitHub Flavored Markdown.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    html: true\n    breaks: true\n    gfm: true\n```",
          "additionalProperties": false
        }
      },
      "markdownDescription": "This key defines your markdown engine for parsing Markdown content into HTML and any configuration options for your engine.\n\n## Examples\n\nIn this example, we have configured CloudCannon to use the `commonmark` Markdown engine with various options including attributes and attribute elements.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attributes_elements:\n      inline: none\n      block: space right\n      ul: below\n      ol: below\n      blockquote: below\n      p: below\n      img: below\n      hr: below\n      table: below\n      li: none\n```",
      "title": "Markdown Settings",
      "description": "This key defines your markdown engine for parsing Markdown content into HTML and any configuration options for your engine.\n\n## Examples\n\nIn this example, we have configured CloudCannon to use the `commonmark` Markdown engine with various options including attributes and attribute elements.\n\n```yaml\nmarkdown:\n  engine: commonmark\n  options:\n    attributes: true\n    attributes_elements:\n      inline: none\n      block: space right\n      ul: below\n      ol: below\n      blockquote: below\n      p: below\n      img: below\n      hr: below\n      table: below\n      li: none\n```",
      "documented": true,
      "additionalProperties": false
    },
    "AttributeListPosition": {
      "type": "string",
      "enum": [
        "none",
        "right",
        "space right",
        "below",
        "newline below",
        "right-of-prefix"
      ],
      "title": "Attribute List Position",
      "description": "Positioning options for Markdown attribute elements.",
      "documented": false,
      "markdownDescription": "Positioning options for Markdown attribute elements."
    },
    "type._snippets": {
      "title": "Snippets",
      "description": "This key defines custom snippets for your Site.\n\nThis key has no default.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "This key defines custom snippets for your Site.\n\nThis key has no default.",
      "documented": true,
      "additionalProperties": {
        "$ref": "#/$defs/type.snippet"
      }
    },
    "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
    },
    "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
    },
    "type._snippets_imports": {
      "type": "object",
      "properties": {
        "hugo": {
          "$ref": "#/$defs/_snippets_imports.hugo"
        },
        "jekyll": {
          "$ref": "#/$defs/_snippets_imports.jekyll"
        },
        "mdx": {
          "$ref": "#/$defs/_snippets_imports.mdx"
        },
        "eleventy_liquid": {
          "$ref": "#/$defs/_snippets_imports.eleventy_liquid"
        },
        "eleventy_nunjucks": {
          "$ref": "#/$defs/_snippets_imports.eleventy_nunjucks"
        },
        "markdoc": {
          "$ref": "#/$defs/_snippets_imports.markdoc"
        },
        "python_markdown_extensions": {
          "$ref": "#/$defs/_snippets_imports.python_markdown_extensions"
        },
        "docusaurus_mdx": {
          "$ref": "#/$defs/_snippets_imports.docusaurus_mdx"
        }
      },
      "markdownDescription": "This key defines snippet templates or libraries for your Site.\n\nSome libraries are SSG specific while others work for most SSGs.\n\nFor more information, please read our documentation on [Docusaurus Components](https://cloudcannon.com/documentation/articles/snippets-using-docusaurus-components/),\n[Eleventy Shortcodes](https://cloudcannon.com/documentation/articles/snippets-using-eleventy-shortcodes/), [Hugo Shortcodes](https://cloudcannon.com/documentation/articles/snippets-using-hugo-shortcodes/), [MDX Components](https://cloudcannon.com/documentation/articles/snippets-using-mdx-components/), or [Python Markdown](https://cloudcannon.com/documentation/articles/snippets-using-python-markdown/).\n\n## Examples\n\nIn this example, we have configured Hugo shortcode imports for the Site.\n\n```yaml\n_snippets_imports:\n  hugo:\n    include:\n      - figure\n      - youtube\n```",
      "title": "Snippets Imports",
      "documented": true,
      "description": "This key defines snippet templates or libraries for your Site.\n\nSome libraries are SSG specific while others work for most SSGs.\n\nFor more information, please read our documentation on [Docusaurus Components](https://cloudcannon.com/documentation/articles/snippets-using-docusaurus-components/),\n[Eleventy Shortcodes](https://cloudcannon.com/documentation/articles/snippets-using-eleventy-shortcodes/), [Hugo Shortcodes](https://cloudcannon.com/documentation/articles/snippets-using-hugo-shortcodes/), [MDX Components](https://cloudcannon.com/documentation/articles/snippets-using-mdx-components/), or [Python Markdown](https://cloudcannon.com/documentation/articles/snippets-using-python-markdown/).\n\n## Examples\n\nIn this example, we have configured Hugo shortcode imports for the Site.\n\n```yaml\n_snippets_imports:\n  hugo:\n    include:\n      - figure\n      - youtube\n```",
      "additionalProperties": false
    },
    "_snippets_imports.hugo": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "hugo"
    },
    "type._snippets_imports.*.(full-import)": {
      "type": "boolean",
      "title": "Snippets Imports Full Import",
      "documented": true
    },
    "SnippetImportExclude": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "exclude[*]"
      },
      "description": "This key defines the list of excluded snippets.\n\nIf unset, all snippets are excluded unless defined in `include`.",
      "documented": true,
      "title": "exclude",
      "markdownDescription": "This key defines the list of excluded snippets.\n\nIf unset, all snippets are excluded unless defined in `include`."
    },
    "SnippetImportInclude": {
      "type": "array",
      "items": {
        "type": "string",
        "documented": true,
        "title": "include[*]"
      },
      "description": "This key defines the list of included snippets.\n\nIf unset, all snippets are included unless defined in `exclude`.",
      "documented": true,
      "title": "include",
      "markdownDescription": "This key defines the list of included snippets.\n\nIf unset, all snippets are included unless defined in `exclude`."
    },
    "_snippets_imports.jekyll": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "jekyll"
    },
    "_snippets_imports.mdx": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "mdx"
    },
    "_snippets_imports.eleventy_liquid": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "eleventy_liquid"
    },
    "_snippets_imports.eleventy_nunjucks": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "eleventy_nunjucks"
    },
    "_snippets_imports.markdoc": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "markdoc"
    },
    "_snippets_imports.python_markdown_extensions": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "python_markdown_extensions"
    },
    "_snippets_imports.docusaurus_mdx": {
      "uniqueItems": true,
      "anyOf": [
        {
          "$ref": "#/$defs/type._snippets_imports.*.(full-import)"
        },
        {
          "type": "object",
          "properties": {
            "exclude": {
              "$ref": "#/$defs/SnippetImportExclude"
            }
          },
          "required": [
            "exclude"
          ],
          "documented": true,
          "title": "Snippets Imports Exclude List",
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "include": {
              "$ref": "#/$defs/SnippetImportInclude"
            }
          },
          "required": [
            "include"
          ],
          "documented": true,
          "title": "Snippets Imports Include List",
          "additionalProperties": false
        }
      ],
      "documented": true,
      "title": "docusaurus_mdx"
    },
    "type._snippets_templates": {
      "title": "Snippets Templates",
      "description": "This key defines extended options used when creating more complex custom snippets.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "This key defines extended options used when creating more complex custom snippets.",
      "documented": true,
      "additionalProperties": {
        "$ref": "#/$defs/type.snippet"
      }
    },
    "type._snippets_definitions": {
      "title": "Snippets Definitions",
      "description": "A record of reusable values that can be referenced in snippet templates. Values are substituted using `{ ref: \"key\" }` for direct replacement or `{ spread_ref: \"key\" }` for spreading arrays/objects. Common definition types include parser formats, argument models, select option lists, and simple string values like shortcode names.\n\n## Examples\n\nDefine reusable values like shortcode names, argument models, and parser formats that can be referenced in snippet templates.\n\n```yaml\n_snippets_definitions:\n  # Simple string value for the shortcode name\n  shortcode_name: \"highlight\"\n  content_key: \"content\"\n\n  # Array of argument models for positional arguments\n  positional_args:\n    - editor_key: \"language\"\n      type: \"string\"\n    - editor_key: \"linenos\"\n      type: \"boolean\"\n      optional: true\n      default: false\n\n  # Parser format configuration\n  custom_format:\n    root_pair_delimiter:\n      - \" \"\n    root_value_delimiter: \"=\"\n    string_boundary:\n      - '\"'\n      - \"'\"\n      - \"\"\n    allow_booleans: true\n    allow_numbers: true\n```\n\nReference definitions in snippet templates using `{ ref: \"key\" }` syntax. This allows you to reuse common configurations across multiple snippets.\n\n```yaml\n_snippets_definitions:\n  shortcode_name: \"figure\"\n  named_args:\n    - editor_key: \"src\"\n      type: \"string\"\n    - editor_key: \"alt\"\n      type: \"string\"\n      optional: true\n\n_snippets_templates:\n  my_shortcode_template:\n    snippet: \"{{< [[name]] [[args]] >}}\"\n    params:\n      name:\n        parser: \"literal\"\n        options:\n          literal:\n            ref: \"shortcode_name\"\n      args:\n        parser: \"key_values\"\n        options:\n          models:\n            ref: \"named_args\"\n\n_snippets:\n  figure:\n    template: \"my_shortcode_template\"\n    definitions:\n      shortcode_name: \"figure\"\n      named_args:\n        - editor_key: \"src\"\n          type: \"string\"\n        - editor_key: \"alt\"\n          type: \"string\"\n```\n\nDefine a list of select options for use in snippet inputs, such as a list of programming languages for a code highlighting snippet.\n\n```yaml\n_snippets_definitions:\n  languages:\n    - name: \"JavaScript\"\n      value: \"js\"\n    - name: \"Python\"\n      value: \"python\"\n    - name: \"Ruby\"\n      value: \"ruby\"\n    - name: \"HTML\"\n      value: \"html\"\n    - name: \"CSS\"\n      value: \"css\"\n```",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "markdownDescription": "A record of reusable values that can be referenced in snippet templates. Values are substituted using `{ ref: \"key\" }` for direct replacement or `{ spread_ref: \"key\" }` for spreading arrays/objects. Common definition types include parser formats, argument models, select option lists, and simple string values like shortcode names.\n\n## Examples\n\nDefine reusable values like shortcode names, argument models, and parser formats that can be referenced in snippet templates.\n\n```yaml\n_snippets_definitions:\n  # Simple string value for the shortcode name\n  shortcode_name: \"highlight\"\n  content_key: \"content\"\n\n  # Array of argument models for positional arguments\n  positional_args:\n    - editor_key: \"language\"\n      type: \"string\"\n    - editor_key: \"linenos\"\n      type: \"boolean\"\n      optional: true\n      default: false\n\n  # Parser format configuration\n  custom_format:\n    root_pair_delimiter:\n      - \" \"\n    root_value_delimiter: \"=\"\n    string_boundary:\n      - '\"'\n      - \"'\"\n      - \"\"\n    allow_booleans: true\n    allow_numbers: true\n```\n\nReference definitions in snippet templates using `{ ref: \"key\" }` syntax. This allows you to reuse common configurations across multiple snippets.\n\n```yaml\n_snippets_definitions:\n  shortcode_name: \"figure\"\n  named_args:\n    - editor_key: \"src\"\n      type: \"string\"\n    - editor_key: \"alt\"\n      type: \"string\"\n      optional: true\n\n_snippets_templates:\n  my_shortcode_template:\n    snippet: \"{{< [[name]] [[args]] >}}\"\n    params:\n      name:\n        parser: \"literal\"\n        options:\n          literal:\n            ref: \"shortcode_name\"\n      args:\n        parser: \"key_values\"\n        options:\n          models:\n            ref: \"named_args\"\n\n_snippets:\n  figure:\n    template: \"my_shortcode_template\"\n    definitions:\n      shortcode_name: \"figure\"\n      named_args:\n        - editor_key: \"src\"\n          type: \"string\"\n        - editor_key: \"alt\"\n          type: \"string\"\n```\n\nDefine a list of select options for use in snippet inputs, such as a list of programming languages for a code highlighting snippet.\n\n```yaml\n_snippets_definitions:\n  languages:\n    - name: \"JavaScript\"\n      value: \"js\"\n    - name: \"Python\"\n      value: \"python\"\n    - name: \"Ruby\"\n      value: \"ruby\"\n    - name: \"HTML\"\n      value: \"html\"\n    - name: \"CSS\"\n      value: \"css\"\n```",
      "documented": true,
      "additionalProperties": {
        "$ref": "#/$defs/type.snippet-definition-value"
      }
    },
    "type.snippet-definition-value": {
      "anyOf": [
        {
          "$ref": "#/$defs/type.snippet-format"
        },
        {
          "$ref": "#/$defs/type.snippet-model"
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/type.snippet-model"
          },
          "title": "Parser Model Array",
          "description": "An array of parser model configurations. Typically used for `positional_args` or `named_args` definitions that specify the arguments a snippet accepts. Each model defines an argument's editor key, type, default value, and whether it's optional.",
          "documented": true,
          "markdownDescription": "An array of parser model configurations. Typically used for `positional_args` or `named_args` definitions that specify the arguments a snippet accepts. Each model defines an argument's editor key, type, default value, and whether it's optional."
        },
        {
          "type": "array",
          "items": {
            "$ref": "#/$defs/type.snippet-definition-select-value"
          },
          "title": "Select Values Array",
          "description": "An array of select option values. Commonly used for language lists in code highlighting snippets, where each option has a display name and a value. For example: `[{ name: \"JavaScript\", value: \"js\" }, { name: \"Python\", value: \"python\" }]`.",
          "documented": true,
          "markdownDescription": "An array of select option values. Commonly used for language lists in code highlighting snippets, where each option has a display name and a value. For example: `[{ name: \"JavaScript\", value: \"js\" }, { name: \"Python\", value: \"python\" }]`."
        },
        {
          "type": "string",
          "title": "String Value",
          "description": "A string value definition. Commonly used for `shortcode_name`, `tag_name`, `content_key`, `include_name`, and similar definitions that identify snippet components by name.",
          "documented": true,
          "markdownDescription": "A string value definition. Commonly used for `shortcode_name`, `tag_name`, `content_key`, `include_name`, and similar definitions that identify snippet components by name."
        },
        {
          "type": "number",
          "title": "Number Value",
          "description": "A numeric value definition. Use for counts, sizes, or other numeric values that can be referenced in snippet templates.",
          "documented": true,
          "markdownDescription": "A numeric value definition. Use for counts, sizes, or other numeric values that can be referenced in snippet templates."
        },
        {
          "type": "boolean",
          "title": "Boolean Value",
          "description": "A boolean value definition. Use for flags and toggles that can be referenced in snippet templates.",
          "documented": true,
          "markdownDescription": "A boolean value definition. Use for flags and toggles that can be referenced in snippet templates."
        },
        {
          "type": "array",
          "items": {
            "type": "string",
            "documented": true,
            "title": "snippet-definition-value(string-array)[*]",
            "description": "A string item in the array.",
            "markdownDescription": "A string item in the array."
          },
          "title": "String Array",
          "description": "An array of string values. Useful for defining lists of allowed values, delimiters, or other string collections that can be referenced in snippet templates.",
          "documented": true,
          "markdownDescription": "An array of string values. Useful for defining lists of allowed values, delimiters, or other string collections that can be referenced in snippet templates."
        }
      ],
      "title": "Snippet Definition Value",
      "description": "A reusable value that can be referenced in snippet templates via `{ ref: \"key\" }` or `{ spread_ref: \"key\" }`. Can be a string, number, boolean, parser format, parser model, array of models, or array of select options.",
      "documented": true,
      "markdownDescription": "A reusable value that can be referenced in snippet templates via `{ ref: \"key\" }` or `{ spread_ref: \"key\" }`. Can be a string, number, boolean, parser format, parser model, array of models, or array of select options."
    },
    "type.snippet-definition-select-value": {
      "type": "object",
      "properties": {
        "name": {
          "description": "The display name shown to users when selecting this option. For example, \"JavaScript\" for a language with value \"js\".",
          "type": "string",
          "documented": true,
          "title": "name",
          "markdownDescription": "The display name shown to users when selecting this option. For example, \"JavaScript\" for a language with value \"js\"."
        },
        "value": {
          "anyOf": [
            {
              "type": "string",
              "title": "String Select Value",
              "documented": true
            },
            {
              "type": "number",
              "title": "Number Select Value",
              "documented": true
            },
            {
              "type": "boolean",
              "title": "Boolean Select Value",
              "documented": true
            }
          ],
          "description": "The actual value used when this option is selected. Can be a string, number, or boolean. For example, \"js\" for JavaScript or 4 for an indentation level.",
          "documented": true,
          "title": "value",
          "markdownDescription": "The actual value used when this option is selected. Can be a string, number, or boolean. For example, \"js\" for JavaScript or 4 for an indentation level."
        }
      },
      "required": [
        "value"
      ],
      "markdownDescription": "A value option for select inputs, typically used in language lists. Contains a display name and the actual value to use.",
      "title": "Snippet Definition Select Value",
      "description": "A value option for select inputs, typically used in language lists. Contains a display name and the actual value to use.",
      "documented": true,
      "additionalProperties": false
    }
  }
}
