Skip to main content
Glama

Add a block

insert_block

Add one block to a page, after or before a block named by its id (in a column, when that block is in one), or at the end. Returns the new block's id. The input schema gives every block's fields, and write_site's description says what each is for. Images: upload_image first.

Input Schema

NameRequiredDescriptionDefault
pathYesThe page: "" for the home page, "_footer" for the footer
afterNoThe id of the block it goes after, in that block's page or column
blockYesThe block, without an id: one is given it
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
beforeNoThe id of the block it goes before; with neither, it goes at the end of the page
summaryNoWhat this change does, in a few words, for the history

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / block / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "content",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "grid": {
      -        "const": true,
      -        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      -        "type": "boolean"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -        "items": {
      -          "properties": {
      -            "alt": {
      -              "description": "What it shows",
      -              "type": "string"
      -            },
      -            "caption": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "poster": {
      -              "description": "A video's picture before it plays",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "video": {
      -              "const": true,
      -              "description": "src is an MP4 file that plays",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "src",
      -            "alt"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pictures",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tabs": {
      -        "items": {
      -          "properties": {
      -            "code": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "language": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "code"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "codeTabs",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "tabs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "columns": {
      -        "anyOf": [
      -          {
      -            "const": 2,
      -            "type": "number"
      -          },
      -          {
      -            "const": 3,
      -            "type": "number"
      -          },
      -          {
      -            "const": 4,
      -            "type": "number"
      -          }
      -        ],
      -        "description": "How many to a row; unset, as many as fit"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "suffix": {
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "value",
      -            "label"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "stats",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "groups": {
      -        "description": "Groups of links under a heading each",
      -        "items": {
      -          "properties": {
      -            "description": {
      -              "description": "Plain semantic HTML",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "heading": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "links": {
      -              "items": {
      -                "properties": {
      -                  "href": {
      -                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                    "type": "string"
      -                  },
      -                  "label": {
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "label",
      -                  "href"
      -                ],
      -                "type": "object"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "heading",
      -            "links"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "intro": {
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "linkGrid",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The citation, plain semantic HTML",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "title": {
      -        "description": "Its heading; unset, \"References\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "references",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Words in place of the notice's standard ones",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "banner",
      -        "type": "string"
      -      },
      -      "variant": {
      -        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -        "enum": [
      -          "stub",
      -          "unsourced",
      -          "outdated",
      -          "promotional",
      -          "cleanup",
      -          "coi"
      -        ],
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "variant"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "count": {
      -        "description": "With \"newest\", how many; unset, 6",
      -        "maximum": 48,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "menu": {
      -        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -        "items": {
      -          "properties": {
      -            "href": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "href"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "type": "array"
      -      },
      -      "pages": {
      -        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 48,
      -        "type": "array"
      -      },
      -      "shape": {
      -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -        "enum": [
      -          "portrait",
      -          "landscape"
      -        ],
      -        "type": "string"
      -      },
      -      "show": {
      -        "default": "cards",
      -        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -        "enum": [
      -          "cards",
      -          "links"
      -        ],
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -        "enum": [
      -          "under",
      -          "newest",
      -          "chosen",
      -          "products"
      -        ],
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tag": {
      -        "description": "With \"products\", only those with this tag; omit for all",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "under": {
      -        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -        "items": {
      -          "properties": {
      -            "date": {
      -              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "When it ends, written as date is; unset, it ends when it starts",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 300,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "past": {
      -        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "events",
      -        "type": "string"
      -      },
      -      "upcoming": {
      -        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "address": {
      -              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -              "type": "string"
      -            },
      -            "email": {
      -              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -              "type": "string"
      -            },
      -            "hours": {
      -              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -              "items": {
      -                "properties": {
      -                  "closes": {
      -                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  },
      -                  "days": {
      -                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                    "items": {
      -                      "enum": [
      -                        "mon",
      -                        "tue",
      -                        "wed",
      -                        "thu",
      -                        "fri",
      -                        "sat",
      -                        "sun"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "opens": {
      -                    "description": "24-hour: \"08:00\"",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "days",
      -                  "opens",
      -                  "closes"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 21,
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "image": {
      -              "description": "A picture of it, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "map": {
      -              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "note": {
      -              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "phone": {
      -              "description": "As it reads: \"020 7232 3010\"",
      -              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -              "type": "string"
      -            },
      -            "timeZone": {
      -              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "map": {
      -        "const": true,
      -        "description": "A map of each address, set under it",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "locations",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "align": {
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "stretch"
      -        ],
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "beside": {
      -        "const": true,
      -        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      -        "type": "boolean"
      -      },
      -      "columns": {
      -        "items": {
      -          "properties": {
      -            "align": {
      -              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      -              "enum": [
      -                "start",
      -                "center",
      -                "end"
      -              ],
      -              "type": "string"
      -            },
      -            "area": {
      -              "description": "Its place on a twelve-column grid; give every column one, or none",
      -              "properties": {
      -                "col": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "row": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "rows": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "span": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "col",
      -                "span",
      -                "row",
      -                "rows"
      -              ],
      -              "type": "object"
      -            },
      -            "blocks": {
      -              "items": {
      -                "oneOf": [
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Plain semantic HTML",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "content",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "text"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "grid": {
      -                        "const": true,
      -                        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      -                        "type": "boolean"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -                        "items": {
      -                          "properties": {
      -                            "alt": {
      -                              "description": "What it shows",
      -                              "type": "string"
      -                            },
      -                            "caption": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "poster": {
      -                              "description": "A video's picture before it plays",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "src": {
      -                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "video": {
      -                              "const": true,
      -                              "description": "src is an MP4 file that plays",
      -                              "type": "boolean"
      -                            }
      -                          },
      -                          "required": [
      -                            "src",
      -                            "alt"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "pictures",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "tabs": {
      -                        "items": {
      -                          "properties": {
      -                            "code": {
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "language": {
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "code"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 8,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "codeTabs",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "tabs"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "columns": {
      -                        "anyOf": [
      -                          {
      -                            "const": 2,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 3,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 4,
      -                            "type": "number"
      -                          }
      -                        ],
      -                        "description": "How many to a row; unset, as many as fit"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "suffix": {
      -                              "type": "string"
      -                            },
      -                            "value": {
      -                              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "value",
      -                            "label"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 12,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "stats",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "groups": {
      -                        "description": "Groups of links under a heading each",
      -                        "items": {
      -                          "properties": {
      -                            "description": {
      -                              "description": "Plain semantic HTML",
      -                              "type": [
      -                                "string",
      -                                "null"
      -                              ]
      -                            },
      -                            "heading": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "links": {
      -                              "items": {
      -                                "properties": {
      -                                  "href": {
      -                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                                    "type": "string"
      -                                  },
      -                                  "label": {
      -                                    "minLength": 1,
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "label",
      -                                  "href"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "type": "array"
      -                            }
      -                          },
      -                          "required": [
      -                            "heading",
      -                            "links"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "intro": {
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "linkGrid",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "groups"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "The citation, plain semantic HTML",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "url": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "title": {
      -                        "description": "Its heading; unset, \"References\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "references",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Words in place of the notice's standard ones",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "banner",
      -                        "type": "string"
      -                      },
      -                      "variant": {
      -                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -                        "enum": [
      -                          "stub",
      -                          "unsourced",
      -                          "outdated",
      -                          "promotional",
      -                          "cleanup",
      -                          "coi"
      -                        ],
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "variant"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "count": {
      -                        "description": "With \"newest\", how many; unset, 6",
      -                        "maximum": 48,
      -                        "minimum": 1,
      -                        "type": "integer"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "menu": {
      -                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -                        "items": {
      -                          "properties": {
      -                            "href": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "href"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 24,
      -                        "type": "array"
      -                      },
      -                      "pages": {
      -                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -                        "items": {
      -                          "type": "string"
      -                        },
      -                        "maxItems": 48,
      -                        "type": "array"
      -                      },
      -                      "shape": {
      -                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -                        "enum": [
      -                          "portrait",
      -                          "landscape"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "show": {
      -                        "default": "cards",
      -                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -                        "enum": [
      -                          "cards",
      -                          "links"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -                        "enum": [
      -                          "under",
      -                          "newest",
      -                          "chosen",
      -                          "products"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "tag": {
      -                        "description": "With \"products\", only those with this tag; omit for all",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "list",
      -                        "type": "string"
      -                      },
      -                      "under": {
      -                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "source"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -                        "items": {
      -                          "properties": {
      -                            "date": {
      -                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "end": {
      -                              "description": "When it ends, written as date is; unset, it ends when it starts",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "date",
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 300,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "past": {
      -                        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "events",
      -                        "type": "string"
      -                      },
      -                      "upcoming": {
      -                        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "heading": {
      -                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "address": {
      -                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -                              "type": "string"
      -                            },
      -                            "email": {
      -                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -                              "type": "string"
      -                            },
      -                            "hours": {
      -                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -                              "items": {
      -                                "properties": {
      -                                  "closes": {
      -                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  },
      -                                  "days": {
      -                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                                    "items": {
      -                                      "enum": [
      -                                        "mon",
      -                                        "tue",
      -                                        "wed",
      -                                        "thu",
      -                                        "fri",
      -                                        "sat",
      -                                        "sun"
      -                                      ],
      -                                      "type": "string"
      -                                    },
      -                                    "minItems": 1,
      -                                    "type": "array"
      -                                  },
      -                                  "opens": {
      -                                    "description": "24-hour: \"08:00\"",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "days",
      -                                  "opens",
      -                                  "closes"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "maxItems": 21,
      -                              "type": "array"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "image": {
      -                              "description": "A picture of it, by https URL",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "map": {
      -                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "name": {
      -                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "note": {
      -                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "phone": {
      -                              "description": "As it reads: \"020 7232 3010\"",
      -                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -                              "type": "string"
      -                            },
      -                            "timeZone": {
      -                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "map": {
      -                        "const": true,
      -                        "description": "A map of each address, set under it",
      -                        "type": "boolean"
      -                      },
      -                      "type": {
      -                        "const": "locations",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "gap": {
      -        "enum": [
      -          "sm",
      -          "md",
      -          "lg"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "columns",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "columns"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "backdrop": {
      -        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      -        "enum": [
      -          "mesh",
      -          "grain",
      -          "flow",
      -          "marble"
      -        ],
      -        "type": "string"
      -      },
      -      "backdropIntensity": {
      -        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "backdropSpeed": {
      -        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "box": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent",
      -              "none"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      -      },
      -      "call": {
      -        "const": true,
      -        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      -        "type": "boolean"
      -      },
      -      "cover": {
      -        "const": true,
      -        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      -        "type": "boolean"
      -      },
      -      "heading": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size; words in <strong> are drawn in the accent colour",
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "How tall it is: \"fit\" its words, \"half\" the screen, \"wide\" as a 16:9 picture is for its width, or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      -        "enum": [
      -          "fit",
      -          "half",
      -          "wide",
      -          "full"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "image": {
      -        "description": "A picture behind the heading, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "subheading": {
      -        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      -        "type": "boolean"
      -      },
      -      "text": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "hero",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "heading"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "duration": {
      -        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "file": {
      -        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      -        "properties": {
      -          "key": {
      -            "maxLength": 400,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "name": {
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "size": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "key",
      -          "name",
      -          "size"
      -        ],
      -        "type": "object"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "images": {
      -        "description": "Its pictures by https URL, the first on every listing",
      -        "items": {
      -          "pattern": "^https:\\/\\/\\S+$",
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "price": {
      -        "description": "As it should read, currency included, \"£2,500\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "service": {
      -        "const": true,
      -        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      -        "type": "boolean"
      -      },
      -      "sold": {
      -        "description": "A thing sold, or a service fully booked",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tags": {
      -        "default": [],
      -        "description": "The listings it appears in, by their \"tag\"",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "product",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "images",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "amounts": {
      -        "default": [],
      -        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 6,
      -        "type": "array"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "currency": {
      -        "description": "With no amounts, the currency gifts are in; unset, £",
      -        "enum": [
      -          "£",
      -          "$",
      -          "€"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "monthly": {
      -        "description": "The donor may give it every month as well as once",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "donate",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "author": {
      -        "description": "Their name: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "avatarUrl": {
      -        "description": "Their photo, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "quote": {
      -        "description": "Their words, exactly: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "role": {
      -        "description": "Who they are, \"Bride, 2024\", \"Head chef, The Ivy\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "testimonial",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "quote",
      -      "author"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "note": {
      -        "description": "A line under it, where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "As set, a line to a line, a blank line between stanzas, the spaces that indent a line kept; each line inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "title": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "poem",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "An h2 over it. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "login": {
      -        "description": "Whose contributions: a GitHub username, as in github.com/<username>",
      -        "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "github",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "login"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contents",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In the order the page scrolls",
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "section": {
      -              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      -              "pattern": "^[\\w-]+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 40,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "scenes",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "comments",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contact",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own home page editor; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "start",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own hosting prices; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pricing",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "content",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "grid": {
      +        "const": true,
      +        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      +        "type": "boolean"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +        "items": {
      +          "properties": {
      +            "alt": {
      +              "description": "What it shows",
      +              "type": "string"
      +            },
      +            "caption": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "poster": {
      +              "description": "A video's picture before it plays",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "video": {
      +              "const": true,
      +              "description": "src is an MP4 file that plays",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "src",
      +            "alt"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pictures",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tabs": {
      +        "items": {
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "language": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "code"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "codeTabs",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "tabs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "columns": {
      +        "anyOf": [
      +          {
      +            "const": 2,
      +            "type": "number"
      +          },
      +          {
      +            "const": 3,
      +            "type": "number"
      +          },
      +          {
      +            "const": 4,
      +            "type": "number"
      +          }
      +        ],
      +        "description": "How many to a row; unset, as many as fit"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "suffix": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "label"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "stats",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "groups": {
      +        "description": "Groups of links under a heading each",
      +        "items": {
      +          "properties": {
      +            "description": {
      +              "description": "Plain semantic HTML",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "heading": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "links": {
      +              "items": {
      +                "properties": {
      +                  "href": {
      +                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "label",
      +                  "href"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "heading",
      +            "links"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "intro": {
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "linkGrid",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The citation, plain semantic HTML",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "Its heading; unset, \"References\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "references",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Words in place of the notice's standard ones",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "banner",
      +        "type": "string"
      +      },
      +      "variant": {
      +        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +        "enum": [
      +          "stub",
      +          "unsourced",
      +          "outdated",
      +          "promotional",
      +          "cleanup",
      +          "coi"
      +        ],
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "variant"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "count": {
      +        "description": "With \"newest\", how many; unset, 6",
      +        "maximum": 48,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "menu": {
      +        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +        "items": {
      +          "properties": {
      +            "href": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "href"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "type": "array"
      +      },
      +      "pages": {
      +        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 48,
      +        "type": "array"
      +      },
      +      "shape": {
      +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +        "enum": [
      +          "portrait",
      +          "landscape"
      +        ],
      +        "type": "string"
      +      },
      +      "show": {
      +        "default": "cards",
      +        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +        "enum": [
      +          "cards",
      +          "links"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +        "enum": [
      +          "under",
      +          "newest",
      +          "chosen",
      +          "products"
      +        ],
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tag": {
      +        "description": "With \"products\", only those with this tag; omit for all",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "under": {
      +        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +        "items": {
      +          "properties": {
      +            "date": {
      +              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "When it ends, written as date is; unset, it ends when it starts",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 300,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "past": {
      +        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "events",
      +        "type": "string"
      +      },
      +      "upcoming": {
      +        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "address": {
      +              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +              "type": "string"
      +            },
      +            "email": {
      +              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +              "type": "string"
      +            },
      +            "hours": {
      +              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +              "items": {
      +                "properties": {
      +                  "closes": {
      +                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  },
      +                  "days": {
      +                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                    "items": {
      +                      "enum": [
      +                        "mon",
      +                        "tue",
      +                        "wed",
      +                        "thu",
      +                        "fri",
      +                        "sat",
      +                        "sun"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "opens": {
      +                    "description": "24-hour: \"08:00\"",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "days",
      +                  "opens",
      +                  "closes"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 21,
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "image": {
      +              "description": "A picture of it, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "map": {
      +              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "note": {
      +              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "phone": {
      +              "description": "As it reads: \"020 7232 3010\"",
      +              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +              "type": "string"
      +            },
      +            "timeZone": {
      +              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "map": {
      +        "const": true,
      +        "description": "A map of each address, set under it",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "locations",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "stretch"
      +        ],
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "beside": {
      +        "const": true,
      +        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      +        "type": "boolean"
      +      },
      +      "columns": {
      +        "items": {
      +          "properties": {
      +            "align": {
      +              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      +              "enum": [
      +                "start",
      +                "center",
      +                "end"
      +              ],
      +              "type": "string"
      +            },
      +            "area": {
      +              "description": "Its place on a twelve-column grid; give every column one, or none",
      +              "properties": {
      +                "col": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "row": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "rows": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "span": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "col",
      +                "span",
      +                "row",
      +                "rows"
      +              ],
      +              "type": "object"
      +            },
      +            "blocks": {
      +              "items": {
      +                "oneOf": [
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Plain semantic HTML",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "content",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "text"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "grid": {
      +                        "const": true,
      +                        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      +                        "type": "boolean"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +                        "items": {
      +                          "properties": {
      +                            "alt": {
      +                              "description": "What it shows",
      +                              "type": "string"
      +                            },
      +                            "caption": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "poster": {
      +                              "description": "A video's picture before it plays",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "src": {
      +                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "video": {
      +                              "const": true,
      +                              "description": "src is an MP4 file that plays",
      +                              "type": "boolean"
      +                            }
      +                          },
      +                          "required": [
      +                            "src",
      +                            "alt"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "pictures",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "tabs": {
      +                        "items": {
      +                          "properties": {
      +                            "code": {
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "language": {
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "code"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 8,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "codeTabs",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "tabs"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "columns": {
      +                        "anyOf": [
      +                          {
      +                            "const": 2,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 3,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 4,
      +                            "type": "number"
      +                          }
      +                        ],
      +                        "description": "How many to a row; unset, as many as fit"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "suffix": {
      +                              "type": "string"
      +                            },
      +                            "value": {
      +                              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "value",
      +                            "label"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 12,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "stats",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "groups": {
      +                        "description": "Groups of links under a heading each",
      +                        "items": {
      +                          "properties": {
      +                            "description": {
      +                              "description": "Plain semantic HTML",
      +                              "type": [
      +                                "string",
      +                                "null"
      +                              ]
      +                            },
      +                            "heading": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "links": {
      +                              "items": {
      +                                "properties": {
      +                                  "href": {
      +                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                                    "type": "string"
      +                                  },
      +                                  "label": {
      +                                    "minLength": 1,
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "label",
      +                                  "href"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "type": "array"
      +                            }
      +                          },
      +                          "required": [
      +                            "heading",
      +                            "links"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "intro": {
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "linkGrid",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "groups"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "The citation, plain semantic HTML",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "url": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "title": {
      +                        "description": "Its heading; unset, \"References\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "references",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Words in place of the notice's standard ones",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "banner",
      +                        "type": "string"
      +                      },
      +                      "variant": {
      +                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +                        "enum": [
      +                          "stub",
      +                          "unsourced",
      +                          "outdated",
      +                          "promotional",
      +                          "cleanup",
      +                          "coi"
      +                        ],
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "variant"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "count": {
      +                        "description": "With \"newest\", how many; unset, 6",
      +                        "maximum": 48,
      +                        "minimum": 1,
      +                        "type": "integer"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "menu": {
      +                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +                        "items": {
      +                          "properties": {
      +                            "href": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "href"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 24,
      +                        "type": "array"
      +                      },
      +                      "pages": {
      +                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +                        "items": {
      +                          "type": "string"
      +                        },
      +                        "maxItems": 48,
      +                        "type": "array"
      +                      },
      +                      "shape": {
      +                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +                        "enum": [
      +                          "portrait",
      +                          "landscape"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "show": {
      +                        "default": "cards",
      +                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +                        "enum": [
      +                          "cards",
      +                          "links"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +                        "enum": [
      +                          "under",
      +                          "newest",
      +                          "chosen",
      +                          "products"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "tag": {
      +                        "description": "With \"products\", only those with this tag; omit for all",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "list",
      +                        "type": "string"
      +                      },
      +                      "under": {
      +                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "source"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +                        "items": {
      +                          "properties": {
      +                            "date": {
      +                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "end": {
      +                              "description": "When it ends, written as date is; unset, it ends when it starts",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "date",
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 300,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "past": {
      +                        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "events",
      +                        "type": "string"
      +                      },
      +                      "upcoming": {
      +                        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "heading": {
      +                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "address": {
      +                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +                              "type": "string"
      +                            },
      +                            "email": {
      +                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +                              "type": "string"
      +                            },
      +                            "hours": {
      +                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +                              "items": {
      +                                "properties": {
      +                                  "closes": {
      +                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  },
      +                                  "days": {
      +                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                                    "items": {
      +                                      "enum": [
      +                                        "mon",
      +                                        "tue",
      +                                        "wed",
      +                                        "thu",
      +                                        "fri",
      +                                        "sat",
      +                                        "sun"
      +                                      ],
      +                                      "type": "string"
      +                                    },
      +                                    "minItems": 1,
      +                                    "type": "array"
      +                                  },
      +                                  "opens": {
      +                                    "description": "24-hour: \"08:00\"",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "days",
      +                                  "opens",
      +                                  "closes"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "maxItems": 21,
      +                              "type": "array"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "image": {
      +                              "description": "A picture of it, by https URL",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "map": {
      +                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "name": {
      +                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "note": {
      +                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "phone": {
      +                              "description": "As it reads: \"020 7232 3010\"",
      +                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +                              "type": "string"
      +                            },
      +                            "timeZone": {
      +                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "map": {
      +                        "const": true,
      +                        "description": "A map of each address, set under it",
      +                        "type": "boolean"
      +                      },
      +                      "type": {
      +                        "const": "locations",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "gap": {
      +        "enum": [
      +          "sm",
      +          "md",
      +          "lg"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "columns",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "columns"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "backdrop": {
      +        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      +        "enum": [
      +          "mesh",
      +          "grain",
      +          "flow",
      +          "marble"
      +        ],
      +        "type": "string"
      +      },
      +      "backdropIntensity": {
      +        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "backdropSpeed": {
      +        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "box": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent",
      +              "none"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      +      },
      +      "call": {
      +        "const": true,
      +        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      +        "type": "boolean"
      +      },
      +      "cover": {
      +        "const": true,
      +        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size; words in <strong> are drawn in the accent colour",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "Over a picture, a backdrop, as a cover or on a site with a background picture, how tall it is: \"fit\" its words, \"half\" the screen, \"wide\" as a 16:9 picture is for its width, or \"full\"; unset, full. With nothing behind it, an opening fits its words whatever this says",
      +        "enum": [
      +          "fit",
      +          "half",
      +          "wide",
      +          "full"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "image": {
      +        "description": "A picture behind the heading, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "subheading": {
      +        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      +        "type": "boolean"
      +      },
      +      "text": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "hero",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "heading"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "duration": {
      +        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "file": {
      +        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      +        "properties": {
      +          "key": {
      +            "maxLength": 400,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "name": {
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "size": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "name",
      +          "size"
      +        ],
      +        "type": "object"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "images": {
      +        "description": "Its pictures by https URL, the first on every listing",
      +        "items": {
      +          "pattern": "^https:\\/\\/\\S+$",
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "price": {
      +        "description": "As it should read, currency included, \"£2,500\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "service": {
      +        "const": true,
      +        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      +        "type": "boolean"
      +      },
      +      "sold": {
      +        "description": "A thing sold, or a service fully booked",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tags": {
      +        "default": [],
      +        "description": "The listings it appears in, by their \"tag\"",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "product",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "images",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "amounts": {
      +        "default": [],
      +        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 6,
      +        "type": "array"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "currency": {
      +        "description": "With no amounts, the currency gifts are in; unset, £",
      +        "enum": [
      +          "£",
      +          "$",
      +          "€"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "monthly": {
      +        "description": "The donor may give it every month as well as once",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "donate",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "author": {
      +        "description": "Their name: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "avatarUrl": {
      +        "description": "Their photo, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "quote": {
      +        "description": "Their words, exactly: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "role": {
      +        "description": "Who they are, \"Bride, 2024\", \"Head chef, The Ivy\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "testimonial",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "quote",
      +      "author"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "note": {
      +        "description": "A line under it, where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "As set, a line to a line, a blank line between stanzas, the spaces that indent a line kept; each line inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "poem",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over it. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "login": {
      +        "description": "Whose contributions: a GitHub username, as in github.com/<username>",
      +        "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "github",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "login"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contents",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In the order the page scrolls",
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "section": {
      +              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      +              "pattern": "^[\\w-]+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "src"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 40,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "scenes",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "comments",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contact",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own home page editor; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "start",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own hosting prices; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pricing",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / block / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "content",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "grid": {
      -        "const": true,
      -        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      -        "type": "boolean"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -        "items": {
      -          "properties": {
      -            "alt": {
      -              "description": "What it shows",
      -              "type": "string"
      -            },
      -            "caption": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "poster": {
      -              "description": "A video's picture before it plays",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "video": {
      -              "const": true,
      -              "description": "src is an MP4 file that plays",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "src",
      -            "alt"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pictures",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tabs": {
      -        "items": {
      -          "properties": {
      -            "code": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "language": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "code"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "codeTabs",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "tabs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "columns": {
      -        "anyOf": [
      -          {
      -            "const": 2,
      -            "type": "number"
      -          },
      -          {
      -            "const": 3,
      -            "type": "number"
      -          },
      -          {
      -            "const": 4,
      -            "type": "number"
      -          }
      -        ],
      -        "description": "How many to a row; unset, as many as fit"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "suffix": {
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "value",
      -            "label"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "stats",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "groups": {
      -        "description": "Groups of links under a heading each",
      -        "items": {
      -          "properties": {
      -            "description": {
      -              "description": "Plain semantic HTML",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "heading": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "links": {
      -              "items": {
      -                "properties": {
      -                  "href": {
      -                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                    "type": "string"
      -                  },
      -                  "label": {
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "label",
      -                  "href"
      -                ],
      -                "type": "object"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "heading",
      -            "links"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "intro": {
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "linkGrid",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The citation, plain semantic HTML",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "title": {
      -        "description": "Its heading; unset, \"References\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "references",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Words in place of the notice's standard ones",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "banner",
      -        "type": "string"
      -      },
      -      "variant": {
      -        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -        "enum": [
      -          "stub",
      -          "unsourced",
      -          "outdated",
      -          "promotional",
      -          "cleanup",
      -          "coi"
      -        ],
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "variant"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "count": {
      -        "description": "With \"newest\", how many; unset, 6",
      -        "maximum": 48,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "menu": {
      -        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -        "items": {
      -          "properties": {
      -            "href": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "href"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "type": "array"
      -      },
      -      "pages": {
      -        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 48,
      -        "type": "array"
      -      },
      -      "shape": {
      -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -        "enum": [
      -          "portrait",
      -          "landscape"
      -        ],
      -        "type": "string"
      -      },
      -      "show": {
      -        "default": "cards",
      -        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -        "enum": [
      -          "cards",
      -          "links"
      -        ],
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -        "enum": [
      -          "under",
      -          "newest",
      -          "chosen",
      -          "products"
      -        ],
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tag": {
      -        "description": "With \"products\", only those with this tag; omit for all",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "under": {
      -        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -        "items": {
      -          "properties": {
      -            "date": {
      -              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "When it ends, written as date is; unset, it ends when it starts",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 300,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "past": {
      -        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "events",
      -        "type": "string"
      -      },
      -      "upcoming": {
      -        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "address": {
      -              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -              "type": "string"
      -            },
      -            "email": {
      -              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -              "type": "string"
      -            },
      -            "hours": {
      -              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -              "items": {
      -                "properties": {
      -                  "closes": {
      -                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  },
      -                  "days": {
      -                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                    "items": {
      -                      "enum": [
      -                        "mon",
      -                        "tue",
      -                        "wed",
      -                        "thu",
      -                        "fri",
      -                        "sat",
      -                        "sun"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "opens": {
      -                    "description": "24-hour: \"08:00\"",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "days",
      -                  "opens",
      -                  "closes"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 21,
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "image": {
      -              "description": "A picture of it, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "map": {
      -              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "note": {
      -              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "phone": {
      -              "description": "As it reads: \"020 7232 3010\"",
      -              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -              "type": "string"
      -            },
      -            "timeZone": {
      -              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "map": {
      -        "const": true,
      -        "description": "A map of each address, set under it",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "locations",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "align": {
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "stretch"
      -        ],
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "beside": {
      -        "const": true,
      -        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      -        "type": "boolean"
      -      },
      -      "columns": {
      -        "items": {
      -          "properties": {
      -            "align": {
      -              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      -              "enum": [
      -                "start",
      -                "center",
      -                "end"
      -              ],
      -              "type": "string"
      -            },
      -            "area": {
      -              "description": "Its place on a twelve-column grid; give every column one, or none",
      -              "properties": {
      -                "col": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "row": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "rows": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "span": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "col",
      -                "span",
      -                "row",
      -                "rows"
      -              ],
      -              "type": "object"
      -            },
      -            "blocks": {
      -              "items": {
      -                "oneOf": [
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Plain semantic HTML",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "content",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "text"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "grid": {
      -                        "const": true,
      -                        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      -                        "type": "boolean"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -                        "items": {
      -                          "properties": {
      -                            "alt": {
      -                              "description": "What it shows",
      -                              "type": "string"
      -                            },
      -                            "caption": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "poster": {
      -                              "description": "A video's picture before it plays",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "src": {
      -                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "video": {
      -                              "const": true,
      -                              "description": "src is an MP4 file that plays",
      -                              "type": "boolean"
      -                            }
      -                          },
      -                          "required": [
      -                            "src",
      -                            "alt"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "pictures",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "tabs": {
      -                        "items": {
      -                          "properties": {
      -                            "code": {
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "language": {
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "code"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 8,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "codeTabs",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "tabs"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "columns": {
      -                        "anyOf": [
      -                          {
      -                            "const": 2,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 3,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 4,
      -                            "type": "number"
      -                          }
      -                        ],
      -                        "description": "How many to a row; unset, as many as fit"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "suffix": {
      -                              "type": "string"
      -                            },
      -                            "value": {
      -                              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "value",
      -                            "label"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 12,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "stats",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "groups": {
      -                        "description": "Groups of links under a heading each",
      -                        "items": {
      -                          "properties": {
      -                            "description": {
      -                              "description": "Plain semantic HTML",
      -                              "type": [
      -                                "string",
      -                                "null"
      -                              ]
      -                            },
      -                            "heading": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "links": {
      -                              "items": {
      -                                "properties": {
      -                                  "href": {
      -                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                                    "type": "string"
      -                                  },
      -                                  "label": {
      -                                    "minLength": 1,
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "label",
      -                                  "href"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "type": "array"
      -                            }
      -                          },
      -                          "required": [
      -                            "heading",
      -                            "links"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "intro": {
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "linkGrid",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "groups"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "The citation, plain semantic HTML",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "url": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "title": {
      -                        "description": "Its heading; unset, \"References\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "references",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Words in place of the notice's standard ones",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "banner",
      -                        "type": "string"
      -                      },
      -                      "variant": {
      -                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -                        "enum": [
      -                          "stub",
      -                          "unsourced",
      -                          "outdated",
      -                          "promotional",
      -                          "cleanup",
      -                          "coi"
      -                        ],
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "variant"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "count": {
      -                        "description": "With \"newest\", how many; unset, 6",
      -                        "maximum": 48,
      -                        "minimum": 1,
      -                        "type": "integer"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "menu": {
      -                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -                        "items": {
      -                          "properties": {
      -                            "href": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "href"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 24,
      -                        "type": "array"
      -                      },
      -                      "pages": {
      -                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -                        "items": {
      -                          "type": "string"
      -                        },
      -                        "maxItems": 48,
      -                        "type": "array"
      -                      },
      -                      "shape": {
      -                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -                        "enum": [
      -                          "portrait",
      -                          "landscape"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "show": {
      -                        "default": "cards",
      -                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -                        "enum": [
      -                          "cards",
      -                          "links"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -                        "enum": [
      -                          "under",
      -                          "newest",
      -                          "chosen",
      -                          "products"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "tag": {
      -                        "description": "With \"products\", only those with this tag; omit for all",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "list",
      -                        "type": "string"
      -                      },
      -                      "under": {
      -                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "source"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -                        "items": {
      -                          "properties": {
      -                            "date": {
      -                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "end": {
      -                              "description": "When it ends, written as date is; unset, it ends when it starts",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "date",
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 300,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "past": {
      -                        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "events",
      -                        "type": "string"
      -                      },
      -                      "upcoming": {
      -                        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "heading": {
      -                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "address": {
      -                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -                              "type": "string"
      -                            },
      -                            "email": {
      -                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -                              "type": "string"
      -                            },
      -                            "hours": {
      -                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -                              "items": {
      -                                "properties": {
      -                                  "closes": {
      -                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  },
      -                                  "days": {
      -                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                                    "items": {
      -                                      "enum": [
      -                                        "mon",
      -                                        "tue",
      -                                        "wed",
      -                                        "thu",
      -                                        "fri",
      -                                        "sat",
      -                                        "sun"
      -                                      ],
      -                                      "type": "string"
      -                                    },
      -                                    "minItems": 1,
      -                                    "type": "array"
      -                                  },
      -                                  "opens": {
      -                                    "description": "24-hour: \"08:00\"",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "days",
      -                                  "opens",
      -                                  "closes"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "maxItems": 21,
      -                              "type": "array"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "image": {
      -                              "description": "A picture of it, by https URL",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "map": {
      -                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "name": {
      -                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "note": {
      -                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "phone": {
      -                              "description": "As it reads: \"020 7232 3010\"",
      -                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -                              "type": "string"
      -                            },
      -                            "timeZone": {
      -                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "map": {
      -                        "const": true,
      -                        "description": "A map of each address, set under it",
      -                        "type": "boolean"
      -                      },
      -                      "type": {
      -                        "const": "locations",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "gap": {
      -        "enum": [
      -          "sm",
      -          "md",
      -          "lg"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "columns",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "columns"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "backdrop": {
      -        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      -        "enum": [
      -          "mesh",
      -          "grain",
      -          "flow",
      -          "marble"
      -        ],
      -        "type": "string"
      -      },
      -      "backdropIntensity": {
      -        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "backdropSpeed": {
      -        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "box": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent",
      -              "none"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      -      },
      -      "call": {
      -        "const": true,
      -        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      -        "type": "boolean"
      -      },
      -      "cover": {
      -        "const": true,
      -        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      -        "type": "boolean"
      -      },
      -      "heading": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size; words in <strong> are drawn in the accent colour",
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "How tall it is: \"fit\" its words, \"half\" the screen, \"wide\" as a 16:9 picture is for its width, or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      -        "enum": [
      -          "fit",
      -          "half",
      -          "wide",
      -          "full"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "image": {
      -        "description": "A picture behind the heading, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "subheading": {
      -        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      -        "type": "boolean"
      -      },
      -      "text": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "hero",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "heading"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "duration": {
      -        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "file": {
      -        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      -        "properties": {
      -          "key": {
      -            "maxLength": 400,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "name": {
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "size": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "key",
      -          "name",
      -          "size"
      -        ],
      -        "type": "object"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "images": {
      -        "description": "Its pictures by https URL, the first on every listing",
      -        "items": {
      -          "pattern": "^https:\\/\\/\\S+$",
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "price": {
      -        "description": "As it should read, currency included, \"£2,500\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "service": {
      -        "const": true,
      -        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      -        "type": "boolean"
      -      },
      -      "sold": {
      -        "description": "A thing sold, or a service fully booked",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tags": {
      -        "default": [],
      -        "description": "The listings it appears in, by their \"tag\"",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "product",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "images",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "amounts": {
      -        "default": [],
      -        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 6,
      -        "type": "array"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "currency": {
      -        "description": "With no amounts, the currency gifts are in; unset, £",
      -        "enum": [
      -          "£",
      -          "$",
      -          "€"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "monthly": {
      -        "description": "The donor may give it every month as well as once",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "donate",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "author": {
      -        "description": "Their name: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "avatarUrl": {
      -        "description": "Their photo, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "quote": {
      -        "description": "Their words, exactly: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "role": {
      -        "description": "Who they are, \"Bride, 2024\", \"Head chef, The Ivy\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "testimonial",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "quote",
      -      "author"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "note": {
      -        "description": "A line under it, where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "As set, a line to a line, a blank line between stanzas, the spaces that indent a line kept; each line inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "title": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "poem",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contents",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In the order the page scrolls",
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "section": {
      -              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      -              "pattern": "^[\\w-]+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 40,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "scenes",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "comments",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contact",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own home page editor; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "start",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own hosting prices; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pricing",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "content",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "grid": {
      +        "const": true,
      +        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      +        "type": "boolean"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +        "items": {
      +          "properties": {
      +            "alt": {
      +              "description": "What it shows",
      +              "type": "string"
      +            },
      +            "caption": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "poster": {
      +              "description": "A video's picture before it plays",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "video": {
      +              "const": true,
      +              "description": "src is an MP4 file that plays",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "src",
      +            "alt"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pictures",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tabs": {
      +        "items": {
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "language": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "code"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "codeTabs",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "tabs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "columns": {
      +        "anyOf": [
      +          {
      +            "const": 2,
      +            "type": "number"
      +          },
      +          {
      +            "const": 3,
      +            "type": "number"
      +          },
      +          {
      +            "const": 4,
      +            "type": "number"
      +          }
      +        ],
      +        "description": "How many to a row; unset, as many as fit"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "suffix": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "label"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "stats",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "groups": {
      +        "description": "Groups of links under a heading each",
      +        "items": {
      +          "properties": {
      +            "description": {
      +              "description": "Plain semantic HTML",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "heading": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "links": {
      +              "items": {
      +                "properties": {
      +                  "href": {
      +                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "label",
      +                  "href"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "heading",
      +            "links"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "intro": {
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "linkGrid",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The citation, plain semantic HTML",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "Its heading; unset, \"References\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "references",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Words in place of the notice's standard ones",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "banner",
      +        "type": "string"
      +      },
      +      "variant": {
      +        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +        "enum": [
      +          "stub",
      +          "unsourced",
      +          "outdated",
      +          "promotional",
      +          "cleanup",
      +          "coi"
      +        ],
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "variant"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "count": {
      +        "description": "With \"newest\", how many; unset, 6",
      +        "maximum": 48,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "menu": {
      +        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +        "items": {
      +          "properties": {
      +            "href": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "href"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "type": "array"
      +      },
      +      "pages": {
      +        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 48,
      +        "type": "array"
      +      },
      +      "shape": {
      +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +        "enum": [
      +          "portrait",
      +          "landscape"
      +        ],
      +        "type": "string"
      +      },
      +      "show": {
      +        "default": "cards",
      +        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +        "enum": [
      +          "cards",
      +          "links"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +        "enum": [
      +          "under",
      +          "newest",
      +          "chosen",
      +          "products"
      +        ],
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tag": {
      +        "description": "With \"products\", only those with this tag; omit for all",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "under": {
      +        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +        "items": {
      +          "properties": {
      +            "date": {
      +              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "When it ends, written as date is; unset, it ends when it starts",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 300,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "past": {
      +        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "events",
      +        "type": "string"
      +      },
      +      "upcoming": {
      +        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "address": {
      +              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +              "type": "string"
      +            },
      +            "email": {
      +              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +              "type": "string"
      +            },
      +            "hours": {
      +              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +              "items": {
      +                "properties": {
      +                  "closes": {
      +                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  },
      +                  "days": {
      +                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                    "items": {
      +                      "enum": [
      +                        "mon",
      +                        "tue",
      +                        "wed",
      +                        "thu",
      +                        "fri",
      +                        "sat",
      +                        "sun"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "opens": {
      +                    "description": "24-hour: \"08:00\"",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "days",
      +                  "opens",
      +                  "closes"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 21,
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "image": {
      +              "description": "A picture of it, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "map": {
      +              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "note": {
      +              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "phone": {
      +              "description": "As it reads: \"020 7232 3010\"",
      +              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +              "type": "string"
      +            },
      +            "timeZone": {
      +              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "map": {
      +        "const": true,
      +        "description": "A map of each address, set under it",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "locations",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "stretch"
      +        ],
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "beside": {
      +        "const": true,
      +        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      +        "type": "boolean"
      +      },
      +      "columns": {
      +        "items": {
      +          "properties": {
      +            "align": {
      +              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      +              "enum": [
      +                "start",
      +                "center",
      +                "end"
      +              ],
      +              "type": "string"
      +            },
      +            "area": {
      +              "description": "Its place on a twelve-column grid; give every column one, or none",
      +              "properties": {
      +                "col": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "row": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "rows": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "span": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "col",
      +                "span",
      +                "row",
      +                "rows"
      +              ],
      +              "type": "object"
      +            },
      +            "blocks": {
      +              "items": {
      +                "oneOf": [
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Plain semantic HTML",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "content",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "text"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "grid": {
      +                        "const": true,
      +                        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      +                        "type": "boolean"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +                        "items": {
      +                          "properties": {
      +                            "alt": {
      +                              "description": "What it shows",
      +                              "type": "string"
      +                            },
      +                            "caption": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "poster": {
      +                              "description": "A video's picture before it plays",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "src": {
      +                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "video": {
      +                              "const": true,
      +                              "description": "src is an MP4 file that plays",
      +                              "type": "boolean"
      +                            }
      +                          },
      +                          "required": [
      +                            "src",
      +                            "alt"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "pictures",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "tabs": {
      +                        "items": {
      +                          "properties": {
      +                            "code": {
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "language": {
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "code"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 8,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "codeTabs",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "tabs"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "columns": {
      +                        "anyOf": [
      +                          {
      +                            "const": 2,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 3,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 4,
      +                            "type": "number"
      +                          }
      +                        ],
      +                        "description": "How many to a row; unset, as many as fit"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "suffix": {
      +                              "type": "string"
      +                            },
      +                            "value": {
      +                              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "value",
      +                            "label"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 12,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "stats",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "groups": {
      +                        "description": "Groups of links under a heading each",
      +                        "items": {
      +                          "properties": {
      +                            "description": {
      +                              "description": "Plain semantic HTML",
      +                              "type": [
      +                                "string",
      +                                "null"
      +                              ]
      +                            },
      +                            "heading": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "links": {
      +                              "items": {
      +                                "properties": {
      +                                  "href": {
      +                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                                    "type": "string"
      +                                  },
      +                                  "label": {
      +                                    "minLength": 1,
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "label",
      +                                  "href"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "type": "array"
      +                            }
      +                          },
      +                          "required": [
      +                            "heading",
      +                            "links"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "intro": {
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "linkGrid",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "groups"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "The citation, plain semantic HTML",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "url": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "title": {
      +                        "description": "Its heading; unset, \"References\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "references",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Words in place of the notice's standard ones",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "banner",
      +                        "type": "string"
      +                      },
      +                      "variant": {
      +                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +                        "enum": [
      +                          "stub",
      +                          "unsourced",
      +                          "outdated",
      +                          "promotional",
      +                          "cleanup",
      +                          "coi"
      +                        ],
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "variant"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "count": {
      +                        "description": "With \"newest\", how many; unset, 6",
      +                        "maximum": 48,
      +                        "minimum": 1,
      +                        "type": "integer"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "menu": {
      +                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +                        "items": {
      +                          "properties": {
      +                            "href": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "href"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 24,
      +                        "type": "array"
      +                      },
      +                      "pages": {
      +                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +                        "items": {
      +                          "type": "string"
      +                        },
      +                        "maxItems": 48,
      +                        "type": "array"
      +                      },
      +                      "shape": {
      +                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +                        "enum": [
      +                          "portrait",
      +                          "landscape"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "show": {
      +                        "default": "cards",
      +                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +                        "enum": [
      +                          "cards",
      +                          "links"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +                        "enum": [
      +                          "under",
      +                          "newest",
      +                          "chosen",
      +                          "products"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "tag": {
      +                        "description": "With \"products\", only those with this tag; omit for all",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "list",
      +                        "type": "string"
      +                      },
      +                      "under": {
      +                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "source"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +                        "items": {
      +                          "properties": {
      +                            "date": {
      +                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "end": {
      +                              "description": "When it ends, written as date is; unset, it ends when it starts",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "date",
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 300,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "past": {
      +                        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "events",
      +                        "type": "string"
      +                      },
      +                      "upcoming": {
      +                        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "heading": {
      +                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "address": {
      +                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +                              "type": "string"
      +                            },
      +                            "email": {
      +                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +                              "type": "string"
      +                            },
      +                            "hours": {
      +                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +                              "items": {
      +                                "properties": {
      +                                  "closes": {
      +                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  },
      +                                  "days": {
      +                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                                    "items": {
      +                                      "enum": [
      +                                        "mon",
      +                                        "tue",
      +                                        "wed",
      +                                        "thu",
      +                                        "fri",
      +                                        "sat",
      +                                        "sun"
      +                                      ],
      +                                      "type": "string"
      +                                    },
      +                                    "minItems": 1,
      +                                    "type": "array"
      +                                  },
      +                                  "opens": {
      +                                    "description": "24-hour: \"08:00\"",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "days",
      +                                  "opens",
      +                                  "closes"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "maxItems": 21,
      +                              "type": "array"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "image": {
      +                              "description": "A picture of it, by https URL",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "map": {
      +                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "name": {
      +                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "note": {
      +                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "phone": {
      +                              "description": "As it reads: \"020 7232 3010\"",
      +                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +                              "type": "string"
      +                            },
      +                            "timeZone": {
      +                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "map": {
      +                        "const": true,
      +                        "description": "A map of each address, set under it",
      +                        "type": "boolean"
      +                      },
      +                      "type": {
      +                        "const": "locations",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "gap": {
      +        "enum": [
      +          "sm",
      +          "md",
      +          "lg"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "columns",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "columns"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "backdrop": {
      +        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      +        "enum": [
      +          "mesh",
      +          "grain",
      +          "flow",
      +          "marble"
      +        ],
      +        "type": "string"
      +      },
      +      "backdropIntensity": {
      +        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "backdropSpeed": {
      +        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "box": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent",
      +              "none"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      +      },
      +      "call": {
      +        "const": true,
      +        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      +        "type": "boolean"
      +      },
      +      "cover": {
      +        "const": true,
      +        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size; words in <strong> are drawn in the accent colour",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "How tall it is: \"fit\" its words, \"half\" the screen, \"wide\" as a 16:9 picture is for its width, or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      +        "enum": [
      +          "fit",
      +          "half",
      +          "wide",
      +          "full"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "image": {
      +        "description": "A picture behind the heading, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "subheading": {
      +        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      +        "type": "boolean"
      +      },
      +      "text": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "hero",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "heading"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "duration": {
      +        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "file": {
      +        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      +        "properties": {
      +          "key": {
      +            "maxLength": 400,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "name": {
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "size": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "name",
      +          "size"
      +        ],
      +        "type": "object"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "images": {
      +        "description": "Its pictures by https URL, the first on every listing",
      +        "items": {
      +          "pattern": "^https:\\/\\/\\S+$",
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "price": {
      +        "description": "As it should read, currency included, \"£2,500\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "service": {
      +        "const": true,
      +        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      +        "type": "boolean"
      +      },
      +      "sold": {
      +        "description": "A thing sold, or a service fully booked",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tags": {
      +        "default": [],
      +        "description": "The listings it appears in, by their \"tag\"",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "product",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "images",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "amounts": {
      +        "default": [],
      +        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 6,
      +        "type": "array"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "currency": {
      +        "description": "With no amounts, the currency gifts are in; unset, £",
      +        "enum": [
      +          "£",
      +          "$",
      +          "€"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "monthly": {
      +        "description": "The donor may give it every month as well as once",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "donate",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "author": {
      +        "description": "Their name: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "avatarUrl": {
      +        "description": "Their photo, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "quote": {
      +        "description": "Their words, exactly: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "role": {
      +        "description": "Who they are, \"Bride, 2024\", \"Head chef, The Ivy\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "testimonial",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "quote",
      +      "author"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "note": {
      +        "description": "A line under it, where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "As set, a line to a line, a blank line between stanzas, the spaces that indent a line kept; each line inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "poem",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over it. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "login": {
      +        "description": "Whose contributions: a GitHub username, as in github.com/<username>",
      +        "pattern": "^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "github",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "login"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contents",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In the order the page scrolls",
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "section": {
      +              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      +              "pattern": "^[\\w-]+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "src"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 40,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "scenes",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "comments",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contact",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own home page editor; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "start",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own hosting prices; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pricing",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / block / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "content",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -        "items": {
      -          "properties": {
      -            "alt": {
      -              "description": "What it shows",
      -              "type": "string"
      -            },
      -            "caption": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "poster": {
      -              "description": "A video's picture before it plays",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "video": {
      -              "const": true,
      -              "description": "src is an MP4 file that plays",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "src",
      -            "alt"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pictures",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tabs": {
      -        "items": {
      -          "properties": {
      -            "code": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "language": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "code"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "codeTabs",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "tabs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "columns": {
      -        "anyOf": [
      -          {
      -            "const": 2,
      -            "type": "number"
      -          },
      -          {
      -            "const": 3,
      -            "type": "number"
      -          },
      -          {
      -            "const": 4,
      -            "type": "number"
      -          }
      -        ],
      -        "description": "How many to a row; unset, as many as fit"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "suffix": {
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "value",
      -            "label"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "stats",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "groups": {
      -        "description": "Groups of links under a heading each",
      -        "items": {
      -          "properties": {
      -            "description": {
      -              "description": "Plain semantic HTML",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "heading": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "links": {
      -              "items": {
      -                "properties": {
      -                  "href": {
      -                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                    "type": "string"
      -                  },
      -                  "label": {
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "label",
      -                  "href"
      -                ],
      -                "type": "object"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "heading",
      -            "links"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "intro": {
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "linkGrid",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The citation, plain semantic HTML",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "title": {
      -        "description": "Its heading; unset, \"References\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "references",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Words in place of the notice's standard ones",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "banner",
      -        "type": "string"
      -      },
      -      "variant": {
      -        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -        "enum": [
      -          "stub",
      -          "unsourced",
      -          "outdated",
      -          "promotional",
      -          "cleanup",
      -          "coi"
      -        ],
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "variant"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "count": {
      -        "description": "With \"newest\", how many; unset, 6",
      -        "maximum": 48,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "menu": {
      -        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -        "items": {
      -          "properties": {
      -            "href": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "href"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "type": "array"
      -      },
      -      "pages": {
      -        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 48,
      -        "type": "array"
      -      },
      -      "shape": {
      -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -        "enum": [
      -          "portrait",
      -          "landscape"
      -        ],
      -        "type": "string"
      -      },
      -      "show": {
      -        "default": "cards",
      -        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -        "enum": [
      -          "cards",
      -          "links"
      -        ],
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -        "enum": [
      -          "under",
      -          "newest",
      -          "chosen",
      -          "products"
      -        ],
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tag": {
      -        "description": "With \"products\", only those with this tag; omit for all",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "under": {
      -        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -        "items": {
      -          "properties": {
      -            "date": {
      -              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "When it ends, written as date is; unset, it ends when it starts",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 300,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "past": {
      -        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "events",
      -        "type": "string"
      -      },
      -      "upcoming": {
      -        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "address": {
      -              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -              "type": "string"
      -            },
      -            "email": {
      -              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -              "type": "string"
      -            },
      -            "hours": {
      -              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -              "items": {
      -                "properties": {
      -                  "closes": {
      -                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  },
      -                  "days": {
      -                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                    "items": {
      -                      "enum": [
      -                        "mon",
      -                        "tue",
      -                        "wed",
      -                        "thu",
      -                        "fri",
      -                        "sat",
      -                        "sun"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "opens": {
      -                    "description": "24-hour: \"08:00\"",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "days",
      -                  "opens",
      -                  "closes"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 21,
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "image": {
      -              "description": "A picture of it, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "map": {
      -              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "note": {
      -              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -              "type": "string"
      -            },
      -            "phone": {
      -              "description": "As it reads: \"020 7232 3010\"",
      -              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -              "type": "string"
      -            },
      -            "timeZone": {
      -              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "map": {
      -        "const": true,
      -        "description": "A map of each address, set under it",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "locations",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "align": {
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "stretch"
      -        ],
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "beside": {
      -        "const": true,
      -        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      -        "type": "boolean"
      -      },
      -      "columns": {
      -        "items": {
      -          "properties": {
      -            "align": {
      -              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      -              "enum": [
      -                "start",
      -                "center",
      -                "end"
      -              ],
      -              "type": "string"
      -            },
      -            "area": {
      -              "description": "Its place on a twelve-column grid; give every column one, or none",
      -              "properties": {
      -                "col": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "row": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "rows": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "span": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "col",
      -                "span",
      -                "row",
      -                "rows"
      -              ],
      -              "type": "object"
      -            },
      -            "blocks": {
      -              "items": {
      -                "oneOf": [
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Plain semantic HTML",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "content",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "text"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -                        "items": {
      -                          "properties": {
      -                            "alt": {
      -                              "description": "What it shows",
      -                              "type": "string"
      -                            },
      -                            "caption": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "poster": {
      -                              "description": "A video's picture before it plays",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "src": {
      -                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "video": {
      -                              "const": true,
      -                              "description": "src is an MP4 file that plays",
      -                              "type": "boolean"
      -                            }
      -                          },
      -                          "required": [
      -                            "src",
      -                            "alt"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "pictures",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "tabs": {
      -                        "items": {
      -                          "properties": {
      -                            "code": {
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "language": {
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "code"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 8,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "codeTabs",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "tabs"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "columns": {
      -                        "anyOf": [
      -                          {
      -                            "const": 2,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 3,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 4,
      -                            "type": "number"
      -                          }
      -                        ],
      -                        "description": "How many to a row; unset, as many as fit"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "suffix": {
      -                              "type": "string"
      -                            },
      -                            "value": {
      -                              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "value",
      -                            "label"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 12,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "stats",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "groups": {
      -                        "description": "Groups of links under a heading each",
      -                        "items": {
      -                          "properties": {
      -                            "description": {
      -                              "description": "Plain semantic HTML",
      -                              "type": [
      -                                "string",
      -                                "null"
      -                              ]
      -                            },
      -                            "heading": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "links": {
      -                              "items": {
      -                                "properties": {
      -                                  "href": {
      -                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                                    "type": "string"
      -                                  },
      -                                  "label": {
      -                                    "minLength": 1,
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "label",
      -                                  "href"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "type": "array"
      -                            }
      -                          },
      -                          "required": [
      -                            "heading",
      -                            "links"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "intro": {
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "linkGrid",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "groups"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "The citation, plain semantic HTML",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "url": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "title": {
      -                        "description": "Its heading; unset, \"References\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "references",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Words in place of the notice's standard ones",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "banner",
      -                        "type": "string"
      -                      },
      -                      "variant": {
      -                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -                        "enum": [
      -                          "stub",
      -                          "unsourced",
      -                          "outdated",
      -                          "promotional",
      -                          "cleanup",
      -                          "coi"
      -                        ],
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "variant"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "count": {
      -                        "description": "With \"newest\", how many; unset, 6",
      -                        "maximum": 48,
      -                        "minimum": 1,
      -                        "type": "integer"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "menu": {
      -                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -                        "items": {
      -                          "properties": {
      -                            "href": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "href"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 24,
      -                        "type": "array"
      -                      },
      -                      "pages": {
      -                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -                        "items": {
      -                          "type": "string"
      -                        },
      -                        "maxItems": 48,
      -                        "type": "array"
      -                      },
      -                      "shape": {
      -                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -                        "enum": [
      -                          "portrait",
      -                          "landscape"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "show": {
      -                        "default": "cards",
      -                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -                        "enum": [
      -                          "cards",
      -                          "links"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -                        "enum": [
      -                          "under",
      -                          "newest",
      -                          "chosen",
      -                          "products"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "tag": {
      -                        "description": "With \"products\", only those with this tag; omit for all",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "list",
      -                        "type": "string"
      -                      },
      -                      "under": {
      -                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "source"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -                        "items": {
      -                          "properties": {
      -                            "date": {
      -                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "end": {
      -                              "description": "When it ends, written as date is; unset, it ends when it starts",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "date",
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 300,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "past": {
      -                        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "events",
      -                        "type": "string"
      -                      },
      -                      "upcoming": {
      -                        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "heading": {
      -                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                        "type": "string"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "address": {
      -                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -                              "type": "string"
      -                            },
      -                            "email": {
      -                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -                              "type": "string"
      -                            },
      -                            "hours": {
      -                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -                              "items": {
      -                                "properties": {
      -                                  "closes": {
      -                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  },
      -                                  "days": {
      -                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                                    "items": {
      -                                      "enum": [
      -                                        "mon",
      -                                        "tue",
      -                                        "wed",
      -                                        "thu",
      -                                        "fri",
      -                                        "sat",
      -                                        "sun"
      -                                      ],
      -                                      "type": "string"
      -                                    },
      -                                    "minItems": 1,
      -                                    "type": "array"
      -                                  },
      -                                  "opens": {
      -                                    "description": "24-hour: \"08:00\"",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "days",
      -                                  "opens",
      -                                  "closes"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "maxItems": 21,
      -                              "type": "array"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "image": {
      -                              "description": "A picture of it, by https URL",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "map": {
      -                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "name": {
      -                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "note": {
      -                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -                              "type": "string"
      -                            },
      -                            "phone": {
      -                              "description": "As it reads: \"020 7232 3010\"",
      -                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -                              "type": "string"
      -                            },
      -                            "timeZone": {
      -                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "map": {
      -                        "const": true,
      -                        "description": "A map of each address, set under it",
      -                        "type": "boolean"
      -                      },
      -                      "type": {
      -                        "const": "locations",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "gap": {
      -        "enum": [
      -          "sm",
      -          "md",
      -          "lg"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "columns",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "columns"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "backdrop": {
      -        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      -        "enum": [
      -          "mesh",
      -          "grain",
      -          "flow",
      -          "marble"
      -        ],
      -        "type": "string"
      -      },
      -      "backdropIntensity": {
      -        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "backdropSpeed": {
      -        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "box": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent",
      -              "none"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      -      },
      -      "call": {
      -        "const": true,
      -        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      -        "type": "boolean"
      -      },
      -      "cover": {
      -        "const": true,
      -        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      -        "type": "boolean"
      -      },
      -      "heading": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size; words in <strong> are drawn in the accent colour",
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "How tall it is: \"fit\" its words, \"half\" the screen or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      -        "enum": [
      -          "fit",
      -          "half",
      -          "full"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "image": {
      -        "description": "A picture behind the heading, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "subheading": {
      -        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      -        "type": "boolean"
      -      },
      -      "text": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "hero",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "heading"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "duration": {
      -        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "file": {
      -        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      -        "properties": {
      -          "key": {
      -            "maxLength": 400,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "name": {
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "size": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "key",
      -          "name",
      -          "size"
      -        ],
      -        "type": "object"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "images": {
      -        "description": "Its pictures by https URL, the first on every listing",
      -        "items": {
      -          "pattern": "^https:\\/\\/\\S+$",
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "price": {
      -        "description": "As it should read, currency included, \"£2,500\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "service": {
      -        "const": true,
      -        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      -        "type": "boolean"
      -      },
      -      "sold": {
      -        "description": "A thing sold, or a service fully booked",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tags": {
      -        "default": [],
      -        "description": "The listings it appears in, by their \"tag\"",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "product",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "images",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "amounts": {
      -        "default": [],
      -        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 6,
      -        "type": "array"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "currency": {
      -        "description": "With no amounts, the currency gifts are in; unset, £",
      -        "enum": [
      -          "£",
      -          "$",
      -          "€"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "monthly": {
      -        "description": "The donor may give it every month as well as once",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "donate",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "author": {
      -        "description": "Their name: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "avatarUrl": {
      -        "description": "Their photo, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "quote": {
      -        "description": "Their words, exactly: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "role": {
      -        "description": "Who they are, \"Bride, 2024\", \"Head chef, The Ivy\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "testimonial",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "quote",
      -      "author"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "note": {
      -        "description": "A line under it, where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "As set, a line to a line, a blank line between stanzas, the spaces that indent a line kept; each line inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "title": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "poem",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contents",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In the order the page scrolls",
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "section": {
      -              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      -              "pattern": "^[\\w-]+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 40,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "scenes",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "comments",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contact",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own home page editor; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "start",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own hosting prices; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pricing",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "content",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "grid": {
      +        "const": true,
      +        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      +        "type": "boolean"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +        "items": {
      +          "properties": {
      +            "alt": {
      +              "description": "What it shows",
      +              "type": "string"
      +            },
      +            "caption": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "poster": {
      +              "description": "A video's picture before it plays",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "video": {
      +              "const": true,
      +              "description": "src is an MP4 file that plays",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "src",
      +            "alt"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pictures",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tabs": {
      +        "items": {
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "language": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "code"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "codeTabs",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "tabs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "columns": {
      +        "anyOf": [
      +          {
      +            "const": 2,
      +            "type": "number"
      +          },
      +          {
      +            "const": 3,
      +            "type": "number"
      +          },
      +          {
      +            "const": 4,
      +            "type": "number"
      +          }
      +        ],
      +        "description": "How many to a row; unset, as many as fit"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "suffix": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "label"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "stats",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "groups": {
      +        "description": "Groups of links under a heading each",
      +        "items": {
      +          "properties": {
      +            "description": {
      +              "description": "Plain semantic HTML",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "heading": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "links": {
      +              "items": {
      +                "properties": {
      +                  "href": {
      +                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "label",
      +                  "href"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "heading",
      +            "links"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "intro": {
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "linkGrid",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The citation, plain semantic HTML",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "Its heading; unset, \"References\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "references",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Words in place of the notice's standard ones",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "banner",
      +        "type": "string"
      +      },
      +      "variant": {
      +        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +        "enum": [
      +          "stub",
      +          "unsourced",
      +          "outdated",
      +          "promotional",
      +          "cleanup",
      +          "coi"
      +        ],
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "variant"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "count": {
      +        "description": "With \"newest\", how many; unset, 6",
      +        "maximum": 48,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "menu": {
      +        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +        "items": {
      +          "properties": {
      +            "href": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "href"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "type": "array"
      +      },
      +      "pages": {
      +        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 48,
      +        "type": "array"
      +      },
      +      "shape": {
      +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +        "enum": [
      +          "portrait",
      +          "landscape"
      +        ],
      +        "type": "string"
      +      },
      +      "show": {
      +        "default": "cards",
      +        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +        "enum": [
      +          "cards",
      +          "links"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +        "enum": [
      +          "under",
      +          "newest",
      +          "chosen",
      +          "products"
      +        ],
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tag": {
      +        "description": "With \"products\", only those with this tag; omit for all",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "under": {
      +        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +        "items": {
      +          "properties": {
      +            "date": {
      +              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "When it ends, written as date is; unset, it ends when it starts",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 300,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "past": {
      +        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "events",
      +        "type": "string"
      +      },
      +      "upcoming": {
      +        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "address": {
      +              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +              "type": "string"
      +            },
      +            "email": {
      +              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +              "type": "string"
      +            },
      +            "hours": {
      +              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +              "items": {
      +                "properties": {
      +                  "closes": {
      +                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  },
      +                  "days": {
      +                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                    "items": {
      +                      "enum": [
      +                        "mon",
      +                        "tue",
      +                        "wed",
      +                        "thu",
      +                        "fri",
      +                        "sat",
      +                        "sun"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "opens": {
      +                    "description": "24-hour: \"08:00\"",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "days",
      +                  "opens",
      +                  "closes"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 21,
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "image": {
      +              "description": "A picture of it, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "map": {
      +              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "note": {
      +              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "phone": {
      +              "description": "As it reads: \"020 7232 3010\"",
      +              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +              "type": "string"
      +            },
      +            "timeZone": {
      +              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "map": {
      +        "const": true,
      +        "description": "A map of each address, set under it",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "locations",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "stretch"
      +        ],
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "beside": {
      +        "const": true,
      +        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      +        "type": "boolean"
      +      },
      +      "columns": {
      +        "items": {
      +          "properties": {
      +            "align": {
      +              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      +              "enum": [
      +                "start",
      +                "center",
      +                "end"
      +              ],
      +              "type": "string"
      +            },
      +            "area": {
      +              "description": "Its place on a twelve-column grid; give every column one, or none",
      +              "properties": {
      +                "col": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "row": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "rows": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "span": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "col",
      +                "span",
      +                "row",
      +                "rows"
      +              ],
      +              "type": "object"
      +            },
      +            "blocks": {
      +              "items": {
      +                "oneOf": [
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Plain semantic HTML",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "content",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "text"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "grid": {
      +                        "const": true,
      +                        "description": "Several set in a grid instead of a row, each cropped to 16:9, two across from a tablet up: a gallery",
      +                        "type": "boolean"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +                        "items": {
      +                          "properties": {
      +                            "alt": {
      +                              "description": "What it shows",
      +                              "type": "string"
      +                            },
      +                            "caption": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "poster": {
      +                              "description": "A video's picture before it plays",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "src": {
      +                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "video": {
      +                              "const": true,
      +                              "description": "src is an MP4 file that plays",
      +                              "type": "boolean"
      +                            }
      +                          },
      +                          "required": [
      +                            "src",
      +                            "alt"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "pictures",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "tabs": {
      +                        "items": {
      +                          "properties": {
      +                            "code": {
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "language": {
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "code"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 8,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "codeTabs",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "tabs"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "columns": {
      +                        "anyOf": [
      +                          {
      +                            "const": 2,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 3,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 4,
      +                            "type": "number"
      +                          }
      +                        ],
      +                        "description": "How many to a row; unset, as many as fit"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "suffix": {
      +                              "type": "string"
      +                            },
      +                            "value": {
      +                              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "value",
      +                            "label"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 12,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "stats",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "groups": {
      +                        "description": "Groups of links under a heading each",
      +                        "items": {
      +                          "properties": {
      +                            "description": {
      +                              "description": "Plain semantic HTML",
      +                              "type": [
      +                                "string",
      +                                "null"
      +                              ]
      +                            },
      +                            "heading": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "links": {
      +                              "items": {
      +                                "properties": {
      +                                  "href": {
      +                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                                    "type": "string"
      +                                  },
      +                                  "label": {
      +                                    "minLength": 1,
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "label",
      +                                  "href"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "type": "array"
      +                            }
      +                          },
      +                          "required": [
      +                            "heading",
      +                            "links"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "intro": {
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "linkGrid",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "groups"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "The citation, plain semantic HTML",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "url": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "title": {
      +                        "description": "Its heading; unset, \"References\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "references",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Words in place of the notice's standard ones",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "banner",
      +                        "type": "string"
      +                      },
      +                      "variant": {
      +                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +                        "enum": [
      +                          "stub",
      +                          "unsourced",
      +                          "outdated",
      +                          "promotional",
      +                          "cleanup",
      +                          "coi"
      +                        ],
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "variant"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "count": {
      +                        "description": "With \"newest\", how many; unset, 6",
      +                        "maximum": 48,
      +                        "minimum": 1,
      +                        "type": "integer"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "menu": {
      +                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +                        "items": {
      +                          "properties": {
      +                            "href": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "href"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 24,
      +                        "type": "array"
      +                      },
      +                      "pages": {
      +                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +                        "items": {
      +                          "type": "string"
      +                        },
      +                        "maxItems": 48,
      +                        "type": "array"
      +                      },
      +                      "shape": {
      +                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +                        "enum": [
      +                          "portrait",
      +                          "landscape"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "show": {
      +                        "default": "cards",
      +                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +                        "enum": [
      +                          "cards",
      +                          "links"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +                        "enum": [
      +                          "under",
      +                          "newest",
      +                          "chosen",
      +                          "products"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "tag": {
      +                        "description": "With \"products\", only those with this tag; omit for all",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "list",
      +                        "type": "string"
      +                      },
      +                      "under": {
      +                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "source"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +                        "items": {
      +                          "properties": {
      +                            "date": {
      +                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "end": {
      +                              "description": "When it ends, written as date is; unset, it ends when it starts",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "date",
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 300,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "past": {
      +                        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "events",
      +                        "type": "string"
      +                      },
      +                      "upcoming": {
      +                        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "heading": {
      +                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "address": {
      +                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +                              "type": "string"
      +                            },
      +                            "email": {
      +                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +                              "type": "string"
      +                            },
      +                            "hours": {
      +                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +                              "items": {
      +                                "properties": {
      +                                  "closes": {
      +                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  },
      +                                  "days": {
      +                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                                    "items": {
      +                                      "enum": [
      +                                        "mon",
      +                                        "tue",
      +                                        "wed",
      +                                        "thu",
      +                                        "fri",
      +                                        "sat",
      +                                        "sun"
      +                                      ],
      +                                      "type": "string"
      +                                    },
      +                                    "minItems": 1,
      +                                    "type": "array"
      +                                  },
      +                                  "opens": {
      +                                    "description": "24-hour: \"08:00\"",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "days",
      +                                  "opens",
      +                                  "closes"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "maxItems": 21,
      +                              "type": "array"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "image": {
      +                              "description": "A picture of it, by https URL",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "map": {
      +                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "name": {
      +                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "note": {
      +                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "phone": {
      +                              "description": "As it reads: \"020 7232 3010\"",
      +                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +                              "type": "string"
      +                            },
      +                            "timeZone": {
      +                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "map": {
      +                        "const": true,
      +                        "description": "A map of each address, set under it",
      +                        "type": "boolean"
      +                      },
      +                      "type": {
      +                        "const": "locations",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "gap": {
      +        "enum": [
      +          "sm",
      +          "md",
      +          "lg"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "columns",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "columns"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "backdrop": {
      +        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      +        "enum": [
      +          "mesh",
      +          "grain",
      +          "flow",
      +          "marble"
      +        ],
      +        "type": "string"
      +      },
      +      "backdropIntensity": {
      +        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "backdropSpeed": {
      +        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "box": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent",
      +              "none"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      +      },
      +      "call": {
      +        "const": true,
      +        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      +        "type": "boolean"
      +      },
      +      "cover": {
      +        "const": true,
      +        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size; words in <strong> are drawn in the accent colour",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "How tall it is: \"fit\" its words, \"half\" the screen, \"wide\" as a 16:9 picture is for its width, or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      +        "enum": [
      +          "fit",
      +          "half",
      +          "wide",
      +          "full"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "image": {
      +        "description": "A picture behind the heading, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "subheading": {
      +        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      +        "type": "boolean"
      +      },
      +      "text": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "hero",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "heading"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "duration": {
      +        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "file": {
      +        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      +        "properties": {
      +          "key": {
      +            "maxLength": 400,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "name": {
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "size": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "name",
      +          "size"
      +        ],
      +        "type": "object"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "images": {
      +        "description": "Its pictures by https URL, the first on every listing",
      +        "items": {
      +          "pattern": "^https:\\/\\/\\S+$",
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "price": {
      +        "description": "As it should read, currency included, \"£2,500\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "service": {
      +        "const": true,
      +        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      +        "type": "boolean"
      +      },
      +      "sold": {
      +        "description": "A thing sold, or a service fully booked",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tags": {
      +        "default": [],
      +        "description": "The listings it appears in, by their \"tag\"",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "product",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "images",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "amounts": {
      +        "default": [],
      +        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 6,
      +        "type": "array"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "currency": {
      +        "description": "With no amounts, the currency gifts are in; unset, £",
      +        "enum": [
      +          "£",
      +          "$",
      +          "€"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "monthly": {
      +        "description": "The donor may give it every month as well as once",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "donate",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "author": {
      +        "description": "Their name: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "avatarUrl": {
      +        "description": "Their photo, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "quote": {
      +        "description": "Their words, exactly: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "role": {
      +        "description": "Who they are, \"Bride, 2024\", \"Head chef, The Ivy\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "testimonial",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "quote",
      +      "author"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "note": {
      +        "description": "A line under it, where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "As set, a line to a line, a blank line between stanzas, the spaces that indent a line kept; each line inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "poem",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contents",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In the order the page scrolls",
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "section": {
      +              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      +              "pattern": "^[\\w-]+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "src"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 40,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "scenes",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "comments",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contact",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own home page editor; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "start",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own hosting prices; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pricing",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed1 schema field changed
    • changedInput schema / properties / block / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "content",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -        "items": {
      -          "properties": {
      -            "alt": {
      -              "description": "What it shows",
      -              "type": "string"
      -            },
      -            "caption": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "poster": {
      -              "description": "A video's picture before it plays",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "video": {
      -              "const": true,
      -              "description": "src is an MP4 file that plays",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "src",
      -            "alt"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pictures",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tabs": {
      -        "items": {
      -          "properties": {
      -            "code": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "language": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "code"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "codeTabs",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "tabs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "columns": {
      -        "anyOf": [
      -          {
      -            "const": 2,
      -            "type": "number"
      -          },
      -          {
      -            "const": 3,
      -            "type": "number"
      -          },
      -          {
      -            "const": 4,
      -            "type": "number"
      -          }
      -        ],
      -        "description": "How many to a row; unset, as many as fit"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "suffix": {
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "value",
      -            "label"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "stats",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "groups": {
      -        "description": "Groups of links under a heading each",
      -        "items": {
      -          "properties": {
      -            "description": {
      -              "description": "Plain semantic HTML",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "heading": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "links": {
      -              "items": {
      -                "properties": {
      -                  "href": {
      -                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                    "type": "string"
      -                  },
      -                  "label": {
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "label",
      -                  "href"
      -                ],
      -                "type": "object"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "heading",
      -            "links"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "intro": {
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "linkGrid",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The citation, plain semantic HTML",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "title": {
      -        "description": "Its heading; unset, \"References\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "references",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Words in place of the notice's standard ones",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "banner",
      -        "type": "string"
      -      },
      -      "variant": {
      -        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -        "enum": [
      -          "stub",
      -          "unsourced",
      -          "outdated",
      -          "promotional",
      -          "cleanup",
      -          "coi"
      -        ],
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "variant"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "count": {
      -        "description": "With \"newest\", how many; unset, 6",
      -        "maximum": 48,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "menu": {
      -        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -        "items": {
      -          "properties": {
      -            "href": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "href"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "type": "array"
      -      },
      -      "pages": {
      -        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 48,
      -        "type": "array"
      -      },
      -      "shape": {
      -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -        "enum": [
      -          "portrait",
      -          "landscape"
      -        ],
      -        "type": "string"
      -      },
      -      "show": {
      -        "default": "cards",
      -        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -        "enum": [
      -          "cards",
      -          "links"
      -        ],
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -        "enum": [
      -          "under",
      -          "newest",
      -          "chosen",
      -          "products"
      -        ],
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tag": {
      -        "description": "With \"products\", only those with this tag; omit for all",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "under": {
      -        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -        "items": {
      -          "properties": {
      -            "date": {
      -              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "When it ends, written as date is; unset, it ends when it starts",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 300,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "past": {
      -        "description": "The heading over those that have ended; unset, \"Past\"",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "events",
      -        "type": "string"
      -      },
      -      "upcoming": {
      -        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "address": {
      -              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -              "type": "string"
      -            },
      -            "email": {
      -              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -              "type": "string"
      -            },
      -            "hours": {
      -              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -              "items": {
      -                "properties": {
      -                  "closes": {
      -                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  },
      -                  "days": {
      -                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                    "items": {
      -                      "enum": [
      -                        "mon",
      -                        "tue",
      -                        "wed",
      -                        "thu",
      -                        "fri",
      -                        "sat",
      -                        "sun"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "opens": {
      -                    "description": "24-hour: \"08:00\"",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "days",
      -                  "opens",
      -                  "closes"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 21,
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "image": {
      -              "description": "A picture of it, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "map": {
      -              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      -              "type": "string"
      -            },
      -            "note": {
      -              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -              "type": "string"
      -            },
      -            "phone": {
      -              "description": "As it reads: \"020 7232 3010\"",
      -              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -              "type": "string"
      -            },
      -            "timeZone": {
      -              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "map": {
      -        "const": true,
      -        "description": "A map of each address, set under it",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "locations",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "align": {
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "stretch"
      -        ],
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "beside": {
      -        "const": true,
      -        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      -        "type": "boolean"
      -      },
      -      "columns": {
      -        "items": {
      -          "properties": {
      -            "align": {
      -              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      -              "enum": [
      -                "start",
      -                "center",
      -                "end"
      -              ],
      -              "type": "string"
      -            },
      -            "area": {
      -              "description": "Its place on a twelve-column grid; give every column one, or none",
      -              "properties": {
      -                "col": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "row": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "rows": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "span": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "col",
      -                "span",
      -                "row",
      -                "rows"
      -              ],
      -              "type": "object"
      -            },
      -            "blocks": {
      -              "items": {
      -                "oneOf": [
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Plain semantic HTML",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "content",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "text"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -                        "items": {
      -                          "properties": {
      -                            "alt": {
      -                              "description": "What it shows",
      -                              "type": "string"
      -                            },
      -                            "caption": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "poster": {
      -                              "description": "A video's picture before it plays",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "src": {
      -                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "video": {
      -                              "const": true,
      -                              "description": "src is an MP4 file that plays",
      -                              "type": "boolean"
      -                            }
      -                          },
      -                          "required": [
      -                            "src",
      -                            "alt"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "pictures",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "tabs": {
      -                        "items": {
      -                          "properties": {
      -                            "code": {
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "language": {
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "code"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 8,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "codeTabs",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "tabs"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "columns": {
      -                        "anyOf": [
      -                          {
      -                            "const": 2,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 3,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 4,
      -                            "type": "number"
      -                          }
      -                        ],
      -                        "description": "How many to a row; unset, as many as fit"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "suffix": {
      -                              "type": "string"
      -                            },
      -                            "value": {
      -                              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "value",
      -                            "label"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 12,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "stats",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "groups": {
      -                        "description": "Groups of links under a heading each",
      -                        "items": {
      -                          "properties": {
      -                            "description": {
      -                              "description": "Plain semantic HTML",
      -                              "type": [
      -                                "string",
      -                                "null"
      -                              ]
      -                            },
      -                            "heading": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "links": {
      -                              "items": {
      -                                "properties": {
      -                                  "href": {
      -                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                                    "type": "string"
      -                                  },
      -                                  "label": {
      -                                    "minLength": 1,
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "label",
      -                                  "href"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "type": "array"
      -                            }
      -                          },
      -                          "required": [
      -                            "heading",
      -                            "links"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "intro": {
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "linkGrid",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "groups"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "The citation, plain semantic HTML",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "url": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "title": {
      -                        "description": "Its heading; unset, \"References\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "references",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Words in place of the notice's standard ones",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "banner",
      -                        "type": "string"
      -                      },
      -                      "variant": {
      -                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -                        "enum": [
      -                          "stub",
      -                          "unsourced",
      -                          "outdated",
      -                          "promotional",
      -                          "cleanup",
      -                          "coi"
      -                        ],
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "variant"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "count": {
      -                        "description": "With \"newest\", how many; unset, 6",
      -                        "maximum": 48,
      -                        "minimum": 1,
      -                        "type": "integer"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "menu": {
      -                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -                        "items": {
      -                          "properties": {
      -                            "href": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "href"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 24,
      -                        "type": "array"
      -                      },
      -                      "pages": {
      -                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -                        "items": {
      -                          "type": "string"
      -                        },
      -                        "maxItems": 48,
      -                        "type": "array"
      -                      },
      -                      "shape": {
      -                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -                        "enum": [
      -                          "portrait",
      -                          "landscape"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "show": {
      -                        "default": "cards",
      -                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -                        "enum": [
      -                          "cards",
      -                          "links"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -                        "enum": [
      -                          "under",
      -                          "newest",
      -                          "chosen",
      -                          "products"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "tag": {
      -                        "description": "With \"products\", only those with this tag; omit for all",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "list",
      -                        "type": "string"
      -                      },
      -                      "under": {
      -                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "source"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -                        "items": {
      -                          "properties": {
      -                            "date": {
      -                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "end": {
      -                              "description": "When it ends, written as date is; unset, it ends when it starts",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "date",
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 300,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "past": {
      -                        "description": "The heading over those that have ended; unset, \"Past\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "events",
      -                        "type": "string"
      -                      },
      -                      "upcoming": {
      -                        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "heading": {
      -                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      -                        "type": "string"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "address": {
      -                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -                              "type": "string"
      -                            },
      -                            "email": {
      -                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -                              "type": "string"
      -                            },
      -                            "hours": {
      -                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -                              "items": {
      -                                "properties": {
      -                                  "closes": {
      -                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  },
      -                                  "days": {
      -                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                                    "items": {
      -                                      "enum": [
      -                                        "mon",
      -                                        "tue",
      -                                        "wed",
      -                                        "thu",
      -                                        "fri",
      -                                        "sat",
      -                                        "sun"
      -                                      ],
      -                                      "type": "string"
      -                                    },
      -                                    "minItems": 1,
      -                                    "type": "array"
      -                                  },
      -                                  "opens": {
      -                                    "description": "24-hour: \"08:00\"",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "days",
      -                                  "opens",
      -                                  "closes"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "maxItems": 21,
      -                              "type": "array"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "image": {
      -                              "description": "A picture of it, by https URL",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "map": {
      -                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "name": {
      -                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      -                              "type": "string"
      -                            },
      -                            "note": {
      -                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -                              "type": "string"
      -                            },
      -                            "phone": {
      -                              "description": "As it reads: \"020 7232 3010\"",
      -                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -                              "type": "string"
      -                            },
      -                            "timeZone": {
      -                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "map": {
      -                        "const": true,
      -                        "description": "A map of each address, set under it",
      -                        "type": "boolean"
      -                      },
      -                      "type": {
      -                        "const": "locations",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "gap": {
      -        "enum": [
      -          "sm",
      -          "md",
      -          "lg"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "columns",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "columns"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "backdrop": {
      -        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      -        "enum": [
      -          "mesh",
      -          "grain",
      -          "flow",
      -          "marble"
      -        ],
      -        "type": "string"
      -      },
      -      "backdropIntensity": {
      -        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "backdropSpeed": {
      -        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "box": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent",
      -              "none"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      -      },
      -      "call": {
      -        "const": true,
      -        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      -        "type": "boolean"
      -      },
      -      "cover": {
      -        "const": true,
      -        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      -        "type": "boolean"
      -      },
      -      "heading": {
      -        "description": "Plain text; words may be wrapped in <strong> or <em>; words in <strong> are drawn in the accent colour",
      -        "type": "string"
      -      },
      -      "height": {
      -        "description": "How tall it is: \"fit\" its words, \"half\" the screen or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      -        "enum": [
      -          "fit",
      -          "half",
      -          "full"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "image": {
      -        "description": "A picture behind the heading, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "subheading": {
      -        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      -        "type": "boolean"
      -      },
      -      "text": {
      -        "description": "Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "hero",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "heading"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "duration": {
      -        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\"",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "file": {
      -        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      -        "properties": {
      -          "key": {
      -            "maxLength": 400,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "name": {
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "size": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "key",
      -          "name",
      -          "size"
      -        ],
      -        "type": "object"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "images": {
      -        "description": "Its pictures by https URL, the first on every listing",
      -        "items": {
      -          "pattern": "^https:\\/\\/\\S+$",
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "price": {
      -        "description": "As it should read, currency included: \"£2,500\"",
      -        "type": "string"
      -      },
      -      "service": {
      -        "const": true,
      -        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      -        "type": "boolean"
      -      },
      -      "sold": {
      -        "description": "A thing sold, or a service fully booked",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "tags": {
      -        "default": [],
      -        "description": "The listings it appears in, by their \"tag\"",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "product",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "images",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "amounts": {
      -        "default": [],
      -        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 6,
      -        "type": "array"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "currency": {
      -        "description": "With no amounts, the currency gifts are in; unset, £",
      -        "enum": [
      -          "£",
      -          "$",
      -          "€"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "monthly": {
      -        "description": "The donor may give it every month as well as once",
      -        "type": "boolean"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "donate",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "author": {
      -        "description": "Their name",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "avatarUrl": {
      -        "description": "Their photo, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "quote": {
      -        "description": "Their words, exactly",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "role": {
      -        "description": "Who they are: \"Bride, 2024\", \"Head chef, The Ivy\"",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "testimonial",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "quote",
      -      "author"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "note": {
      -        "description": "A line under it: where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\"",
      -        "type": "string"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain text as set: a line to a line, a blank line between stanzas, the spaces that indent a line kept; words may be wrapped in <strong> or <em>",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "poem",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contents",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In the order the page scrolls",
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "section": {
      -              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      -              "pattern": "^[\\w-]+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 40,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "scenes",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "comments",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contact",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own home page editor; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "start",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own hosting prices; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "look": {
      -        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      -        "properties": {
      -          "--align": {
      -            "description": "Where its words sit: at the start of the line, centred or at the end",
      -            "enum": [
      -              "start",
      -              "center",
      -              "end"
      -            ],
      -            "type": "string"
      -          },
      -          "--color-accent": {
      -            "description": "Its links, buttons and accent",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-heading": {
      -            "description": "Its headings",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-muted": {
      -            "description": "Its quieter words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--color-text": {
      -            "description": "Its words",
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          },
      -          "--font-heading": {
      -            "description": "Its headings' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "--font-sans": {
      -            "description": "Its words' font",
      -            "pattern": "^[\\w\\s,()\\-]+$",
      -            "type": "string"
      -          },
      -          "depth": {
      -            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          },
      -          "roundness": {
      -            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      -            "maximum": 1,
      -            "minimum": 0,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "space": {
      -        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      -        "enum": [
      -          "none",
      -          "small",
      -          "large"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pricing",
      -        "type": "string"
      -      },
      -      "width": {
      -        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      -        "enum": [
      -          "narrow",
      -          "full"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "content",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +        "items": {
      +          "properties": {
      +            "alt": {
      +              "description": "What it shows",
      +              "type": "string"
      +            },
      +            "caption": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "poster": {
      +              "description": "A video's picture before it plays",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "video": {
      +              "const": true,
      +              "description": "src is an MP4 file that plays",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "src",
      +            "alt"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pictures",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tabs": {
      +        "items": {
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "language": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "code"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "codeTabs",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "tabs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "columns": {
      +        "anyOf": [
      +          {
      +            "const": 2,
      +            "type": "number"
      +          },
      +          {
      +            "const": 3,
      +            "type": "number"
      +          },
      +          {
      +            "const": 4,
      +            "type": "number"
      +          }
      +        ],
      +        "description": "How many to a row; unset, as many as fit"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "suffix": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "label"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "stats",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "groups": {
      +        "description": "Groups of links under a heading each",
      +        "items": {
      +          "properties": {
      +            "description": {
      +              "description": "Plain semantic HTML",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "heading": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "links": {
      +              "items": {
      +                "properties": {
      +                  "href": {
      +                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "label",
      +                  "href"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "heading",
      +            "links"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "intro": {
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "linkGrid",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The citation, plain semantic HTML",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "Its heading; unset, \"References\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "references",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Words in place of the notice's standard ones",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "banner",
      +        "type": "string"
      +      },
      +      "variant": {
      +        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +        "enum": [
      +          "stub",
      +          "unsourced",
      +          "outdated",
      +          "promotional",
      +          "cleanup",
      +          "coi"
      +        ],
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "variant"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "count": {
      +        "description": "With \"newest\", how many; unset, 6",
      +        "maximum": 48,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "menu": {
      +        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +        "items": {
      +          "properties": {
      +            "href": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "href"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "type": "array"
      +      },
      +      "pages": {
      +        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 48,
      +        "type": "array"
      +      },
      +      "shape": {
      +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +        "enum": [
      +          "portrait",
      +          "landscape"
      +        ],
      +        "type": "string"
      +      },
      +      "show": {
      +        "default": "cards",
      +        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +        "enum": [
      +          "cards",
      +          "links"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +        "enum": [
      +          "under",
      +          "newest",
      +          "chosen",
      +          "products"
      +        ],
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tag": {
      +        "description": "With \"products\", only those with this tag; omit for all",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "under": {
      +        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +        "items": {
      +          "properties": {
      +            "date": {
      +              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "When it ends, written as date is; unset, it ends when it starts",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 300,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "past": {
      +        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "events",
      +        "type": "string"
      +      },
      +      "upcoming": {
      +        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "address": {
      +              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +              "type": "string"
      +            },
      +            "email": {
      +              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +              "type": "string"
      +            },
      +            "hours": {
      +              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +              "items": {
      +                "properties": {
      +                  "closes": {
      +                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  },
      +                  "days": {
      +                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                    "items": {
      +                      "enum": [
      +                        "mon",
      +                        "tue",
      +                        "wed",
      +                        "thu",
      +                        "fri",
      +                        "sat",
      +                        "sun"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "opens": {
      +                    "description": "24-hour: \"08:00\"",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "days",
      +                  "opens",
      +                  "closes"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 21,
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "image": {
      +              "description": "A picture of it, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "map": {
      +              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "note": {
      +              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +              "type": "string"
      +            },
      +            "phone": {
      +              "description": "As it reads: \"020 7232 3010\"",
      +              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +              "type": "string"
      +            },
      +            "timeZone": {
      +              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "map": {
      +        "const": true,
      +        "description": "A map of each address, set under it",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "locations",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "stretch"
      +        ],
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "beside": {
      +        "const": true,
      +        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      +        "type": "boolean"
      +      },
      +      "columns": {
      +        "items": {
      +          "properties": {
      +            "align": {
      +              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      +              "enum": [
      +                "start",
      +                "center",
      +                "end"
      +              ],
      +              "type": "string"
      +            },
      +            "area": {
      +              "description": "Its place on a twelve-column grid; give every column one, or none",
      +              "properties": {
      +                "col": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "row": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "rows": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "span": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "col",
      +                "span",
      +                "row",
      +                "rows"
      +              ],
      +              "type": "object"
      +            },
      +            "blocks": {
      +              "items": {
      +                "oneOf": [
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Plain semantic HTML",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "content",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "text"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +                        "items": {
      +                          "properties": {
      +                            "alt": {
      +                              "description": "What it shows",
      +                              "type": "string"
      +                            },
      +                            "caption": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "poster": {
      +                              "description": "A video's picture before it plays",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "src": {
      +                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "video": {
      +                              "const": true,
      +                              "description": "src is an MP4 file that plays",
      +                              "type": "boolean"
      +                            }
      +                          },
      +                          "required": [
      +                            "src",
      +                            "alt"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "pictures",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "tabs": {
      +                        "items": {
      +                          "properties": {
      +                            "code": {
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "language": {
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "code"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 8,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "codeTabs",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "tabs"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "columns": {
      +                        "anyOf": [
      +                          {
      +                            "const": 2,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 3,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 4,
      +                            "type": "number"
      +                          }
      +                        ],
      +                        "description": "How many to a row; unset, as many as fit"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "suffix": {
      +                              "type": "string"
      +                            },
      +                            "value": {
      +                              "description": "As it should read, \"1987\", \"40+\", \"4.9★\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "value",
      +                            "label"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 12,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "stats",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "groups": {
      +                        "description": "Groups of links under a heading each",
      +                        "items": {
      +                          "properties": {
      +                            "description": {
      +                              "description": "Plain semantic HTML",
      +                              "type": [
      +                                "string",
      +                                "null"
      +                              ]
      +                            },
      +                            "heading": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "links": {
      +                              "items": {
      +                                "properties": {
      +                                  "href": {
      +                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                                    "type": "string"
      +                                  },
      +                                  "label": {
      +                                    "minLength": 1,
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "label",
      +                                  "href"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "type": "array"
      +                            }
      +                          },
      +                          "required": [
      +                            "heading",
      +                            "links"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "intro": {
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "linkGrid",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "groups"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "The citation, plain semantic HTML",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "url": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "title": {
      +                        "description": "Its heading; unset, \"References\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "references",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Words in place of the notice's standard ones",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "banner",
      +                        "type": "string"
      +                      },
      +                      "variant": {
      +                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +                        "enum": [
      +                          "stub",
      +                          "unsourced",
      +                          "outdated",
      +                          "promotional",
      +                          "cleanup",
      +                          "coi"
      +                        ],
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "variant"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "count": {
      +                        "description": "With \"newest\", how many; unset, 6",
      +                        "maximum": 48,
      +                        "minimum": 1,
      +                        "type": "integer"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "menu": {
      +                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +                        "items": {
      +                          "properties": {
      +                            "href": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "href"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 24,
      +                        "type": "array"
      +                      },
      +                      "pages": {
      +                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +                        "items": {
      +                          "type": "string"
      +                        },
      +                        "maxItems": 48,
      +                        "type": "array"
      +                      },
      +                      "shape": {
      +                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +                        "enum": [
      +                          "portrait",
      +                          "landscape"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "show": {
      +                        "default": "cards",
      +                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +                        "enum": [
      +                          "cards",
      +                          "links"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +                        "enum": [
      +                          "under",
      +                          "newest",
      +                          "chosen",
      +                          "products"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "tag": {
      +                        "description": "With \"products\", only those with this tag; omit for all",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "list",
      +                        "type": "string"
      +                      },
      +                      "under": {
      +                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "source"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +                        "items": {
      +                          "properties": {
      +                            "date": {
      +                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "end": {
      +                              "description": "When it ends, written as date is; unset, it ends when it starts",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "What it is and where: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "date",
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 300,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "past": {
      +                        "description": "The heading over those that have ended; unset, \"Past\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "events",
      +                        "type": "string"
      +                      },
      +                      "upcoming": {
      +                        "description": "The heading over those to come or on now; unset, \"Upcoming\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "heading": {
      +                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                        "type": "string"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "address": {
      +                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +                              "type": "string"
      +                            },
      +                            "email": {
      +                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +                              "type": "string"
      +                            },
      +                            "hours": {
      +                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +                              "items": {
      +                                "properties": {
      +                                  "closes": {
      +                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  },
      +                                  "days": {
      +                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                                    "items": {
      +                                      "enum": [
      +                                        "mon",
      +                                        "tue",
      +                                        "wed",
      +                                        "thu",
      +                                        "fri",
      +                                        "sat",
      +                                        "sun"
      +                                      ],
      +                                      "type": "string"
      +                                    },
      +                                    "minItems": 1,
      +                                    "type": "array"
      +                                  },
      +                                  "opens": {
      +                                    "description": "24-hour: \"08:00\"",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "days",
      +                                  "opens",
      +                                  "closes"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "maxItems": 21,
      +                              "type": "array"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "image": {
      +                              "description": "A picture of it, by https URL",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "map": {
      +                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "name": {
      +                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "note": {
      +                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +                              "type": "string"
      +                            },
      +                            "phone": {
      +                              "description": "As it reads: \"020 7232 3010\"",
      +                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +                              "type": "string"
      +                            },
      +                            "timeZone": {
      +                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "map": {
      +                        "const": true,
      +                        "description": "A map of each address, set under it",
      +                        "type": "boolean"
      +                      },
      +                      "type": {
      +                        "const": "locations",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "gap": {
      +        "enum": [
      +          "sm",
      +          "md",
      +          "lg"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "columns",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "columns"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "backdrop": {
      +        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      +        "enum": [
      +          "mesh",
      +          "grain",
      +          "flow",
      +          "marble"
      +        ],
      +        "type": "string"
      +      },
      +      "backdropIntensity": {
      +        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "backdropSpeed": {
      +        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "box": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent",
      +              "none"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      +      },
      +      "call": {
      +        "const": true,
      +        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      +        "type": "boolean"
      +      },
      +      "cover": {
      +        "const": true,
      +        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size; words in <strong> are drawn in the accent colour",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "How tall it is: \"fit\" its words, \"half\" the screen or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      +        "enum": [
      +          "fit",
      +          "half",
      +          "full"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "image": {
      +        "description": "A picture behind the heading, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "subheading": {
      +        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      +        "type": "boolean"
      +      },
      +      "text": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "hero",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "heading"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size, with no <a>, as it is a link already",
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "duration": {
      +        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\". A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "file": {
      +        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      +        "properties": {
      +          "key": {
      +            "maxLength": 400,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "name": {
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "size": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "name",
      +          "size"
      +        ],
      +        "type": "object"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "images": {
      +        "description": "Its pictures by https URL, the first on every listing",
      +        "items": {
      +          "pattern": "^https:\\/\\/\\S+$",
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "price": {
      +        "description": "As it should read, currency included, \"£2,500\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "service": {
      +        "const": true,
      +        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      +        "type": "boolean"
      +      },
      +      "sold": {
      +        "description": "A thing sold, or a service fully booked",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tags": {
      +        "default": [],
      +        "description": "The listings it appears in, by their \"tag\"",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "product",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many. A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "images",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "amounts": {
      +        "default": [],
      +        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 6,
      +        "type": "array"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "currency": {
      +        "description": "With no amounts, the currency gifts are in; unset, £",
      +        "enum": [
      +          "£",
      +          "$",
      +          "€"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "monthly": {
      +        "description": "The donor may give it every month as well as once",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "donate",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "author": {
      +        "description": "Their name: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "avatarUrl": {
      +        "description": "Their photo, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "quote": {
      +        "description": "Their words, exactly: A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "role": {
      +        "description": "Who they are, \"Bride, 2024\", \"Head chef, The Ivy\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "testimonial",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "quote",
      +      "author"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "note": {
      +        "description": "A line under it, where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\": A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "As set, a line to a line, a blank line between stanzas, the spaces that indent a line kept; each line inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "poem",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contents",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In the order the page scrolls",
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "section": {
      +              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      +              "pattern": "^[\\w-]+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "src"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 40,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "scenes",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "comments",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contact",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own home page editor; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "start",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own hosting prices; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "A line of words, inline HTML: <strong>, <em>, <code>, <a href> and <span style> with font-family, color or font-size",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pricing",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  5. Changed1 schema field changed
    • changedInput schema / properties / block / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "content",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -        "items": {
      -          "properties": {
      -            "alt": {
      -              "description": "What it shows",
      -              "type": "string"
      -            },
      -            "caption": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "poster": {
      -              "description": "A video's picture before it plays",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "video": {
      -              "const": true,
      -              "description": "src is an MP4 file that plays",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "src",
      -            "alt"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "pictures",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "tabs": {
      -        "items": {
      -          "properties": {
      -            "code": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "language": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "code"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "codeTabs",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "tabs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "columns": {
      -        "anyOf": [
      -          {
      -            "const": 2,
      -            "type": "number"
      -          },
      -          {
      -            "const": 3,
      -            "type": "number"
      -          },
      -          {
      -            "const": 4,
      -            "type": "number"
      -          }
      -        ],
      -        "description": "How many to a row; unset, as many as fit"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "suffix": {
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "value",
      -            "label"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "stats",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "groups": {
      -        "description": "Groups of links under a heading each",
      -        "items": {
      -          "properties": {
      -            "description": {
      -              "description": "Plain semantic HTML",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "heading": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "links": {
      -              "items": {
      -                "properties": {
      -                  "href": {
      -                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                    "type": "string"
      -                  },
      -                  "label": {
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "label",
      -                  "href"
      -                ],
      -                "type": "object"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "heading",
      -            "links"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "intro": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "linkGrid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The citation, plain semantic HTML",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "title": {
      -        "description": "Its heading; unset, \"References\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "references",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Words in place of the notice's standard ones",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "banner",
      -        "type": "string"
      -      },
      -      "variant": {
      -        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -        "enum": [
      -          "stub",
      -          "unsourced",
      -          "outdated",
      -          "promotional",
      -          "cleanup",
      -          "coi"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "variant"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "count": {
      -        "description": "With \"newest\", how many; unset, 6",
      -        "maximum": 48,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "menu": {
      -        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -        "items": {
      -          "properties": {
      -            "href": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "href"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "type": "array"
      -      },
      -      "pages": {
      -        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 48,
      -        "type": "array"
      -      },
      -      "shape": {
      -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -        "enum": [
      -          "portrait",
      -          "landscape"
      -        ],
      -        "type": "string"
      -      },
      -      "show": {
      -        "default": "cards",
      -        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -        "enum": [
      -          "cards",
      -          "links"
      -        ],
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -        "enum": [
      -          "under",
      -          "newest",
      -          "chosen",
      -          "products"
      -        ],
      -        "type": "string"
      -      },
      -      "tag": {
      -        "description": "With \"products\", only those with this tag; omit for all",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "under": {
      -        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -        "items": {
      -          "properties": {
      -            "date": {
      -              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "When it ends, written as date is; unset, it ends when it starts",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 300,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "past": {
      -        "description": "The heading over those that have ended; unset, \"Past\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "events",
      -        "type": "string"
      -      },
      -      "upcoming": {
      -        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "address": {
      -              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -              "type": "string"
      -            },
      -            "email": {
      -              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -              "type": "string"
      -            },
      -            "hours": {
      -              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -              "items": {
      -                "properties": {
      -                  "closes": {
      -                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  },
      -                  "days": {
      -                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                    "items": {
      -                      "enum": [
      -                        "mon",
      -                        "tue",
      -                        "wed",
      -                        "thu",
      -                        "fri",
      -                        "sat",
      -                        "sun"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "opens": {
      -                    "description": "24-hour: \"08:00\"",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "days",
      -                  "opens",
      -                  "closes"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 21,
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "image": {
      -              "description": "A picture of it, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "map": {
      -              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      -              "type": "string"
      -            },
      -            "note": {
      -              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -              "type": "string"
      -            },
      -            "phone": {
      -              "description": "As it reads: \"020 7232 3010\"",
      -              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -              "type": "string"
      -            },
      -            "timeZone": {
      -              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "map": {
      -        "const": true,
      -        "description": "A map of each address, set under it",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "locations",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "align": {
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "stretch"
      -        ],
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "beside": {
      -        "const": true,
      -        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      -        "type": "boolean"
      -      },
      -      "columns": {
      -        "items": {
      -          "properties": {
      -            "area": {
      -              "description": "Its place on a twelve-column grid; give every column one, or none",
      -              "properties": {
      -                "col": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "row": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "rows": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "span": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "col",
      -                "span",
      -                "row",
      -                "rows"
      -              ],
      -              "type": "object"
      -            },
      -            "blocks": {
      -              "items": {
      -                "oneOf": [
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Plain semantic HTML",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "content",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "text"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -                        "items": {
      -                          "properties": {
      -                            "alt": {
      -                              "description": "What it shows",
      -                              "type": "string"
      -                            },
      -                            "caption": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "poster": {
      -                              "description": "A video's picture before it plays",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "src": {
      -                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "video": {
      -                              "const": true,
      -                              "description": "src is an MP4 file that plays",
      -                              "type": "boolean"
      -                            }
      -                          },
      -                          "required": [
      -                            "src",
      -                            "alt"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "pictures",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "tabs": {
      -                        "items": {
      -                          "properties": {
      -                            "code": {
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "language": {
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "code"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 8,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "codeTabs",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "tabs"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "columns": {
      -                        "anyOf": [
      -                          {
      -                            "const": 2,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 3,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 4,
      -                            "type": "number"
      -                          }
      -                        ],
      -                        "description": "How many to a row; unset, as many as fit"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "suffix": {
      -                              "type": "string"
      -                            },
      -                            "value": {
      -                              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "value",
      -                            "label"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 12,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "stats",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "groups": {
      -                        "description": "Groups of links under a heading each",
      -                        "items": {
      -                          "properties": {
      -                            "description": {
      -                              "description": "Plain semantic HTML",
      -                              "type": [
      -                                "string",
      -                                "null"
      -                              ]
      -                            },
      -                            "heading": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "links": {
      -                              "items": {
      -                                "properties": {
      -                                  "href": {
      -                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                                    "type": "string"
      -                                  },
      -                                  "label": {
      -                                    "minLength": 1,
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "label",
      -                                  "href"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "type": "array"
      -                            }
      -                          },
      -                          "required": [
      -                            "heading",
      -                            "links"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "intro": {
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "linkGrid",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "groups"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "The citation, plain semantic HTML",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "url": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "title": {
      -                        "description": "Its heading; unset, \"References\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "references",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Words in place of the notice's standard ones",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "banner",
      -                        "type": "string"
      -                      },
      -                      "variant": {
      -                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -                        "enum": [
      -                          "stub",
      -                          "unsourced",
      -                          "outdated",
      -                          "promotional",
      -                          "cleanup",
      -                          "coi"
      -                        ],
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "variant"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "count": {
      -                        "description": "With \"newest\", how many; unset, 6",
      -                        "maximum": 48,
      -                        "minimum": 1,
      -                        "type": "integer"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "menu": {
      -                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -                        "items": {
      -                          "properties": {
      -                            "href": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "href"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 24,
      -                        "type": "array"
      -                      },
      -                      "pages": {
      -                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -                        "items": {
      -                          "type": "string"
      -                        },
      -                        "maxItems": 48,
      -                        "type": "array"
      -                      },
      -                      "shape": {
      -                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -                        "enum": [
      -                          "portrait",
      -                          "landscape"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "show": {
      -                        "default": "cards",
      -                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -                        "enum": [
      -                          "cards",
      -                          "links"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -                        "enum": [
      -                          "under",
      -                          "newest",
      -                          "chosen",
      -                          "products"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "tag": {
      -                        "description": "With \"products\", only those with this tag; omit for all",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "list",
      -                        "type": "string"
      -                      },
      -                      "under": {
      -                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "source"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -                        "items": {
      -                          "properties": {
      -                            "date": {
      -                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "end": {
      -                              "description": "When it ends, written as date is; unset, it ends when it starts",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "date",
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 300,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "past": {
      -                        "description": "The heading over those that have ended; unset, \"Past\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "events",
      -                        "type": "string"
      -                      },
      -                      "upcoming": {
      -                        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "heading": {
      -                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      -                        "type": "string"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "address": {
      -                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -                              "type": "string"
      -                            },
      -                            "email": {
      -                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -                              "type": "string"
      -                            },
      -                            "hours": {
      -                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -                              "items": {
      -                                "properties": {
      -                                  "closes": {
      -                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  },
      -                                  "days": {
      -                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                                    "items": {
      -                                      "enum": [
      -                                        "mon",
      -                                        "tue",
      -                                        "wed",
      -                                        "thu",
      -                                        "fri",
      -                                        "sat",
      -                                        "sun"
      -                                      ],
      -                                      "type": "string"
      -                                    },
      -                                    "minItems": 1,
      -                                    "type": "array"
      -                                  },
      -                                  "opens": {
      -                                    "description": "24-hour: \"08:00\"",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "days",
      -                                  "opens",
      -                                  "closes"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "maxItems": 21,
      -                              "type": "array"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "image": {
      -                              "description": "A picture of it, by https URL",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "map": {
      -                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "name": {
      -                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      -                              "type": "string"
      -                            },
      -                            "note": {
      -                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -                              "type": "string"
      -                            },
      -                            "phone": {
      -                              "description": "As it reads: \"020 7232 3010\"",
      -                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -                              "type": "string"
      -                            },
      -                            "timeZone": {
      -                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "map": {
      -                        "const": true,
      -                        "description": "A map of each address, set under it",
      -                        "type": "boolean"
      -                      },
      -                      "type": {
      -                        "const": "locations",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "gap": {
      -        "enum": [
      -          "sm",
      -          "md",
      -          "lg"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "columns",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "columns"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "backdrop": {
      -        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      -        "enum": [
      -          "mesh",
      -          "grain",
      -          "flow",
      -          "marble"
      -        ],
      -        "type": "string"
      -      },
      -      "backdropIntensity": {
      -        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "backdropSpeed": {
      -        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "box": {
      -        "description": "Over a picture or backdrop, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; \"none\" no box, light words straight on the picture",
      -        "enum": [
      -          "panel",
      -          "accent",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "call": {
      -        "const": true,
      -        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      -        "type": "boolean"
      -      },
      -      "heading": {
      -        "description": "Plain text; words may be wrapped in <strong> or <em>; words in <strong> are drawn in the accent colour",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "image": {
      -        "description": "A picture behind the heading, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "subheading": {
      -        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      -        "type": "boolean"
      -      },
      -      "text": {
      -        "description": "Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "hero",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "heading"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "duration": {
      -        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\"",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "file": {
      -        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      -        "properties": {
      -          "key": {
      -            "maxLength": 400,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "name": {
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "size": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "key",
      -          "name",
      -          "size"
      -        ],
      -        "type": "object"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "images": {
      -        "description": "Its pictures by https URL, the first on every listing",
      -        "items": {
      -          "pattern": "^https:\\/\\/\\S+$",
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "price": {
      -        "description": "As it should read, currency included: \"£2,500\"",
      -        "type": "string"
      -      },
      -      "service": {
      -        "const": true,
      -        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      -        "type": "boolean"
      -      },
      -      "sold": {
      -        "description": "A thing sold, or a service fully booked",
      -        "type": "boolean"
      -      },
      -      "tags": {
      -        "default": [],
      -        "description": "The listings it appears in, by their \"tag\"",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "product",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many",
      -        "maxLength": 40,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "images",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "amounts": {
      -        "default": [],
      -        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 6,
      -        "type": "array"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "currency": {
      -        "description": "With no amounts, the currency gifts are in; unset, £",
      -        "enum": [
      -          "£",
      -          "$",
      -          "€"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "monthly": {
      -        "description": "The donor may give it every month as well as once",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "donate",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "author": {
      -        "description": "Their name",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "avatarUrl": {
      -        "description": "Their photo, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "quote": {
      -        "description": "Their words, exactly",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "role": {
      -        "description": "Who they are: \"Bride, 2024\", \"Head chef, The Ivy\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "testimonial",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "quote",
      -      "author"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "note": {
      -        "description": "A line under it: where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\"",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain text as set: a line to a line, a blank line between stanzas, the spaces that indent a line kept; words may be wrapped in <strong> or <em>",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "poem",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contents",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In the order the page scrolls",
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "section": {
      -              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      -              "pattern": "^[\\w-]+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 40,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "scenes",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "comments",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contact",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own home page editor; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "start",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own hosting prices; never on another site",
      -    "properties": {
      -      "band": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "panel",
      -              "accent"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "pattern": "^#[0-9a-f]{6}$",
      -            "type": "string"
      -          }
      -        ],
      -        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      -      },
      -      "heading": {
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pricing",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "content",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +        "items": {
      +          "properties": {
      +            "alt": {
      +              "description": "What it shows",
      +              "type": "string"
      +            },
      +            "caption": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "poster": {
      +              "description": "A video's picture before it plays",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "video": {
      +              "const": true,
      +              "description": "src is an MP4 file that plays",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "src",
      +            "alt"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pictures",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tabs": {
      +        "items": {
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "language": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "code"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "codeTabs",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "tabs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "columns": {
      +        "anyOf": [
      +          {
      +            "const": 2,
      +            "type": "number"
      +          },
      +          {
      +            "const": 3,
      +            "type": "number"
      +          },
      +          {
      +            "const": 4,
      +            "type": "number"
      +          }
      +        ],
      +        "description": "How many to a row; unset, as many as fit"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "suffix": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "label"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "stats",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "groups": {
      +        "description": "Groups of links under a heading each",
      +        "items": {
      +          "properties": {
      +            "description": {
      +              "description": "Plain semantic HTML",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "heading": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "links": {
      +              "items": {
      +                "properties": {
      +                  "href": {
      +                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "label",
      +                  "href"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "heading",
      +            "links"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "intro": {
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "linkGrid",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The citation, plain semantic HTML",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "Its heading; unset, \"References\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "references",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Words in place of the notice's standard ones",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "banner",
      +        "type": "string"
      +      },
      +      "variant": {
      +        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +        "enum": [
      +          "stub",
      +          "unsourced",
      +          "outdated",
      +          "promotional",
      +          "cleanup",
      +          "coi"
      +        ],
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "variant"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "count": {
      +        "description": "With \"newest\", how many; unset, 6",
      +        "maximum": 48,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "menu": {
      +        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +        "items": {
      +          "properties": {
      +            "href": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "href"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "type": "array"
      +      },
      +      "pages": {
      +        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 48,
      +        "type": "array"
      +      },
      +      "shape": {
      +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +        "enum": [
      +          "portrait",
      +          "landscape"
      +        ],
      +        "type": "string"
      +      },
      +      "show": {
      +        "default": "cards",
      +        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +        "enum": [
      +          "cards",
      +          "links"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +        "enum": [
      +          "under",
      +          "newest",
      +          "chosen",
      +          "products"
      +        ],
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tag": {
      +        "description": "With \"products\", only those with this tag; omit for all",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "under": {
      +        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +        "items": {
      +          "properties": {
      +            "date": {
      +              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "When it ends, written as date is; unset, it ends when it starts",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 300,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "past": {
      +        "description": "The heading over those that have ended; unset, \"Past\"",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "events",
      +        "type": "string"
      +      },
      +      "upcoming": {
      +        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "address": {
      +              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +              "type": "string"
      +            },
      +            "email": {
      +              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +              "type": "string"
      +            },
      +            "hours": {
      +              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +              "items": {
      +                "properties": {
      +                  "closes": {
      +                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  },
      +                  "days": {
      +                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                    "items": {
      +                      "enum": [
      +                        "mon",
      +                        "tue",
      +                        "wed",
      +                        "thu",
      +                        "fri",
      +                        "sat",
      +                        "sun"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "opens": {
      +                    "description": "24-hour: \"08:00\"",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "days",
      +                  "opens",
      +                  "closes"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 21,
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "image": {
      +              "description": "A picture of it, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "map": {
      +              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      +              "type": "string"
      +            },
      +            "note": {
      +              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +              "type": "string"
      +            },
      +            "phone": {
      +              "description": "As it reads: \"020 7232 3010\"",
      +              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +              "type": "string"
      +            },
      +            "timeZone": {
      +              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "map": {
      +        "const": true,
      +        "description": "A map of each address, set under it",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "locations",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "stretch"
      +        ],
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "beside": {
      +        "const": true,
      +        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      +        "type": "boolean"
      +      },
      +      "columns": {
      +        "items": {
      +          "properties": {
      +            "align": {
      +              "description": "Where its words and headings sit: at the start of the line, centred or at the end; unset, as the rest of the page",
      +              "enum": [
      +                "start",
      +                "center",
      +                "end"
      +              ],
      +              "type": "string"
      +            },
      +            "area": {
      +              "description": "Its place on a twelve-column grid; give every column one, or none",
      +              "properties": {
      +                "col": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "row": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "rows": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "span": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "col",
      +                "span",
      +                "row",
      +                "rows"
      +              ],
      +              "type": "object"
      +            },
      +            "blocks": {
      +              "items": {
      +                "oneOf": [
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Plain semantic HTML",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "content",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "text"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +                        "items": {
      +                          "properties": {
      +                            "alt": {
      +                              "description": "What it shows",
      +                              "type": "string"
      +                            },
      +                            "caption": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "poster": {
      +                              "description": "A video's picture before it plays",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "src": {
      +                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "video": {
      +                              "const": true,
      +                              "description": "src is an MP4 file that plays",
      +                              "type": "boolean"
      +                            }
      +                          },
      +                          "required": [
      +                            "src",
      +                            "alt"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "pictures",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "tabs": {
      +                        "items": {
      +                          "properties": {
      +                            "code": {
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "language": {
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "code"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 8,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "codeTabs",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "tabs"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "columns": {
      +                        "anyOf": [
      +                          {
      +                            "const": 2,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 3,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 4,
      +                            "type": "number"
      +                          }
      +                        ],
      +                        "description": "How many to a row; unset, as many as fit"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "suffix": {
      +                              "type": "string"
      +                            },
      +                            "value": {
      +                              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "value",
      +                            "label"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 12,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "stats",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "groups": {
      +                        "description": "Groups of links under a heading each",
      +                        "items": {
      +                          "properties": {
      +                            "description": {
      +                              "description": "Plain semantic HTML",
      +                              "type": [
      +                                "string",
      +                                "null"
      +                              ]
      +                            },
      +                            "heading": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "links": {
      +                              "items": {
      +                                "properties": {
      +                                  "href": {
      +                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                                    "type": "string"
      +                                  },
      +                                  "label": {
      +                                    "minLength": 1,
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "label",
      +                                  "href"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "type": "array"
      +                            }
      +                          },
      +                          "required": [
      +                            "heading",
      +                            "links"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "intro": {
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "linkGrid",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "groups"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "The citation, plain semantic HTML",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "url": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "title": {
      +                        "description": "Its heading; unset, \"References\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "references",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Words in place of the notice's standard ones",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "banner",
      +                        "type": "string"
      +                      },
      +                      "variant": {
      +                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +                        "enum": [
      +                          "stub",
      +                          "unsourced",
      +                          "outdated",
      +                          "promotional",
      +                          "cleanup",
      +                          "coi"
      +                        ],
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "variant"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "count": {
      +                        "description": "With \"newest\", how many; unset, 6",
      +                        "maximum": 48,
      +                        "minimum": 1,
      +                        "type": "integer"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "menu": {
      +                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +                        "items": {
      +                          "properties": {
      +                            "href": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "href"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 24,
      +                        "type": "array"
      +                      },
      +                      "pages": {
      +                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +                        "items": {
      +                          "type": "string"
      +                        },
      +                        "maxItems": 48,
      +                        "type": "array"
      +                      },
      +                      "shape": {
      +                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +                        "enum": [
      +                          "portrait",
      +                          "landscape"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "show": {
      +                        "default": "cards",
      +                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +                        "enum": [
      +                          "cards",
      +                          "links"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +                        "enum": [
      +                          "under",
      +                          "newest",
      +                          "chosen",
      +                          "products"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "tag": {
      +                        "description": "With \"products\", only those with this tag; omit for all",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "list",
      +                        "type": "string"
      +                      },
      +                      "under": {
      +                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "source"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +                        "items": {
      +                          "properties": {
      +                            "date": {
      +                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "end": {
      +                              "description": "When it ends, written as date is; unset, it ends when it starts",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "date",
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 300,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "past": {
      +                        "description": "The heading over those that have ended; unset, \"Past\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "events",
      +                        "type": "string"
      +                      },
      +                      "upcoming": {
      +                        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "heading": {
      +                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      +                        "type": "string"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "address": {
      +                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +                              "type": "string"
      +                            },
      +                            "email": {
      +                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +                              "type": "string"
      +                            },
      +                            "hours": {
      +                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +                              "items": {
      +                                "properties": {
      +                                  "closes": {
      +                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  },
      +                                  "days": {
      +                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                                    "items": {
      +                                      "enum": [
      +                                        "mon",
      +                                        "tue",
      +                                        "wed",
      +                                        "thu",
      +                                        "fri",
      +                                        "sat",
      +                                        "sun"
      +                                      ],
      +                                      "type": "string"
      +                                    },
      +                                    "minItems": 1,
      +                                    "type": "array"
      +                                  },
      +                                  "opens": {
      +                                    "description": "24-hour: \"08:00\"",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "days",
      +                                  "opens",
      +                                  "closes"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "maxItems": 21,
      +                              "type": "array"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "image": {
      +                              "description": "A picture of it, by https URL",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "map": {
      +                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "name": {
      +                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      +                              "type": "string"
      +                            },
      +                            "note": {
      +                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +                              "type": "string"
      +                            },
      +                            "phone": {
      +                              "description": "As it reads: \"020 7232 3010\"",
      +                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +                              "type": "string"
      +                            },
      +                            "timeZone": {
      +                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "map": {
      +                        "const": true,
      +                        "description": "A map of each address, set under it",
      +                        "type": "boolean"
      +                      },
      +                      "type": {
      +                        "const": "locations",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "gap": {
      +        "enum": [
      +          "sm",
      +          "md",
      +          "lg"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "columns",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "columns"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "backdrop": {
      +        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      +        "enum": [
      +          "mesh",
      +          "grain",
      +          "flow",
      +          "marble"
      +        ],
      +        "type": "string"
      +      },
      +      "backdropIntensity": {
      +        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "backdropSpeed": {
      +        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "box": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent",
      +              "none"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Over a picture, a backdrop or as a cover, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; any colour as \"#rrggbb\", its words dark or light to read on it; \"none\" no box, light words straight on the picture"
      +      },
      +      "call": {
      +        "const": true,
      +        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      +        "type": "boolean"
      +      },
      +      "cover": {
      +        "const": true,
      +        "description": "Set as it is over a picture, with nothing behind it: centred, its words on their boxes, on the page's own colour",
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "description": "Plain text; words may be wrapped in <strong> or <em>; words in <strong> are drawn in the accent colour",
      +        "type": "string"
      +      },
      +      "height": {
      +        "description": "How tall it is: \"fit\" its words, \"half\" the screen or \"full\"; unset, full over a picture or backdrop and fit otherwise",
      +        "enum": [
      +          "fit",
      +          "half",
      +          "full"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "image": {
      +        "description": "A picture behind the heading, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "subheading": {
      +        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      +        "type": "boolean"
      +      },
      +      "text": {
      +        "description": "Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "hero",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "heading"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "duration": {
      +        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\"",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "file": {
      +        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      +        "properties": {
      +          "key": {
      +            "maxLength": 400,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "name": {
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "size": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "name",
      +          "size"
      +        ],
      +        "type": "object"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "images": {
      +        "description": "Its pictures by https URL, the first on every listing",
      +        "items": {
      +          "pattern": "^https:\\/\\/\\S+$",
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "price": {
      +        "description": "As it should read, currency included: \"£2,500\"",
      +        "type": "string"
      +      },
      +      "service": {
      +        "const": true,
      +        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      +        "type": "boolean"
      +      },
      +      "sold": {
      +        "description": "A thing sold, or a service fully booked",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "tags": {
      +        "default": [],
      +        "description": "The listings it appears in, by their \"tag\"",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "product",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "images",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "amounts": {
      +        "default": [],
      +        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 6,
      +        "type": "array"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "currency": {
      +        "description": "With no amounts, the currency gifts are in; unset, £",
      +        "enum": [
      +          "£",
      +          "$",
      +          "€"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "monthly": {
      +        "description": "The donor may give it every month as well as once",
      +        "type": "boolean"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "donate",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "author": {
      +        "description": "Their name",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "avatarUrl": {
      +        "description": "Their photo, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "quote": {
      +        "description": "Their words, exactly",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "role": {
      +        "description": "Who they are: \"Bride, 2024\", \"Head chef, The Ivy\"",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "testimonial",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "quote",
      +      "author"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "note": {
      +        "description": "A line under it: where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\"",
      +        "type": "string"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain text as set: a line to a line, a blank line between stanzas, the spaces that indent a line kept; words may be wrapped in <strong> or <em>",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "poem",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contents",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In the order the page scrolls",
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "section": {
      +              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      +              "pattern": "^[\\w-]+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "src"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 40,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "scenes",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "comments",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contact",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own home page editor; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "start",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own hosting prices; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "look": {
      +        "description": "A look of its own, apart from the site's: each key set wins over the site's for this block alone, and an empty one wears the site's",
      +        "properties": {
      +          "--align": {
      +            "description": "Where its words sit: at the start of the line, centred or at the end",
      +            "enum": [
      +              "start",
      +              "center",
      +              "end"
      +            ],
      +            "type": "string"
      +          },
      +          "--color-accent": {
      +            "description": "Its links, buttons and accent",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-heading": {
      +            "description": "Its headings",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-muted": {
      +            "description": "Its quieter words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--color-text": {
      +            "description": "Its words",
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          },
      +          "--font-heading": {
      +            "description": "Its headings' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "--font-sans": {
      +            "description": "Its words' font",
      +            "pattern": "^[\\w\\s,()\\-]+$",
      +            "type": "string"
      +          },
      +          "depth": {
      +            "description": "Shadow under buttons and panels: 0 flat, 1 raised",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "roundness": {
      +            "description": "Corners of buttons, pictures and panels: 0 square, 1 round",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "space": {
      +        "description": "Space above and below the block, and inside its band: \"none\", \"small\" or \"large\"; unset, the site's spacing",
      +        "enum": [
      +          "none",
      +          "small",
      +          "large"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pricing",
      +        "type": "string"
      +      },
      +      "width": {
      +        "description": "\"narrow\" a line of text wide, centred; \"full\" from edge to edge; unset, the page's column",
      +        "enum": [
      +          "narrow",
      +          "full"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  6. Changed1 schema field changed
    • changedInput schema / properties / block / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "content",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -        "items": {
      -          "properties": {
      -            "alt": {
      -              "description": "What it shows",
      -              "type": "string"
      -            },
      -            "caption": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "poster": {
      -              "description": "A video's picture before it plays",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "video": {
      -              "const": true,
      -              "description": "src is an MP4 file that plays",
      -              "type": "boolean"
      -            }
      -          },
      -          "required": [
      -            "src",
      -            "alt"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "pictures",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "tabs": {
      -        "items": {
      -          "properties": {
      -            "code": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "language": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "code"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 8,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "codeTabs",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "tabs"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "columns": {
      -        "anyOf": [
      -          {
      -            "const": 2,
      -            "type": "number"
      -          },
      -          {
      -            "const": 3,
      -            "type": "number"
      -          },
      -          {
      -            "const": 4,
      -            "type": "number"
      -          }
      -        ],
      -        "description": "How many to a row; unset, as many as fit"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "suffix": {
      -              "type": "string"
      -            },
      -            "value": {
      -              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "value",
      -            "label"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "stats",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "groups": {
      -        "description": "Groups of links under a heading each",
      -        "items": {
      -          "properties": {
      -            "description": {
      -              "description": "Plain semantic HTML",
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "heading": {
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "links": {
      -              "items": {
      -                "properties": {
      -                  "href": {
      -                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                    "type": "string"
      -                  },
      -                  "label": {
      -                    "minLength": 1,
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "label",
      -                  "href"
      -                ],
      -                "type": "object"
      -              },
      -              "type": "array"
      -            }
      -          },
      -          "required": [
      -            "heading",
      -            "links"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "intro": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "linkGrid",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "groups"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "The citation, plain semantic HTML",
      -              "minLength": 1,
      -              "type": "string"
      -            },
      -            "url": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "title": {
      -        "description": "Its heading; unset, \"References\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "references",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Words in place of the notice's standard ones",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "banner",
      -        "type": "string"
      -      },
      -      "variant": {
      -        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -        "enum": [
      -          "stub",
      -          "unsourced",
      -          "outdated",
      -          "promotional",
      -          "cleanup",
      -          "coi"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "variant"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "count": {
      -        "description": "With \"newest\", how many; unset, 6",
      -        "maximum": 48,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "menu": {
      -        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -        "items": {
      -          "properties": {
      -            "href": {
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "label": {
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "label",
      -            "href"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 24,
      -        "type": "array"
      -      },
      -      "pages": {
      -        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 48,
      -        "type": "array"
      -      },
      -      "shape": {
      -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -        "enum": [
      -          "portrait",
      -          "landscape"
      -        ],
      -        "type": "string"
      -      },
      -      "show": {
      -        "default": "cards",
      -        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -        "enum": [
      -          "cards",
      -          "links"
      -        ],
      -        "type": "string"
      -      },
      -      "source": {
      -        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -        "enum": [
      -          "under",
      -          "newest",
      -          "chosen",
      -          "products"
      -        ],
      -        "type": "string"
      -      },
      -      "tag": {
      -        "description": "With \"products\", only those with this tag; omit for all",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "list",
      -        "type": "string"
      -      },
      -      "under": {
      -        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -        "items": {
      -          "properties": {
      -            "date": {
      -              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "end": {
      -              "description": "When it ends, written as date is; unset, it ends when it starts",
      -              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -              "type": "string"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "text": {
      -              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -              "minLength": 1,
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "date",
      -            "text"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 300,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "past": {
      -        "description": "The heading over those that have ended; unset, \"Past\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "events",
      -        "type": "string"
      -      },
      -      "upcoming": {
      -        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "heading": {
      -        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "items": {
      -          "properties": {
      -            "address": {
      -              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -              "type": "string"
      -            },
      -            "email": {
      -              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -              "type": "string"
      -            },
      -            "hours": {
      -              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -              "items": {
      -                "properties": {
      -                  "closes": {
      -                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  },
      -                  "days": {
      -                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                    "items": {
      -                      "enum": [
      -                        "mon",
      -                        "tue",
      -                        "wed",
      -                        "thu",
      -                        "fri",
      -                        "sat",
      -                        "sun"
      -                      ],
      -                      "type": "string"
      -                    },
      -                    "minItems": 1,
      -                    "type": "array"
      -                  },
      -                  "opens": {
      -                    "description": "24-hour: \"08:00\"",
      -                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "days",
      -                  "opens",
      -                  "closes"
      -                ],
      -                "type": "object"
      -              },
      -              "maxItems": 21,
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "image": {
      -              "description": "A picture of it, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            },
      -            "map": {
      -              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      -              "type": "string"
      -            },
      -            "note": {
      -              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -              "type": "string"
      -            },
      -            "phone": {
      -              "description": "As it reads: \"020 7232 3010\"",
      -              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -              "type": "string"
      -            },
      -            "timeZone": {
      -              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 100,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "map": {
      -        "const": true,
      -        "description": "A map of each address, set under it",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "locations",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "align": {
      -        "enum": [
      -          "start",
      -          "center",
      -          "end",
      -          "stretch"
      -        ],
      -        "type": "string"
      -      },
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "beside": {
      -        "const": true,
      -        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      -        "type": "boolean"
      -      },
      -      "columns": {
      -        "items": {
      -          "properties": {
      -            "area": {
      -              "description": "Its place on a twelve-column grid; give every column one, or none",
      -              "properties": {
      -                "col": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "row": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "rows": {
      -                  "maximum": 99,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                },
      -                "span": {
      -                  "maximum": 12,
      -                  "minimum": 1,
      -                  "type": "integer"
      -                }
      -              },
      -              "required": [
      -                "col",
      -                "span",
      -                "row",
      -                "rows"
      -              ],
      -              "type": "object"
      -            },
      -            "blocks": {
      -              "items": {
      -                "oneOf": [
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Plain semantic HTML",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "content",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "text"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      -                        "items": {
      -                          "properties": {
      -                            "alt": {
      -                              "description": "What it shows",
      -                              "type": "string"
      -                            },
      -                            "caption": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "poster": {
      -                              "description": "A video's picture before it plays",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "src": {
      -                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "video": {
      -                              "const": true,
      -                              "description": "src is an MP4 file that plays",
      -                              "type": "boolean"
      -                            }
      -                          },
      -                          "required": [
      -                            "src",
      -                            "alt"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "pictures",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "tabs": {
      -                        "items": {
      -                          "properties": {
      -                            "code": {
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "language": {
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "code"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 8,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "codeTabs",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "tabs"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "columns": {
      -                        "anyOf": [
      -                          {
      -                            "const": 2,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 3,
      -                            "type": "number"
      -                          },
      -                          {
      -                            "const": 4,
      -                            "type": "number"
      -                          }
      -                        ],
      -                        "description": "How many to a row; unset, as many as fit"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "suffix": {
      -                              "type": "string"
      -                            },
      -                            "value": {
      -                              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "value",
      -                            "label"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 12,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "type": {
      -                        "const": "stats",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "groups": {
      -                        "description": "Groups of links under a heading each",
      -                        "items": {
      -                          "properties": {
      -                            "description": {
      -                              "description": "Plain semantic HTML",
      -                              "type": [
      -                                "string",
      -                                "null"
      -                              ]
      -                            },
      -                            "heading": {
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "links": {
      -                              "items": {
      -                                "properties": {
      -                                  "href": {
      -                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                                    "type": "string"
      -                                  },
      -                                  "label": {
      -                                    "minLength": 1,
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "label",
      -                                  "href"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "type": "array"
      -                            }
      -                          },
      -                          "required": [
      -                            "heading",
      -                            "links"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "intro": {
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "linkGrid",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "groups"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "The citation, plain semantic HTML",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            },
      -                            "url": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "title": {
      -                        "description": "Its heading; unset, \"References\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "references",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "text": {
      -                        "description": "Words in place of the notice's standard ones",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "banner",
      -                        "type": "string"
      -                      },
      -                      "variant": {
      -                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      -                        "enum": [
      -                          "stub",
      -                          "unsourced",
      -                          "outdated",
      -                          "promotional",
      -                          "cleanup",
      -                          "coi"
      -                        ],
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "variant"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "count": {
      -                        "description": "With \"newest\", how many; unset, 6",
      -                        "maximum": 48,
      -                        "minimum": 1,
      -                        "type": "integer"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "menu": {
      -                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      -                        "items": {
      -                          "properties": {
      -                            "href": {
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "label": {
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "label",
      -                            "href"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 24,
      -                        "type": "array"
      -                      },
      -                      "pages": {
      -                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      -                        "items": {
      -                          "type": "string"
      -                        },
      -                        "maxItems": 48,
      -                        "type": "array"
      -                      },
      -                      "shape": {
      -                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      -                        "enum": [
      -                          "portrait",
      -                          "landscape"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "show": {
      -                        "default": "cards",
      -                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      -                        "enum": [
      -                          "cards",
      -                          "links"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "source": {
      -                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      -                        "enum": [
      -                          "under",
      -                          "newest",
      -                          "chosen",
      -                          "products"
      -                        ],
      -                        "type": "string"
      -                      },
      -                      "tag": {
      -                        "description": "With \"products\", only those with this tag; omit for all",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "list",
      -                        "type": "string"
      -                      },
      -                      "under": {
      -                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "source"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      -                        "items": {
      -                          "properties": {
      -                            "date": {
      -                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "end": {
      -                              "description": "When it ends, written as date is; unset, it ends when it starts",
      -                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      -                              "type": "string"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "text": {
      -                              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -                              "minLength": 1,
      -                              "type": "string"
      -                            }
      -                          },
      -                          "required": [
      -                            "date",
      -                            "text"
      -                          ],
      -                          "type": "object"
      -                        },
      -                        "maxItems": 300,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "past": {
      -                        "description": "The heading over those that have ended; unset, \"Past\"",
      -                        "type": "string"
      -                      },
      -                      "type": {
      -                        "const": "events",
      -                        "type": "string"
      -                      },
      -                      "upcoming": {
      -                        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  },
      -                  {
      -                    "properties": {
      -                      "heading": {
      -                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      -                        "type": "string"
      -                      },
      -                      "id": {
      -                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                        "type": "string"
      -                      },
      -                      "items": {
      -                        "items": {
      -                          "properties": {
      -                            "address": {
      -                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      -                              "type": "string"
      -                            },
      -                            "email": {
      -                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      -                              "type": "string"
      -                            },
      -                            "hours": {
      -                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      -                              "items": {
      -                                "properties": {
      -                                  "closes": {
      -                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  },
      -                                  "days": {
      -                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      -                                    "items": {
      -                                      "enum": [
      -                                        "mon",
      -                                        "tue",
      -                                        "wed",
      -                                        "thu",
      -                                        "fri",
      -                                        "sat",
      -                                        "sun"
      -                                      ],
      -                                      "type": "string"
      -                                    },
      -                                    "minItems": 1,
      -                                    "type": "array"
      -                                  },
      -                                  "opens": {
      -                                    "description": "24-hour: \"08:00\"",
      -                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      -                                    "type": "string"
      -                                  }
      -                                },
      -                                "required": [
      -                                  "days",
      -                                  "opens",
      -                                  "closes"
      -                                ],
      -                                "type": "object"
      -                              },
      -                              "maxItems": 21,
      -                              "type": "array"
      -                            },
      -                            "id": {
      -                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -                              "type": "string"
      -                            },
      -                            "image": {
      -                              "description": "A picture of it, by https URL",
      -                              "pattern": "^https:\\/\\/\\S+$",
      -                              "type": "string"
      -                            },
      -                            "map": {
      -                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      -                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -                              "type": "string"
      -                            },
      -                            "name": {
      -                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      -                              "type": "string"
      -                            },
      -                            "note": {
      -                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -                              "type": "string"
      -                            },
      -                            "phone": {
      -                              "description": "As it reads: \"020 7232 3010\"",
      -                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      -                              "type": "string"
      -                            },
      -                            "timeZone": {
      -                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      -                              "type": "string"
      -                            }
      -                          },
      -                          "type": "object"
      -                        },
      -                        "maxItems": 100,
      -                        "minItems": 1,
      -                        "type": "array"
      -                      },
      -                      "map": {
      -                        "const": true,
      -                        "description": "A map of each address, set under it",
      -                        "type": "boolean"
      -                      },
      -                      "type": {
      -                        "const": "locations",
      -                        "type": "string"
      -                      }
      -                    },
      -                    "required": [
      -                      "type",
      -                      "items"
      -                    ],
      -                    "type": "object"
      -                  }
      -                ]
      -              },
      -              "type": "array"
      -            },
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "gap": {
      -        "enum": [
      -          "sm",
      -          "md",
      -          "lg"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "columns",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "columns"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "backdrop": {
      -        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      -        "enum": [
      -          "mesh",
      -          "grain",
      -          "flow",
      -          "marble"
      -        ],
      -        "type": "string"
      -      },
      -      "backdropIntensity": {
      -        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "backdropSpeed": {
      -        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "box": {
      -        "description": "Over a picture or backdrop, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; \"none\" no box, light words straight on the picture",
      -        "enum": [
      -          "panel",
      -          "accent",
      -          "none"
      -        ],
      -        "type": "string"
      -      },
      -      "call": {
      -        "const": true,
      -        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      -        "type": "boolean"
      -      },
      -      "heading": {
      -        "description": "Plain text; words may be wrapped in <strong> or <em>; words in <strong> are drawn in the accent colour",
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "image": {
      -        "description": "A picture behind the heading, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "subheading": {
      -        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      -        "type": "boolean"
      -      },
      -      "text": {
      -        "description": "Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "hero",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "heading"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "action": {
      -        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      -        "properties": {
      -          "href": {
      -            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      -            "type": "string"
      -          },
      -          "label": {
      -            "minLength": 1,
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "label",
      -          "href"
      -        ],
      -        "type": "object"
      -      },
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "duration": {
      -        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\"",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "file": {
      -        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      -        "properties": {
      -          "key": {
      -            "maxLength": 400,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "name": {
      -            "maxLength": 200,
      -            "minLength": 1,
      -            "type": "string"
      -          },
      -          "size": {
      -            "maximum": 9007199254740991,
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "key",
      -          "name",
      -          "size"
      -        ],
      -        "type": "object"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "images": {
      -        "description": "Its pictures by https URL, the first on every listing",
      -        "items": {
      -          "pattern": "^https:\\/\\/\\S+$",
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "price": {
      -        "description": "As it should read, currency included: \"£2,500\"",
      -        "type": "string"
      -      },
      -      "service": {
      -        "const": true,
      -        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      -        "type": "boolean"
      -      },
      -      "sold": {
      -        "description": "A thing sold, or a service fully booked",
      -        "type": "boolean"
      -      },
      -      "tags": {
      -        "default": [],
      -        "description": "The listings it appears in, by their \"tag\"",
      -        "items": {
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "text": {
      -        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "product",
      -        "type": "string"
      -      },
      -      "unit": {
      -        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many",
      -        "maxLength": 40,
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "images",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "amounts": {
      -        "default": [],
      -        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      -        "items": {
      -          "type": "string"
      -        },
      -        "maxItems": 6,
      -        "type": "array"
      -      },
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "currency": {
      -        "description": "With no amounts, the currency gifts are in; unset, £",
      -        "enum": [
      -          "£",
      -          "$",
      -          "€"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "monthly": {
      -        "description": "The donor may give it every month as well as once",
      -        "type": "boolean"
      -      },
      -      "type": {
      -        "const": "donate",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "author": {
      -        "description": "Their name",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "avatarUrl": {
      -        "description": "Their photo, by https URL",
      -        "pattern": "^https:\\/\\/\\S+$",
      -        "type": "string"
      -      },
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "quote": {
      -        "description": "Their words, exactly",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "role": {
      -        "description": "Who they are: \"Bride, 2024\", \"Head chef, The Ivy\"",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "testimonial",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "quote",
      -      "author"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "note": {
      -        "description": "A line under it: where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\"",
      -        "type": "string"
      -      },
      -      "text": {
      -        "description": "Plain text as set: a line to a line, a blank line between stanzas, the spaces that indent a line kept; words may be wrapped in <strong> or <em>",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "title": {
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "poem",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contents",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "items": {
      -        "description": "In the order the page scrolls",
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -              "type": "string"
      -            },
      -            "section": {
      -              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      -              "pattern": "^[\\w-]+$",
      -              "type": "string"
      -            },
      -            "src": {
      -              "description": "The picture, by https URL",
      -              "pattern": "^https:\\/\\/\\S+$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 40,
      -        "minItems": 1,
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "scenes",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "items"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "comments",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "contact",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own home page editor; never on another site",
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "start",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "miow.me's own hosting prices; never on another site",
      -    "properties": {
      -      "band": {
      -        "description": "A full-width strip of the panel or the accent colour behind the block",
      -        "enum": [
      -          "panel",
      -          "accent"
      -        ],
      -        "type": "string"
      -      },
      -      "heading": {
      -        "type": "string"
      -      },
      -      "id": {
      -        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "pricing",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "content",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +        "items": {
      +          "properties": {
      +            "alt": {
      +              "description": "What it shows",
      +              "type": "string"
      +            },
      +            "caption": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "poster": {
      +              "description": "A video's picture before it plays",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "video": {
      +              "const": true,
      +              "description": "src is an MP4 file that plays",
      +              "type": "boolean"
      +            }
      +          },
      +          "required": [
      +            "src",
      +            "alt"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "pictures",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "tabs": {
      +        "items": {
      +          "properties": {
      +            "code": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "language": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "code"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 8,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "codeTabs",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "tabs"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "columns": {
      +        "anyOf": [
      +          {
      +            "const": 2,
      +            "type": "number"
      +          },
      +          {
      +            "const": 3,
      +            "type": "number"
      +          },
      +          {
      +            "const": 4,
      +            "type": "number"
      +          }
      +        ],
      +        "description": "How many to a row; unset, as many as fit"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "suffix": {
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "label"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "stats",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "groups": {
      +        "description": "Groups of links under a heading each",
      +        "items": {
      +          "properties": {
      +            "description": {
      +              "description": "Plain semantic HTML",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "heading": {
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "links": {
      +              "items": {
      +                "properties": {
      +                  "href": {
      +                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                    "type": "string"
      +                  },
      +                  "label": {
      +                    "minLength": 1,
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "label",
      +                  "href"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "heading",
      +            "links"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "intro": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "linkGrid",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "groups"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "The citation, plain semantic HTML",
      +              "minLength": 1,
      +              "type": "string"
      +            },
      +            "url": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "title": {
      +        "description": "Its heading; unset, \"References\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "references",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Words in place of the notice's standard ones",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "banner",
      +        "type": "string"
      +      },
      +      "variant": {
      +        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +        "enum": [
      +          "stub",
      +          "unsourced",
      +          "outdated",
      +          "promotional",
      +          "cleanup",
      +          "coi"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "variant"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "count": {
      +        "description": "With \"newest\", how many; unset, 6",
      +        "maximum": 48,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "menu": {
      +        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +        "items": {
      +          "properties": {
      +            "href": {
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "label": {
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "label",
      +            "href"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 24,
      +        "type": "array"
      +      },
      +      "pages": {
      +        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 48,
      +        "type": "array"
      +      },
      +      "shape": {
      +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +        "enum": [
      +          "portrait",
      +          "landscape"
      +        ],
      +        "type": "string"
      +      },
      +      "show": {
      +        "default": "cards",
      +        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +        "enum": [
      +          "cards",
      +          "links"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +        "enum": [
      +          "under",
      +          "newest",
      +          "chosen",
      +          "products"
      +        ],
      +        "type": "string"
      +      },
      +      "tag": {
      +        "description": "With \"products\", only those with this tag; omit for all",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "list",
      +        "type": "string"
      +      },
      +      "under": {
      +        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +        "items": {
      +          "properties": {
      +            "date": {
      +              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "end": {
      +              "description": "When it ends, written as date is; unset, it ends when it starts",
      +              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "text": {
      +              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +              "minLength": 1,
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "date",
      +            "text"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 300,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "past": {
      +        "description": "The heading over those that have ended; unset, \"Past\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "events",
      +        "type": "string"
      +      },
      +      "upcoming": {
      +        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "items": {
      +          "properties": {
      +            "address": {
      +              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +              "type": "string"
      +            },
      +            "email": {
      +              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +              "type": "string"
      +            },
      +            "hours": {
      +              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +              "items": {
      +                "properties": {
      +                  "closes": {
      +                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  },
      +                  "days": {
      +                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                    "items": {
      +                      "enum": [
      +                        "mon",
      +                        "tue",
      +                        "wed",
      +                        "thu",
      +                        "fri",
      +                        "sat",
      +                        "sun"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    "minItems": 1,
      +                    "type": "array"
      +                  },
      +                  "opens": {
      +                    "description": "24-hour: \"08:00\"",
      +                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "days",
      +                  "opens",
      +                  "closes"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 21,
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "image": {
      +              "description": "A picture of it, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            },
      +            "map": {
      +              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      +              "type": "string"
      +            },
      +            "note": {
      +              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +              "type": "string"
      +            },
      +            "phone": {
      +              "description": "As it reads: \"020 7232 3010\"",
      +              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +              "type": "string"
      +            },
      +            "timeZone": {
      +              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 100,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "map": {
      +        "const": true,
      +        "description": "A map of each address, set under it",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "locations",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "start",
      +          "center",
      +          "end",
      +          "stretch"
      +        ],
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "beside": {
      +        "const": true,
      +        "description": "Set as one panel beside the text, its columns stacked in it: a facts panel on a page about one thing, placed before its content",
      +        "type": "boolean"
      +      },
      +      "columns": {
      +        "items": {
      +          "properties": {
      +            "area": {
      +              "description": "Its place on a twelve-column grid; give every column one, or none",
      +              "properties": {
      +                "col": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "row": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "rows": {
      +                  "maximum": 99,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                },
      +                "span": {
      +                  "maximum": 12,
      +                  "minimum": 1,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "col",
      +                "span",
      +                "row",
      +                "rows"
      +              ],
      +              "type": "object"
      +            },
      +            "blocks": {
      +              "items": {
      +                "oneOf": [
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Plain semantic HTML",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "content",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "text"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "One picture or video, or several in a row the visitor scrolls sideways, each once, in order",
      +                        "items": {
      +                          "properties": {
      +                            "alt": {
      +                              "description": "What it shows",
      +                              "type": "string"
      +                            },
      +                            "caption": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "poster": {
      +                              "description": "A video's picture before it plays",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "src": {
      +                              "description": "The picture by https URL, or with \"video\": true an MP4 file",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "video": {
      +                              "const": true,
      +                              "description": "src is an MP4 file that plays",
      +                              "type": "boolean"
      +                            }
      +                          },
      +                          "required": [
      +                            "src",
      +                            "alt"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "pictures",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "tabs": {
      +                        "items": {
      +                          "properties": {
      +                            "code": {
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "language": {
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "code"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 8,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "codeTabs",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "tabs"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "columns": {
      +                        "anyOf": [
      +                          {
      +                            "const": 2,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 3,
      +                            "type": "number"
      +                          },
      +                          {
      +                            "const": 4,
      +                            "type": "number"
      +                          }
      +                        ],
      +                        "description": "How many to a row; unset, as many as fit"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "suffix": {
      +                              "type": "string"
      +                            },
      +                            "value": {
      +                              "description": "As it should read: \"1987\", \"40+\", \"4.9★\"",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "value",
      +                            "label"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 12,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "type": {
      +                        "const": "stats",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "groups": {
      +                        "description": "Groups of links under a heading each",
      +                        "items": {
      +                          "properties": {
      +                            "description": {
      +                              "description": "Plain semantic HTML",
      +                              "type": [
      +                                "string",
      +                                "null"
      +                              ]
      +                            },
      +                            "heading": {
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "links": {
      +                              "items": {
      +                                "properties": {
      +                                  "href": {
      +                                    "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                                    "type": "string"
      +                                  },
      +                                  "label": {
      +                                    "minLength": 1,
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "label",
      +                                  "href"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "type": "array"
      +                            }
      +                          },
      +                          "required": [
      +                            "heading",
      +                            "links"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "intro": {
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "linkGrid",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "groups"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "The citation, plain semantic HTML",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            },
      +                            "url": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "title": {
      +                        "description": "Its heading; unset, \"References\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "references",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "text": {
      +                        "description": "Words in place of the notice's standard ones",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "banner",
      +                        "type": "string"
      +                      },
      +                      "variant": {
      +                        "description": "The notice: a stub, unsourced, outdated, promotional, needing cleanup, or written with a conflict of interest",
      +                        "enum": [
      +                          "stub",
      +                          "unsourced",
      +                          "outdated",
      +                          "promotional",
      +                          "cleanup",
      +                          "coi"
      +                        ],
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "variant"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "count": {
      +                        "description": "With \"newest\", how many; unset, 6",
      +                        "maximum": 48,
      +                        "minimum": 1,
      +                        "type": "integer"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "menu": {
      +                        "description": "With \"products\", the shop's lists, linked down the left of the cards with this one marked; the block then heads the page with its title",
      +                        "items": {
      +                          "properties": {
      +                            "href": {
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "label": {
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "label",
      +                            "href"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 24,
      +                        "type": "array"
      +                      },
      +                      "pages": {
      +                        "description": "With \"chosen\", the pages by path, in the order they are listed",
      +                        "items": {
      +                          "type": "string"
      +                        },
      +                        "maxItems": 48,
      +                        "type": "array"
      +                      },
      +                      "shape": {
      +                        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square for products and wide for pages",
      +                        "enum": [
      +                          "portrait",
      +                          "landscape"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "show": {
      +                        "default": "cards",
      +                        "description": "Cards of each page's first picture, title and search snippet, or links with how long ago each changed; products are always cards",
      +                        "enum": [
      +                          "cards",
      +                          "links"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "source": {
      +                        "description": "\"under\" the pages directly under an address (on a wiki, in a category); \"newest\" the most recently changed; \"chosen\" the pages named in \"pages\"; \"products\" the product pages",
      +                        "enum": [
      +                          "under",
      +                          "newest",
      +                          "chosen",
      +                          "products"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      "tag": {
      +                        "description": "With \"products\", only those with this tag; omit for all",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "list",
      +                        "type": "string"
      +                      },
      +                      "under": {
      +                        "description": "The address or category listed, or with \"newest\" the one the newest are taken from; omit for the top level, or the whole site",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "source"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "description": "In any order: the page sets those to come soonest first and those that have ended latest first, by the day it is read",
      +                        "items": {
      +                          "properties": {
      +                            "date": {
      +                              "description": "When it starts, as precisely as known: \"2026\", \"2026-11\" or \"2026-11-12\"",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "end": {
      +                              "description": "When it ends, written as date is; unset, it ends when it starts",
      +                              "pattern": "^\\d{4}(?:-(?:0[1-9]|1[0-2])(?:-(?:0[1-9]|[12]\\d|3[01]))?)?$",
      +                              "type": "string"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "text": {
      +                              "description": "What it is and where: Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +                              "minLength": 1,
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "date",
      +                            "text"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "maxItems": 300,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "past": {
      +                        "description": "The heading over those that have ended; unset, \"Past\"",
      +                        "type": "string"
      +                      },
      +                      "type": {
      +                        "const": "events",
      +                        "type": "string"
      +                      },
      +                      "upcoming": {
      +                        "description": "The heading over those to come or on now; unset, \"Upcoming\"",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "properties": {
      +                      "heading": {
      +                        "description": "An h2 over the places, whose names are then h3s; unset, each name is an h2",
      +                        "type": "string"
      +                      },
      +                      "id": {
      +                        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                        "type": "string"
      +                      },
      +                      "items": {
      +                        "items": {
      +                          "properties": {
      +                            "address": {
      +                              "description": "Plain text, a line to a line: \"27 Monmouth Street\\nLondon WC2H 9EU\"",
      +                              "type": "string"
      +                            },
      +                            "email": {
      +                              "pattern": "^[^\\s@<>]+@[^\\s@<>]+\\.[^\\s@<>]+$",
      +                              "type": "string"
      +                            },
      +                            "hours": {
      +                              "description": "Its regular opening hours, a row for each set of days that keeps the same times and two rows for a day it closes in the middle of; a day in none is closed",
      +                              "items": {
      +                                "properties": {
      +                                  "closes": {
      +                                    "description": "24-hour: \"18:00\"; at or before opens, the next morning; equal to opens, open all day",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  },
      +                                  "days": {
      +                                    "description": "The days these hours hold: \"mon\" to \"sun\"",
      +                                    "items": {
      +                                      "enum": [
      +                                        "mon",
      +                                        "tue",
      +                                        "wed",
      +                                        "thu",
      +                                        "fri",
      +                                        "sat",
      +                                        "sun"
      +                                      ],
      +                                      "type": "string"
      +                                    },
      +                                    "minItems": 1,
      +                                    "type": "array"
      +                                  },
      +                                  "opens": {
      +                                    "description": "24-hour: \"08:00\"",
      +                                    "pattern": "^(?:[01]\\d|2[0-3]):[0-5]\\d$",
      +                                    "type": "string"
      +                                  }
      +                                },
      +                                "required": [
      +                                  "days",
      +                                  "opens",
      +                                  "closes"
      +                                ],
      +                                "type": "object"
      +                              },
      +                              "maxItems": 21,
      +                              "type": "array"
      +                            },
      +                            "id": {
      +                              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +                              "type": "string"
      +                            },
      +                            "image": {
      +                              "description": "A picture of it, by https URL",
      +                              "pattern": "^https:\\/\\/\\S+$",
      +                              "type": "string"
      +                            },
      +                            "map": {
      +                              "description": "A link to the place on a map, as the business gives it; unset, a search for the address",
      +                              "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +                              "type": "string"
      +                            },
      +                            "name": {
      +                              "description": "Which one it is, where a business has several: \"Covent Garden\"; unset where it has one",
      +                              "type": "string"
      +                            },
      +                            "note": {
      +                              "description": "What the hours do not say: \"Closed on bank holidays\", \"Card payments only\"; Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +                              "type": "string"
      +                            },
      +                            "phone": {
      +                              "description": "As it reads: \"020 7232 3010\"",
      +                              "pattern": "^\\+?[\\d\\s().-]{6,}$",
      +                              "type": "string"
      +                            },
      +                            "timeZone": {
      +                              "description": "Where its clock is, as \"America/Los_Angeles\"; unset, \"Europe/London\"",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "type": "object"
      +                        },
      +                        "maxItems": 100,
      +                        "minItems": 1,
      +                        "type": "array"
      +                      },
      +                      "map": {
      +                        "const": true,
      +                        "description": "A map of each address, set under it",
      +                        "type": "boolean"
      +                      },
      +                      "type": {
      +                        "const": "locations",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "type",
      +                      "items"
      +                    ],
      +                    "type": "object"
      +                  }
      +                ]
      +              },
      +              "type": "array"
      +            },
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "gap": {
      +        "enum": [
      +          "sm",
      +          "md",
      +          "lg"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "columns",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "columns"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "backdrop": {
      +        "description": "With no picture, a slowly moving field of the site's own colours behind the heading: \"mesh\" smooth, \"grain\" grainy as print, \"flow\" folding like poured paint, \"marble\" hard-edged as marbled paper",
      +        "enum": [
      +          "mesh",
      +          "grain",
      +          "flow",
      +          "marble"
      +        ],
      +        "type": "string"
      +      },
      +      "backdropIntensity": {
      +        "description": "How strongly the backdrop swirls and folds: 0 gently, 1 wildly; unset, 0.5",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "backdropSpeed": {
      +        "description": "How fast the backdrop moves: 0 still, 1 fast; unset, 0.25, slowly",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "box": {
      +        "description": "Over a picture or backdrop, what the words sit on: unset, boxes of the page's background; \"panel\" or \"accent\" boxes of that colour; \"none\" no box, light words straight on the picture",
      +        "enum": [
      +          "panel",
      +          "accent",
      +          "none"
      +        ],
      +        "type": "string"
      +      },
      +      "call": {
      +        "const": true,
      +        "description": "A call to action further down the page rather than its opening: its heading an h2, set smaller",
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "description": "Plain text; words may be wrapped in <strong> or <em>; words in <strong> are drawn in the accent colour",
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "image": {
      +        "description": "A picture behind the heading, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "subheading": {
      +        "description": "Its text is a subheading, set in the headings' font, each line on its own",
      +        "type": "boolean"
      +      },
      +      "text": {
      +        "description": "Plain text; words may be wrapped in <strong> or <em>, and in <a href> for a link",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "hero",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "heading"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "action": {
      +        "description": "A button of its own, to where it is sold or booked elsewhere: a publisher's or a gallery's page, a booking calendar",
      +        "properties": {
      +          "href": {
      +            "pattern": "^(?:\\/(?!\\/)\\S*|#[\\w-]+|https?:\\/\\/\\S+|mailto:\\S+|tel:\\S+)$",
      +            "type": "string"
      +          },
      +          "label": {
      +            "minLength": 1,
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "label",
      +          "href"
      +        ],
      +        "type": "object"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "duration": {
      +        "description": "With \"service\", how long it takes, as it reads: \"1 hour\", \"Half a day\"",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "file": {
      +        "description": "What a buyer downloads once they have paid, which only the site's owner sets, from Products; send it back as read",
      +        "properties": {
      +          "key": {
      +            "maxLength": 400,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "name": {
      +            "maxLength": 200,
      +            "minLength": 1,
      +            "type": "string"
      +          },
      +          "size": {
      +            "maximum": 9007199254740991,
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "key",
      +          "name",
      +          "size"
      +        ],
      +        "type": "object"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "images": {
      +        "description": "Its pictures by https URL, the first on every listing",
      +        "items": {
      +          "pattern": "^https:\\/\\/\\S+$",
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "price": {
      +        "description": "As it should read, currency included: \"£2,500\"",
      +        "type": "string"
      +      },
      +      "service": {
      +        "const": true,
      +        "description": "It is a service, booked rather than sold: a lesson, a treatment, a consultation",
      +        "type": "boolean"
      +      },
      +      "sold": {
      +        "description": "A thing sold, or a service fully booked",
      +        "type": "boolean"
      +      },
      +      "tags": {
      +        "default": [],
      +        "description": "The listings it appears in, by their \"tag\"",
      +        "items": {
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "text": {
      +        "description": "Plain semantic HTML: materials, size, year, what it is; for a service, what it involves",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "product",
      +        "type": "string"
      +      },
      +      "unit": {
      +        "description": "With \"service\", what the price is for, as it reads after it: \"an hour\", \"a session\", \"per person\"; bought online, the buyer says how many",
      +        "maxLength": 40,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "images",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "amounts": {
      +        "default": [],
      +        "description": "The suggested gifts as they read, in one currency, only as the charity gives them: [\"£10\", \"£20\"]; the donor may always give an amount of their own",
      +        "items": {
      +          "type": "string"
      +        },
      +        "maxItems": 6,
      +        "type": "array"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "currency": {
      +        "description": "With no amounts, the currency gifts are in; unset, £",
      +        "enum": [
      +          "£",
      +          "$",
      +          "€"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "monthly": {
      +        "description": "The donor may give it every month as well as once",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "const": "donate",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "author": {
      +        "description": "Their name",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "avatarUrl": {
      +        "description": "Their photo, by https URL",
      +        "pattern": "^https:\\/\\/\\S+$",
      +        "type": "string"
      +      },
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "quote": {
      +        "description": "Their words, exactly",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "role": {
      +        "description": "Who they are: \"Bride, 2024\", \"Head chef, The Ivy\"",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "testimonial",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "quote",
      +      "author"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "note": {
      +        "description": "A line under it: where it first appeared, \"From Wringing Blood (Shoestring Press, 2013)\"",
      +        "type": "string"
      +      },
      +      "text": {
      +        "description": "Plain text as set: a line to a line, a blank line between stanzas, the spaces that indent a line kept; words may be wrapped in <strong> or <em>",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "poem",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contents",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "items": {
      +        "description": "In the order the page scrolls",
      +        "items": {
      +          "properties": {
      +            "id": {
      +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +              "type": "string"
      +            },
      +            "section": {
      +              "description": "The id of the section the picture is shown from, as it scrolls into view: an h2 or h3 in the page's text, as its heading reads in lowercase with hyphens for spaces, \"excelsior-studios\"; unset, from where the page opens",
      +              "pattern": "^[\\w-]+$",
      +              "type": "string"
      +            },
      +            "src": {
      +              "description": "The picture, by https URL",
      +              "pattern": "^https:\\/\\/\\S+$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "src"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 40,
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "scenes",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "items"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "comments",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "contact",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own home page editor; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "start",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "miow.me's own hosting prices; never on another site",
      +    "properties": {
      +      "band": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "panel",
      +              "accent"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "pattern": "^#[0-9a-f]{6}$",
      +            "type": "string"
      +          }
      +        ],
      +        "description": "A full-width strip of colour behind the block: \"panel\" or \"accent\" for the site's own, which follow its palette, or any colour as \"#rrggbb\""
      +      },
      +      "heading": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "Omit on a new block, keep as read on one you send back; assigned on write",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "pricing",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  }
      +]
  7. Added

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=false, so the safety profile is carried structurally. The description adds the return value ("Returns the new block's id"), which matters because there is no output schema, and the id-omission rule. It does not flag that a non-idempotent insert re-run will duplicate the block, nor any permission or auth behaviour beyond the schema's token note.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the action and its placement semantics, then the return value, then the two cross-references. Nothing is padded and each sentence changes how the agent would call the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a very large polymorphic block schema and no output schema, the description covers the parts the schema cannot: where the block lands, what comes back, and the image dependency. It leaves token and summary to the schema, which documents them adequately; the only real gap is the absence of any warning about duplication or reversibility on a non-idempotent write.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the description clears it by explaining the relationship between the placement params ("after or before ... or at the end") and, importantly, routing the agent to write_site's description for the meaning of each block field — a genuinely useful pointer given the enormous oneOf. It doesn't add anything for path, token or summary beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Add one block to a page" gives a clear verb plus object scope, and the four placement modes (after / before by id, inside a column, or at the end) pin down what "add" means here. It implicitly separates itself from write_site by making clear it inserts a single block, but it never names update_block, move_block or remove_block, so the agent must infer the boundary with those siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the conditions for the three insertion positions and supplies a real ordering prerequisite — "Images: upload_image first" — which prevents a failed call. What's missing is any exclusion guidance: nothing says when to prefer write_site over repeated inserts, or when update_block is the better tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources