{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://afa5.chaos.callai.online/mcp-guide/schema",
  "title": "AIFA 内容声明",
  "version": "cd64eef9",
  "index": [
    {
      "name": "block",
      "title": "块的骨架（五类共用）"
    },
    {
      "name": "block/title",
      "title": "标题（text）"
    },
    {
      "name": "block/paragraph",
      "title": "正文（text）"
    },
    {
      "name": "block/chapter-head",
      "title": "章节页头（text）"
    },
    {
      "name": "block/contents",
      "title": "目录（text）"
    },
    {
      "name": "block/source-list",
      "title": "来源（text）"
    },
    {
      "name": "block/imprint",
      "title": "刊记（text）"
    },
    {
      "name": "block/blank",
      "title": "留白（text）"
    },
    {
      "name": "block/pull-quote",
      "title": "引语（quote-metric）"
    },
    {
      "name": "block/figure",
      "title": "数字（quote-metric）"
    },
    {
      "name": "block/picture",
      "title": "图片（image）"
    },
    {
      "name": "block/html-canvas",
      "title": "自定义网页（interactive）"
    },
    {
      "name": "block/url-canvas",
      "title": "嵌入网页（interactive）"
    },
    {
      "name": "block/comment-box",
      "title": "留言（interactive）"
    },
    {
      "name": "block/share-card",
      "title": "分享卡（interactive）"
    },
    {
      "name": "block/qr-code",
      "title": "二维码（interactive）"
    },
    {
      "name": "block/dialogue",
      "title": "阅读助手（interactive）"
    },
    {
      "name": "block/video-player",
      "title": "视频（media）"
    },
    {
      "name": "block/audio-player",
      "title": "音频（media）"
    },
    {
      "name": "block/file-download",
      "title": "文件（media）"
    },
    {
      "name": "block/work-bundle",
      "title": "作品包（media）"
    },
    {
      "name": "block/external-link",
      "title": "外链（interactive）"
    },
    {
      "name": "block/item-list",
      "title": "列表（text）"
    },
    {
      "name": "block/data-table",
      "title": "表（quote-metric）"
    },
    {
      "name": "block/name-card",
      "title": "名片（interactive）"
    },
    {
      "name": "block/live-landscape",
      "title": "横屏直播（media）"
    },
    {
      "name": "block/live-portrait",
      "title": "竖屏直播（media）"
    },
    {
      "name": "page",
      "title": "页与栅格"
    },
    {
      "name": "article",
      "title": "单篇"
    },
    {
      "name": "collection",
      "title": "合集"
    }
  ],
  "$defs": {
    "block": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block",
      "title": "块的骨架（五类共用）",
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "pattern": "^b[a-z0-9]{6,32}$",
          "description": "块 id，同页唯一。"
        },
        "class": {
          "enum": [
            "text",
            "quote-metric",
            "image",
            "interactive",
            "media"
          ],
          "description": "块类：按「装什么」分的五类。"
        },
        "variant": {
          "enum": [
            "title",
            "paragraph",
            "chapter-head",
            "contents",
            "source-list",
            "imprint",
            "blank",
            "pull-quote",
            "figure",
            "picture",
            "html-canvas",
            "url-canvas",
            "comment-box",
            "share-card",
            "qr-code",
            "dialogue",
            "video-player",
            "audio-player",
            "file-download",
            "work-bundle",
            "external-link",
            "item-list",
            "data-table",
            "name-card",
            "live-landscape",
            "live-portrait"
          ],
          "description": "变体：同一类里的具体画法，决定 content 收哪些字段（block/<变体> 那一份）。"
        },
        "width": {
          "enum": [
            "full",
            "half"
          ],
          "description": "宽度档：全宽或半宽，两个半宽并排成一行、必须声明相同行数。"
        },
        "rows": {
          "type": "integer",
          "minimum": 1,
          "maximum": 31,
          "description": "框高，单位行，由你声明，服务端不改；下界按变体，见 page 的 params.blocks。"
        },
        "chain": {
          "type": "string",
          "pattern": "^[a-z0-9][a-z0-9-]{0,31}$",
          "description": "串接文本的链名（可选）。"
        },
        "content": {
          "type": "object",
          "properties": {
            "sourceIds": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "骨架字段 sources 的存储名：指向单篇来源表的 id。"
            }
          },
          "description": "按变体的内容字段，见 block/<变体>。"
        }
      },
      "required": [
        "id",
        "class",
        "variant",
        "width",
        "rows",
        "content"
      ],
      "additionalProperties": true,
      "x-variants": [
        {
          "container": 1,
          "class": "text",
          "variant": "title",
          "label": "标题",
          "skill": "aifa-block-title"
        },
        {
          "container": 2,
          "class": "text",
          "variant": "paragraph",
          "label": "正文",
          "skill": "aifa-block-paragraph"
        },
        {
          "container": 3,
          "class": "text",
          "variant": "chapter-head",
          "label": "章节页头",
          "skill": "aifa-block-chapter-head"
        },
        {
          "container": 4,
          "class": "text",
          "variant": "contents",
          "label": "目录",
          "skill": "aifa-block-contents"
        },
        {
          "container": 5,
          "class": "text",
          "variant": "source-list",
          "label": "来源",
          "skill": "aifa-block-source-list"
        },
        {
          "container": 6,
          "class": "text",
          "variant": "imprint",
          "label": "刊记",
          "skill": "aifa-block-imprint"
        },
        {
          "container": 7,
          "class": "text",
          "variant": "blank",
          "label": "留白",
          "skill": "aifa-block-blank"
        },
        {
          "container": 8,
          "class": "quote-metric",
          "variant": "pull-quote",
          "label": "引语",
          "skill": "aifa-block-pull-quote"
        },
        {
          "container": 9,
          "class": "quote-metric",
          "variant": "figure",
          "label": "数字",
          "skill": "aifa-block-figure"
        },
        {
          "container": 10,
          "class": "image",
          "variant": "picture",
          "label": "图片",
          "skill": "aifa-block-picture"
        },
        {
          "container": 11,
          "class": "interactive",
          "variant": "html-canvas",
          "label": "自定义网页",
          "skill": "aifa-block-html-canvas"
        },
        {
          "container": 12,
          "class": "interactive",
          "variant": "url-canvas",
          "label": "嵌入网页",
          "skill": "aifa-block-url-canvas"
        },
        {
          "container": 13,
          "class": "interactive",
          "variant": "comment-box",
          "label": "留言",
          "skill": "aifa-block-comment-box"
        },
        {
          "container": 14,
          "class": "interactive",
          "variant": "share-card",
          "label": "分享卡",
          "skill": "aifa-block-share-card"
        },
        {
          "container": 15,
          "class": "interactive",
          "variant": "qr-code",
          "label": "二维码",
          "skill": "aifa-block-qr-code"
        },
        {
          "container": 16,
          "class": "interactive",
          "variant": "dialogue",
          "label": "阅读助手",
          "skill": "aifa-block-dialogue"
        },
        {
          "container": 17,
          "class": "media",
          "variant": "video-player",
          "label": "视频",
          "skill": "aifa-block-video-player"
        },
        {
          "container": 18,
          "class": "media",
          "variant": "audio-player",
          "label": "音频",
          "skill": "aifa-block-audio-player"
        },
        {
          "container": 19,
          "class": "media",
          "variant": "file-download",
          "label": "文件",
          "skill": "aifa-block-file-download"
        },
        {
          "container": 20,
          "class": "media",
          "variant": "work-bundle",
          "label": "作品包",
          "skill": "aifa-block-work-bundle"
        },
        {
          "container": 21,
          "class": "interactive",
          "variant": "external-link",
          "label": "外链",
          "skill": "aifa-block-external-link"
        },
        {
          "container": 22,
          "class": "text",
          "variant": "item-list",
          "label": "列表",
          "skill": "aifa-block-item-list"
        },
        {
          "container": 23,
          "class": "quote-metric",
          "variant": "data-table",
          "label": "表",
          "skill": "aifa-block-data-table"
        },
        {
          "container": 24,
          "class": "interactive",
          "variant": "name-card",
          "label": "名片",
          "skill": "aifa-block-name-card"
        },
        {
          "container": 25,
          "class": "media",
          "variant": "live-landscape",
          "label": "横屏直播",
          "skill": "aifa-block-live-landscape"
        },
        {
          "container": 26,
          "class": "media",
          "variant": "live-portrait",
          "label": "竖屏直播",
          "skill": "aifa-block-live-portrait"
        }
      ]
    },
    "block/title": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:title",
      "title": "标题（text / title）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "text": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "kicker": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "按条件必填",
          "x-when": "块上的 preset 等于 \"kicker\""
        },
        "sub": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        }
      },
      "required": [
        "text"
      ],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "title",
      "x-compress": {
        "mode": "none",
        "priority": 0,
        "floor": {
          "full": 0,
          "half": 0
        }
      }
    },
    "block/paragraph": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:paragraph",
      "title": "正文（text / paragraph）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "text": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        }
      },
      "required": [
        "text"
      ],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "paragraph",
      "x-compress": {
        "mode": "scroll",
        "priority": 8,
        "floor": {
          "full": 4,
          "half": 4
        }
      }
    },
    "block/chapter-head": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:chapter-head",
      "title": "章节页头（text / chapter-head）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "ordinal": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "必填"
        },
        "sentence": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        }
      },
      "required": [
        "ordinal",
        "sentence"
      ],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "chapter-head",
      "x-compress": {
        "mode": "none",
        "priority": 0,
        "floor": {
          "full": 0,
          "half": 0
        }
      }
    },
    "block/contents": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:contents",
      "title": "目录（text / contents）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "title": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "lead": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        }
      },
      "required": [],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "contents",
      "x-compress": {
        "mode": "scroll",
        "priority": 6,
        "floor": {
          "full": 4,
          "half": 4
        }
      },
      "x-retired": [
        {
          "key": "items",
          "mode": "reject",
          "note": "条目另有唯一真源（合集的成员与顺序），抄一份进来就是第二个真源。"
        }
      ]
    },
    "block/source-list": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:source-list",
      "title": "来源（text / source-list）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "sourceIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "列表",
          "x-form": "[来源 id]",
          "x-need": "必填"
        }
      },
      "required": [
        "sourceIds"
      ],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "source-list",
      "x-compress": {
        "mode": "scroll",
        "priority": 7,
        "floor": {
          "full": 3,
          "half": 3
        }
      },
      "x-retired": [
        {
          "key": "author",
          "mode": "reject",
          "note": "署名是单篇字段（第 144 条），块里不带。"
        },
        {
          "key": "kicker",
          "mode": "reject",
          "note": "眉题是单篇字段。"
        },
        {
          "key": "date",
          "mode": "reject",
          "note": "日期是单篇字段。"
        }
      ]
    },
    "block/imprint": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:imprint",
      "title": "刊记（text / imprint）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "term": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              },
              "detail": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "term",
              "detail"
            ]
          },
          "title": "列表",
          "x-form": "[{term: {<语种代码>: 文字}, detail: {<语种代码>: 文字}}]",
          "x-need": "必填"
        }
      },
      "required": [
        "items"
      ],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "imprint",
      "x-compress": {
        "mode": "scroll",
        "priority": 6,
        "floor": {
          "full": 4,
          "half": 4
        }
      }
    },
    "block/blank": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:blank",
      "title": "留白（text / blank）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {},
      "required": [],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "blank",
      "x-compress": {
        "mode": "scroll",
        "priority": 1,
        "floor": {
          "full": 0,
          "half": 0
        }
      }
    },
    "block/pull-quote": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:pull-quote",
      "title": "引语（quote-metric / pull-quote）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "text": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "attribution": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        }
      },
      "required": [
        "text"
      ],
      "additionalProperties": true,
      "x-class": "quote-metric",
      "x-variant": "pull-quote",
      "x-compress": {
        "mode": "none",
        "priority": 0,
        "floor": {
          "full": 0,
          "half": 0
        }
      }
    },
    "block/figure": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:figure",
      "title": "数字（quote-metric / figure）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "value": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言（原文必填，其他语种可空，空则沿用原文）",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "unit": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "note": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "sourceIds": {
          "minItems": 1,
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "非空列表",
          "x-form": "[来源 id]（至少一条）",
          "x-need": "必填"
        }
      },
      "required": [
        "value",
        "unit",
        "note",
        "sourceIds"
      ],
      "additionalProperties": true,
      "x-class": "quote-metric",
      "x-variant": "figure",
      "x-compress": {
        "mode": "none",
        "priority": 0,
        "floor": {
          "full": 0,
          "half": 0
        }
      }
    },
    "block/picture": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:picture",
      "title": "图片（image / picture）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "mediaKind": {
          "type": "string",
          "enum": [
            "image",
            "video",
            "audio"
          ],
          "title": "枚举",
          "x-form": "\"image\" | \"video\" | \"audio\"",
          "x-need": "必填"
        },
        "asset": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "必填"
        },
        "video": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "videoPoster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 media.hasVideo"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 不等于 \"image\""
        },
        "startAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "title": "整数",
          "x-form": "不小于 0 的整数（秒）",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"video\""
        },
        "spokenLanguage": {
          "type": "string",
          "enum": [
            "zh",
            "en",
            "none"
          ],
          "title": "枚举",
          "x-form": "\"zh\" | \"en\" | \"none\"",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"video\""
        },
        "audio": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "subtitles": {
          "type": "object",
          "properties": {
            "zh": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "assetId"
              ]
            },
            "en": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "assetId"
              ]
            }
          },
          "title": "字幕轨",
          "x-form": "{zh:{assetId}, en:{assetId}}",
          "x-need": "选填",
          "x-when": "谓词 media.hasVideo"
        },
        "focal": {
          "type": "object",
          "properties": {
            "x": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "y": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            }
          },
          "required": [
            "x",
            "y"
          ],
          "title": "百分比坐标",
          "x-form": "{x, y}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "rect": {
          "type": "object",
          "properties": {
            "x": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "y": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "width": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "height": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "outWidth": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "outHeight": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "x",
            "y",
            "width",
            "height",
            "outWidth",
            "outHeight"
          ],
          "title": "像素矩形",
          "x-form": "{x, y, width, height, outWidth, outHeight}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "link": {
          "type": "string",
          "title": "单串",
          "x-form": "aifa:article/<单篇编号> | aifa:collection/<合集编号> | /本站路径 | https://…",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "frames": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "asset": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "asset"
                      },
                      "assetId": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "assetId"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "url"
                      },
                      "url": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "url"
                    ]
                  }
                ]
              },
              "alt": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              },
              "caption": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "asset"
            ]
          },
          "title": "列表",
          "x-form": "[{asset: {kind:\"asset\", assetId} 或 {kind:\"url\", url}, alt?: {<语种代码>: 文字}, caption?: {<语种代码>: 文字}}]",
          "x-need": "选填"
        },
        "phone": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 media.single"
        },
        "alt": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "caption": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "rights": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "必填"
        },
        "aiGenerated": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        }
      },
      "required": [
        "mediaKind",
        "asset",
        "alt",
        "caption",
        "rights"
      ],
      "additionalProperties": true,
      "x-class": "image",
      "x-variant": "picture",
      "x-implied": {
        "mediaKind": "image"
      },
      "x-compress": {
        "mode": "scale",
        "priority": 3,
        "floor": {
          "full": 6,
          "half": 4
        }
      },
      "x-hook": [
        {
          "id": "media.spokenSubtitles",
          "at": "contracts/video-block#spokenSubtitleGap",
          "note": "口播语言与字幕两个字段合判：有口播缺另一语种字幕只提醒。"
        }
      ]
    },
    "block/html-canvas": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:html-canvas",
      "title": "自定义网页（interactive / html-canvas）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "source",
            "url",
            "bundle"
          ],
          "title": "枚举",
          "x-form": "\"source\" | \"url\" | \"bundle\"",
          "x-need": "选填"
        },
        "url": {
          "type": "string",
          "title": "单串",
          "x-form": "https://…（白名单主机）| /…（本站公开页）",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.urlMode"
        },
        "resource": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.bundleMode"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 canvas.bundleMode"
        },
        "source": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.sourceMode"
        },
        "label": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.labelOn"
        },
        "sourceIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "列表",
          "x-form": "[来源 id]",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.sourcesOn"
        },
        "alt": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "showLabel": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "showHeader": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "showSources": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "bleed": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "aspect": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "x-when": "谓词 canvas.aspectField"
        }
      },
      "required": [],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "html-canvas",
      "x-implied": {
        "mode": "source"
      },
      "x-compress": {
        "mode": "scale",
        "priority": 2,
        "floor": {
          "full": 4,
          "half": 4
        }
      },
      "x-hook": [
        {
          "id": "canvas.sandbox",
          "at": "contracts/embed-validator#embedValidationForBlock",
          "note": "沙箱技术边界：字节上限、外链、脚本。"
        },
        {
          "id": "canvas.activity",
          "at": "contracts/canvas-source#canvasRecordsActivity",
          "note": "源码扫描：有没有本地存储或网络回传的调用。"
        },
        {
          "id": "canvas.night",
          "at": "contracts/canvas-source#canvasNightHints",
          "note": "源码扫描：夜览对比度（--navy 当字色、读颜色不听换档）。"
        }
      ],
      "x-retired": [
        {
          "key": "mobile",
          "mode": "ignore",
          "note": "手机上怎么放改由渲染器读源码里的 aifa-phone 声明（canvasMobile）。"
        },
        {
          "key": "recordInteraction",
          "mode": "ignore",
          "note": "是否记录读者操作改由校验器扫源码自动判（canvasRecordsActivity）。"
        }
      ]
    },
    "block/url-canvas": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:url-canvas",
      "title": "嵌入网页（interactive / url-canvas）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "source",
            "url",
            "bundle"
          ],
          "title": "枚举",
          "x-form": "\"source\" | \"url\" | \"bundle\"",
          "x-need": "选填"
        },
        "url": {
          "type": "string",
          "title": "单串",
          "x-form": "https://…（白名单主机）| /…（本站公开页）",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.urlMode"
        },
        "resource": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.bundleMode"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 canvas.bundleMode"
        },
        "source": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.sourceMode"
        },
        "label": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.labelOn"
        },
        "sourceIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "列表",
          "x-form": "[来源 id]",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.sourcesOn"
        },
        "alt": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "showLabel": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "showHeader": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "showSources": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "bleed": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "aspect": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "x-when": "谓词 canvas.aspectField"
        }
      },
      "required": [],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "url-canvas",
      "x-implied": {
        "mode": "url"
      },
      "x-compress": {
        "mode": "scale",
        "priority": 2,
        "floor": {
          "full": 4,
          "half": 4
        }
      },
      "x-hook": [
        {
          "id": "canvas.sandbox",
          "at": "contracts/embed-validator#embedValidationForBlock",
          "note": "沙箱技术边界：字节上限、外链、脚本。"
        },
        {
          "id": "canvas.activity",
          "at": "contracts/canvas-source#canvasRecordsActivity",
          "note": "源码扫描：有没有本地存储或网络回传的调用。"
        },
        {
          "id": "canvas.night",
          "at": "contracts/canvas-source#canvasNightHints",
          "note": "源码扫描：夜览对比度（--navy 当字色、读颜色不听换档）。"
        }
      ],
      "x-retired": [
        {
          "key": "mobile",
          "mode": "ignore",
          "note": "手机上怎么放改由渲染器读源码里的 aifa-phone 声明（canvasMobile）。"
        },
        {
          "key": "recordInteraction",
          "mode": "ignore",
          "note": "是否记录读者操作改由校验器扫源码自动判（canvasRecordsActivity）。"
        }
      ]
    },
    "block/comment-box": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:comment-box",
      "title": "留言（interactive / comment-box）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "background": {
          "type": "string",
          "title": "色板五色",
          "x-form": "\"#fafaf7\" 纸白 | \"#eceae5\" 浅灰 | \"#b08d57\" 铜金 | \"#0e2a47\" 深海蓝 | \"#111418\" 墨黑",
          "x-need": "选填"
        }
      },
      "required": [],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "comment-box",
      "x-compress": {
        "mode": "scroll",
        "priority": 5,
        "floor": {
          "full": 5,
          "half": 5
        }
      }
    },
    "block/share-card": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:share-card",
      "title": "分享卡（interactive / share-card）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "lines": {
          "type": "array",
          "items": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "title": "列表",
          "x-form": "[{<语种代码>: 文字}]（至少一条）",
          "x-need": "必填"
        },
        "panelBackground": {
          "type": "string",
          "title": "色板五色",
          "x-form": "\"#fafaf7\" 纸白 | \"#eceae5\" 浅灰 | \"#b08d57\" 铜金 | \"#0e2a47\" 深海蓝 | \"#111418\" 墨黑",
          "x-need": "选填"
        }
      },
      "required": [
        "lines"
      ],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "share-card",
      "x-compress": {
        "mode": "none",
        "priority": 0,
        "floor": {
          "full": 0,
          "half": 0
        }
      },
      "x-retired": [
        {
          "key": "imageAsset",
          "mode": "ignore",
          "note": "左边恒是本篇封面页缩略，作者不再指定图；随一次性迁移清掉，界面不做兼容。"
        }
      ]
    },
    "block/qr-code": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:qr-code",
      "title": "二维码（interactive / qr-code）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "text",
            "image"
          ],
          "title": "枚举",
          "x-form": "\"text\" | \"image\"",
          "x-need": "必填"
        },
        "asset": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "按条件必填",
          "x-when": "mode 等于 \"image\""
        },
        "text": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "按条件必填",
          "x-when": "mode 不等于 \"image\""
        },
        "note": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        }
      },
      "required": [
        "mode",
        "note"
      ],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "qr-code",
      "x-compress": {
        "mode": "scale",
        "priority": 4,
        "floor": {
          "full": 6,
          "half": 4
        }
      }
    },
    "block/dialogue": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:dialogue",
      "title": "阅读助手（interactive / dialogue）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "prompts": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "question": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              },
              "answer": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "question"
            ]
          },
          "title": "列表",
          "x-form": "[{question: {<语种代码>: 文字}, answer?: {<语种代码>: 文字}}]（1 到 6 条）",
          "x-need": "必填"
        },
        "lead": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言（成对或整个留空）",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        }
      },
      "required": [
        "prompts"
      ],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "dialogue",
      "x-compress": {
        "mode": "scroll",
        "priority": 5,
        "floor": {
          "full": 5,
          "half": 5
        }
      }
    },
    "block/video-player": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:video-player",
      "title": "视频（media / video-player）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "mediaKind": {
          "type": "string",
          "enum": [
            "image",
            "video",
            "audio"
          ],
          "title": "枚举",
          "x-form": "\"image\" | \"video\" | \"audio\"",
          "x-need": "必填"
        },
        "asset": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "必填"
        },
        "video": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "videoPoster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 media.hasVideo"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 不等于 \"image\""
        },
        "startAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "title": "整数",
          "x-form": "不小于 0 的整数（秒）",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"video\""
        },
        "spokenLanguage": {
          "type": "string",
          "enum": [
            "zh",
            "en",
            "none"
          ],
          "title": "枚举",
          "x-form": "\"zh\" | \"en\" | \"none\"",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"video\""
        },
        "audio": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "subtitles": {
          "type": "object",
          "properties": {
            "zh": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "assetId"
              ]
            },
            "en": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "assetId"
              ]
            }
          },
          "title": "字幕轨",
          "x-form": "{zh:{assetId}, en:{assetId}}",
          "x-need": "选填",
          "x-when": "谓词 media.hasVideo"
        },
        "focal": {
          "type": "object",
          "properties": {
            "x": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "y": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            }
          },
          "required": [
            "x",
            "y"
          ],
          "title": "百分比坐标",
          "x-form": "{x, y}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "rect": {
          "type": "object",
          "properties": {
            "x": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "y": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "width": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "height": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "outWidth": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "outHeight": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "x",
            "y",
            "width",
            "height",
            "outWidth",
            "outHeight"
          ],
          "title": "像素矩形",
          "x-form": "{x, y, width, height, outWidth, outHeight}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "link": {
          "type": "string",
          "title": "单串",
          "x-form": "aifa:article/<单篇编号> | aifa:collection/<合集编号> | /本站路径 | https://…",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "frames": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "asset": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "asset"
                      },
                      "assetId": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "assetId"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "url"
                      },
                      "url": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "url"
                    ]
                  }
                ]
              },
              "alt": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              },
              "caption": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "asset"
            ]
          },
          "title": "列表",
          "x-form": "[{asset: {kind:\"asset\", assetId} 或 {kind:\"url\", url}, alt?: {<语种代码>: 文字}, caption?: {<语种代码>: 文字}}]",
          "x-need": "选填"
        },
        "phone": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 media.single"
        },
        "alt": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "caption": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "rights": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "必填"
        },
        "aiGenerated": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        }
      },
      "required": [
        "mediaKind",
        "asset",
        "alt",
        "caption",
        "rights"
      ],
      "additionalProperties": true,
      "x-class": "media",
      "x-variant": "video-player",
      "x-implied": {
        "mediaKind": "video"
      },
      "x-poster": "optional",
      "x-compress": {
        "mode": "scale",
        "priority": 3,
        "floor": {
          "full": 6,
          "half": 4
        }
      },
      "x-hook": [
        {
          "id": "media.spokenSubtitles",
          "at": "contracts/video-block#spokenSubtitleGap",
          "note": "口播语言与字幕两个字段合判：有口播缺另一语种字幕只提醒。"
        }
      ]
    },
    "block/audio-player": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:audio-player",
      "title": "音频（media / audio-player）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "mediaKind": {
          "type": "string",
          "enum": [
            "image",
            "video",
            "audio"
          ],
          "title": "枚举",
          "x-form": "\"image\" | \"video\" | \"audio\"",
          "x-need": "必填"
        },
        "asset": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "必填"
        },
        "video": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "videoPoster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 media.hasVideo"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 不等于 \"image\""
        },
        "startAt": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "title": "整数",
          "x-form": "不小于 0 的整数（秒）",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"video\""
        },
        "spokenLanguage": {
          "type": "string",
          "enum": [
            "zh",
            "en",
            "none"
          ],
          "title": "枚举",
          "x-form": "\"zh\" | \"en\" | \"none\"",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"video\""
        },
        "audio": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "subtitles": {
          "type": "object",
          "properties": {
            "zh": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "assetId"
              ]
            },
            "en": {
              "type": "object",
              "properties": {
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "assetId"
              ]
            }
          },
          "title": "字幕轨",
          "x-form": "{zh:{assetId}, en:{assetId}}",
          "x-need": "选填",
          "x-when": "谓词 media.hasVideo"
        },
        "focal": {
          "type": "object",
          "properties": {
            "x": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "y": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            }
          },
          "required": [
            "x",
            "y"
          ],
          "title": "百分比坐标",
          "x-form": "{x, y}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "rect": {
          "type": "object",
          "properties": {
            "x": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "y": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "width": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "height": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "outWidth": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "outHeight": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            }
          },
          "required": [
            "x",
            "y",
            "width",
            "height",
            "outWidth",
            "outHeight"
          ],
          "title": "像素矩形",
          "x-form": "{x, y, width, height, outWidth, outHeight}",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "link": {
          "type": "string",
          "title": "单串",
          "x-form": "aifa:article/<单篇编号> | aifa:collection/<合集编号> | /本站路径 | https://…",
          "x-need": "选填",
          "x-when": "mediaKind 等于 \"image\""
        },
        "frames": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "asset": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "asset"
                      },
                      "assetId": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "assetId"
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "kind": {
                        "type": "string",
                        "const": "url"
                      },
                      "url": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "kind",
                      "url"
                    ]
                  }
                ]
              },
              "alt": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              },
              "caption": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "asset"
            ]
          },
          "title": "列表",
          "x-form": "[{asset: {kind:\"asset\", assetId} 或 {kind:\"url\", url}, alt?: {<语种代码>: 文字}, caption?: {<语种代码>: 文字}}]",
          "x-need": "选填"
        },
        "phone": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 media.single"
        },
        "alt": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "caption": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "rights": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "必填"
        },
        "aiGenerated": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        }
      },
      "required": [
        "mediaKind",
        "asset",
        "alt",
        "caption",
        "rights"
      ],
      "additionalProperties": true,
      "x-class": "media",
      "x-variant": "audio-player",
      "x-implied": {
        "mediaKind": "audio"
      },
      "x-poster": "optional",
      "x-compress": {
        "mode": "scale",
        "priority": 3,
        "floor": {
          "full": 6,
          "half": 4
        }
      },
      "x-hook": [
        {
          "id": "media.spokenSubtitles",
          "at": "contracts/video-block#spokenSubtitleGap",
          "note": "口播语言与字幕两个字段合判：有口播缺另一语种字幕只提醒。"
        }
      ]
    },
    "block/file-download": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:file-download",
      "title": "文件（media / file-download）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "file": {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "drive"
            },
            "mediaId": {
              "type": "string"
            }
          },
          "required": [
            "kind",
            "mediaId"
          ],
          "title": "网盘文件引用",
          "x-form": "{kind:\"drive\", mediaId}",
          "x-need": "必填"
        },
        "note": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        }
      },
      "required": [
        "file"
      ],
      "additionalProperties": true,
      "x-class": "media",
      "x-variant": "file-download",
      "x-poster": "forbidden",
      "x-compress": {
        "mode": "scroll",
        "priority": 6,
        "floor": {
          "full": 2,
          "half": 2
        }
      }
    },
    "block/work-bundle": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:work-bundle",
      "title": "作品包（media / work-bundle）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "source",
            "url",
            "bundle"
          ],
          "title": "枚举",
          "x-form": "\"source\" | \"url\" | \"bundle\"",
          "x-need": "选填"
        },
        "url": {
          "type": "string",
          "title": "单串",
          "x-form": "https://…（白名单主机）| /…（本站公开页）",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.urlMode"
        },
        "resource": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.bundleMode"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填",
          "x-when": "谓词 canvas.bundleMode"
        },
        "source": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.sourceMode"
        },
        "label": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.labelOn"
        },
        "sourceIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "列表",
          "x-form": "[来源 id]",
          "x-need": "按条件必填",
          "x-when": "谓词 canvas.sourcesOn"
        },
        "alt": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "showLabel": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "showHeader": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "showSources": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "bleed": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "aspect": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "x-when": "谓词 canvas.aspectField"
        }
      },
      "required": [],
      "additionalProperties": true,
      "x-class": "media",
      "x-variant": "work-bundle",
      "x-implied": {
        "mode": "bundle"
      },
      "x-poster": "required",
      "x-compress": {
        "mode": "scale",
        "priority": 2,
        "floor": {
          "full": 4,
          "half": 4
        }
      },
      "x-hook": [
        {
          "id": "canvas.sandbox",
          "at": "contracts/embed-validator#embedValidationForBlock",
          "note": "沙箱技术边界：字节上限、外链、脚本。"
        },
        {
          "id": "canvas.activity",
          "at": "contracts/canvas-source#canvasRecordsActivity",
          "note": "源码扫描：有没有本地存储或网络回传的调用。"
        },
        {
          "id": "canvas.night",
          "at": "contracts/canvas-source#canvasNightHints",
          "note": "源码扫描：夜览对比度（--navy 当字色、读颜色不听换档）。"
        }
      ],
      "x-retired": [
        {
          "key": "mobile",
          "mode": "ignore",
          "note": "手机上怎么放改由渲染器读源码里的 aifa-phone 声明（canvasMobile）。"
        },
        {
          "key": "recordInteraction",
          "mode": "ignore",
          "note": "是否记录读者操作改由校验器扫源码自动判（canvasRecordsActivity）。"
        }
      ]
    },
    "block/external-link": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:external-link",
      "title": "外链（interactive / external-link）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "url": {
          "type": "string",
          "title": "单串",
          "x-form": "https://…",
          "x-need": "必填"
        },
        "title": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "note": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        }
      },
      "required": [
        "url",
        "title"
      ],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "external-link",
      "x-compress": {
        "mode": "scroll",
        "priority": 6,
        "floor": {
          "full": 2,
          "half": 2
        }
      }
    },
    "block/item-list": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:item-list",
      "title": "列表（text / item-list）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "title": "列表",
          "x-form": "[{<语种代码>: 文字}]（至少一条）",
          "x-need": "必填"
        }
      },
      "required": [
        "items"
      ],
      "additionalProperties": true,
      "x-class": "text",
      "x-variant": "item-list",
      "x-compress": {
        "mode": "scroll",
        "priority": 6,
        "floor": {
          "full": 3,
          "half": 3
        }
      }
    },
    "block/data-table": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:data-table",
      "title": "表（quote-metric / data-table）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "title": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "columns": {
          "type": "array",
          "items": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "string"
            }
          },
          "title": "列表",
          "x-form": "[{<语种代码>: 文字}]（至少一条）",
          "x-need": "必填"
        },
        "cells": {
          "minItems": 1,
          "type": "array",
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "value": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {
                    "type": "string"
                  }
                },
                "sourceIds": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "value"
              ]
            }
          },
          "title": "表格",
          "x-form": "[[{value:{zh, en}, sourceIds?:[来源 id]}, …], …]（一行一个列表）",
          "x-need": "必填"
        }
      },
      "required": [
        "columns",
        "cells"
      ],
      "additionalProperties": true,
      "x-class": "quote-metric",
      "x-variant": "data-table",
      "x-compress": {
        "mode": "scroll",
        "priority": 6,
        "floor": {
          "full": 3,
          "half": 3
        }
      },
      "x-hook": [
        {
          "id": "table.grid",
          "at": "contracts/declaration#BLOCK_HOOKS",
          "note": "表头与数据行合判：每行的格数要与表头列数相同。"
        }
      ]
    },
    "block/name-card": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:name-card",
      "title": "名片（interactive / name-card）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "author": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "必填"
        },
        "reveal": {
          "type": "string",
          "enum": [
            "name",
            "avatar-name",
            "card"
          ],
          "title": "枚举",
          "x-form": "\"name\" | \"avatar-name\" | \"card\"",
          "x-need": "选填"
        }
      },
      "required": [
        "author"
      ],
      "additionalProperties": true,
      "x-class": "interactive",
      "x-variant": "name-card",
      "x-compress": {
        "mode": "none",
        "priority": 0,
        "floor": {
          "full": 0,
          "half": 0
        }
      }
    },
    "block/live-landscape": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:live-landscape",
      "title": "横屏直播（media / live-landscape）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "title": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "orientation": {
          "type": "string",
          "enum": [
            "landscape",
            "portrait"
          ],
          "title": "枚举",
          "x-form": "\"landscape\" | \"portrait\"",
          "x-need": "选填"
        },
        "scheduledAt": {
          "type": "string",
          "title": "单串",
          "x-form": "2026-10-12T20:00:00+08:00（带时区偏移）",
          "x-need": "必填"
        },
        "routes": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string"
              },
              "name": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "url"
            ]
          },
          "title": "列表",
          "x-form": "[{url: https://…, name?: {<语种代码>: 文字}}]（1 到 6 条）",
          "x-need": "必填"
        },
        "notice": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言（成对或整个留空）",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填"
        },
        "commentsBlock": {
          "type": "string",
          "title": "单串",
          "x-form": "留言块的块 id",
          "x-need": "选填"
        }
      },
      "required": [
        "title",
        "scheduledAt",
        "routes"
      ],
      "additionalProperties": true,
      "x-class": "media",
      "x-variant": "live-landscape",
      "x-implied": {
        "orientation": "landscape"
      },
      "x-poster": "optional",
      "x-compress": {
        "mode": "scale",
        "priority": 3,
        "floor": {
          "full": 6,
          "half": 4
        }
      }
    },
    "block/live-portrait": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:block:live-portrait",
      "title": "竖屏直播（media / live-portrait）",
      "description": "这一个变体的 content。骨架（id、class、variant、width、rows、chain、sources）各变体共用，见 block 那一份。",
      "type": "object",
      "properties": {
        "title": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "必填"
        },
        "orientation": {
          "type": "string",
          "enum": [
            "landscape",
            "portrait"
          ],
          "title": "枚举",
          "x-form": "\"landscape\" | \"portrait\"",
          "x-need": "选填"
        },
        "scheduledAt": {
          "type": "string",
          "title": "单串",
          "x-form": "2026-10-12T20:00:00+08:00（带时区偏移）",
          "x-need": "必填"
        },
        "routes": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "url": {
                "type": "string"
              },
              "name": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "string"
                }
              }
            },
            "required": [
              "url"
            ]
          },
          "title": "列表",
          "x-form": "[{url: https://…, name?: {<语种代码>: 文字}}]（1 到 6 条）",
          "x-need": "必填"
        },
        "notice": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言（成对或整个留空）",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "poster": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "素材引用",
          "x-form": "{kind:\"asset\", assetId} 或 {kind:\"url\", url}",
          "x-need": "选填"
        },
        "commentsBlock": {
          "type": "string",
          "title": "单串",
          "x-form": "留言块的块 id",
          "x-need": "选填"
        }
      },
      "required": [
        "title",
        "scheduledAt",
        "routes"
      ],
      "additionalProperties": true,
      "x-class": "media",
      "x-variant": "live-portrait",
      "x-implied": {
        "orientation": "portrait"
      },
      "x-poster": "optional",
      "x-compress": {
        "mode": "scale",
        "priority": 3,
        "floor": {
          "full": 6,
          "half": 4
        }
      }
    },
    "page": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:page",
      "title": "页与栅格",
      "type": "object",
      "properties": {
        "params": {
          "type": "object",
          "const": {
            "canvas": {
              "width": 636,
              "height": 900
            },
            "mobileCanvas": {
              "width": 390,
              "height": 585
            },
            "pcMinWidth": 1024,
            "margin": {
              "top": 30,
              "side": 38,
              "bottom": 24
            },
            "typeArea": {
              "width": 560,
              "height": 744
            },
            "row": 24,
            "rowsPerPage": 31,
            "typeRows": 31,
            "widths": {
              "full": 560,
              "half": 270
            },
            "gutter": 20,
            "pageBounds": {
              "width": {
                "min": 636,
                "max": 800
              },
              "height": {
                "min": 900,
                "max": 1044
              }
            },
            "wideBodyPageWidth": 720,
            "ratioTiers": [
              "1:4",
              "1:3",
              "1:2",
              "9:16",
              "2:3",
              "3:4",
              "1:1",
              "4:3",
              "3:2",
              "16:9"
            ],
            "specialTiers": [
              "min",
              "max"
            ],
            "heightTiers": [
              "1:4",
              "1:3",
              "1:2",
              "9:16",
              "2:3",
              "3:4",
              "1:1",
              "4:3",
              "3:2",
              "16:9",
              "min",
              "max"
            ],
            "classes": [
              "text",
              "quote-metric",
              "image",
              "interactive",
              "media"
            ],
            "clipBlocks": [
              "chapter"
            ],
            "blockId": "^b[a-z0-9]{6,32}$",
            "blocks": {
              "title": {
                "class": "text",
                "variant": "title",
                "type": "heading",
                "minRows": {
                  "full": 3,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "none",
                  "priority": 0,
                  "floor": {
                    "full": 0,
                    "half": 0
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 4,
                  "half": 3
                },
                "presets": [
                  {
                    "name": "plain",
                    "label": {
                      "zh": "普通",
                      "en": "Plain"
                    }
                  },
                  {
                    "name": "pull",
                    "label": {
                      "zh": "金句式",
                      "en": "Pull"
                    }
                  },
                  {
                    "name": "kicker",
                    "label": {
                      "zh": "栏目标签加标题",
                      "en": "Kicker"
                    }
                  }
                ],
                "default": "plain"
              },
              "paragraph": {
                "class": "text",
                "variant": "paragraph",
                "type": "body",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 8,
                  "floor": {
                    "full": 4,
                    "half": 4
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 6,
                  "half": 12
                },
                "presets": [
                  {
                    "name": "running",
                    "label": {
                      "zh": "通栏正文",
                      "en": "Running text"
                    }
                  }
                ],
                "default": "running"
              },
              "chapter-head": {
                "class": "text",
                "variant": "chapter-head",
                "type": "chapter",
                "minRows": {
                  "full": 5,
                  "half": 3
                },
                "rowAddend": 0,
                "overflow": "clip",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "none",
                  "priority": 0,
                  "floor": {
                    "full": 0,
                    "half": 0
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 5,
                  "half": 4
                },
                "presets": [
                  {
                    "name": "numbered-rule",
                    "label": {
                      "zh": "序号加金短线",
                      "en": "Numbered rule"
                    }
                  }
                ],
                "default": "numbered-rule"
              },
              "contents": {
                "class": "text",
                "variant": "contents",
                "type": "toc",
                "minRows": {
                  "full": 4,
                  "half": 4
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 6,
                  "floor": {
                    "full": 4,
                    "half": 4
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 12,
                  "half": 16
                },
                "presets": [
                  {
                    "name": "ledger",
                    "label": {
                      "zh": "目录清单",
                      "en": "Ledger"
                    }
                  }
                ],
                "default": "ledger"
              },
              "source-list": {
                "class": "text",
                "variant": "source-list",
                "type": "credits",
                "minRows": {
                  "full": 3,
                  "half": 3
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 7,
                  "floor": {
                    "full": 3,
                    "half": 3
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 6,
                  "half": 6
                },
                "presets": [
                  {
                    "name": "numbered",
                    "label": {
                      "zh": "编号来源",
                      "en": "Numbered"
                    }
                  }
                ],
                "default": "numbered"
              },
              "imprint": {
                "class": "text",
                "variant": "imprint",
                "type": "colophon",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 6,
                  "floor": {
                    "full": 4,
                    "half": 4
                  }
                },
                "defaultWidth": "half",
                "defaultRows": {
                  "full": 7,
                  "half": 9
                },
                "presets": [
                  {
                    "name": "entry-list",
                    "label": {
                      "zh": "名目条目",
                      "en": "Entry list"
                    }
                  }
                ],
                "default": "entry-list"
              },
              "blank": {
                "class": "text",
                "variant": "blank",
                "type": "spacer",
                "minRows": {
                  "full": 1,
                  "half": 1
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 1,
                  "floor": {
                    "full": 0,
                    "half": 0
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 1,
                  "half": 1
                },
                "presets": [
                  {
                    "name": "empty",
                    "label": {
                      "zh": "留白",
                      "en": "Empty"
                    }
                  }
                ],
                "default": "empty"
              },
              "pull-quote": {
                "class": "quote-metric",
                "variant": "pull-quote",
                "type": "quote",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "none",
                  "priority": 0,
                  "floor": {
                    "full": 0,
                    "half": 0
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 9,
                  "half": 6
                },
                "presets": [
                  {
                    "name": "centered-gold",
                    "label": {
                      "zh": "居中金引号",
                      "en": "Centered, gold mark"
                    }
                  },
                  {
                    "name": "inline-marks",
                    "label": {
                      "zh": "引号随文",
                      "en": "Inline marks"
                    }
                  }
                ],
                "default": {
                  "full": "centered-gold",
                  "half": "inline-marks"
                }
              },
              "figure": {
                "class": "quote-metric",
                "variant": "figure",
                "type": "metric",
                "minRows": {
                  "full": 5,
                  "half": 4
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "none",
                  "priority": 0,
                  "floor": {
                    "full": 0,
                    "half": 0
                  }
                },
                "defaultWidth": "half",
                "defaultRows": {
                  "full": 6,
                  "half": 6
                },
                "presets": [
                  {
                    "name": "big-number",
                    "label": {
                      "zh": "大数字",
                      "en": "Big number"
                    }
                  }
                ],
                "default": "big-number"
              },
              "picture": {
                "class": "image",
                "variant": "picture",
                "type": "media",
                "minRows": {
                  "full": 6,
                  "half": 4
                },
                "rowAddend": 1,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 6
                    },
                    {
                      "tier": "1:3",
                      "rows": 8
                    },
                    {
                      "tier": "1:2",
                      "rows": 12
                    },
                    {
                      "tier": "9:16",
                      "rows": 13
                    },
                    {
                      "tier": "2:3",
                      "rows": 16
                    },
                    {
                      "tier": "3:4",
                      "rows": 17
                    },
                    {
                      "tier": "1:1",
                      "rows": 23
                    },
                    {
                      "tier": "4:3",
                      "rows": 30
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 4
                    },
                    {
                      "tier": "1:3",
                      "rows": 5
                    },
                    {
                      "tier": "1:2",
                      "rows": 6
                    },
                    {
                      "tier": "9:16",
                      "rows": 7
                    },
                    {
                      "tier": "2:3",
                      "rows": 8
                    },
                    {
                      "tier": "3:4",
                      "rows": 9
                    },
                    {
                      "tier": "1:1",
                      "rows": 12
                    },
                    {
                      "tier": "4:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:2",
                      "rows": 17
                    },
                    {
                      "tier": "16:9",
                      "rows": 20
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 3,
                  "floor": {
                    "full": 6,
                    "half": 4
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 14,
                  "half": 14
                },
                "presets": [
                  {
                    "name": "bleed-caption",
                    "label": {
                      "zh": "出血铺满加图注",
                      "en": "Bleed with caption"
                    }
                  }
                ],
                "default": "bleed-caption"
              },
              "html-canvas": {
                "class": "interactive",
                "variant": "html-canvas",
                "type": "canvas",
                "minRows": {
                  "full": 4,
                  "half": 4
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 2,
                  "floor": {
                    "full": 4,
                    "half": 4
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 17,
                  "half": 15
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "url-canvas": {
                "class": "interactive",
                "variant": "url-canvas",
                "type": "canvas",
                "minRows": {
                  "full": 6,
                  "half": 6
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 2,
                  "floor": {
                    "full": 4,
                    "half": 4
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 16,
                  "half": 15
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "comment-box": {
                "class": "interactive",
                "variant": "comment-box",
                "type": "comments",
                "minRows": {
                  "full": 5,
                  "half": 5
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 5,
                  "floor": {
                    "full": 5,
                    "half": 5
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 13,
                  "half": 15
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "share-card": {
                "class": "interactive",
                "variant": "share-card",
                "type": "share",
                "minRows": {
                  "full": 2,
                  "half": 4
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "none",
                  "priority": 0,
                  "floor": {
                    "full": 0,
                    "half": 0
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 8,
                  "half": 9
                },
                "presets": [
                  {
                    "name": "cover-quote",
                    "label": {
                      "zh": "封面加金句面板",
                      "en": "Cover and quote"
                    }
                  }
                ],
                "default": "cover-quote"
              },
              "qr-code": {
                "class": "interactive",
                "variant": "qr-code",
                "type": "qrcode",
                "minRows": {
                  "full": 6,
                  "half": 5
                },
                "rowAddend": 1,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 6
                    },
                    {
                      "tier": "1:3",
                      "rows": 8
                    },
                    {
                      "tier": "1:2",
                      "rows": 12
                    },
                    {
                      "tier": "9:16",
                      "rows": 13
                    },
                    {
                      "tier": "2:3",
                      "rows": 16
                    },
                    {
                      "tier": "3:4",
                      "rows": 17
                    },
                    {
                      "tier": "1:1",
                      "rows": 23
                    },
                    {
                      "tier": "4:3",
                      "rows": 30
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:3",
                      "rows": 5
                    },
                    {
                      "tier": "1:2",
                      "rows": 6
                    },
                    {
                      "tier": "9:16",
                      "rows": 7
                    },
                    {
                      "tier": "2:3",
                      "rows": 8
                    },
                    {
                      "tier": "3:4",
                      "rows": 9
                    },
                    {
                      "tier": "1:1",
                      "rows": 12
                    },
                    {
                      "tier": "4:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:2",
                      "rows": 17
                    },
                    {
                      "tier": "16:9",
                      "rows": 20
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 4,
                  "floor": {
                    "full": 6,
                    "half": 4
                  }
                },
                "defaultWidth": "half",
                "defaultRows": {
                  "full": 7,
                  "half": 9
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "dialogue": {
                "class": "interactive",
                "variant": "dialogue",
                "type": "talk",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 5,
                  "floor": {
                    "full": 5,
                    "half": 5
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 7,
                  "half": 9
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "video-player": {
                "class": "media",
                "variant": "video-player",
                "type": "media",
                "minRows": {
                  "full": 9,
                  "half": 7
                },
                "rowAddend": 1,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 6
                    },
                    {
                      "tier": "1:3",
                      "rows": 8
                    },
                    {
                      "tier": "1:2",
                      "rows": 12
                    },
                    {
                      "tier": "9:16",
                      "rows": 13
                    },
                    {
                      "tier": "2:3",
                      "rows": 16
                    },
                    {
                      "tier": "3:4",
                      "rows": 17
                    },
                    {
                      "tier": "1:1",
                      "rows": 23
                    },
                    {
                      "tier": "4:3",
                      "rows": 30
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 4
                    },
                    {
                      "tier": "1:3",
                      "rows": 5
                    },
                    {
                      "tier": "1:2",
                      "rows": 6
                    },
                    {
                      "tier": "9:16",
                      "rows": 7
                    },
                    {
                      "tier": "2:3",
                      "rows": 8
                    },
                    {
                      "tier": "3:4",
                      "rows": 9
                    },
                    {
                      "tier": "1:1",
                      "rows": 12
                    },
                    {
                      "tier": "4:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:2",
                      "rows": 17
                    },
                    {
                      "tier": "16:9",
                      "rows": 20
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 3,
                  "floor": {
                    "full": 6,
                    "half": 4
                  }
                },
                "defaultWidth": "orientation",
                "defaultRows": {
                  "full": 16,
                  "half": 19
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "audio-player": {
                "class": "media",
                "variant": "audio-player",
                "type": "media",
                "minRows": {
                  "full": 3,
                  "half": 3
                },
                "rowAddend": 1,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 6
                    },
                    {
                      "tier": "1:3",
                      "rows": 8
                    },
                    {
                      "tier": "1:2",
                      "rows": 12
                    },
                    {
                      "tier": "9:16",
                      "rows": 13
                    },
                    {
                      "tier": "2:3",
                      "rows": 16
                    },
                    {
                      "tier": "3:4",
                      "rows": 17
                    },
                    {
                      "tier": "1:1",
                      "rows": 23
                    },
                    {
                      "tier": "4:3",
                      "rows": 30
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 4
                    },
                    {
                      "tier": "1:3",
                      "rows": 5
                    },
                    {
                      "tier": "1:2",
                      "rows": 6
                    },
                    {
                      "tier": "9:16",
                      "rows": 7
                    },
                    {
                      "tier": "2:3",
                      "rows": 8
                    },
                    {
                      "tier": "3:4",
                      "rows": 9
                    },
                    {
                      "tier": "1:1",
                      "rows": 12
                    },
                    {
                      "tier": "4:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:2",
                      "rows": 17
                    },
                    {
                      "tier": "16:9",
                      "rows": 20
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 3,
                  "floor": {
                    "full": 6,
                    "half": 4
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 5,
                  "half": 5
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "file-download": {
                "class": "media",
                "variant": "file-download",
                "type": "resource",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 6,
                  "floor": {
                    "full": 2,
                    "half": 2
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 2,
                  "half": 3
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "work-bundle": {
                "class": "media",
                "variant": "work-bundle",
                "type": "canvas",
                "minRows": {
                  "full": 6,
                  "half": 4
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 2,
                  "floor": {
                    "full": 4,
                    "half": 4
                  }
                },
                "defaultWidth": "orientation",
                "defaultRows": {
                  "full": 13,
                  "half": 15
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "external-link": {
                "class": "interactive",
                "variant": "external-link",
                "type": "link",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 6,
                  "floor": {
                    "full": 2,
                    "half": 2
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 2,
                  "half": 3
                },
                "presets": [
                  {
                    "name": "card",
                    "label": {
                      "zh": "去向卡片",
                      "en": "Card"
                    }
                  }
                ],
                "default": "card"
              },
              "item-list": {
                "class": "text",
                "variant": "item-list",
                "type": "list",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 6,
                  "floor": {
                    "full": 3,
                    "half": 3
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 8,
                  "half": 12
                },
                "presets": [
                  {
                    "name": "bullets",
                    "label": {
                      "zh": "圆点",
                      "en": "Bullets"
                    }
                  },
                  {
                    "name": "numbered",
                    "label": {
                      "zh": "编号",
                      "en": "Numbered"
                    }
                  }
                ],
                "default": "bullets"
              },
              "data-table": {
                "class": "quote-metric",
                "variant": "data-table",
                "type": "table",
                "minRows": {
                  "full": 3,
                  "half": 3
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "scroll",
                  "priority": 6,
                  "floor": {
                    "full": 3,
                    "half": 3
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 8,
                  "half": 8
                },
                "presets": [
                  {
                    "name": "ruled",
                    "label": {
                      "zh": "细线表",
                      "en": "Ruled"
                    }
                  }
                ],
                "default": "ruled"
              },
              "name-card": {
                "class": "interactive",
                "variant": "name-card",
                "type": "namecard",
                "minRows": {
                  "full": 2,
                  "half": 2
                },
                "rowAddend": 0,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 5
                    },
                    {
                      "tier": "1:3",
                      "rows": 7
                    },
                    {
                      "tier": "1:2",
                      "rows": 11
                    },
                    {
                      "tier": "9:16",
                      "rows": 12
                    },
                    {
                      "tier": "2:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:4",
                      "rows": 16
                    },
                    {
                      "tier": "1:1",
                      "rows": 22
                    },
                    {
                      "tier": "4:3",
                      "rows": 29
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 3
                    },
                    {
                      "tier": "1:3",
                      "rows": 4
                    },
                    {
                      "tier": "1:2",
                      "rows": 5
                    },
                    {
                      "tier": "9:16",
                      "rows": 6
                    },
                    {
                      "tier": "2:3",
                      "rows": 7
                    },
                    {
                      "tier": "3:4",
                      "rows": 8
                    },
                    {
                      "tier": "1:1",
                      "rows": 11
                    },
                    {
                      "tier": "4:3",
                      "rows": 14
                    },
                    {
                      "tier": "3:2",
                      "rows": 16
                    },
                    {
                      "tier": "16:9",
                      "rows": 19
                    }
                  ]
                },
                "compress": {
                  "mode": "none",
                  "priority": 0,
                  "floor": {
                    "full": 0,
                    "half": 0
                  }
                },
                "defaultWidth": "half",
                "defaultRows": {
                  "full": 10,
                  "half": 12
                },
                "presets": [
                  {
                    "name": "identity",
                    "label": {
                      "zh": "作者名片",
                      "en": "Name card"
                    }
                  }
                ],
                "default": "identity"
              },
              "live-landscape": {
                "class": "media",
                "variant": "live-landscape",
                "type": "live",
                "minRows": {
                  "full": 6,
                  "half": 4
                },
                "rowAddend": 1,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 6
                    },
                    {
                      "tier": "1:3",
                      "rows": 8
                    },
                    {
                      "tier": "1:2",
                      "rows": 12
                    },
                    {
                      "tier": "9:16",
                      "rows": 13
                    },
                    {
                      "tier": "2:3",
                      "rows": 16
                    },
                    {
                      "tier": "3:4",
                      "rows": 17
                    },
                    {
                      "tier": "1:1",
                      "rows": 23
                    },
                    {
                      "tier": "4:3",
                      "rows": 30
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 4
                    },
                    {
                      "tier": "1:3",
                      "rows": 5
                    },
                    {
                      "tier": "1:2",
                      "rows": 6
                    },
                    {
                      "tier": "9:16",
                      "rows": 7
                    },
                    {
                      "tier": "2:3",
                      "rows": 8
                    },
                    {
                      "tier": "3:4",
                      "rows": 9
                    },
                    {
                      "tier": "1:1",
                      "rows": 12
                    },
                    {
                      "tier": "4:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:2",
                      "rows": 17
                    },
                    {
                      "tier": "16:9",
                      "rows": 20
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 3,
                  "floor": {
                    "full": 6,
                    "half": 4
                  }
                },
                "defaultWidth": "full",
                "defaultRows": {
                  "full": 14,
                  "half": 8
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              },
              "live-portrait": {
                "class": "media",
                "variant": "live-portrait",
                "type": "live",
                "minRows": {
                  "full": 6,
                  "half": 4
                },
                "rowAddend": 1,
                "overflow": "scroll",
                "recommended": {
                  "full": [
                    {
                      "tier": "1:4",
                      "rows": 6
                    },
                    {
                      "tier": "1:3",
                      "rows": 8
                    },
                    {
                      "tier": "1:2",
                      "rows": 12
                    },
                    {
                      "tier": "9:16",
                      "rows": 13
                    },
                    {
                      "tier": "2:3",
                      "rows": 16
                    },
                    {
                      "tier": "3:4",
                      "rows": 17
                    },
                    {
                      "tier": "1:1",
                      "rows": 23
                    },
                    {
                      "tier": "4:3",
                      "rows": 30
                    }
                  ],
                  "half": [
                    {
                      "tier": "1:4",
                      "rows": 4
                    },
                    {
                      "tier": "1:3",
                      "rows": 5
                    },
                    {
                      "tier": "1:2",
                      "rows": 6
                    },
                    {
                      "tier": "9:16",
                      "rows": 7
                    },
                    {
                      "tier": "2:3",
                      "rows": 8
                    },
                    {
                      "tier": "3:4",
                      "rows": 9
                    },
                    {
                      "tier": "1:1",
                      "rows": 12
                    },
                    {
                      "tier": "4:3",
                      "rows": 15
                    },
                    {
                      "tier": "3:2",
                      "rows": 17
                    },
                    {
                      "tier": "16:9",
                      "rows": 20
                    }
                  ]
                },
                "compress": {
                  "mode": "scale",
                  "priority": 3,
                  "floor": {
                    "full": 6,
                    "half": 4
                  }
                },
                "defaultWidth": "half",
                "defaultRows": {
                  "full": 31,
                  "half": 20
                },
                "presets": [
                  {
                    "name": "framed",
                    "label": {
                      "zh": "外框内现行画法",
                      "en": "Framed"
                    }
                  }
                ],
                "default": "framed"
              }
            }
          }
        },
        "limits": {
          "type": "object",
          "const": {
            "blocksPerPage": 62,
            "articlePages": 200,
            "textFieldGuard": 100000,
            "canvasSourceBytes": 1048576,
            "canvasScriptBytes": 524288
          }
        }
      },
      "x-computed": [
        {
          "id": "groupRows",
          "at": "contracts/blocks#groupRows",
          "input": "整页块序列",
          "output": "视觉行列表（每行的块与行高）",
          "note": "一个全宽块独占一行，或两个半宽块并排共用一行；落单的半宽块右半是天然留白。"
        },
        {
          "id": "usedRows",
          "at": "contracts/blocks#usedRows",
          "input": "视觉行列表",
          "output": "这一页用掉多少行",
          "note": "各视觉行行数之和，加块间距折成的行（n 个视觉行之间 n−1 道间距）。"
        },
        {
          "id": "blockCoords",
          "at": "contracts/blocks#blockCoords",
          "input": "整页块序列",
          "output": "逐块的 index / visualRow / topRow / bottomRow / column",
          "note": "块本身没有坐标字段，三个数一律现算，不另存一份。"
        },
        {
          "id": "maxTierRows",
          "at": "contracts/blocks#maxTierRows",
          "input": "整页块序列",
          "output": "最大档块应占的行数",
          "note": "最大档 2026-09-21 退役，函数留着是为了把老数据物化成固定行数。"
        },
        {
          "id": "roomRows",
          "at": "contracts/blocks#roomRows",
          "input": "整页块序列 + 块 id",
          "output": "这一块在本页还能长到多少行",
          "note": "版心可用行数减去同页其余视觉行与块间距；同行的半宽伙伴不占它的额度。"
        },
        {
          "id": "rowBounds",
          "at": "contracts/blocks#rowBounds",
          "input": "整页块序列 + 块",
          "output": "这一块此刻能取的行数区间",
          "note": "块型自己的区间与本页剩余行数取小的那个上界。"
        },
        {
          "id": "aspectRowNeed",
          "at": "@chaos7479/aifa-renderer/contracts/grid#aspectRowNeed",
          "input": "块的设计行数 + 这张纸的宽",
          "output": "等比档的块在这张纸上要多少行",
          "note": "纸横向拉宽几倍，等比档的块（画面、媒体、二维码）就要高几倍；竖向行网格不变，所以折成多要几行。"
        },
        {
          "id": "compressPage",
          "at": "@chaos7479/aifa-renderer/contracts/page-compress#compressPage",
          "input": "整页块序列 + 这张纸的网格",
          "output": "逐块的显示行数、压缩方式，与整页是否需要再等比缩的比值",
          "note": "读者屏让纸变方时按优先级压缩（人类第 229 条）。只答这一屏画多高：不写回文档、不进历史、不参与校验与容量估算，容量一律仍按默认页 636×900 估。默认页上原样返回。"
        }
      ],
      "x-hook": [
        {
          "id": "sample-staleness",
          "at": "contracts/block-content#sampleFields",
          "note": "这一块是否一个可比字段都没写过。跨字段，输入是整块内容加示例表加豁免表。"
        },
        {
          "id": "canvas.sandbox",
          "at": "contracts/embed-validator#embedValidationForBlock",
          "note": "画面沙箱的技术边界：字节上限、外链、脚本。"
        },
        {
          "id": "canvas.activity",
          "at": "contracts/canvas-source#canvasRecordsActivity",
          "note": "源码扫描：有没有本地存储或网络回传的调用。"
        },
        {
          "id": "canvas.night",
          "at": "contracts/canvas-source#canvasNightHints",
          "note": "源码扫描：夜览对比度，只提醒。"
        },
        {
          "id": "sequence",
          "at": "contracts/blocks#sequenceIssues",
          "note": "页结构：同行两个半宽块行高一致、最大档唯一、总行数越界并指到第一块越界块。序列级算法。"
        },
        {
          "id": "page-composition",
          "at": "contracts/block-content#pageCompositionIssues",
          "note": "整页只有留白块。序列级。"
        },
        {
          "id": "hard-limits",
          "at": "contracts/hard-limits#pageHardLimitIssues / blockTextGuardIssues",
          "note": "数值在 PAGE_LIMITS 里，判定仍走函数。"
        },
        {
          "id": "server-facts",
          "at": "backend/db/slots-repo 的写入闸",
          "note": "资产存在性、网盘文件体积、mediaId 有效性。契约层没有数据库。"
        }
      ],
      "x-structure": "contracts/blocks#blockIssues"
    },
    "article": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:article",
      "title": "单篇",
      "type": "object",
      "properties": {
        "title": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "kicker": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "byline": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "列表",
          "x-form": "[…]",
          "x-need": "选填"
        },
        "bylineText": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填",
          "description": "署名文字：没有在用的署名账号时读者侧显示它，两格都空显示「AIFA 编辑部」，英文空沿用中文。"
        },
        "intro": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "sources": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "object",
                "properties": {
                  "zh": {
                    "type": "string"
                  },
                  "en": {
                    "type": "string"
                  }
                },
                "required": [
                  "zh",
                  "en"
                ]
              },
              "title": {
                "type": "object",
                "properties": {
                  "zh": {
                    "type": "string"
                  },
                  "en": {
                    "type": "string"
                  }
                },
                "required": [
                  "zh",
                  "en"
                ]
              },
              "url": {
                "type": "string"
              },
              "publisher": {
                "type": "string"
              },
              "publishedAt": {
                "type": "string"
              },
              "accessedAt": {
                "type": "string"
              },
              "homepage": {
                "type": "boolean"
              }
            },
            "required": [
              "name",
              "url"
            ]
          },
          "title": "对象",
          "x-form": "[{id?, name:{zh,en}, title?:{zh,en}, url, publisher?, publishedAt?, accessedAt?, homepage?: true（出处就是站点首页）}]",
          "x-need": "选填"
        },
        "audioAssetId": {
          "type": "object",
          "properties": {
            "zh": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "en": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false,
          "title": "对象",
          "x-form": "{zh?: 资产编号|null, en?: 资产编号|null}",
          "x-need": "选填",
          "x-null-clears": true
        },
        "audioTimeline": {
          "type": "object",
          "properties": {
            "zh": {
              "anyOf": [
                {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "startTime": {
                        "type": "number"
                      },
                      "endTime": {
                        "type": "number"
                      },
                      "pageId": {
                        "type": "string"
                      },
                      "blockId": {
                        "type": "string"
                      },
                      "text": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "startTime",
                      "endTime",
                      "pageId",
                      "blockId",
                      "text"
                    ]
                  }
                },
                {
                  "type": "null"
                }
              ]
            },
            "en": {
              "anyOf": [
                {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "startTime": {
                        "type": "number"
                      },
                      "endTime": {
                        "type": "number"
                      },
                      "pageId": {
                        "type": "string"
                      },
                      "blockId": {
                        "type": "string"
                      },
                      "text": {
                        "type": "string"
                      }
                    },
                    "required": [
                      "startTime",
                      "endTime",
                      "pageId",
                      "blockId",
                      "text"
                    ]
                  }
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false,
          "title": "对象",
          "x-form": "{zh?: [{startTime, endTime, pageId, blockId, text}]|null, en?: 同形}",
          "x-need": "选填",
          "x-null-clears": true
        },
        "coverArticle": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填"
        },
        "coverImage": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "asset"
                },
                "assetId": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "const": "url"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "kind",
                "url"
              ]
            }
          ],
          "title": "对象",
          "x-form": "资产编号／站内地址，或 {kind:\"asset\",assetId}／{kind:\"url\",url}",
          "x-need": "选填",
          "x-null-clears": true
        },
        "coverFocal": {
          "type": "object",
          "properties": {
            "x": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            },
            "y": {
              "type": "number",
              "minimum": 0,
              "maximum": 100
            }
          },
          "required": [
            "x",
            "y"
          ],
          "title": "百分比坐标",
          "x-form": "{x, y}",
          "x-need": "选填"
        },
        "coverMedia": {
          "type": "object",
          "properties": {
            "video": {
              "description": "关联视频：站内素材 {kind:\"asset\",assetId} 或站内路径/http(s) 外链 {kind:\"url\",url}；null 移除（连同 videoPoster 一起清掉）",
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "asset"
                        },
                        "assetId": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "assetId"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "url"
                        },
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "url"
                      ]
                    }
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "videoPoster": {
              "description": "关联视频的引导小图：叠在封面主图上，播放键画在它上面，点它才播；不填就是整张封面图当播放键；只在已有 video 时收；null 去掉小图",
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "asset"
                        },
                        "assetId": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "assetId"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "url"
                        },
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "url"
                      ]
                    }
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "badgePosition": {
              "description": "引导小图贴在封面的哪个角：top-left/top-right/bottom-left/bottom-right；不填按该宿主位置既有的固定角显示；null 恢复默认角",
              "anyOf": [
                {
                  "type": "string",
                  "enum": [
                    "top-left",
                    "top-right",
                    "bottom-left",
                    "bottom-right"
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "subtitles": {
              "description": "视频字幕，中英各一条 .vtt 资产，可不填；只在已有 video 时收；null 整个清掉，单条清掉传 {\"en\":null}",
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "zh": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "assetId": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "assetId"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "en": {
                      "anyOf": [
                        {
                          "type": "object",
                          "properties": {
                            "assetId": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "assetId"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  }
                },
                {
                  "type": "null"
                }
              ]
            },
            "audio": {
              "description": "图片下面那条控件条播放的关联音频；null 移除",
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "asset"
                        },
                        "assetId": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "assetId"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "url"
                        },
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "url"
                      ]
                    }
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "canvas": {
              "description": "封面画面：主图位置放一段 SVG 或 HTML 源码（沙箱边界与正文画面块相同），铺满主图那一格、标题照旧压在上面；article.json 里只写 {\"file\":\"canvas/cover.html\"}，源码写那个文件；coverImage 仍要填，宿主把它垫在画面底层，画面背景透明就看得到，可只画叠加层；null 移除",
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "phone": {
              "description": "手机版封面图（T4928），可不填：手机上封面整屏铺满这一张（按出血裁，Logo 与标题下的黑色渐变照旧），电脑上照旧是 coverImage；读者只下载其中一张。建议给一张竖构图（约 9:19.5，主体放中间）；不填手机上是 coverImage 按屏宽居中。服务端不裁它；null 移除",
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "asset"
                        },
                        "assetId": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "assetId"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "url"
                        },
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "url"
                      ]
                    }
                  ]
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "title": "对象",
          "x-form": "{video?: {kind:\"asset\", assetId} 或 {kind:\"url\", url}, videoPoster?: {kind:\"asset\", assetId} 或 {kind:\"url\", url}, badgePosition?: \"top-left\" | \"top-right\" | \"bottom-left\" | \"bottom-right\", subtitles?: {zh:{assetId}, en:{assetId}}, audio?: {kind:\"asset\", assetId} 或 {kind:\"url\", url}, canvas?: 字符串（SVG 或 HTML 源码）, phone?: {kind:\"asset\", assetId} 或 {kind:\"url\", url}}",
          "x-need": "选填",
          "description": "封面的其余媒体：video、videoPoster、badgePosition、subtitles、audio、canvas、phone。整份替换，null 清掉。",
          "x-null-clears": true
        },
        "coverFrame": {
          "type": "object",
          "properties": {
            "col": {
              "description": "列起点：0 左列、1 右列；width 为 full 时不必填，恒按 0 处理",
              "anyOf": [
                {
                  "type": "number",
                  "const": 0
                },
                {
                  "type": "number",
                  "const": 1
                }
              ]
            },
            "row": {
              "type": "integer",
              "minimum": 0,
              "maximum": 30,
              "description": "行起点：0–30 的整数，对齐版心行网格"
            },
            "width": {
              "type": "string",
              "enum": [
                "full",
                "half"
              ],
              "description": "宽度档：full 占版心整宽、half 占版心半宽，与正文块同一对档位"
            },
            "rows": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "行跨：至少 1 行，row + rows 不能超过 31（版心行数）"
            }
          },
          "required": [
            "row",
            "width",
            "rows"
          ],
          "title": "对象",
          "x-form": "{col?: 0 | 1, row: 0–30 的整数, width: \"full\" | \"half\", rows: 不小于 1 的整数}",
          "x-need": "选填",
          "description": "封面媒体框：col 0–1（仅 half 有意义）、row 0–30、rows≥1 且 row+rows≤31，越界回 400；null 即全画幅",
          "x-null-clears": true
        },
        "backCoverColor": {
          "type": "string",
          "enum": [
            "#fafaf7",
            "#eceae5",
            "#b08d57",
            "#0e2a47",
            "#111418"
          ],
          "title": "枚举",
          "x-form": "\"#fafaf7\" | \"#eceae5\" | \"#b08d57\" | \"#0e2a47\" | \"#111418\"",
          "x-need": "选填",
          "x-null-clears": true
        },
        "interactionSettings": {
          "type": "object",
          "properties": {
            "assistant": {
              "type": "boolean"
            },
            "comments": {
              "type": "boolean"
            },
            "share": {
              "type": "boolean"
            }
          },
          "title": "对象",
          "x-form": "{assistant?, comments?, share?}",
          "x-need": "选填"
        },
        "commentSettings": {
          "type": "object",
          "properties": {
            "placeholder": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "zh": {
                      "type": "string"
                    },
                    "en": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "zh",
                    "en"
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "threading": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "requireSignIn": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "autoTranslate": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "liveInstant": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "title": "对象",
          "x-form": "{placeholder?:{zh,en}, threading?, requireSignIn?, autoTranslate?, liveInstant?}",
          "x-need": "选填"
        },
        "number": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "readOnly": true
        },
        "date": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "readOnly": true
        },
        "cover": {
          "type": "object",
          "properties": {},
          "additionalProperties": {},
          "title": "对象",
          "x-form": "派生页，无 pageId",
          "x-need": "选填",
          "readOnly": true
        },
        "backCover": {
          "type": "object",
          "properties": {},
          "additionalProperties": {},
          "title": "对象",
          "x-form": "派生页，无 pageId",
          "x-need": "选填",
          "readOnly": true
        },
        "coverBitmap": {
          "type": "object",
          "properties": {},
          "additionalProperties": {},
          "title": "对象",
          "x-form": "{zh, en} 两张地址",
          "x-need": "选填",
          "readOnly": true
        },
        "pageCount": {
          "type": "number",
          "title": "数值",
          "x-form": "数字",
          "x-need": "选填",
          "readOnly": true
        }
      },
      "required": [],
      "additionalProperties": true,
      "x-hook": [
        {
          "id": "server-facts",
          "at": "backend/db 的写入闸",
          "note": "资产存在性、账号存在性、编号分配。契约层没有数据库。"
        }
      ]
    },
    "collection": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "$id": "urn:aifa:declare:collection",
      "title": "合集",
      "type": "object",
      "properties": {
        "title": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "intro": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "string"
          },
          "title": "多语言",
          "x-form": "{<语种代码>: 文字}",
          "x-need": "选填"
        },
        "icon": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "description": "合集图标：SVG 源码，最多 64 KB；null 清掉、回到按名字自动出的字标。合集发布后固定",
          "x-null-clears": true
        },
        "coverArticleId": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "description": "封面头条那一篇的 id；只能选这个合集里标记过 coverArticle 的单篇",
          "x-null-clears": true
        },
        "secondaryArticleIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "列表",
          "x-form": "[…]",
          "x-need": "选填",
          "description": "兼容字段：封面不列篇目（排版规则 R1，篇目只在目录），写了照存、封面不画，发布检查提醒"
        },
        "contentsImage": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "description": "目录对页左页的配图：资产编号或站内地址；null＝跟随封面图",
          "x-null-clears": true
        },
        "backCover": {
          "type": "object",
          "properties": {
            "color": {
              "description": "封底底色，五色板取一；null 或不传即缺省纸白",
              "anyOf": [
                {
                  "type": "string",
                  "enum": [
                    "#fafaf7",
                    "#eceae5",
                    "#b08d57",
                    "#0e2a47",
                    "#111418"
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "image": {
              "description": "封底底图：走封面同一条裁剪；null 清掉，无底图即纯色底",
              "anyOf": [
                {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "asset"
                        },
                        "assetId": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "assetId"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "kind": {
                          "type": "string",
                          "const": "url"
                        },
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "kind",
                        "url"
                      ]
                    }
                  ]
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "title": "对象",
          "x-form": "{color?: \"#fafaf7\" | \"#eceae5\" | \"#b08d57\" | \"#0e2a47\" | \"#111418\", image?: 资产编号／站内地址／外部地址，或 {kind:\"asset\",assetId}／{kind:\"url\",url}}",
          "x-need": "选填",
          "description": "封底那两格 {color?, image?}：按格合并，不传的格保留原值，传 null 清掉那一格"
        },
        "articleIds": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "title": "列表",
          "x-form": "[…]",
          "x-need": "选填",
          "description": "成员顺序：整份替换的单篇 id 列表。加减成员是另外两个动作，不在这一格里做"
        },
        "itemCount": {
          "type": "number",
          "title": "数值",
          "x-form": "数字",
          "x-need": "选填",
          "readOnly": true
        },
        "slug": {
          "type": "string",
          "title": "单串",
          "x-form": "字符串",
          "x-need": "选填",
          "readOnly": true
        },
        "identityLocked": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填",
          "readOnly": true
        },
        "readOnly": {
          "type": "boolean",
          "title": "开关",
          "x-form": "true | false",
          "x-need": "选填",
          "readOnly": true
        },
        "state": {
          "type": "string",
          "enum": [
            "editing",
            "published"
          ],
          "title": "枚举",
          "x-form": "\"editing\" | \"published\"",
          "x-need": "选填",
          "readOnly": true
        }
      },
      "required": [],
      "additionalProperties": true,
      "x-hook": [
        {
          "id": "collection-publish",
          "at": "contracts/editorial-api#CollectionPublishBlocker",
          "note": "发布前置条件：已取名且有英文名、地址段可用、清单非空、每篇已发布、封面已设、目录页在、副题与封面导语不超长。跨字段且要查库，留服务端。"
        }
      ]
    }
  },
  "guideUrl": "https://afa5.chaos.callai.online/mcp-guide",
  "note": "字段规则的单一真源：校验器、字段说明、MCP 入参与这份 Schema 都从同一份声明投影，不会一处改了另一处忘改。算不出来的规则不混进 properties——序列级算法在 x-computed，输入超出单个字段的判定在 x-hook，两者都写明真源函数在哪；读得到写不进去的字段标 readOnly；MCP 那一侧传 null 表示清空的字段标 x-null-clears。声明默认宽松：没有登记的键一律忽略，不是报错。version 是内容指纹，内容没变它就不变。"
}