Skip to main content
Glama

Server Details

Build and host a small business website: write its pages, move an existing site in, add a domain.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.8/5.0

Scored across 24 tools

Disambiguation4/5

Most tools have clearly distinct resource+action pairs, and the descriptions do real work separating the risky pairs: write_site vs save_wiki_page vs the block tools (insert/update/move/remove), read_page vs read_wiki_page, history vs wiki_history, get_site vs read_page. A few boundaries still require reading carefully (write_site can also delete pages and change theme/header, overlapping the block tools' territory), but an agent can reliably pick the right tool.

Naming Consistency4/5

The dominant pattern is verb_noun (create_site, get_site, read_page, save_wiki_page, update_block, upload_image, search_site), applied consistently across the page, block, wiki and domain families. The outliers are noun-style helpers (history, wiki_history, domain_status) and the bare verb undo, which are readable but break the pattern.

Tool Count4/5

24 tools is on the heavy side, but the surface genuinely spans four jobs — site building, block-level editing, wiki authoring and analytics/domains — and each tool maps to a real operation rather than a combinatorial variant. Nothing looks redundant enough to cut, though the set sits just above the comfortable 3-15 band.

Completeness4/5

Coverage is strong: site creation/claim/invite, full page and block CRUD, bulk import, image upload, domain setup with status polling, search, analytics, history/undo, and a complete wiki lifecycle (set_wiki, save/read/delete/restore, wiki_history). Minor gaps remain — there is no delete_site, no explicit page-deletion tool (buried in write_site), and no moderation surface for comments beyond the block, so a few lifecycle ends are reached awkwardly.

Available Tools

24 tools
create_siteCreate a siteAInspect

Make a new, empty site, live at once at https://.miow.me. Returns its token (pass it to every other tool as token) and a claim link. Give the claim link to your human: opening it on their phone saves a passkey that makes them the owner. An unclaimed site is deleted after 30 days; its free 14 days start when it is claimed. Then fill the site with write_site.

NameRequiredDescriptionDefault
nameYesThe business's name

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only declare it is a non-destructive, closed-world write; the description adds substantive context the annotations cannot: it returns a token used by every other tool, returns a claim link, requires human action to claim, and unclaimed sites are deleted after 30 days with the 14-day window starting at claim. That is exactly the lifecycle and auth context an agent needs.

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?

Roughly four short sentences, front-loaded with what is created, followed by return values, the human handoff, and the lifecycle constraint. No filler.

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

Completeness5/5

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

No output schema exists, and the description compensates by naming the two return values (token and claim link) and their use. Combined with the deletion/claim timing, an agent has everything needed to call it and act on the result.

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

Parameters3/5

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

Schema coverage is 100% and the single `name` parameter is documented as 'The business's name', so the schema carries the semantics. The description adds nothing about the parameter itself (e.g. whether it drives the slug), so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Make a new, empty site') plus the immediate outcome (live at https://<slug>.miow.me), which cleanly separates it from siblings like write_site, import_site, and get_site. An agent knows exactly what this creates without opening the schema.

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?

Explicitly routes the follow-up action: 'Then fill the site with write_site,' and implies the tool is a first step in a workflow. It does not say when to prefer import_site over create_site, so the alternative selection is not fully covered.

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

delete_wiki_pageDelete a wiki pageA
Destructive
Inspect

Delete a wiki page and its whole history. This cannot be undone, and restore_wiki_page cannot bring it back: read it first with read_wiki_page if it may be wanted. A category's hub article is its category's path.

NameRequiredDescriptionDefault
pathYes"" for the home page, a category's path for its hub, else <category path>/<slug>
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare destructiveHint=true, but the description adds traits they cannot express: the entire history is destroyed, the damage is irreversible, and the sibling restore tool will not recover it. That is precisely the extra context an agent needs before a destructive call.

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?

Three short sentences, each load-bearing: scope, irreversibility, and the safer alternative are front-loaded with zero filler.

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

Completeness5/5

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

For a two-parameter destructive tool with a fully documented schema and strong annotations, nothing an agent needs to call it correctly is missing; auth handling is covered by the token parameter's own schema description.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented. The description's note that 'A category's hub article is its category's path' largely restates the schema's own path semantics, adding only marginal value beyond it.

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

Purpose5/5

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

The description states a specific verb+resource+scope: 'Delete a wiki page and its whole history.' It explicitly distinguishes itself from restore_wiki_page, so an agent can tell it apart from its closest sibling without opening either schema.

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

Usage Guidelines5/5

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

It gives explicit when-not guidance ('This cannot be undone, and restore_wiki_page cannot bring it back') and an alternative workflow ('read it first with read_wiki_page if it may be wanted'). The condition that selects the safer sibling tool is spelled out rather than inferred.

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

domain_statusDomain statusAInspect

Whether a pending domain from set_domain is live yet, and the DNS records still missing if not. DNS can take an hour to be seen; call again later rather than in a loop.

NameRequiredDescriptionDefault
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only give the generic readOnly/destructive/openWorld flags, so the description's disclosure of the ~1 hour DNS propagation latency and the anti-polling instruction adds real behavioral value the agent cannot infer elsewhere. Note the mild tension that readOnlyHint=false is set for what reads like a status query, though the description never explicitly claims read-only.

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?

Two sentences, zero waste: the first states what is returned, the second gives the operational cadence. The most decision-relevant fact (is it live, what's missing) is front-loaded.

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?

There is no output schema, so the description usefully carries the return semantics (live-or-not plus outstanding DNS records) and the timing expectation. Auth/permission details and any failure modes are left implicit, which is the only shortfall.

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

Parameters3/5

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

Schema coverage is 100% and the token parameter is already fully documented in the schema, including the fallback to the Authorization header. The description adds no syntax, format, or sourcing detail beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific resource and result: whether a domain pending from set_domain has gone live, plus which DNS records are still missing. Naming set_domain as the producer lets an agent place it precisely among siblings such as get_site and set_domain.

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?

Gives clear standing guidance for the natural follow-up case: after setting a domain, DNS may take an hour to propagate, so 'call again later rather than in a loop.' It does not spell out an alternative tool or an explicit when-not (e.g. if no domain was ever set), which keeps it from a 5.

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

get_siteGet a siteA
Read-only
Inspect

A site's name, theme, header, address and every page by path and title, plus its status: a running or failed job (from import_site) and its domain. Call before changing a site you did not just create; write_site replaces the header whole, so change it from this one. With site and no token, any live site's name, address and pages as it lists them, a wiki's being its articles outside hidden categories, without its status.

NameRequiredDescriptionDefault
siteNoAny live site's address, as acme.miow.me, acme.com or a page's url, to read what anyone can see there without a token
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A4.4/5.0
Behavior4/5

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

Beyond the readOnly/destructive annotations, it discloses that status may reflect a running or failed import_site job, that write_site overwrites the header wholesale (a real blast-radius warning), and that the no-token path returns only public content and omits status. It doesn't cover failure modes or how large wikis are paginated, which keeps it short of a 5.

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

Conciseness3/5

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

It is dense with no filler and leads with the return payload, but the final clause ('With `site` and no token, any live site's name, address and pages as it lists them, a wiki's being its articles outside hidden categories, without its status') is a run-on that is hard to parse on first read.

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?

With no output schema, the description compensates by enumerating the returned fields, and annotations already carry the safety profile. The remaining gap is modest: the no-token mode's boundaries ('any live site', custom domains) are implied rather than nailed down.

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 coverage is 100%, so the baseline is 3, but the description adds interaction semantics the schema doesn't: supplying `site` without `token` yields the anonymous public view, and for wikis that view is limited to articles outside hidden categories with no status. That is genuine added meaning about how the two parameters combine.

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

Purpose5/5

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

The description names the resource and enumerates exactly what is returned: name, theme, header, address, every page by path and title, job status, and domain. This is a specific verb+resource statement that an agent can distinguish from read_page, search_site, and get_stats without opening the schema.

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

Usage Guidelines5/5

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

It gives an explicit precondition ('Call before changing a site you did not just create') and names the sibling that mandates it ('write_site replaces the header whole, so change it from this one'). It also defines a second usage mode — `site` with no token for public, unauthenticated reading — so both invocation patterns have a stated when-to-use.

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

get_statsVisitorsB
Read-only
Inspect

The site's visitors, agents, page views, bounce rate and visit length over the last days days, the same figures for the same number of days before, visitors and agents by day, the agents by name, its most visited pages, entry pages, sources (a referring host or a link's utm_source), countries (ISO codes) and devices, and what visitors searched the site for and found nothing. A visitor is one browser on one day, counted without cookies. An agent (an AI crawler, an MCP client, or anything reading the site's markdown, llms.txt or .well-known files) is counted the same way and never among the visitors.

NameRequiredDescriptionDefault
daysNo1 to 365; 30 if omitted
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare this is a safe, read-only, non-open-world read. The description goes further by defining non-obvious result semantics: a visitor is one browser on one day counted without cookies, an agent is an AI crawler/MCP client counted the same way and never mixed with visitors. That is real interpretive context the annotations cannot supply. It stops short of describing pagination, caching, or call cost.

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

Conciseness3/5

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

The metric inventory is dense and relevant, but it is delivered as one long run-on sentence that would read far better as a structured list. The two definitional sentences at the end are well-placed, but the front-loaded enumeration is hard to parse.

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?

With no output schema, the description must carry the return-value burden, and it largely does: every metric family and breakdown dimension is named, and the comparison period is disclosed. The only meaningful gap is that it does not indicate result shape (flat object vs. nested series) or how to address the token when omitted.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are fully documented there (days range and default, token source), which sets the baseline at 3. The description adds the useful fact that the same metrics are returned for the equivalent prior period, giving meaning to the `days` window — a small but genuine supplement.

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?

The description names a specific resource — the site's analytics — and enumerates the exact figures returned (visitors, agents, page views, bounce rate, visit length, breakdowns by day, pages, sources, countries, devices, failed searches). It is clearly distinguishable from siblings like get_site or search_site, though it never states an explicit verb framing beyond the enumerated metrics.

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

Usage Guidelines2/5

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

There is no guidance on when to call this versus get_site or any other sibling, and no mention of prerequisites, caching, or cost of the call. The only usage-adjacent information (token optionality) is carried by the input schema, not the description.

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

historyHistoryB
Read-only
Inspect

The last 30 changes to the site, newest first: what each did, who made it and when. Pass a change id to undo to put the site back as it was before that change.

NameRequiredDescriptionDefault
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that — a hard 30-entry cap, newest-first ordering, and the per-entry fields (what/who/when). However, 'Pass a change id to undo to put the site back as it was before that change' is ambiguous and, read literally, implies a write capability that conflicts with the read-only annotations.

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

Conciseness4/5

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

Two short sentences, with the return-value summary front-loaded ahead of the secondary note. Nothing is padded. The second sentence is muddled in wording, but the overall length is appropriate for a one-parameter read 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?

With no output schema, the description usefully compensates by naming what each entry contains (what each did, who made it, when) plus the cap and ordering. Combined with read-only annotations and a fully documented optional token, an agent has enough to invoke it correctly; only the ambiguous undo sentence leaves a gap.

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

Parameters2/5

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

Schema coverage is 100% and the single optional 'token' parameter is fully documented in the schema, so the baseline would be 3. The description instead introduces a 'change id' concept that exists in no parameter, which can mislead an agent into looking for or inventing an argument that the tool does not accept.

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?

The description states exactly what the tool returns: the last 30 changes to the site, newest first, with actor and timestamp. That is a concrete resource with scope and ordering, far beyond the bare name 'history'. It does not, however, name the sibling it must be distinguished from (wiki_history covers page-level history), so a reader must infer the boundary.

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

Usage Guidelines3/5

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

Usage is only implied — the agent must infer that this is the tool for auditing recent site-wide changes. The second sentence gestures at a related action (undo), but it does not clearly say when to use history vs. undo vs. wiki_history, and the routing is ambiguous.

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

import_siteMove a website inA
Destructive
Inspect

Replace the site's pages with an existing website's (Squarespace, Wix or anything else: its sitemap, or failing that its home page's links, says which pages), word for word, at the same paths, with its images copied across. Runs in the background for a minute or two: poll get_site until job is null, or read its error.

NameRequiredDescriptionDefault
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
sourceYesThe current website, e.g. https://example.com

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already flag destructiveHint and openWorldHint, and the description adds what they cannot: the lifespan (a minute or two), the asynchronous job model, and the exact way to detect completion or failure through get_site. It also discloses how pages are discovered (sitemap, falling back to the home page's links), which matters when a source has no sitemap.

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?

Two sentences, the operation front-loaded and the polling instructions second. No filler; every clause carries operational meaning.

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

Completeness5/5

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

There is no output schema, and the description compensates by explaining how results surface (the `job` field on get_site, or its error). For a two-parameter destructive background job, nothing an agent needs is missing.

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 coverage is 100%, so the baseline is 3; the description still earns credit for clarifying that `source` drives link discovery and that the import preserves paths and copies images. It adds no formatting or edge-case guidance for `token`.

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

Purpose5/5

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

States a specific verb and resource ('Replace the site's pages with an existing website's') and pins down the scope of the operation: word for word, same paths, images copied. That is clearly distinguishable from create_site or write_site, which build content rather than importing an existing site.

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?

The import scenario is unambiguous and the follow-up procedure is spelled out ('poll get_site until `job` is null, or read its error'). It never names the alternative tool for starting from scratch, so the agent must infer that create_site is the non-import path.

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

insert_blockAdd a blockAInspect

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.

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

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare the profile (not read-only, not idempotent, not destructive), so the description's job is to add context, and it does: it discloses the return value ("Returns the new block's id"), which matters because there is no output schema, plus the id-assignment behaviour and the column-aware insertion semantics. It is silent on authorization or failure when an after/before id is stale, which is the main remaining gap for a mutation tool.

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 placement rules, then return value, then pointers to where field documentation lives, then the image prerequisite. Every clause carries information an agent needs and none is padding.

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?

For a tool with a huge discriminated block union and no output schema, the description covers what it must carry itself: return value, id handling, insertion position, and where field semantics are documented. Gaps remain around preconditions (ownership token, invalid reference ids) that a caller could trip over, but the schema compensates for most of the structural complexity.

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 earns above that by clarifying the mutual positioning of after and before and the implicit default of appending at the end. It also explicitly delegates per-block field semantics to write_site's description and the schema, which is useful orientation given the very large block union. It adds no syntax detail beyond that, so it is not a 5.

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

Purpose5/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 specific verb and resource, and the sentence goes on to state exactly where the block lands: after or before an id-named block, inside its column when applicable, or at the end. Nothing is ambiguous against siblings such as update_block, move_block or remove_block, and the reference to write_site signals this is the single-block counterpart to a whole-page write.

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?

The placement rules tell the agent precisely which of after/before/neither to supply and what each does, which is the main decision this tool requires. It also gives an explicit prerequisite chain for media ("Images: upload_image first"), a genuine routing instruction rather than a restatement. It stops short of saying when to prefer this over rewriting a page with write_site, so it falls short of a full when/when-not treatment.

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

move_blockMove a blockA
Idempotent
Inspect

Move one block on a page, as it is, to after or before another block named by its id (into a column, when that block is in one), or to the end of the page. Nothing else on the page changes.

NameRequiredDescriptionDefault
idYesThe block's id, as read_page gives it
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
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

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare idempotent, non-destructive, and closed-world behavior, so the bar is lower. The description still adds real value: it clarifies that the block moves unchanged, that column placement is inherited from the anchor block, and that no other page content is affected.

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?

A single tightly written sentence that front-loads the action and destination logic, then closes with the side-effect guarantee. No filler.

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?

For a simple mutation with no output schema and strong annotation coverage, the description covers action, placement, and side effects adequately. It could say more about error conditions (invalid id, missing anchor) but nothing essential is missing.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents id, path, after, before, token, and summary with concrete semantics. The description restates the after/before/end-of-page behavior the schema defines but adds no new detail such as ordering conflicts when both are supplied, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (move one block on a page) with precise scope: reposition 'as it is' relative to another block id or to the page end. The phrases 'as it is' and 'Nothing else on the page changes' implicitly distinguish it from update_block, insert_block, and remove_block.

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

Usage Guidelines3/5

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

The destination mechanics (after/before an id, or end of page, or into a column) imply when the tool applies, but it never explicitly says when to choose move_block over insert_block, update_block, or remove_block, nor states prerequisites such as the block and anchor needing to share a page.

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

read_pageRead a pageA
Read-only
Inspect

One page whole, in the shape write_site takes, so you can change it and send it back. Read every page you mean to change first: write_site replaces a page whole. With site and no token, the page as its address shows it: on a wiki, the article there; a sold product without its price.

NameRequiredDescriptionDefault
pathYes"" for the home page
siteNoAny live site's address, as acme.miow.me, acme.com or a page's url, to read what anyone can see there without a token
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful context—that with `site` and no token you see the public view (a wiki article, a product without its price)—but says nothing about authentication failures, permissions, or what happens when a token and site conflict. It also contradicts itself slightly: it implies `site`-only reads, yet the schema marks `path` required.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core contract (shape matches write_site) and then the precondition. Slightly mannered phrasing ('a sold product without its price') costs a little clarity, but nothing is redundant.

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?

No output schema exists, and the description compensates by tying the return shape to write_site, which is exactly what an agent needs to act on the result. Remaining gaps—auth-failure behavior and the read_page vs read_wiki_page split—are moderate but not fatal for a simple read.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters are already documented, including `path` = "" for home and the site/token interaction. The description reinforces the no-token public-read case, which is helpful, but adds little semantic detail beyond the schema (no format for path, no token precedence rules). Baseline 3 applies when the schema does the heavy lifting.

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?

States it returns 'one page whole' in the same shape write_site accepts, with the explicit motivation of editing and sending back. The verb is implied by the name/title rather than the body, and it never distinguishes itself from the sibling read_wiki_page, which an agent could easily confuse with it.

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?

Gives a concrete precondition: 'Read every page you mean to change first: write_site replaces a page whole,' naming the alternative and the consequence of skipping this step. Leaves the read_page vs read_wiki_page choice unaddressed, so usage is clear for the write path but not for the wiki path.

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

read_wiki_pageRead a wiki pageA
Read-only
Inspect

One wiki page whole: its title, blocks, metadata, version and how many revisions it has. Pass its version as base_version when you save it back.

NameRequiredDescriptionDefault
pathYes"" for the home page, a category's path for its hub, else <category path>/<slug>
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral value by enumerating the read payload (blocks, metadata, version, revision count), which partially substitutes for the absent output schema, but says nothing about size limits, auth requirements beyond the token param, or whether blocks are paginated.

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

Conciseness4/5

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

Two short sentences with no filler, and the payload summary comes first. The telegraphic style ("One wiki page whole") is slightly clipped but still readable and front-loaded.

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?

For a two-parameter read-only tool with no output schema, the description does the important work of describing return contents and the read-then-save version handoff. Remaining gaps (payload size, relation to `read_page`) are minor but real.

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

Parameters3/5

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

Schema description coverage is 100%, so both `path` (home page, category hub, or category/slug) and `token` are fully documented in the schema. The description adds nothing about parameter format; its mention of "version" refers to a returned field consumed by `save_wiki_page`, not to an input here. Baseline 3 applies.

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?

The description names a specific resource (a single wiki page) and enumerates exactly what comes back: title, blocks, metadata, version and revision count. It is clear what the call yields, but it never distinguishes this tool from the sibling `read_page` or from `wiki_history`, which look like overlapping reads.

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

Usage Guidelines3/5

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

It gives one concrete workflow instruction: pass the returned version as `base_version` when saving back, which implicitly points at `save_wiki_page`. There is no guidance on when to choose this over `read_page`/`wiki_history`, nor any exclusion or prerequisite.

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

remove_blockRemove a blockA
Destructive
Inspect

Take one block off a page, by its id from read_page; in a column, it leaves the column. Every other block stays as it is, and history and undo put it back.

NameRequiredDescriptionDefault
idYesThe block's id, as read_page gives it
pathYesThe page: "" for the home page, "_footer" for the footer
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
summaryNoWhat this change does, in a few words, for the history

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and non-idempotent, so the safety profile is known. The description adds genuine context beyond that: only the targeted block is removed ("Every other block stays as it is") and the action is reversible via history/undo. It does not mention whether removal frees the id or how the parent reflows, keeping it below a 5.

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

Conciseness4/5

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

A single front-loaded sentence with three tight clauses and no filler; each clause carries scope, source of the id, or recoverability. The "in a column, it leaves the column" phrasing is slightly awkward but earns its place as a scope clarification.

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?

For a destructive, non-idempotent tool with full schema coverage and no output schema, the description covers the crucial points: what is destroyed, what is preserved, and how to reverse it. Error behavior for an unknown id or cross-page id is unaddressed, so it is strong but not exhaustive.

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

Parameters3/5

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

Schema description coverage is 100%, so the four parameters are already documented, and the description only echoes the id's origin from read_page. It adds no syntax, format, or default detail beyond the schema, making the baseline 3 correct.

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?

States a specific verb and resource ("Take one block off a page") and scopes it precisely with "in a column, it leaves the column," which separates it from column/page-level deletions and from move_block or update_block. It does not name a sibling explicitly, so it stops short of a 5.

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

Usage Guidelines3/5

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

"By its id from read_page" tells the agent where the identifier comes from, and the undo/history mention points to recovery paths, so usage is clearly implied. There is no explicit when-not-to-use guidance or a named alternative such as move_block or update_block for non-removal edits.

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

restore_wiki_pageRestore a wiki pageA
Destructive
Inspect

Put a wiki page back as one of its revisions had it. The restore is a revision of its own, so it can be undone the same way.

NameRequiredDescriptionDefault
pathYes"" for the home page, a category's path for its hub, else <category path>/<slug>
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
revision_idYesFrom wiki_history

TDQS

A3.8/5.0
Behavior4/5

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

Annotations flag destructiveHint=true, and the description usefully adds that the restore is itself a revision and therefore undoable the same way — meaningful context about reversibility and the overwriting of current content that annotations alone do not convey. It does not cover authorization requirements, but the schema's token field handles that.

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?

Two short sentences, front-loaded with the action and followed by the one behavioral fact an agent needs. No filler and nothing redundant with the schema or annotations.

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?

With no output schema and a simple three-parameter mutation, the description plus 100% schema coverage and the destructive annotation are close to complete. The only unaddressed point is what happens to the current page content, which is implied but not stated.

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

Parameters3/5

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

Schema description coverage is 100%, with path, token and revision_id all documented in the schema (including the 'from wiki_history' provenance for revision_id). The description adds no parameter-level detail beyond that, so the baseline 3 applies.

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?

States a specific verb ('Put ... back') and resource ('a wiki page') with the mechanism (to a chosen revision), which clearly separates it from save_wiki_page, delete_wiki_page and read_wiki_page. It stops short of naming any sibling, but the action is unambiguous.

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

Usage Guidelines3/5

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

Usage is implied by 'as one of its revisions had it' plus the note that restoration is itself a revision, which hints at the undo/history workflow. However, it never says when to prefer this over undo or save_wiki_page, and gives no prerequisites (e.g. needing a revision_id from wiki_history).

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

save_wiki_pageSave a wiki pageAInspect

Create a wiki page, or change one, as one revision of its history. Send the blocks whole, with base_version from read_wiki_page: a save over a page someone changed since is refused, and you read it again. A change to blocks or title moves its version (major for added, moved or removed blocks, minor for changed words); a metadata-only change moves nothing.

Pages

  • path "" is the home page and must exist. Other paths are lowercase slugs, slash-separated, no leading slash.

  • navOrder places a page in the header nav (0 first); null keeps it out. The home page is reached by the site name, so give it null.

  • path "search" is the site's search results page, which every site has, with a search box on every page; no page takes it.

  • path "_footer" is not a page to visit but the footer shown under every page: addresses, hours, contact details. Content, locations and columns blocks, no hero and no h1, navOrder null. A site without one has no footer.

  • description is the page's search snippet: one sentence, under 160 characters.

  • Omit the id of a block you add, and keep every id a page was read with, so a wiki page's history matches its blocks one for one.

Blocks

  • A page is a list of blocks, stacked vertically. Every page has exactly one h1: an opening hero's heading, a product's or a products list's with a menu, or else an h1 at the top of its first content block.

  • "hero" is a heading, a sentence or two of plain text, and optionally one button. It opens a page, its heading the h1: use one on the home page and on pages that sell something. With "call": true it is a call to action further down instead, its heading an h2: at most one on a page, usually last, asking for one action, with a button. Words in in its heading are also drawn in the accent colour. Its optional image is a picture filling it behind the words, by https URL, under the same rule as a pictures block. Where its words are a subheading rather than a sentence (a line or two, often set as headings at the source), give "subheading": true. With no picture, "backdrop": "mesh", "grain", "flow" or "marble" sets a slowly moving field of the site's own colours behind the words, smooth, grainy, folding like poured paint, or hard-edged as marbled paper, and "backdropSpeed" and "backdropIntensity", each 0 to 1, set how fast it moves (0.25 unset) and how strongly it folds (0.5 unset): at most one on a site, on the home page's opening, for a brief that wants a modern or striking look, and never on a site moved across from elsewhere. Over a picture or backdrop its words sit on boxes of the page's background; "box": "panel" or "accent" sets them on that colour instead, any colour as "#rrggbb" on that one, and "none" sets light words on the picture itself. "cover": true sets it as over a picture with nothing behind it, on the page's own colour. "height": "fit", "half", "wide" (16:9, as a landscape photograph) or "full" sets how tall it is; unset, full over a picture or backdrop and fit otherwise.

  • "content" holds HTML, plain and semantic: h1–h4, p, ul, ol, li, a, strong, em, blockquote, table, hr. No class, style or script: they are stripped. No img either: a picture goes in a pictures block. After a hero, headings start at h2.

  • "columns" sets 2–4 columns side by side, each {"blocks": [...]} of the blocks a column may hold (content, pictures, figures, code, link groups, references, notices, lists, events, locations): for features, services or contact details. They stack on a phone. To place them freely instead, as a page builder's grid does, give every column an "area": {"col", "span", "row", "rows"} on twelve columns, rows counted from 1 (up to 12 columns then); cells may sit lower than their neighbours or overlap. A column may take "align": "start", "center" or "end" for where its words and headings sit. With "beside": true and one column, it is a facts panel beside the text instead: on a page about one thing (a product, a place, an organisation), placed before the page's content, its usual content a picture and a two-column table of facts.

  • "pictures" shows pictures by https URL, {"items": [{"src", "alt": what it shows, "caption"?}]}: one is a figure, several a row the visitor scrolls sideways. With "grid": true several are set in a grid instead, each cropped to 16:9, two across from a tablet up: a gallery to look over rather than step through. A video file is an item with "video": true, its src an MP4, and "poster"?: the picture it shows before it plays. Use only picture and video URLs the brief gives you; never invent one. For any gallery or slideshow on a site being moved across, one pictures block holding each picture once, in order, without the slideshow's counters ("Image 1 of 12") or its thumbnails. A YouTube link is an iframe in a content block.

  • "product" makes its page one thing for sale: {"images": [https URLs, the first on every listing], "price"?: as it reads ("£2,500"), "sold"?: true, "tags": [the lists it appears in], "text": HTML of what it is (materials, size, year, words about it)}. It draws the page's title as the h1, so the page has no hero; it goes first. One product per page. Write a price as an amount, "£2,500", "$40" or "€12.50", and the product can be bought online once the site takes payment; "from £40" or "POA" keeps it to the Enquire button. Where it is sold elsewhere, as a book is by its publisher, give it "action": {"label": "Buy from Salmon Poetry", "href": the page that sells it}. A service, booked rather than sold (a lesson, a treatment, a consultation), is a product with "service": true, "duration"?: how long it takes as it reads ("1 hour"), and "unit"?: what its price is for as it reads after it ("an hour", "per person"); its button reads Book, and where it is booked elsewhere, "action" goes to that calendar. "sold" on a service means fully booked. A thing a buyer downloads once they have paid (an ebook, a pattern, a track) carries "file", which only the owner sets, from Products: keep it as read, never write one.

  • "list" lists pages of the site, read as the page is: {"source": "under", "under"?: a path} the pages directly under it, a section's index page; {"source": "newest", "count"?, "under"?} the most recently changed, a blog's latest posts; {"source": "chosen", "pages": [paths]} those, in order; or {"source": "products", "tag"?} the product and service pages with that tag, or all, newest first. "show": "cards" (the default) draws each page's first picture, title and search snippet, "links" each title with how long ago it changed; products are always cards of their pictures, name and price, cropped square, "shape": "portrait" upright for books and posters, "landscape" wide. A shop with several lists gives each list's products block a "menu" of links to all of them, [{"label": "All", "href": "/shop"}, …], shown down the left; the block then heads the page with its title, so the page needs no other h1. A list is drawn from each page, so never copy a product's pictures, name or price onto another page; list it.

  • "donate" takes gifts for a charity or a cause: {"amounts"?: the suggested gifts in one currency, as they read (["£10", "£20"]), only where the brief gives them, "currency"?: "£", "$" or "€" where it gives none (unset, £), "monthly"?: true only where the brief says donors may give every month}. The donor may always give an amount of their own. It shows once the site takes payment. Use it only where the brief asks for donations, with the words that ask for them before it.

  • "stats" sets 1–12 figures in a row, each {"value": as it reads ("1987", "40+"), "label": what it counts}: years open, customers served, awards. Only figures the brief gives.

  • "testimonial" is one person's words about the business: {"quote": their words exactly, "author": their name, "role"?, "avatarUrl"?: their photo by https URL}. Only quotes the brief gives, never one written for them.

  • "poem" sets one poem, or a song's words, line for line as written: {"title"?, "text": plain text, a line to a line, a blank line between stanzas, the spaces that indent a line kept, and words set in italic or bold wrapped in or , "note"?: one line under it, such as where it first appeared}. Verse goes in a poem block, never a content block, whose paragraphs would run its lines together. Copy every word, line break and indent exactly, and only poems you were given.

  • "events" lists exhibitions, shows, talks or performances, {"upcoming"?: the heading over those to come or on now ("Upcoming exhibitions"; unset, "Upcoming"), "past"?: the heading over those that have ended (unset, "Past"), "items": [{"date": when it starts, as precisely as given, "2026", "2026-11" or "2026-11-12", "end"?: when it ends, written the same way, "text": what it is and where, plain text that may link words with }]}. Give every event in one block, in any order: the page sets those to come soonest first under one heading and those that have ended latest first under the other, by the day it is read, so an event moves on its own once it ends. Never split a list into upcoming and past by hand, and never write its dates into the text as well. Its headings are h2s, so a page about events opens on an h1 before it.

  • "locations" sets out where a business is and when it is open, {"heading"?: an h2 over them, "map"?: true to set a map of each address under it, "items": [{"name"?: which one, where it has several ("Covent Garden"), "image"?: a picture of it by https URL, under the same rule as a pictures block, "address"?: plain text, a line to a line, "map"?: the link to it on a map the source gives, "phone"?, "email"?, "hours"?: [{"days": ["mon", …, "sun"], "opens": "08:00", "closes": "18:00"}], "timeZone"?: its IANA zone where it is not in the UK ("America/Los_Angeles"), "note"?: what the hours do not say, plain text ("Closed on bank holidays")}]}. A row of hours 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 reads Closed, and a closing time at or before the opening one is the next morning. The page groups the days ("Mon–Fri 8am–6pm") and says whether each is open now, by its own clock, so never write hours, an address or its phone number into a content block as well. Every shop, studio or office's address and hours go in one, on its contact or visit page and in the footer; a page about several gives every one in one block. Only hours given as regular opening hours: visits by appointment, or a reading on the third Tuesday of the month, are words in a note or a content block. Its names are h2s, or h3s under its heading.

  • "codeTabs" shows code to copy in tabs, {"tabs": [{"label": "JavaScript", "language"?: "javascript", "code": "…"}]}: for a developer or a product with an API.

  • "linkGrid" sets groups of links under a heading each, {"intro"?, "groups": [{"heading", "description"?, "links": [{"label", "href"}]}]}: a page of resources, or the places to go next.

  • "references" lists the sources a page's claims rest on, {"title"?, "items": [{"text": the citation as HTML, "url"?}]}: at the foot of a page that cites them.

  • "banner" is a notice at the top of a page about the page itself, {"variant": "stub" | "unsourced" | "outdated" | "promotional" | "cleanup" | "coi", "text"?: words in place of the standard notice}: on a wiki, where a page needs work.

  • "github" shows someone's last year on GitHub, read from GitHub as the page is: {"login": their GitHub username, "heading"?: an h2 over it}. It draws their contributions over the year, the days they contributed, their longest and current runs of days, and the calendar of every day shaded by how much, linked to their profile. Only a username the brief gives, and once on a page: a developer's or a studio's portfolio, or a project's page.

  • "contents" lists links to the page's own sections, its h2s. Use it at the top of a long page with several sections.

  • "scenes" changes the picture behind the whole page as it scrolls, {"items": [{"section"?: the id of the h2 or h3 the picture is shown from as it scrolls into view (its heading in lowercase, hyphens for spaces: "excelsior-studios"; unset, from where the page opens), "src": the picture by https URL}]}, in the order the page scrolls, each crossfading into the next. It needs the theme's "background" picture, which the page opens on and the scenes are drawn over, so set one. One per page, placed anywhere; it shows nothing of its own in the page, so a section's scene is not also its figure. For a single scrolling page whose sections are each a place or a thing with a picture of its own, as a tour, a portfolio or a set of projects. Only picture URLs the brief gives you.

  • "comments" lets visitors comment on the page, each comment shown once an owner approves it. Use it only where the brief asks for comments, usually at the foot of a blog post.

  • "contact" is a form for a visitor's name, email address and message, which reaches the site's owners privately and never shows on the site. Use it on a contact page, and wherever the brief asks to be written to but gives no address to publish.

  • Any block of the page's own (not one inside columns) may take "band": "panel" or "accent", or any colour as "#rrggbb", which sets it on a strip of that colour from edge to edge; the site's own two follow its palette. Use bands sparingly, to set a section apart; consecutive blocks with the same band read as one section. It may also take "space": "none", "small" or "large" for the room above and below it (and inside its band), "width": "narrow" (a line of text wide, centred) or "full" (edge to edge), and "look", a look of its own apart from the site's, any of "--color-text", "--color-muted", "--color-heading" and "--color-accent" as "#rrggbb", "--align" "start", "center" or "end", and "roundness" and "depth" from 0 to 1. Leave them unset unless the source sets a block apart that way or the owner asks.

  • Every piece of words a block holds apart from HTML text (a heading, a caption, a figure and its label, a quote and who said it, a price, a button's label, a place's name or note, an event) is a line of inline HTML: as plain as the source, its words may be wrapped in , or , linked with (not in a button's label, which is a link already), or set in a giving font-family (a value from the Theme list), color or font-size, as the source sets them.

  • A button's href is a page on the site ("/contact"), an https URL, a mailto: or a tel: address. Link between pages with root-relative hrefs, never the full domain.

  • Write every phone number as a tel: link and every email address as a mailto: link, so a visitor on a phone can tap it.

Theme

  • Each value is a CSS colour, OKLCH preferred, e.g. "oklch(0.72 0.16 40)". Choose what suits the business, and keep text readable on bg (contrast 4.5:1 or better) and muted text still legible.

  • --font-sans is one of these values, written exactly: Clean: "ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif"; Friendly: "ui-rounded, SF Pro Rounded, Nunito, Varela Round, system-ui, sans-serif"; Humanist: "Optima, Candara, Seravek, Gill Sans Nova, Noto Sans, sans-serif"; Classic: "Charter, Bitstream Charter, Sitka Text, Cambria, Georgia, serif"; Elegant: "Iowan Old Style, Palatino Linotype, Palatino, URW Palladio L, serif"; Typewriter: "ui-monospace, SF Mono, Menlo, Consolas, monospace"; Inter: "var(--font-inter), ui-sans-serif, system-ui, sans-serif"; Geist: "var(--font-geist), ui-sans-serif, system-ui, sans-serif"; DM Sans: "var(--font-dm-sans), ui-sans-serif, system-ui, sans-serif"; Manrope: "var(--font-manrope), ui-sans-serif, system-ui, sans-serif"; Nunito: "var(--font-nunito), ui-rounded, system-ui, sans-serif"; Work Sans: "var(--font-work-sans), ui-sans-serif, system-ui, sans-serif"; Space Grotesk: "var(--font-space-grotesk), ui-sans-serif, system-ui, sans-serif"; Jost: "var(--font-jost), Futura, ui-sans-serif, system-ui, sans-serif"; Bricolage Grotesque: "var(--font-bricolage), ui-sans-serif, system-ui, sans-serif"; Lora: "var(--font-lora), Georgia, serif"; Playfair Display: "var(--font-playfair), Georgia, serif"; Instrument Serif: "var(--font-instrument-serif), Georgia, serif"; Source Serif: "var(--font-source-serif), Georgia, serif"; Crimson Pro: "var(--font-crimson), Georgia, serif"; Bitter: "var(--font-bitter), Rockwell, Georgia, serif"; Young Serif: "var(--font-young-serif), Georgia, serif"; JetBrains Mono: "var(--font-jetbrains), ui-monospace, monospace". The first six use fonts every device has; the rest are web fonts miow serves. Nothing else loads, and a value with quotes is discarded.

  • roundness, density, scale and depth are numbers from 0 to 1 that shape every page: corners from square to round, spacing from roomy to compact, headings from close to body size to far larger, and shadow from flat to raised. Choose them for the business as you choose its colours; 0.33, 0.5, 0.5 and 0 is a plain, even look.

  • --hero-entrance makes an opening's words arrive as the page opens: "rise", "focus" or "unveil". Leave it unset unless the business suits motion.

  • background is a picture by https URL held behind the whole site, which every page scrolls over on frosted panels of the page's colour, an opening with no picture of its own sitting straight on it: for a single scrolling page with a strong sense of place, and only a picture URL the brief gives you.

  • Looks to start from, each its colours in words and the rest of its theme. Where one suits the business, take its theme whole and choose colours that match its words, in the business's own hue:

    • Gallery: white walls and near-black ink, one quiet accent, a slim display serif over a clean sans, square corners and wide margins; for photographers, artists, architects and galleries. {"roundness":0,"density":0.15,"scale":0.9,"depth":0,"--font-sans":"var(--font-geist), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-instrument-serif), Georgia, serif","--font-heading-weight":"400","--hero-entrance":"focus"}

    • Maker: warm oat and clay, one earthy accent, soft corners and a friendly grotesk; for ceramics, homeware, bakeries and small makers. {"roundness":0.4,"density":0.35,"scale":0.75,"depth":0,"--font-sans":"var(--font-dm-sans), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-bricolage), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"600","--hero-entrance":"rise"}

    • Quiet luxury: ivory and warm near-black, one muted accent, a high-contrast serif and room to breathe; for premium goods, fashion and private services. {"roundness":0.05,"density":0.1,"scale":0.75,"depth":0,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-playfair), Georgia, serif","--font-heading-weight":"400","--hero-entrance":"focus"}

    • Japanese minimal: rice paper and soft ink, one seal-red accent, a calligraphic serif and wide empty space; for studios, tea, food and wellness. {"roundness":0,"density":0,"scale":0.6,"depth":0,"--font-sans":"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif","--font-heading":"var(--font-crimson), Georgia, serif","--font-heading-weight":"400","--hero-entrance":"rise"}

    • Editorial: warm paper and ink-black, one vermilion accent, a large serif over a clean sans, square corners; for writers, magazines and studios. {"roundness":0,"density":0.35,"scale":0.9,"depth":0,"--font-sans":"var(--font-work-sans), ui-sans-serif, system-ui, sans-serif","--font-heading":"Charter, Bitstream Charter, Sitka Text, Cambria, Georgia, serif","--font-heading-weight":"400"}

    • Corporate: white, blue-grey ink and one deep accent, one sans throughout, modest headings; for firms, finance and anything that must look dependable. {"roundness":0.33,"density":0.55,"scale":0.25,"depth":0.1,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-sans)","--font-heading-weight":"700"}

    • Dark tech: near-black with fine lines and one bright accent, a geometric sans; for software, developer tools and technical products. {"roundness":0.33,"density":0.6,"scale":0.45,"depth":0,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-space-grotesk), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"700","--hero-entrance":"rise"}

    • Playful: cream with saturated colour and black ink, round corners and a chunky sans; for shops, children, food and events. {"roundness":0.66,"density":0.45,"scale":0.8,"depth":0,"--font-sans":"var(--font-nunito), ui-rounded, system-ui, sans-serif","--font-heading":"var(--font-bricolage), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"700","--hero-entrance":"rise"}

    • Industrial: aged paper and black, one signal colour such as safety orange, square edges and a heavy grotesk at great size; for makers, workshops and engineering. {"roundness":0,"density":0.65,"scale":1,"depth":0,"--font-sans":"var(--font-work-sans), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-space-grotesk), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"700","--hero-entrance":"unveil"}

    • Retro print: warm print stock, print-black and one riso ink such as red, a bold slab over a quiet serif; for bookshops, records, posters and local makers. {"roundness":0,"density":0.4,"scale":1,"depth":0,"--font-sans":"var(--font-source-serif), Georgia, serif","--font-heading":"var(--font-bitter), Rockwell, Georgia, serif","--font-heading-weight":"700"}

    • Cinematic: warm studio paper and black, one electric accent, a tight sans at very large sizes and an opening that unveils; for launches, film and agencies. {"roundness":0.1,"density":0.3,"scale":1,"depth":0,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-sans)","--font-heading-weight":"700","--hero-entrance":"unveil"}

NameRequiredDescriptionDefault
pathYesThe page's address without its slashes: "" for the home page, a category's path for its hub article, else category path + "/" + slug
titleNoRequired for a new page
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
contentNoThe page's blocks, whole. Required for a new page; omit to keep them
messageNoWhat this change does, for the page's history
metadataNoReplaces the page's metadata whole: the facts its category declares, and `description`, its search snippet
new_slugNoMoves the page to this slug in its category
base_versionNoThe version you read. A save over a page that has moved on since is refused, so read it again

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, non-open-world operation. The description adds substantial behavioral detail beyond that: optimistic concurrency via base_version, refusal on conflict, revision semantics, and when a change causes a major, minor, or no version move. It does not discuss permissions, rate limits, or response shape.

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

Conciseness2/5

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

The description is extremely long and includes a full Theme section that is not a parameter of save_wiki_page, making much of it extraneous for this tool. The core save semantics are front-loaded and reasonably structured with Pages and Blocks headings, but the overall size and out-of-scope theme content are major conciseness problems.

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?

For a complex tool with eight parameters, deeply nested block schemas, and no output schema, the description covers most of what an agent needs to call it correctly. It explains page paths, block composition, versioning, and conflict handling. It does not describe what the save returns, and the irrelevant Theme section dilutes rather than completes the definition.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds meaning the schema does not: the special meaning of path "", "search", and "_footer", the one-h1 rule, block id handling, navOrder behavior, and the fact that blocks must be sent whole. It materially improves correct construction of the content parameter.

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?

The opening sentence gives a specific verb and resource: create or change a wiki page as one revision of its history. It also names read_wiki_page as the companion read tool. However, it does not explicitly distinguish this tool from siblings such as write_site, insert_block, update_block, or set_wiki.

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

Usage Guidelines3/5

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

The description clearly explains the read-then-save workflow with base_version and says a stale save is refused. It does not say when to use this tool rather than insert_block, update_block, write_site, or set_wiki, nor does it give explicit when-not guidance.

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

search_siteSearch a siteB
Read-only
Inspect

The site's pages that hold some words, best first: titles starting with them, then titles holding them, then descriptions and page text; a question no page holds word for word is matched in English, stems and all. Each with its path, url, title, description and the passage the words are in, the first 20 of total: the same rows as the site's search page and /search.json?q=.

NameRequiredDescriptionDefault
siteNoAny live site's address, as acme.miow.me, acme.com or a page's url, to read what anyone can see there without a token
queryYesThe words to find
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

B3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered; the description adds real value beyond that by disclosing the ranking tiers, the stemming/English fallback behavior, the returned fields, and the 20-row cap against `total`. It does not mention auth requirements or how to retrieve rows beyond the first 20, which keeps it short of a 5.

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

Conciseness2/5

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

The whole definition is a single dense run-on sentence stitched together with semicolons and a colon, with the core purpose buried mid-sentence rather than front-loaded. The content is largely non-redundant, but the structure makes it hard to scan quickly.

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?

With no output schema, the description does the work of explaining return values: path, url, title, description, matching passage, and the 20-of-total limit. For a read-only search tool with fully covered parameter schemas, this is close to complete, though pagination behavior and auth expectations are left implicit.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (site, query, token) are already documented in the schema, including the token-header fallback. The description adds output shape and the 'first 20 of total' limit but nothing new about parameter syntax or formats, so the baseline 3 applies.

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

Purpose3/5

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

The description describes the result set ('the site's pages that hold some words') and the ranking order, so the resource is identifiable, but it never states the action as a verb and never differentiates itself from siblings like read_page, get_site, or wiki_history. The purpose is inferable from the name rather than stated in the text.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of when to pick this over read_page or get_site, and no explanation of when the `site` or `token` parameters are required. The equivalence to '/search.json?q=' hints at a context, but the agent is left to infer everything else.

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

send_feedbackSend feedbackAInspect

Tell the maintainers of miow what you needed and did not find, what is wrong, or what broke. One issue per call, in 300 characters at most. Reports are read, not published.

NameRequiredDescriptionDefault
kindYesmissing: not covered here. wrong: a fact or link is out of date or false. broken: a tool or page failed. suggestion: anything else.
pageNoThe page path, URL or tool it is about, if any
messageYesWhat you were after, or what is wrong and what it should say. 300 characters at most.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=false, so the write-but-harmless profile is already visible. The description adds real, non-redundant behavior: 'Reports are read, not published' tells the agent submissions aren't public, and the 300-char cap signals truncation behavior. It stops short of saying whether a confirmation or reply is returned.

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?

Three short sentences: purpose first, calling constraint second, privacy note last. Every sentence carries distinct information and nothing is repeated from the title or schema.

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?

For a 3-parameter, no-output-schema tool, the description plus full schema coverage covers kinds, target page, message limit, and visibility. The only gap is what happens after submission (confirmation, response, rate limits), which is minor given the low-stakes, non-destructive nature.

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 coverage is 100%, so the baseline is 3 and the schema already carries the enum meanings and field purposes. The description still contributes beyond schema: 'one issue per call' is a calling convention the schema does not encode, and restating the 300-character limit reinforces the constraint on message.

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

Purpose5/5

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

States a specific verb+recipient+content ('Tell the maintainers of miow what you needed and did not find, what is wrong, or what broke'), which no sibling covers — the siblings are all site/wiki CRUD tools. An agent can distinguish this from every other tool in the list without opening the schema.

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?

The description enumerates the triggering situations (missing content, wrong content, breakage) and adds a calling constraint, 'One issue per call,' which shapes how the agent batches. It does not name when not to use it or an alternative channel, but no sibling competes for this purpose.

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

set_domainUse a domainAInspect

Put a site nobody owns yet on a domain your human already has; once someone owns the site, its domain is set only from its settings. Returns the DNS records they must set where they bought it: first a TXT record proving the domain is theirs, then the records that point it here. The site moves to the domain once those records are seen; call domain_status to check.

NameRequiredDescriptionDefault
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
domainYese.g. example.com

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare it is a non-read-only, non-destructive, open-world write; the description goes further by disclosing the return payload (TXT proof record then pointing records), the sequence of what the human must do, and that the site migrates only once those records are observed. That is meaningful behavioral context beyond the structured fields.

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?

Roughly three sentences, front-loaded with the precondition and action, then the return payload and the verification follow-up. No filler sentences; each clause carries actionable information.

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

Completeness5/5

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

With no output schema, the description takes on the burden of explaining the return value and it does so (DNS records in order, eventual domain migration). Combined with annotations covering the safety profile and a 100%-covered schema, nothing needed to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so both parameters are already documented, including the token fallback to the Authorization header. The description implies the domain is one the human already owns but adds no syntax or format detail beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Put a site nobody owns yet on a domain') plus the precondition that distinguishes it from the post-ownership path. An agent can tell this apart from domain_status and from setting a domain via settings without opening a schema.

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

Usage Guidelines5/5

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

Explicitly says when to use it (site nobody owns yet) and when not to (once someone owns the site, the domain is set only from its settings), and names the sibling to call afterwards (domain_status). The routing conditions are fully spelled out.

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

set_wikiMake a site a wikiA
DestructiveIdempotent
Inspect

Give the site a category tree and make it a wiki, or change its tree. A wiki's pages live in its categories, each with a version and a history of every save, and are written with save_wiki_page, not write_site. The tree is sent whole: each node's slug is its path segment, and its metadataKeys are the facts a page under it carries, a select key becoming a filter on the category's page.

NameRequiredDescriptionDefault
treeYesThe top-level categories, each with its children
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known; the description adds the crucial semantics behind it: 'The tree is sent whole,' which tells the agent the existing tree is replaced rather than merged. It does not say what happens to existing pages or history when a category is dropped from the tree, which is the main remaining behavioral gap for a destructive mutation.

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

Conciseness4/5

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

Three sentences, no filler, with the core action front-loaded and the tree-structure semantics following. The sentences are dense and long, which slightly hurts scannability, but nothing is redundant and every clause carries information.

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?

For a two-parameter mutation tool with no output schema and full schema coverage, the description supplies the conceptual model (wiki pages live in categories, are versioned, have history) plus replacement semantics. It is nearly complete; the missing piece is the effect of removing a category from the tree on existing pages and history.

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 baseline is 3. The description goes beyond the schema by explaining that each node's slug is its path segment and that metadataKeys define the facts a page under that node carries, with a select key becoming a filter on the category page — semantic meaning the schema states only partially ('select keys become facets'). It does not elaborate on the token parameter, but the schema already covers it.

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

Purpose5/5

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

The description states a specific verb and resource ('Give the site a category tree and make it a wiki, or change its tree') and clearly distinguishes the tool from siblings by naming write_site and save_wiki_page as the page-authoring path instead. An agent can tell this is the site-to-wiki conversion/structure tool without opening another schema.

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 covers both use cases ('make it a wiki, or change its tree') and routes the agent away from write_site for wiki content, which is a useful sibling distinction. It stops short of explicit when-not guidance (e.g., what to do if the site is already a wiki, or how this interacts with delete_wiki_page/restore_wiki_page), so it is clear context rather than complete routing.

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

undoUndoA
Destructive
Inspect

Put the site back as it was before a change, undoing it and every change since. Take the change id from history. The undo is itself a change, so it can be undone too.

NameRequiredDescriptionDefault
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
change_idYesFrom history

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description goes further by quantifying the blast radius (every change since the target) and disclosing reversibility ('The undo is itself a change, so it can be undone too'). That reversibility detail is exactly the extra context an agent cannot infer from structured fields.

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?

Three tight sentences with zero padding; the destructive cascade is front-loaded before the provenance and reversibility notes.

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?

For a destructive, output-schema-less tool, the description covers scope, input provenance, and reversibility, and annotations carry the safety profile. It does not mention confirmation requirements or that the token may come from the Authorization header, though the schema handles the token.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented, and the description's 'Take the change id from history' largely restates the schema's own 'From history' for change_id. It adds only a mild cross-tool pointer, not new semantics, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (undo/put back) and resource (the site, to its pre-change state) and precisely delineates the scope: the named change plus every change after it. It is clearly distinguishable from siblings like history (which supplies the change id) and write_site.

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?

'Take the change id from history' gives a concrete prerequisite and routes the agent to the sibling that produces the input. It does not, however, state when to prefer undo over other mutation paths or any exclusions, so it stops short of full when/when-not guidance.

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

update_blockChange a blockA
DestructiveIdempotent
Inspect

Change some fields of one block on a page, by its id from read_page, and leave the rest of it and every other block as they are: the way to change a price, a line of text or a picture without resending the page. A block keeps its type. On a wiki, the block tools change its footer; save_wiki_page changes its articles.

NameRequiredDescriptionDefault
idYesThe block's id, as read_page gives it
pathYesThe page: "" for the home page, "_footer" for the footer
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
fieldsYesThe fields to change, each replacing the one it names, an array whole; null takes a field away. Every field you leave out stays as it is.
summaryNoWhat this change does, in a few words, for the history

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true; the description adds the semantics behind that: it is a partial patch, unreferenced fields and all other blocks are untouched, and 'A block keeps its type' is a constraint not present in the schema. It does not explain what a destructive outcome looks like in practice (e.g. field removal) or what comes back from the call, but the added context is meaningful.

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

Conciseness4/5

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

The key behavior — partial update by block id — is front-loaded in the first clause, and the two follow-on sentences each carry a distinct fact (type immutability, wiki footer vs articles). The opening sentence is long and slightly run-on, but there is no filler.

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?

For a destructive, idempotent mutation with a nested 'fields' object and no output schema, the description covers the semantics an agent needs: partial replacement, type preservation, and the wiki split. Missing only secondary detail such as failure behavior or whether the updated block is returned; annotations already cover the safety profile.

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

Parameters3/5

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

Schema description coverage is 100%, so id, path, token, fields and summary are already documented, including null-removes-a-field and whole-array replacement. The description largely restates that ('by its id from read_page', footer handling) rather than adding syntax or format detail. Baseline 3 is appropriate when the schema carries the load.

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

Purpose5/5

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

States a specific verb and resource ('Change some fields of one block on a page') and immediately bounds the scope: only the named fields change, everything else stays. It also pins the id's provenance to read_page and distinguishes its behavior from save_wiki_page, so an agent can separate it from insert_block, remove_block, move_block and whole-page writes without opening a schema.

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?

Gives concrete routing: get the id from read_page, and on a wiki use the block tools for the footer but save_wiki_page for articles. That is real when-to-use-an-alternative guidance. It stops short of a full exclusion list (e.g. when to prefer write_site for whole-page rewrites), so it is clear context rather than a complete decision matrix.

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

upload_imageUpload an imageAInspect

Copy an image from a URL into miow's store and get back the URL to use in a pictures block. Up to 10 MB. JPEG, PNG, GIF, WebP and AVIF are kept as they are; an SVG is drawn as a PNG at twice its size, and refused if it holds a script or links to other files. Use it for an image on someone else's server, which may move or vanish.

NameRequiredDescriptionDefault
urlYeshttps URL of the image
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A4.7/5.0
Behavior5/5

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

The description adds substantial behavior beyond the annotations: a 10 MB limit, preserved formats for JPEG/PNG/GIF/WebP/AVIF, SVG conversion to PNG at 2x size, and refusal of SVGs containing scripts or external links. These details are consistent with the non-destructive write and open-world annotations.

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?

The description is four tightly written sentences: purpose first, then limits and format behavior, then the intended use case. Every sentence contributes useful information with no repetition or wasted phrasing.

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

Completeness5/5

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

With no output schema, the description still states that the tool returns the uploaded URL. It also covers size, format handling, SVG restrictions, and the intended external-image use case, leaving no critical gap for an agent to call it correctly.

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 coverage is already 100%, so the base expectation is 3. The description adds meaningful constraints for the url parameter, including size and accepted image formats, though it does not add anything about the token parameter beyond what the schema already explains.

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

Purpose5/5

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

The description states a specific verb and resource: copy an image from a URL into miow's store and return the resulting URL for a pictures block. This clearly distinguishes the tool from generic block or page operations in the sibling list, even without naming a specific alternative.

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 gives clear usage context: use this for an image hosted on someone else's server, which may move or vanish. It does not explicitly state when not to use it or name alternative tools, so it falls short of a full 5.

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

wiki_historyA wiki page's historyA
Read-only
Inspect

A wiki page's revisions, newest first: version, kind of change, message, who and when, and what each changed block by block. Pass a revision id to restore_wiki_page to put the page back as it was.

NameRequiredDescriptionDefault
pathYes"" for the home page, a category's path for its hub, else <category path>/<slug>
limitNo1 to 100; 20 if omitted
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond that: results are sorted newest first, each revision is broken down 'block by block', and the version values are actionable via restore_wiki_page. It stops short of documenting pagination or the limit's effect on the result size.

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?

Two tight sentences, front-loaded with what the tool returns, with the restore tip as a natural trailing rider. Every clause carries information; nothing is filler.

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?

There is no output schema, so the description usefully carries the return shape (ordering plus the enumerated fields), which is the main completeness burden here. It leaves the limit/pagination behavior and the token parameter entirely to the schema, which is acceptable but leaves a small gap for a history-listing tool.

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, but the description adds cross-tool semantics the schema lacks: the returned revision id is what you feed to restore_wiki_page to revert the page. That linkage gives the version field operational meaning rather than leaving it a bare identifier.

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?

The description names a specific resource (a wiki page's revisions) and even characterizes the payload: version, kind of change, message, author/time, and block-level diffs, ordered newest first. It is clearly distinct from read_wiki_page or save_wiki_page, though it never explicitly contrasts itself with the sibling 'history' tool, which an agent might confuse it with.

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

Usage Guidelines3/5

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

Usage is implied (consult past revisions of a wiki page) rather than stated, and no condition or exclusion is given relative to the sibling 'history'. The one explicit routing hint — pass a revision id to restore_wiki_page — guides what to do with the result rather than when to call this tool.

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

write_siteWrite pagesA
DestructiveIdempotent
Inspect

Create or replace pages, each sent whole, and delete others; optionally rename the site, change its theme, or set its header, replaced whole. A page you do not send is left as it is; to change part of one, update_block, insert_block, move_block and remove_block leave the rest of it as it is. Every write can be undone (history, undo). The input schema gives every block's fields. The reply's notes say what the write changed of what you sent.

Pages

  • path "" is the home page and must exist. Other paths are lowercase slugs, slash-separated, no leading slash.

  • navOrder places a page in the header nav (0 first); null keeps it out. The home page is reached by the site name, so give it null.

  • path "search" is the site's search results page, which every site has, with a search box on every page; no page takes it.

  • path "_footer" is not a page to visit but the footer shown under every page: addresses, hours, contact details. Content, locations and columns blocks, no hero and no h1, navOrder null. A site without one has no footer.

  • description is the page's search snippet: one sentence, under 160 characters.

  • Omit the id of a block you add, and keep every id a page was read with, so a wiki page's history matches its blocks one for one.

Blocks

  • A page is a list of blocks, stacked vertically. Every page has exactly one h1: an opening hero's heading, a product's or a products list's with a menu, or else an h1 at the top of its first content block.

  • "hero" is a heading, a sentence or two of plain text, and optionally one button. It opens a page, its heading the h1: use one on the home page and on pages that sell something. With "call": true it is a call to action further down instead, its heading an h2: at most one on a page, usually last, asking for one action, with a button. Words in in its heading are also drawn in the accent colour. Its optional image is a picture filling it behind the words, by https URL, under the same rule as a pictures block. Where its words are a subheading rather than a sentence (a line or two, often set as headings at the source), give "subheading": true. With no picture, "backdrop": "mesh", "grain", "flow" or "marble" sets a slowly moving field of the site's own colours behind the words, smooth, grainy, folding like poured paint, or hard-edged as marbled paper, and "backdropSpeed" and "backdropIntensity", each 0 to 1, set how fast it moves (0.25 unset) and how strongly it folds (0.5 unset): at most one on a site, on the home page's opening, for a brief that wants a modern or striking look, and never on a site moved across from elsewhere. Over a picture or backdrop its words sit on boxes of the page's background; "box": "panel" or "accent" sets them on that colour instead, any colour as "#rrggbb" on that one, and "none" sets light words on the picture itself. "cover": true sets it as over a picture with nothing behind it, on the page's own colour. "height": "fit", "half", "wide" (16:9, as a landscape photograph) or "full" sets how tall it is; unset, full over a picture or backdrop and fit otherwise.

  • "content" holds HTML, plain and semantic: h1–h4, p, ul, ol, li, a, strong, em, blockquote, table, hr. No class, style or script: they are stripped. No img either: a picture goes in a pictures block. After a hero, headings start at h2.

  • "columns" sets 2–4 columns side by side, each {"blocks": [...]} of the blocks a column may hold (content, pictures, figures, code, link groups, references, notices, lists, events, locations): for features, services or contact details. They stack on a phone. To place them freely instead, as a page builder's grid does, give every column an "area": {"col", "span", "row", "rows"} on twelve columns, rows counted from 1 (up to 12 columns then); cells may sit lower than their neighbours or overlap. A column may take "align": "start", "center" or "end" for where its words and headings sit. With "beside": true and one column, it is a facts panel beside the text instead: on a page about one thing (a product, a place, an organisation), placed before the page's content, its usual content a picture and a two-column table of facts.

  • "pictures" shows pictures by https URL, {"items": [{"src", "alt": what it shows, "caption"?}]}: one is a figure, several a row the visitor scrolls sideways. With "grid": true several are set in a grid instead, each cropped to 16:9, two across from a tablet up: a gallery to look over rather than step through. A video file is an item with "video": true, its src an MP4, and "poster"?: the picture it shows before it plays. Use only picture and video URLs the brief gives you; never invent one. For any gallery or slideshow on a site being moved across, one pictures block holding each picture once, in order, without the slideshow's counters ("Image 1 of 12") or its thumbnails. A YouTube link is an iframe in a content block.

  • "product" makes its page one thing for sale: {"images": [https URLs, the first on every listing], "price"?: as it reads ("£2,500"), "sold"?: true, "tags": [the lists it appears in], "text": HTML of what it is (materials, size, year, words about it)}. It draws the page's title as the h1, so the page has no hero; it goes first. One product per page. Write a price as an amount, "£2,500", "$40" or "€12.50", and the product can be bought online once the site takes payment; "from £40" or "POA" keeps it to the Enquire button. Where it is sold elsewhere, as a book is by its publisher, give it "action": {"label": "Buy from Salmon Poetry", "href": the page that sells it}. A service, booked rather than sold (a lesson, a treatment, a consultation), is a product with "service": true, "duration"?: how long it takes as it reads ("1 hour"), and "unit"?: what its price is for as it reads after it ("an hour", "per person"); its button reads Book, and where it is booked elsewhere, "action" goes to that calendar. "sold" on a service means fully booked. A thing a buyer downloads once they have paid (an ebook, a pattern, a track) carries "file", which only the owner sets, from Products: keep it as read, never write one.

  • "list" lists pages of the site, read as the page is: {"source": "under", "under"?: a path} the pages directly under it, a section's index page; {"source": "newest", "count"?, "under"?} the most recently changed, a blog's latest posts; {"source": "chosen", "pages": [paths]} those, in order; or {"source": "products", "tag"?} the product and service pages with that tag, or all, newest first. "show": "cards" (the default) draws each page's first picture, title and search snippet, "links" each title with how long ago it changed; products are always cards of their pictures, name and price, cropped square, "shape": "portrait" upright for books and posters, "landscape" wide. A shop with several lists gives each list's products block a "menu" of links to all of them, [{"label": "All", "href": "/shop"}, …], shown down the left; the block then heads the page with its title, so the page needs no other h1. A list is drawn from each page, so never copy a product's pictures, name or price onto another page; list it.

  • "donate" takes gifts for a charity or a cause: {"amounts"?: the suggested gifts in one currency, as they read (["£10", "£20"]), only where the brief gives them, "currency"?: "£", "$" or "€" where it gives none (unset, £), "monthly"?: true only where the brief says donors may give every month}. The donor may always give an amount of their own. It shows once the site takes payment. Use it only where the brief asks for donations, with the words that ask for them before it.

  • "stats" sets 1–12 figures in a row, each {"value": as it reads ("1987", "40+"), "label": what it counts}: years open, customers served, awards. Only figures the brief gives.

  • "testimonial" is one person's words about the business: {"quote": their words exactly, "author": their name, "role"?, "avatarUrl"?: their photo by https URL}. Only quotes the brief gives, never one written for them.

  • "poem" sets one poem, or a song's words, line for line as written: {"title"?, "text": plain text, a line to a line, a blank line between stanzas, the spaces that indent a line kept, and words set in italic or bold wrapped in or , "note"?: one line under it, such as where it first appeared}. Verse goes in a poem block, never a content block, whose paragraphs would run its lines together. Copy every word, line break and indent exactly, and only poems you were given.

  • "events" lists exhibitions, shows, talks or performances, {"upcoming"?: the heading over those to come or on now ("Upcoming exhibitions"; unset, "Upcoming"), "past"?: the heading over those that have ended (unset, "Past"), "items": [{"date": when it starts, as precisely as given, "2026", "2026-11" or "2026-11-12", "end"?: when it ends, written the same way, "text": what it is and where, plain text that may link words with }]}. Give every event in one block, in any order: the page sets those to come soonest first under one heading and those that have ended latest first under the other, by the day it is read, so an event moves on its own once it ends. Never split a list into upcoming and past by hand, and never write its dates into the text as well. Its headings are h2s, so a page about events opens on an h1 before it.

  • "locations" sets out where a business is and when it is open, {"heading"?: an h2 over them, "map"?: true to set a map of each address under it, "items": [{"name"?: which one, where it has several ("Covent Garden"), "image"?: a picture of it by https URL, under the same rule as a pictures block, "address"?: plain text, a line to a line, "map"?: the link to it on a map the source gives, "phone"?, "email"?, "hours"?: [{"days": ["mon", …, "sun"], "opens": "08:00", "closes": "18:00"}], "timeZone"?: its IANA zone where it is not in the UK ("America/Los_Angeles"), "note"?: what the hours do not say, plain text ("Closed on bank holidays")}]}. A row of hours 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 reads Closed, and a closing time at or before the opening one is the next morning. The page groups the days ("Mon–Fri 8am–6pm") and says whether each is open now, by its own clock, so never write hours, an address or its phone number into a content block as well. Every shop, studio or office's address and hours go in one, on its contact or visit page and in the footer; a page about several gives every one in one block. Only hours given as regular opening hours: visits by appointment, or a reading on the third Tuesday of the month, are words in a note or a content block. Its names are h2s, or h3s under its heading.

  • "codeTabs" shows code to copy in tabs, {"tabs": [{"label": "JavaScript", "language"?: "javascript", "code": "…"}]}: for a developer or a product with an API.

  • "linkGrid" sets groups of links under a heading each, {"intro"?, "groups": [{"heading", "description"?, "links": [{"label", "href"}]}]}: a page of resources, or the places to go next.

  • "references" lists the sources a page's claims rest on, {"title"?, "items": [{"text": the citation as HTML, "url"?}]}: at the foot of a page that cites them.

  • "banner" is a notice at the top of a page about the page itself, {"variant": "stub" | "unsourced" | "outdated" | "promotional" | "cleanup" | "coi", "text"?: words in place of the standard notice}: on a wiki, where a page needs work.

  • "github" shows someone's last year on GitHub, read from GitHub as the page is: {"login": their GitHub username, "heading"?: an h2 over it}. It draws their contributions over the year, the days they contributed, their longest and current runs of days, and the calendar of every day shaded by how much, linked to their profile. Only a username the brief gives, and once on a page: a developer's or a studio's portfolio, or a project's page.

  • "contents" lists links to the page's own sections, its h2s. Use it at the top of a long page with several sections.

  • "scenes" changes the picture behind the whole page as it scrolls, {"items": [{"section"?: the id of the h2 or h3 the picture is shown from as it scrolls into view (its heading in lowercase, hyphens for spaces: "excelsior-studios"; unset, from where the page opens), "src": the picture by https URL}]}, in the order the page scrolls, each crossfading into the next. It needs the theme's "background" picture, which the page opens on and the scenes are drawn over, so set one. One per page, placed anywhere; it shows nothing of its own in the page, so a section's scene is not also its figure. For a single scrolling page whose sections are each a place or a thing with a picture of its own, as a tour, a portfolio or a set of projects. Only picture URLs the brief gives you.

  • "comments" lets visitors comment on the page, each comment shown once an owner approves it. Use it only where the brief asks for comments, usually at the foot of a blog post.

  • "contact" is a form for a visitor's name, email address and message, which reaches the site's owners privately and never shows on the site. Use it on a contact page, and wherever the brief asks to be written to but gives no address to publish.

  • Any block of the page's own (not one inside columns) may take "band": "panel" or "accent", or any colour as "#rrggbb", which sets it on a strip of that colour from edge to edge; the site's own two follow its palette. Use bands sparingly, to set a section apart; consecutive blocks with the same band read as one section. It may also take "space": "none", "small" or "large" for the room above and below it (and inside its band), "width": "narrow" (a line of text wide, centred) or "full" (edge to edge), and "look", a look of its own apart from the site's, any of "--color-text", "--color-muted", "--color-heading" and "--color-accent" as "#rrggbb", "--align" "start", "center" or "end", and "roundness" and "depth" from 0 to 1. Leave them unset unless the source sets a block apart that way or the owner asks.

  • Every piece of words a block holds apart from HTML text (a heading, a caption, a figure and its label, a quote and who said it, a price, a button's label, a place's name or note, an event) is a line of inline HTML: as plain as the source, its words may be wrapped in , or , linked with (not in a button's label, which is a link already), or set in a giving font-family (a value from the Theme list), color or font-size, as the source sets them.

  • A button's href is a page on the site ("/contact"), an https URL, a mailto: or a tel: address. Link between pages with root-relative hrefs, never the full domain.

  • Write every phone number as a tel: link and every email address as a mailto: link, so a visitor on a phone can tap it.

Theme

  • Each value is a CSS colour, OKLCH preferred, e.g. "oklch(0.72 0.16 40)". Choose what suits the business, and keep text readable on bg (contrast 4.5:1 or better) and muted text still legible.

  • --font-sans is one of these values, written exactly: Clean: "ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif"; Friendly: "ui-rounded, SF Pro Rounded, Nunito, Varela Round, system-ui, sans-serif"; Humanist: "Optima, Candara, Seravek, Gill Sans Nova, Noto Sans, sans-serif"; Classic: "Charter, Bitstream Charter, Sitka Text, Cambria, Georgia, serif"; Elegant: "Iowan Old Style, Palatino Linotype, Palatino, URW Palladio L, serif"; Typewriter: "ui-monospace, SF Mono, Menlo, Consolas, monospace"; Inter: "var(--font-inter), ui-sans-serif, system-ui, sans-serif"; Geist: "var(--font-geist), ui-sans-serif, system-ui, sans-serif"; DM Sans: "var(--font-dm-sans), ui-sans-serif, system-ui, sans-serif"; Manrope: "var(--font-manrope), ui-sans-serif, system-ui, sans-serif"; Nunito: "var(--font-nunito), ui-rounded, system-ui, sans-serif"; Work Sans: "var(--font-work-sans), ui-sans-serif, system-ui, sans-serif"; Space Grotesk: "var(--font-space-grotesk), ui-sans-serif, system-ui, sans-serif"; Jost: "var(--font-jost), Futura, ui-sans-serif, system-ui, sans-serif"; Bricolage Grotesque: "var(--font-bricolage), ui-sans-serif, system-ui, sans-serif"; Lora: "var(--font-lora), Georgia, serif"; Playfair Display: "var(--font-playfair), Georgia, serif"; Instrument Serif: "var(--font-instrument-serif), Georgia, serif"; Source Serif: "var(--font-source-serif), Georgia, serif"; Crimson Pro: "var(--font-crimson), Georgia, serif"; Bitter: "var(--font-bitter), Rockwell, Georgia, serif"; Young Serif: "var(--font-young-serif), Georgia, serif"; JetBrains Mono: "var(--font-jetbrains), ui-monospace, monospace". The first six use fonts every device has; the rest are web fonts miow serves. Nothing else loads, and a value with quotes is discarded.

  • roundness, density, scale and depth are numbers from 0 to 1 that shape every page: corners from square to round, spacing from roomy to compact, headings from close to body size to far larger, and shadow from flat to raised. Choose them for the business as you choose its colours; 0.33, 0.5, 0.5 and 0 is a plain, even look.

  • --hero-entrance makes an opening's words arrive as the page opens: "rise", "focus" or "unveil". Leave it unset unless the business suits motion.

  • background is a picture by https URL held behind the whole site, which every page scrolls over on frosted panels of the page's colour, an opening with no picture of its own sitting straight on it: for a single scrolling page with a strong sense of place, and only a picture URL the brief gives you.

  • Looks to start from, each its colours in words and the rest of its theme. Where one suits the business, take its theme whole and choose colours that match its words, in the business's own hue:

    • Gallery: white walls and near-black ink, one quiet accent, a slim display serif over a clean sans, square corners and wide margins; for photographers, artists, architects and galleries. {"roundness":0,"density":0.15,"scale":0.9,"depth":0,"--font-sans":"var(--font-geist), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-instrument-serif), Georgia, serif","--font-heading-weight":"400","--hero-entrance":"focus"}

    • Maker: warm oat and clay, one earthy accent, soft corners and a friendly grotesk; for ceramics, homeware, bakeries and small makers. {"roundness":0.4,"density":0.35,"scale":0.75,"depth":0,"--font-sans":"var(--font-dm-sans), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-bricolage), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"600","--hero-entrance":"rise"}

    • Quiet luxury: ivory and warm near-black, one muted accent, a high-contrast serif and room to breathe; for premium goods, fashion and private services. {"roundness":0.05,"density":0.1,"scale":0.75,"depth":0,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-playfair), Georgia, serif","--font-heading-weight":"400","--hero-entrance":"focus"}

    • Japanese minimal: rice paper and soft ink, one seal-red accent, a calligraphic serif and wide empty space; for studios, tea, food and wellness. {"roundness":0,"density":0,"scale":0.6,"depth":0,"--font-sans":"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif","--font-heading":"var(--font-crimson), Georgia, serif","--font-heading-weight":"400","--hero-entrance":"rise"}

    • Editorial: warm paper and ink-black, one vermilion accent, a large serif over a clean sans, square corners; for writers, magazines and studios. {"roundness":0,"density":0.35,"scale":0.9,"depth":0,"--font-sans":"var(--font-work-sans), ui-sans-serif, system-ui, sans-serif","--font-heading":"Charter, Bitstream Charter, Sitka Text, Cambria, Georgia, serif","--font-heading-weight":"400"}

    • Corporate: white, blue-grey ink and one deep accent, one sans throughout, modest headings; for firms, finance and anything that must look dependable. {"roundness":0.33,"density":0.55,"scale":0.25,"depth":0.1,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-sans)","--font-heading-weight":"700"}

    • Dark tech: near-black with fine lines and one bright accent, a geometric sans; for software, developer tools and technical products. {"roundness":0.33,"density":0.6,"scale":0.45,"depth":0,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-space-grotesk), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"700","--hero-entrance":"rise"}

    • Playful: cream with saturated colour and black ink, round corners and a chunky sans; for shops, children, food and events. {"roundness":0.66,"density":0.45,"scale":0.8,"depth":0,"--font-sans":"var(--font-nunito), ui-rounded, system-ui, sans-serif","--font-heading":"var(--font-bricolage), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"700","--hero-entrance":"rise"}

    • Industrial: aged paper and black, one signal colour such as safety orange, square edges and a heavy grotesk at great size; for makers, workshops and engineering. {"roundness":0,"density":0.65,"scale":1,"depth":0,"--font-sans":"var(--font-work-sans), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-space-grotesk), ui-sans-serif, system-ui, sans-serif","--font-heading-weight":"700","--hero-entrance":"unveil"}

    • Retro print: warm print stock, print-black and one riso ink such as red, a bold slab over a quiet serif; for bookshops, records, posters and local makers. {"roundness":0,"density":0.4,"scale":1,"depth":0,"--font-sans":"var(--font-source-serif), Georgia, serif","--font-heading":"var(--font-bitter), Rockwell, Georgia, serif","--font-heading-weight":"700"}

    • Cinematic: warm studio paper and black, one electric accent, a tight sans at very large sizes and an opening that unveils; for launches, film and agencies. {"roundness":0.1,"density":0.3,"scale":1,"depth":0,"--font-sans":"var(--font-inter), ui-sans-serif, system-ui, sans-serif","--font-heading":"var(--font-sans)","--font-heading-weight":"700","--hero-entrance":"unveil"}

Copy

  • Most visitors read on a phone. Short paragraphs, plain words, the important thing first.

  • Write in the business's own voice, from what you were given.

  • Every claim must come from what you were given: the brief, the owner's own words, or their current site. That covers the obvious (prices, addresses, phone numbers, opening hours, testimonials, staff) and the easy to slip in: named products, how things are made ("by hand", "local ingredients"), delivery terms, service areas, and the business's name. Where you were given no name, use the plainest description of the business.

  • A thin brief makes a short site. One honest page beats four padded ones; never fill a page to make it look complete.

Images: upload_image first, then use the URL it returns; a picture from anywhere else is refused.

NameRequiredDescriptionDefault
nameNoA new name for the site
pagesNoPages to create or replace, each whole
themeNoKeys to change. hue, chroma, tone and contrast, sent together, derive all six colours and replace those set before; a colour sent beside them is kept over it.
tokenNoThe site token from create_site or the site's settings. Omit if your Authorization header carries it.
deleteNoPaths of pages to remove
headerNoReplaces the header whole; {} clears it
summaryYesWhat this change does, in a few words, for the history

TDQS

A4.6/5.0
Behavior5/5

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

Beyond the annotations, it states that omitted pages are left untouched, that replacing is whole-page, that deletions happen via the delete list, and that every write can be undone with history or undo. It also warns that image URLs must come from upload_image and that some block fields, like product files, must be preserved as read.

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

Conciseness2/5

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

The description is front-loaded with a useful summary and organized under headings, but it is exceptionally long and reads like full product documentation rather than a tool definition. Large sections on every block type, theme presets, font stacks, and copy style exceed what is needed to select and invoke the tool, even given the schema's complexity.

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

Completeness5/5

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

Given the tool's complexity, nested schema, and lack of an output schema, the description is complete enough to guide correct invocation. It explains page-level behavior, block selection, theme setup, image prerequisites, and what the reply's notes will contain.

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 coverage is 100%, so the schema already documents all seven parameters and most nested fields. The description still adds meaning beyond the schema by explaining cross-parameter rules, such as the single-h1 requirement, page path constraints, when to use specific blocks, and how theme parameters interact.

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

Purpose5/5

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

The opening sentence states a specific verb and resource: create or replace whole pages, delete pages, and optionally rename the site, change its theme, or set its header. It immediately distinguishes whole-page writes from block-level editing by naming update_block, insert_block, move_block and remove_block as the tools for partial changes.

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

Usage Guidelines5/5

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

The description explicitly says to use this tool when sending a page whole and to use the block tools when changing only part of a page. It also gives concrete when/when-not guidance for blocks, theme changes, image uploads, and destructive deletes, leaving little ambiguity about when this tool is the right choice.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updates
    • Changedinsert_block1 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"
        +  }
        +]
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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"
        +  }
        +]
    • Changedwrite_site1 field changed
      • changedInput schema / properties / pages / items / properties / content / items / 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"
        +  }
        +]
  2. 3 tool updates
    • Changedinsert_block1 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"
        +  }
        +]
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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"
        +  }
        +]
    • Changedwrite_site3 fields changed
      • addedInput schema / properties / header / properties / icons
        Added value: +{
        +  "description": "The header's menu as icons: a page whose path names a kind (blog, news, shop, contact, about, events, work) as that kind's icon, its title its label",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / pages / items / properties / content / items / 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"
        +  }
        +]
      • addedInput schema / properties / theme / properties / --header-opacity
        Added value: +{
        +  "description": "With \"sticky\", how much of the page the header hides as it scrolls under it, from 0 clear to 1 solid; unset, 0.82",
        +  "pattern": "^(?:0?\\.\\d+|[01])?$",
        +  "type": "string"
        +}
  3. 3 tool updates
    • Changedinsert_block1 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"
        +  }
        +]
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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"
        +  }
        +]
    • Changedwrite_site8 fields changed
      • addedInput schema / properties / header / properties / action / properties / label / description
        Added value: +"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"
      • changedInput schema / properties / header / properties / styledName / description
        Previous value: -"The site's name as the header draws it: Plain text; words may be wrapped in <strong> or <em>. Shown only while its words are the site's name"New value: +"The site's name as the header draws it, inside its link home: 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. Shown only while its words are the site's name"
      • changedInput schema / properties / header / properties / tagline / description
        Previous value: -"A short line under the name: Plain text; words may be wrapped in <strong> or <em>"New value: +"A short line under the name, inside its link home: 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"
      • changedInput schema / properties / pages / items / properties / content / items / 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"
        +  }
        +]
      • removedInput schema / properties / theme / properties / --color-name
        Removed value: -{
        -  "description": "The name's colour; unset, the headings'",
        -  "type": "string"
        -}
      • removedInput schema / properties / theme / properties / --color-name-strong
        Removed value: -{
        -  "description": "The colour of the words in <strong> in the header's styledName; unset, the name's",
        -  "type": "string"
        -}
      • removedInput schema / properties / theme / properties / --color-tagline
        Removed value: -{
        -  "description": "The line's colour; unset, the quiet text's",
        -  "type": "string"
        -}
      • removedInput schema / properties / theme / properties / --color-tagline-strong
        Removed value: -{
        -  "description": "The colour of the words in <strong> in the line; unset, the line's",
        -  "type": "string"
        -}
  4. 1 tool update
    • Changedwrite_site1 field changed
      • changedInput schema / properties / pages / items / properties / path / description
        Previous value: -"\"\" is the home page; else slash-separated slugs, no leading slash, never starting \"search\", \"mcp\" or \"download\""New value: +"\"\" is the home page; else slash-separated slugs, no leading slash, never starting \"search\", \"mcp\", \"download\""
  5. 4 tool updates
    • Changedinsert_block1 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"
        +  }
        +]
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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"
        +  }
        +]
    • Addedsend_feedback
    • Changedwrite_site2 fields changed
      • addedInput schema / properties / header / properties / wordmark
        Added value: +{
        +  "description": "The logo spells the site's name, so the name beside it is left for screen readers alone, not printed twice",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / pages / items / properties / content / items / 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. 3 tool updates
    • Changedinsert_block1 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"
        +  }
        +]
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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"
        +  }
        +]
    • Changedwrite_site2 fields changed
      • changedInput schema / properties / header / properties / menu / description
        Previous value: -"\"side\" puts the name and menu down the left from a laptop up; across the top, \"start\" sets the menu just after the name and \"center\" in the middle; unset, at the end"New value: +"Where the header's menu sits, so only while \"nav\" puts a menu in the header: \"side\" puts the name and menu down the left from a laptop up; across the top, \"start\" sets the menu just after the name and \"center\" in the middle; unset, at the end"
      • changedInput schema / properties / pages / items / properties / content / items / 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. 6 tool updates
    • Addedinsert_block
    • Addedmove_block
    • Addedremove_block
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -                          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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": {
        +        "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"
        +  }
        +]
    • Addedupdate_block
    • Changedwrite_site3 fields changed
      • removedInput schema / properties / delete / default
        Removed value: -[]
      • changedInput schema / properties / pages / items / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -                          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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": {
        +        "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"
        +  }
        +]
      • removedInput schema / properties / pages / items / properties / path / pattern
        Removed value: -"^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$"
  8. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +                          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +  }
        +]
    • Changedwrite_site4 fields changed
      • changedInput schema / properties / pages / items / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +                          "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +  }
        +]
      • changedInput schema / properties / pages / items / properties / path / description
        Previous value: -"\"\" is the home page; else slash-separated slugs, no leading slash, never \"search\" or \"mcp\""New value: +"\"\" is the home page; else slash-separated slugs, no leading slash, never starting \"search\", \"mcp\" or \"download\""
      • changedInput schema / properties / pages / items / properties / path / pattern
        Previous value: -"^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$"New value: +"^(?!(?:search|mcp|download)(?:\\/|$))(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$"
      • addedInput schema / properties / theme / properties / background
        Added value: +{
        +  "description": "A picture behind the whole site, by https URL, held still as the pages scroll over it: every block then sits on a frosted panel of the page's colour, and an opening with no picture of its own sits straight on it. For a single scrolling page with a strong sense of place; \"\" removes it",
        +  "pattern": "^(?:https:\\/\\/\\S+)?$",
        +  "type": "string"
        +}
  9. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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": "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "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"
        +  }
        +]
    • Changedwrite_site3 fields changed
      • addedInput schema / properties / header / properties / nav
        Added value: +{
        +  "description": "Where the menu of pages is: \"header\" across the header; \"sidebar\" in a sidebar beside each page, with the search box and the page's sections; \"both\"; unset, the header on a site of pages and the sidebar on a wiki. The search box sits in the sidebar when there is one, else in the header",
        +  "enum": [
        +    "header",
        +    "sidebar",
        +    "both"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / header / properties / search
        Removed value: -{
        -  "description": "A search field in the header, finding any of the site's pages by its words",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / pages / items / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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": "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "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"
        +  }
        +]
  10. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -      "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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": "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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": "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"
        +  }
        +]
    • Changedwrite_site1 field changed
      • changedInput schema / properties / pages / items / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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": {
        -      "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "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"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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": "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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": "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"
        +  }
        +]
  11. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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": "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +      "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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": "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"
        +  }
        +]
    • Changedwrite_site2 fields changed
      • changedInput schema / properties / pages / items / properties / content / items / 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "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"
        -      },
        -      "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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "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"
        -      },
        -      "monthly": {
        -        "description": "The donor may give it every month as well as once",
        -        "type": "boolean"
        -      },
        -      "type": {
        -        "const": "donate",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "amounts"
        -    ],
        -    "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"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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": "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": {
        +        "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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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": {
        +      "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "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"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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": "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"
        +  }
        +]
      • addedInput schema / properties / pages / items / properties / image
        Added value: +{
        +  "anyOf": [
        +    {
        +      "pattern": "^https:\\/\\/\\S+$",
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The picture a link to the page shows in a chat or a feed, by https URL, cropped to 1200×630; null draws a card of the page's title over its first picture or the site's colours"
        +}
  12. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; 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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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": "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"
        +  }
        +]
    • Changedwrite_site1 field changed
      • changedInput schema / properties / pages / items / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; 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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit on a new block, keep as read on one you send back; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "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"
        +      },
        +      "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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "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"
        +      },
        +      "monthly": {
        +        "description": "The donor may give it every month as well as once",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "const": "donate",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "amounts"
        +    ],
        +    "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"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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": "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"
        +  }
        +]
  13. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; 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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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"
        +      },
        +      "id": {
        +        "description": "Omit; 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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedwrite_site3 fields changed
      • changedInput schema / properties / pages / items / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; 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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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"
        +      },
        +      "id": {
        +        "description": "Omit; 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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / pages / items / properties / path / description
        Previous value: -"\"\" is the home page; else slash-separated slugs, no leading slash, never \"search\""New value: +"\"\" is the home page; else slash-separated slugs, no leading slash, never \"search\" or \"mcp\""
      • changedInput schema / properties / pages / items / properties / path / pattern
        Previous value: -"^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$"New value: +"^(?!(?:search|mcp)$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$"
  14. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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>",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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"
        +      },
        +      "id": {
        +        "description": "Omit; 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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedwrite_site1 field changed
      • changedInput schema / properties / pages / items / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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>",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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"
        +      },
        +      "id": {
        +        "description": "Omit; 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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
  15. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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>",
        -        "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 elsewhere: a publisher's or a gallery's page",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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"
        -      },
        -      "sold": {
        -        "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",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "product",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "images",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "amounts": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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>",
        +        "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"
        +      },
        +      "id": {
        +        "description": "Omit; 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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedwrite_site19 fields changed
      • addedInput schema / properties / header / properties / styledName
        Added value: +{
        +  "description": "The site's name as the header draws it: Plain text; words may be wrapped in <strong> or <em>. Shown only while its words are the site's name",
        +  "type": "string"
        +}
      • changedInput schema / properties / header / properties / tagline / description
        Previous value: -"A short line under the name"New value: +"A short line under the name: Plain text; words may be wrapped in <strong> or <em>"
      • changedInput schema / properties / pages / items / properties / content / items / 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; 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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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": {
        -          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -          "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",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "source"
        -    ],
        -    "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; 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; 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; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; 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": {
        -                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                          "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",
        -                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "source"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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; 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>",
        -        "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 elsewhere: a publisher's or a gallery's page",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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"
        -      },
        -      "sold": {
        -        "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",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "product",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "images",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "amounts": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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>",
        +        "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"
        +      },
        +      "id": {
        +        "description": "Omit; 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": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedInput schema / properties / theme / properties / --color-header-button
        Added value: +{
        +  "description": "The header button's colour; unset, the accent",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --color-header-button-text
        Added value: +{
        +  "description": "The colour of its words; unset, the background's",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --color-name
        Added value: +{
        +  "description": "The name's colour; unset, the headings'",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --color-name-strong
        Added value: +{
        +  "description": "The colour of the words in <strong> in the header's styledName; unset, the name's",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --color-nav
        Added value: +{
        +  "description": "The menu's colour; unset, the headings'",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --color-tagline
        Added value: +{
        +  "description": "The line's colour; unset, the quiet text's",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --color-tagline-strong
        Added value: +{
        +  "description": "The colour of the words in <strong> in the line; unset, the line's",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --font-header-button
        Added value: +{
        +  "description": "The font of the header's button; unset, the text's",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --font-name
        Added value: +{
        +  "description": "The site's name in a font of its own, written as --font-sans is; unset, --font-header's",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --font-nav
        Added value: +{
        +  "description": "The header menu's font, written as --font-sans is; unset, --font-header's",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --header-button-size
        Added value: +{
        +  "description": "The size of the words on the header's button, \"1.1rem\"; unset, the text's",
        +  "pattern": "^(?:\\d*\\.?\\d+rem)?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --heading-align
        Added value: +{
        +  "description": "Where the headings in a page's text sit: \"center\" centred; unset, at the start of the line",
        +  "enum": [
        +    "",
        +    "start",
        +    "center",
        +    "end"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --name-weight
        Added value: +{
        +  "description": "The name's weight; unset, the headings'",
        +  "pattern": "^(?:[1-9]00)?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --nav-weight
        Added value: +{
        +  "description": "The menu's weight; unset, the headings'",
        +  "pattern": "^(?:[1-9]00)?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --tagline-size
        Added value: +{
        +  "description": "The size of the line under the name, \"0.9rem\"; unset, a little under the text's",
        +  "pattern": "^(?:\\d*\\.?\\d+rem)?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / theme / properties / --tagline-style
        Added value: +{
        +  "description": "\"italic\" sets the line under the name in italic",
        +  "enum": [
        +    "",
        +    "italic"
        +  ],
        +  "type": "string"
        +}
  16. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain semantic HTML",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "content",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "alt": {
        -        "type": "string"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "caption": {
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "src": {
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "image",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src",
        -      "alt"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "poster": {
        -        "description": "The picture shown before it plays",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "src": {
        -        "description": "An MP4 file",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "video",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src"
        -    ],
        -    "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "limit": {
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "tagPath": {
        -        "description": "A category's path; unset, the whole wiki",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "recentPages",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "limit"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "pageIds": {
        -        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 48,
        -        "type": "array"
        -      },
        -      "type": {
        -        "const": "pageList",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "pageIds"
        -    ],
        -    "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"
        -      },
        -      "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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "text": {
        -                        "description": "Plain semantic HTML",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "content",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "text"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "alt": {
        -                        "type": "string"
        -                      },
        -                      "caption": {
        -                        "type": "string"
        -                      },
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "image",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src",
        -                      "alt"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "poster": {
        -                        "description": "The picture shown before it plays",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "description": "An MP4 file",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "video",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "limit": {
        -                        "maximum": 50,
        -                        "minimum": 1,
        -                        "type": "integer"
        -                      },
        -                      "tagPath": {
        -                        "description": "A category's path; unset, the whole wiki",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "recentPages",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "limit"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "pageIds": {
        -                        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                        "items": {
        -                          "minLength": 1,
        -                          "type": "string"
        -                        },
        -                        "maxItems": 48,
        -                        "type": "array"
        -                      },
        -                      "type": {
        -                        "const": "pageList",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "pageIds"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "columns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "columns"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "items": {
        -          "oneOf": [
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "text": {
        -                  "description": "Plain semantic HTML",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "content",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "text"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "alt": {
        -                  "type": "string"
        -                },
        -                "caption": {
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "image",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src",
        -                "alt"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "poster": {
        -                  "description": "The picture shown before it plays",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "description": "An MP4 file",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "video",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "intro": {
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "linkGrid",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "groups"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "limit": {
        -                  "maximum": 50,
        -                  "minimum": 1,
        -                  "type": "integer"
        -                },
        -                "tagPath": {
        -                  "description": "A category's path; unset, the whole wiki",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "recentPages",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "limit"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "pageIds": {
        -                  "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                  "items": {
        -                    "minLength": 1,
        -                    "type": "string"
        -                  },
        -                  "maxItems": 48,
        -                  "type": "array"
        -                },
        -                "type": {
        -                  "const": "pageList",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "pageIds"
        -              ],
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "infobox",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "description": "Each picture once, in order",
        -        "items": {
        -          "properties": {
        -            "alt": {
        -              "type": "string"
        -            },
        -            "caption": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            },
        -            "src": {
        -              "pattern": "^https:\\/\\/\\S+$",
        -              "type": "string"
        -            },
        -            "type": {
        -              "const": "image",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "src",
        -            "alt"
        -          ],
        -          "type": "object"
        -        },
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "carousel",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "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"
        -      },
        -      "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; 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>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "hero",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading"
        -    ],
        -    "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"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "heading": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "cta",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading",
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "action": {
        -        "description": "A button of its own, to where it is sold elsewhere: a publisher's or a gallery's page",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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"
        -      },
        -      "sold": {
        -        "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",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "product",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "images",
        -      "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; assigned on write",
        -        "type": "string"
        -      },
        -      "menu": {
        -        "description": "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"
        -      },
        -      "shape": {
        -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square",
        -        "enum": [
        -          "portrait",
        -          "landscape"
        -        ],
        -        "type": "string"
        -      },
        -      "tag": {
        -        "description": "Only products with this tag; omit for all",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "products",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "amounts": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "newest": {
        -        "description": "List this many of the newest pages instead",
        -        "maximum": 24,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "pages",
        -        "type": "string"
        -      },
        -      "under": {
        -        "description": "List the pages directly under this path; omit for the top level",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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>",
        +        "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 elsewhere: a publisher's or a gallery's page",
        +        "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"
        +      },
        +      "id": {
        +        "description": "Omit; 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"
        +      },
        +      "sold": {
        +        "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",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "product",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "images",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "amounts": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedwrite_site1 field changed
      • changedInput schema / properties / pages / items / properties / content / items / 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; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain semantic HTML",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "content",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "alt": {
        -        "type": "string"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "caption": {
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "src": {
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "image",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src",
        -      "alt"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "poster": {
        -        "description": "The picture shown before it plays",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "src": {
        -        "description": "An MP4 file",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "video",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src"
        -    ],
        -    "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "limit": {
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "tagPath": {
        -        "description": "A category's path; unset, the whole wiki",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "recentPages",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "limit"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "pageIds": {
        -        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 48,
        -        "type": "array"
        -      },
        -      "type": {
        -        "const": "pageList",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "pageIds"
        -    ],
        -    "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"
        -      },
        -      "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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "text": {
        -                        "description": "Plain semantic HTML",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "content",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "text"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "alt": {
        -                        "type": "string"
        -                      },
        -                      "caption": {
        -                        "type": "string"
        -                      },
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "image",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src",
        -                      "alt"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "poster": {
        -                        "description": "The picture shown before it plays",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "description": "An MP4 file",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "video",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "limit": {
        -                        "maximum": 50,
        -                        "minimum": 1,
        -                        "type": "integer"
        -                      },
        -                      "tagPath": {
        -                        "description": "A category's path; unset, the whole wiki",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "recentPages",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "limit"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "pageIds": {
        -                        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                        "items": {
        -                          "minLength": 1,
        -                          "type": "string"
        -                        },
        -                        "maxItems": 48,
        -                        "type": "array"
        -                      },
        -                      "type": {
        -                        "const": "pageList",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "pageIds"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "columns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "columns"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "items": {
        -          "oneOf": [
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "text": {
        -                  "description": "Plain semantic HTML",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "content",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "text"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "alt": {
        -                  "type": "string"
        -                },
        -                "caption": {
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "image",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src",
        -                "alt"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "poster": {
        -                  "description": "The picture shown before it plays",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "description": "An MP4 file",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "video",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "intro": {
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "linkGrid",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "groups"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "limit": {
        -                  "maximum": 50,
        -                  "minimum": 1,
        -                  "type": "integer"
        -                },
        -                "tagPath": {
        -                  "description": "A category's path; unset, the whole wiki",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "recentPages",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "limit"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "pageIds": {
        -                  "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                  "items": {
        -                    "minLength": 1,
        -                    "type": "string"
        -                  },
        -                  "maxItems": 48,
        -                  "type": "array"
        -                },
        -                "type": {
        -                  "const": "pageList",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "pageIds"
        -              ],
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "infobox",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "description": "Each picture once, in order",
        -        "items": {
        -          "properties": {
        -            "alt": {
        -              "type": "string"
        -            },
        -            "caption": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            },
        -            "src": {
        -              "pattern": "^https:\\/\\/\\S+$",
        -              "type": "string"
        -            },
        -            "type": {
        -              "const": "image",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "src",
        -            "alt"
        -          ],
        -          "type": "object"
        -        },
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "carousel",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "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"
        -      },
        -      "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; 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>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "hero",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading"
        -    ],
        -    "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"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "heading": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "cta",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading",
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "action": {
        -        "description": "A button of its own, to where it is sold elsewhere: a publisher's or a gallery's page",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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"
        -      },
        -      "sold": {
        -        "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",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "product",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "images",
        -      "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; assigned on write",
        -        "type": "string"
        -      },
        -      "menu": {
        -        "description": "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"
        -      },
        -      "shape": {
        -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square",
        -        "enum": [
        -          "portrait",
        -          "landscape"
        -        ],
        -        "type": "string"
        -      },
        -      "tag": {
        -        "description": "Only products with this tag; omit for all",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "products",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "amounts": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "newest": {
        -        "description": "List this many of the newest pages instead",
        -        "maximum": 24,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "pages",
        -        "type": "string"
        -      },
        -      "under": {
        -        "description": "List the pages directly under this path; omit for the top level",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; 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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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": {
        +          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +          "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",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "source"
        +    ],
        +    "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; 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; 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; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; 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": {
        +                          "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                          "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",
        +                        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "source"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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; 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>",
        +        "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 elsewhere: a publisher's or a gallery's page",
        +        "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"
        +      },
        +      "id": {
        +        "description": "Omit; 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"
        +      },
        +      "sold": {
        +        "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",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "product",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "images",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "amounts": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
  17. 3 tool updates
    • Changedget_site1 field changed
      • addedInput schema / properties / site
        Added value: +{
        +  "description": "Any live site's address, as acme.miow.me, acme.com or a page's url, to read what anyone can see there without a token",
        +  "type": "string"
        +}
    • Changedread_page1 field changed
      • addedInput schema / properties / site
        Added value: +{
        +  "description": "Any live site's address, as acme.miow.me, acme.com or a page's url, to read what anyone can see there without a token",
        +  "type": "string"
        +}
    • Changedsearch_site1 field changed
      • addedInput schema / properties / site
        Added value: +{
        +  "description": "Any live site's address, as acme.miow.me, acme.com or a page's url, to read what anyone can see there without a token",
        +  "type": "string"
        +}
  18. 2 tool updates
    • Changedsave_wiki_page1 field changed
      • changedInput schema / properties / content / items / 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; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain semantic HTML",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "content",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "alt": {
        -        "type": "string"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "caption": {
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "src": {
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "image",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src",
        -      "alt"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "poster": {
        -        "description": "The picture shown before it plays",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "src": {
        -        "description": "An MP4 file",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "video",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src"
        -    ],
        -    "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "limit": {
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "tagPath": {
        -        "description": "A category's path; unset, the whole wiki",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "recentPages",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "limit"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "pageIds": {
        -        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 48,
        -        "type": "array"
        -      },
        -      "type": {
        -        "const": "pageList",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "pageIds"
        -    ],
        -    "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"
        -      },
        -      "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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "text": {
        -                        "description": "Plain semantic HTML",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "content",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "text"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "alt": {
        -                        "type": "string"
        -                      },
        -                      "caption": {
        -                        "type": "string"
        -                      },
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "image",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src",
        -                      "alt"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "poster": {
        -                        "description": "The picture shown before it plays",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "description": "An MP4 file",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "video",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "limit": {
        -                        "maximum": 50,
        -                        "minimum": 1,
        -                        "type": "integer"
        -                      },
        -                      "tagPath": {
        -                        "description": "A category's path; unset, the whole wiki",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "recentPages",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "limit"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "pageIds": {
        -                        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                        "items": {
        -                          "minLength": 1,
        -                          "type": "string"
        -                        },
        -                        "maxItems": 48,
        -                        "type": "array"
        -                      },
        -                      "type": {
        -                        "const": "pageList",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "pageIds"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "columns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "columns"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "items": {
        -          "oneOf": [
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "text": {
        -                  "description": "Plain semantic HTML",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "content",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "text"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "alt": {
        -                  "type": "string"
        -                },
        -                "caption": {
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "image",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src",
        -                "alt"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "poster": {
        -                  "description": "The picture shown before it plays",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "description": "An MP4 file",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "video",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "intro": {
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "linkGrid",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "groups"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "limit": {
        -                  "maximum": 50,
        -                  "minimum": 1,
        -                  "type": "integer"
        -                },
        -                "tagPath": {
        -                  "description": "A category's path; unset, the whole wiki",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "recentPages",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "limit"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "pageIds": {
        -                  "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                  "items": {
        -                    "minLength": 1,
        -                    "type": "string"
        -                  },
        -                  "maxItems": 48,
        -                  "type": "array"
        -                },
        -                "type": {
        -                  "const": "pageList",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "pageIds"
        -              ],
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "infobox",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "description": "Each picture once, in order",
        -        "items": {
        -          "properties": {
        -            "alt": {
        -              "type": "string"
        -            },
        -            "caption": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            },
        -            "src": {
        -              "pattern": "^https:\\/\\/\\S+$",
        -              "type": "string"
        -            },
        -            "type": {
        -              "const": "image",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "src",
        -            "alt"
        -          ],
        -          "type": "object"
        -        },
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "carousel",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "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"
        -      },
        -      "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"
        -      },
        -      "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; 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>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "hero",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading"
        -    ],
        -    "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"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "heading": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "cta",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading",
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "action": {
        -        "description": "A button of its own, to where it is sold elsewhere: a publisher's or a gallery's page",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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"
        -      },
        -      "sold": {
        -        "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",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "product",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "images",
        -      "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; assigned on write",
        -        "type": "string"
        -      },
        -      "menu": {
        -        "description": "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"
        -      },
        -      "shape": {
        -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square",
        -        "enum": [
        -          "portrait",
        -          "landscape"
        -        ],
        -        "type": "string"
        -      },
        -      "tag": {
        -        "description": "Only products with this tag; omit for all",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "products",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "amounts": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "newest": {
        -        "description": "List this many of the newest pages instead",
        -        "maximum": 24,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "pages",
        -        "type": "string"
        -      },
        -      "under": {
        -        "description": "List the pages directly under this path; omit for the top level",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; assigned on write",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Plain semantic HTML",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "content",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "alt": {
        +        "type": "string"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "caption": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "src": {
        +        "pattern": "^https:\\/\\/\\S+$",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "image",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "src",
        +      "alt"
        +    ],
        +    "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; assigned on write",
        +        "type": "string"
        +      },
        +      "poster": {
        +        "description": "The picture shown before it plays",
        +        "pattern": "^https:\\/\\/\\S+$",
        +        "type": "string"
        +      },
        +      "src": {
        +        "description": "An MP4 file",
        +        "pattern": "^https:\\/\\/\\S+$",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "video",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "src"
        +    ],
        +    "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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "limit": {
        +        "maximum": 50,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "tagPath": {
        +        "description": "A category's path; unset, the whole wiki",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "recentPages",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "limit"
        +    ],
        +    "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; assigned on write",
        +        "type": "string"
        +      },
        +      "pageIds": {
        +        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 48,
        +        "type": "array"
        +      },
        +      "type": {
        +        "const": "pageList",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "pageIds"
        +    ],
        +    "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"
        +      },
        +      "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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "text": {
        +                        "description": "Plain semantic HTML",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "content",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "text"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "alt": {
        +                        "type": "string"
        +                      },
        +                      "caption": {
        +                        "type": "string"
        +                      },
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "src": {
        +                        "pattern": "^https:\\/\\/\\S+$",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "image",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "src",
        +                      "alt"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "poster": {
        +                        "description": "The picture shown before it plays",
        +                        "pattern": "^https:\\/\\/\\S+$",
        +                        "type": "string"
        +                      },
        +                      "src": {
        +                        "description": "An MP4 file",
        +                        "pattern": "^https:\\/\\/\\S+$",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "video",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "src"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "limit": {
        +                        "maximum": 50,
        +                        "minimum": 1,
        +                        "type": "integer"
        +                      },
        +                      "tagPath": {
        +                        "description": "A category's path; unset, the whole wiki",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "recentPages",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "limit"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "pageIds": {
        +                        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        +                        "items": {
        +                          "minLength": 1,
        +                          "type": "string"
        +                        },
        +                        "maxItems": 48,
        +                        "type": "array"
        +                      },
        +                      "type": {
        +                        "const": "pageList",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "pageIds"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "columns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "columns"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "blocks": {
        +        "items": {
        +          "oneOf": [
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "text": {
        +                  "description": "Plain semantic HTML",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "content",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "text"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "alt": {
        +                  "type": "string"
        +                },
        +                "caption": {
        +                  "type": "string"
        +                },
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "src": {
        +                  "pattern": "^https:\\/\\/\\S+$",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "image",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "src",
        +                "alt"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "poster": {
        +                  "description": "The picture shown before it plays",
        +                  "pattern": "^https:\\/\\/\\S+$",
        +                  "type": "string"
        +                },
        +                "src": {
        +                  "description": "An MP4 file",
        +                  "pattern": "^https:\\/\\/\\S+$",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "video",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "src"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; 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; assigned on write",
        +                  "type": "string"
        +                },
        +                "items": {
        +                  "items": {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; 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; 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; assigned on write",
        +                  "type": "string"
        +                },
        +                "intro": {
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "linkGrid",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "groups"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "items": {
        +                  "items": {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; 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; 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": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "limit": {
        +                  "maximum": 50,
        +                  "minimum": 1,
        +                  "type": "integer"
        +                },
        +                "tagPath": {
        +                  "description": "A category's path; unset, the whole wiki",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "recentPages",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "limit"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "pageIds": {
        +                  "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        +                  "items": {
        +                    "minLength": 1,
        +                    "type": "string"
        +                  },
        +                  "maxItems": 48,
        +                  "type": "array"
        +                },
        +                "type": {
        +                  "const": "pageList",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "pageIds"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "infobox",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "blocks"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "blocks": {
        +        "description": "Each picture once, in order",
        +        "items": {
        +          "properties": {
        +            "alt": {
        +              "type": "string"
        +            },
        +            "caption": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            },
        +            "src": {
        +              "pattern": "^https:\\/\\/\\S+$",
        +              "type": "string"
        +            },
        +            "type": {
        +              "const": "image",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "type",
        +            "src",
        +            "alt"
        +          ],
        +          "type": "object"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "carousel",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "blocks"
        +    ],
        +    "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"
        +      },
        +      "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; 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>",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "hero",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "heading"
        +    ],
        +    "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"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "heading": {
        +        "description": "Plain text; words may be wrapped in <strong> or <em>",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Plain text; words may be wrapped in <strong> or <em>",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "cta",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "heading",
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "description": "A button of its own, to where it is sold elsewhere: a publisher's or a gallery's page",
        +        "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"
        +      },
        +      "id": {
        +        "description": "Omit; 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"
        +      },
        +      "sold": {
        +        "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",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "product",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "images",
        +      "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; assigned on write",
        +        "type": "string"
        +      },
        +      "menu": {
        +        "description": "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"
        +      },
        +      "shape": {
        +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square",
        +        "enum": [
        +          "portrait",
        +          "landscape"
        +        ],
        +        "type": "string"
        +      },
        +      "tag": {
        +        "description": "Only products with this tag; omit for all",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "products",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "amounts": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "newest": {
        +        "description": "List this many of the newest pages instead",
        +        "maximum": 24,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "pages",
        +        "type": "string"
        +      },
        +      "under": {
        +        "description": "List the pages directly under this path; omit for the top level",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedwrite_site1 field changed
      • changedInput schema / properties / pages / items / properties / content / items / 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; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain semantic HTML",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "content",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "text"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "alt": {
        -        "type": "string"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "caption": {
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "src": {
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "image",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src",
        -      "alt"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "poster": {
        -        "description": "The picture shown before it plays",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "src": {
        -        "description": "An MP4 file",
        -        "pattern": "^https:\\/\\/\\S+$",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "video",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "src"
        -    ],
        -    "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "items": {
        -        "items": {
        -          "properties": {
        -            "id": {
        -              "description": "Omit; 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; 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"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "limit": {
        -        "maximum": 50,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "tagPath": {
        -        "description": "A category's path; unset, the whole wiki",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "recentPages",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "limit"
        -    ],
        -    "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; assigned on write",
        -        "type": "string"
        -      },
        -      "pageIds": {
        -        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 48,
        -        "type": "array"
        -      },
        -      "type": {
        -        "const": "pageList",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "pageIds"
        -    ],
        -    "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"
        -      },
        -      "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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "text": {
        -                        "description": "Plain semantic HTML",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "content",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "text"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "alt": {
        -                        "type": "string"
        -                      },
        -                      "caption": {
        -                        "type": "string"
        -                      },
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "image",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src",
        -                      "alt"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "poster": {
        -                        "description": "The picture shown before it plays",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "src": {
        -                        "description": "An MP4 file",
        -                        "pattern": "^https:\\/\\/\\S+$",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "video",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "src"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "intro": {
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "linkGrid",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "groups"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "items": {
        -                        "items": {
        -                          "properties": {
        -                            "id": {
        -                              "description": "Omit; 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; 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": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "limit": {
        -                        "maximum": 50,
        -                        "minimum": 1,
        -                        "type": "integer"
        -                      },
        -                      "tagPath": {
        -                        "description": "A category's path; unset, the whole wiki",
        -                        "type": "string"
        -                      },
        -                      "type": {
        -                        "const": "recentPages",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "limit"
        -                    ],
        -                    "type": "object"
        -                  },
        -                  {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; assigned on write",
        -                        "type": "string"
        -                      },
        -                      "pageIds": {
        -                        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                        "items": {
        -                          "minLength": 1,
        -                          "type": "string"
        -                        },
        -                        "maxItems": 48,
        -                        "type": "array"
        -                      },
        -                      "type": {
        -                        "const": "pageList",
        -                        "type": "string"
        -                      }
        -                    },
        -                    "required": [
        -                      "type",
        -                      "pageIds"
        -                    ],
        -                    "type": "object"
        -                  }
        -                ]
        -              },
        -              "type": "array"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "blocks"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 12,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "gap": {
        -        "enum": [
        -          "sm",
        -          "md",
        -          "lg"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "columns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "columns"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "items": {
        -          "oneOf": [
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "text": {
        -                  "description": "Plain semantic HTML",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "content",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "text"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "alt": {
        -                  "type": "string"
        -                },
        -                "caption": {
        -                  "type": "string"
        -                },
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "image",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src",
        -                "alt"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "poster": {
        -                  "description": "The picture shown before it plays",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "src": {
        -                  "description": "An MP4 file",
        -                  "pattern": "^https:\\/\\/\\S+$",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "video",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "src"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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; assigned on write",
        -                  "type": "string"
        -                },
        -                "intro": {
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "linkGrid",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "groups"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "items": {
        -                  "items": {
        -                    "properties": {
        -                      "id": {
        -                        "description": "Omit; 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; 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": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "limit": {
        -                  "maximum": 50,
        -                  "minimum": 1,
        -                  "type": "integer"
        -                },
        -                "tagPath": {
        -                  "description": "A category's path; unset, the whole wiki",
        -                  "type": "string"
        -                },
        -                "type": {
        -                  "const": "recentPages",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "limit"
        -              ],
        -              "type": "object"
        -            },
        -            {
        -              "properties": {
        -                "id": {
        -                  "description": "Omit; assigned on write",
        -                  "type": "string"
        -                },
        -                "pageIds": {
        -                  "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        -                  "items": {
        -                    "minLength": 1,
        -                    "type": "string"
        -                  },
        -                  "maxItems": 48,
        -                  "type": "array"
        -                },
        -                "type": {
        -                  "const": "pageList",
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "type",
        -                "pageIds"
        -              ],
        -              "type": "object"
        -            }
        -          ]
        -        },
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "infobox",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "blocks": {
        -        "description": "Each picture once, in order",
        -        "items": {
        -          "properties": {
        -            "alt": {
        -              "type": "string"
        -            },
        -            "caption": {
        -              "type": "string"
        -            },
        -            "id": {
        -              "description": "Omit; assigned on write",
        -              "type": "string"
        -            },
        -            "src": {
        -              "pattern": "^https:\\/\\/\\S+$",
        -              "type": "string"
        -            },
        -            "type": {
        -              "const": "image",
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "type",
        -            "src",
        -            "alt"
        -          ],
        -          "type": "object"
        -        },
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "carousel",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "blocks"
        -    ],
        -    "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"
        -      },
        -      "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"
        -      },
        -      "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; 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>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "hero",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading"
        -    ],
        -    "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"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "heading": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; assigned on write",
        -        "type": "string"
        -      },
        -      "text": {
        -        "description": "Plain text; words may be wrapped in <strong> or <em>",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "cta",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "heading",
        -      "action"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "action": {
        -        "description": "A button of its own, to where it is sold elsewhere: a publisher's or a gallery's page",
        -        "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"
        -      },
        -      "id": {
        -        "description": "Omit; 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"
        -      },
        -      "sold": {
        -        "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",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "product",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "images",
        -      "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; assigned on write",
        -        "type": "string"
        -      },
        -      "menu": {
        -        "description": "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"
        -      },
        -      "shape": {
        -        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square",
        -        "enum": [
        -          "portrait",
        -          "landscape"
        -        ],
        -        "type": "string"
        -      },
        -      "tag": {
        -        "description": "Only products with this tag; omit for all",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "products",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "amounts": {
        -        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        -        "items": {
        -          "type": "string"
        -        },
        -        "maxItems": 6,
        -        "minItems": 1,
        -        "type": "array"
        -      },
        -      "band": {
        -        "description": "A full-width strip of the panel or the accent colour behind the block",
        -        "enum": [
        -          "panel",
        -          "accent"
        -        ],
        -        "type": "string"
        -      },
        -      "id": {
        -        "description": "Omit; 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",
        -      "amounts"
        -    ],
        -    "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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "newest": {
        -        "description": "List this many of the newest pages instead",
        -        "maximum": 24,
        -        "minimum": 1,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "pages",
        -        "type": "string"
        -      },
        -      "under": {
        -        "description": "List the pages directly under this path; omit for the top level",
        -        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        -        "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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "search",
        -        "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; 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; 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; 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; assigned on write",
        -        "type": "string"
        -      },
        -      "type": {
        -        "const": "pricing",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New 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; assigned on write",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Plain semantic HTML",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "content",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "alt": {
        +        "type": "string"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "caption": {
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "src": {
        +        "pattern": "^https:\\/\\/\\S+$",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "image",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "src",
        +      "alt"
        +    ],
        +    "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; assigned on write",
        +        "type": "string"
        +      },
        +      "poster": {
        +        "description": "The picture shown before it plays",
        +        "pattern": "^https:\\/\\/\\S+$",
        +        "type": "string"
        +      },
        +      "src": {
        +        "description": "An MP4 file",
        +        "pattern": "^https:\\/\\/\\S+$",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "video",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "src"
        +    ],
        +    "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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "items": {
        +        "items": {
        +          "properties": {
        +            "id": {
        +              "description": "Omit; 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; 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"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "limit": {
        +        "maximum": 50,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "tagPath": {
        +        "description": "A category's path; unset, the whole wiki",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "recentPages",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "limit"
        +    ],
        +    "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; assigned on write",
        +        "type": "string"
        +      },
        +      "pageIds": {
        +        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 48,
        +        "type": "array"
        +      },
        +      "type": {
        +        "const": "pageList",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "pageIds"
        +    ],
        +    "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"
        +      },
        +      "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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "text": {
        +                        "description": "Plain semantic HTML",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "content",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "text"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "alt": {
        +                        "type": "string"
        +                      },
        +                      "caption": {
        +                        "type": "string"
        +                      },
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "src": {
        +                        "pattern": "^https:\\/\\/\\S+$",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "image",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "src",
        +                      "alt"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "poster": {
        +                        "description": "The picture shown before it plays",
        +                        "pattern": "^https:\\/\\/\\S+$",
        +                        "type": "string"
        +                      },
        +                      "src": {
        +                        "description": "An MP4 file",
        +                        "pattern": "^https:\\/\\/\\S+$",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "video",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "src"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "intro": {
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "linkGrid",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "groups"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "items": {
        +                        "items": {
        +                          "properties": {
        +                            "id": {
        +                              "description": "Omit; 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; 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": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "limit": {
        +                        "maximum": 50,
        +                        "minimum": 1,
        +                        "type": "integer"
        +                      },
        +                      "tagPath": {
        +                        "description": "A category's path; unset, the whole wiki",
        +                        "type": "string"
        +                      },
        +                      "type": {
        +                        "const": "recentPages",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "limit"
        +                    ],
        +                    "type": "object"
        +                  },
        +                  {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; assigned on write",
        +                        "type": "string"
        +                      },
        +                      "pageIds": {
        +                        "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        +                        "items": {
        +                          "minLength": 1,
        +                          "type": "string"
        +                        },
        +                        "maxItems": 48,
        +                        "type": "array"
        +                      },
        +                      "type": {
        +                        "const": "pageList",
        +                        "type": "string"
        +                      }
        +                    },
        +                    "required": [
        +                      "type",
        +                      "pageIds"
        +                    ],
        +                    "type": "object"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "blocks"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 12,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "gap": {
        +        "enum": [
        +          "sm",
        +          "md",
        +          "lg"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "columns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "columns"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "blocks": {
        +        "items": {
        +          "oneOf": [
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "text": {
        +                  "description": "Plain semantic HTML",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "content",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "text"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "alt": {
        +                  "type": "string"
        +                },
        +                "caption": {
        +                  "type": "string"
        +                },
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "src": {
        +                  "pattern": "^https:\\/\\/\\S+$",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "image",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "src",
        +                "alt"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "poster": {
        +                  "description": "The picture shown before it plays",
        +                  "pattern": "^https:\\/\\/\\S+$",
        +                  "type": "string"
        +                },
        +                "src": {
        +                  "description": "An MP4 file",
        +                  "pattern": "^https:\\/\\/\\S+$",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "video",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "src"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; 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; assigned on write",
        +                  "type": "string"
        +                },
        +                "items": {
        +                  "items": {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; 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; 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; assigned on write",
        +                  "type": "string"
        +                },
        +                "intro": {
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "linkGrid",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "groups"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "items": {
        +                  "items": {
        +                    "properties": {
        +                      "id": {
        +                        "description": "Omit; 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; 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": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "limit": {
        +                  "maximum": 50,
        +                  "minimum": 1,
        +                  "type": "integer"
        +                },
        +                "tagPath": {
        +                  "description": "A category's path; unset, the whole wiki",
        +                  "type": "string"
        +                },
        +                "type": {
        +                  "const": "recentPages",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "limit"
        +              ],
        +              "type": "object"
        +            },
        +            {
        +              "properties": {
        +                "id": {
        +                  "description": "Omit; assigned on write",
        +                  "type": "string"
        +                },
        +                "pageIds": {
        +                  "description": "Wiki pages by id, as read_wiki_page gives them, in the order they're listed",
        +                  "items": {
        +                    "minLength": 1,
        +                    "type": "string"
        +                  },
        +                  "maxItems": 48,
        +                  "type": "array"
        +                },
        +                "type": {
        +                  "const": "pageList",
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "type",
        +                "pageIds"
        +              ],
        +              "type": "object"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "infobox",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "blocks"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "blocks": {
        +        "description": "Each picture once, in order",
        +        "items": {
        +          "properties": {
        +            "alt": {
        +              "type": "string"
        +            },
        +            "caption": {
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "Omit; assigned on write",
        +              "type": "string"
        +            },
        +            "src": {
        +              "pattern": "^https:\\/\\/\\S+$",
        +              "type": "string"
        +            },
        +            "type": {
        +              "const": "image",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "type",
        +            "src",
        +            "alt"
        +          ],
        +          "type": "object"
        +        },
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "carousel",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "blocks"
        +    ],
        +    "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"
        +      },
        +      "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; 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>",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "hero",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "heading"
        +    ],
        +    "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"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "heading": {
        +        "description": "Plain text; words may be wrapped in <strong> or <em>",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; assigned on write",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "Plain text; words may be wrapped in <strong> or <em>",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "cta",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "heading",
        +      "action"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "description": "A button of its own, to where it is sold elsewhere: a publisher's or a gallery's page",
        +        "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"
        +      },
        +      "id": {
        +        "description": "Omit; 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"
        +      },
        +      "sold": {
        +        "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",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "product",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "images",
        +      "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; assigned on write",
        +        "type": "string"
        +      },
        +      "menu": {
        +        "description": "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"
        +      },
        +      "shape": {
        +        "description": "Each card's picture upright, as a book's cover or a poster, or wide; unset, square",
        +        "enum": [
        +          "portrait",
        +          "landscape"
        +        ],
        +        "type": "string"
        +      },
        +      "tag": {
        +        "description": "Only products with this tag; omit for all",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "products",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "amounts": {
        +        "description": "The suggested gifts as they read, in one currency: [\"£10\", \"£20\"]; the donor may also give their own",
        +        "items": {
        +          "type": "string"
        +        },
        +        "maxItems": 6,
        +        "minItems": 1,
        +        "type": "array"
        +      },
        +      "band": {
        +        "description": "A full-width strip of the panel or the accent colour behind the block",
        +        "enum": [
        +          "panel",
        +          "accent"
        +        ],
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Omit; 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",
        +      "amounts"
        +    ],
        +    "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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "newest": {
        +        "description": "List this many of the newest pages instead",
        +        "maximum": 24,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "pages",
        +        "type": "string"
        +      },
        +      "under": {
        +        "description": "List the pages directly under this path; omit for the top level",
        +        "pattern": "^(?!search$)(?:[A-Za-z0-9_~-]+(?:\\/[A-Za-z0-9_~-]+)*)?$",
        +        "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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "search",
        +        "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; 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; 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; 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; assigned on write",
        +        "type": "string"
        +      },
        +      "type": {
        +        "const": "pricing",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables creating, editing, previewing, and publishing hosted business websites with owner-approved OAuth access, including template discovery, image uploads, revision checks, and live publication status checks.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables users to build, publish, share, and manage websites, dashboards, reports, and small web tools through chat, including updating content and design, managing access and custom domains, and restoring deployments.
    7
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    sitectrl turns a plain-language description into a real, hosted, live website — not a mockup. Your AI can ask sitectrl's builder to do it (create_site), or write the code itself and push the files (write_site_files + publish_site). Every site ships with hosting, SSL, working contact forms, and private built-in analytics; domains and email connect in-product.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources