{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "docusaurus:blog:3.10",
  "title": "Docusaurus blog front matter v3.10",
  "description": "Front matter accepted by @docusaurus/plugin-content-blog as of Docusaurus 3.10. Docusaurus marks no field as required, so this is a format check, not a presence check. Unknown keys are tolerated, matching Docusaurus. `authors` is deliberately loose — a key, an inline author object, or a list of either — because Docusaurus resolves author entries against `authors.yml` rather than validating them strictly. The single-author `author*` keys are the deprecated spelling that `authors` replaces. It claims neither `type` nor `action`, so it composes with the taxonomy vocabularies; stacking it with google:okf:0.1 is the one exception, since both define `tags` and OKF allows string tags only. See https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog#markdown-front-matter",
  "type": "object",
  "additionalProperties": true,
  "properties": {
    "authors": {
      "description": "One author or several: a key from `authors.yml`, an inline author object, or a list mixing the two. The `$ref` types the inline-object form and `items` the list form, so each shape is checked without an anyOf that would report every alternative as a separate failure.",
      "type": ["string", "object", "array"],
      "$ref": "#/$defs/authorFields",
      "items": { "$ref": "#/$defs/author" }
    },
    "author": {
      "type": "string",
      "description": "Deprecated in favor of `authors`. The post author's name."
    },
    "author_url": {
      "type": "string",
      "format": "uri-reference",
      "description": "Deprecated in favor of `authors`. URL of the author's profile page."
    },
    "author_image_url": {
      "type": "string",
      "format": "uri-reference",
      "description": "Deprecated in favor of `authors`. URL of the author's thumbnail image."
    },
    "author_title": {
      "type": "string",
      "description": "Deprecated in favor of `authors`. A description of the author."
    },
    "title": {
      "type": "string",
      "description": "Blog post title. Defaults to the Markdown title."
    },
    "title_meta": {
      "type": "string",
      "description": "SEO title used for `<title>` and `og:title`. Defaults to `title`."
    },
    "sidebar_label": {
      "type": "string",
      "description": "Text shown for this post in the blog sidebar. Defaults to `title`."
    },
    "date": {
      "type": "string",
      "description": "Post creation date. Defaults to a date parsed from the file name, then the file's creation time."
    },
    "tags": {
      "type": "array",
      "items": {
        "type": ["string", "object"],
        "required": ["label", "permalink"],
        "additionalProperties": true,
        "properties": {
          "label": { "type": "string" },
          "permalink": { "type": "string" },
          "description": { "type": "string" }
        }
      },
      "description": "Tags for this post: either a string, or an object carrying both a `label` and a `permalink`. `required` and `properties` bind only to the object form, so a plain string tag passes and a half-written object reports the key it is missing."
    },
    "draft": {
      "type": "boolean",
      "description": "A draft post is available in development only. Cannot be combined with `unlisted`."
    },
    "unlisted": {
      "type": "boolean",
      "description": "An unlisted post is published but hidden from listings, search, and sitemaps. Cannot be combined with `draft`."
    },
    "hide_table_of_contents": {
      "type": "boolean",
      "description": "Hide the right-hand table of contents."
    },
    "toc_min_heading_level": {
      "type": "number",
      "minimum": 2,
      "maximum": 6,
      "description": "Shallowest heading level shown in the table of contents. Between 2 and 6, and no deeper than `toc_max_heading_level`. Typed `number` rather than `integer` because upstream is `Joi.number().min(2).max(6)` with no `.integer()`; being stricter here would fail a page Docusaurus builds."
    },
    "toc_max_heading_level": {
      "type": "number",
      "minimum": 2,
      "maximum": 6,
      "description": "Deepest heading level shown in the table of contents. Between 2 and 6. Typed `number` rather than `integer` to match upstream, as with `toc_min_heading_level`."
    },
    "keywords": {
      "type": "array",
      "items": { "type": "string" },
      "description": "Keywords meta tag for search engines."
    },
    "description": {
      "type": "string",
      "description": "Meta description for search engines. Defaults to the first line of Markdown content. May be empty."
    },
    "image": {
      "type": "string",
      "format": "uri-reference",
      "description": "Cover image used in social link previews. A site-root path such as `/img/card.png` is legal."
    },
    "slug": {
      "type": "string",
      "description": "Custom URL for this post. Defaults to the file path."
    },
    "last_update": {
      "type": "object",
      "minProperties": 1,
      "additionalProperties": false,
      "properties": {
        "author": {
          "type": "string",
          "description": "Overrides the last-update author."
        },
        "date": {
          "type": "string",
          "description": "Overrides the last-update date."
        }
      },
      "description": "Overrides the computed last-update information. Takes `author`, `date`, or both, and at least one of them."
    }
  },
  "if": {
    "required": ["draft"],
    "properties": { "draft": { "const": true } }
  },
  "then": {
    "properties": { "unlisted": { "const": false } }
  },
  "$defs": {
    "authorFields": {
      "description": "The inline author fields, defined once and shared by the single-author and list forms so the two cannot drift apart. It declares no `type`, because `properties` is ignored for non-objects — that is what lets the single-author form apply it without excluding the string and array spellings.",
      "properties": {
        "key": { "type": "string" },
        "name": { "type": "string" },
        "title": { "type": "string" },
        "url": { "type": "string", "format": "uri-reference" },
        "imageURL": { "type": "string", "format": "uri-reference" },
        "email": { "type": "string" },
        "socials": { "type": "object" },
        "page": { "type": ["boolean", "object"] }
      }
    },
    "author": {
      "description": "One entry in an `authors` list: a key from `authors.yml`, or an inline author object.",
      "type": ["string", "object"],
      "$ref": "#/$defs/authorFields"
    }
  }
}
