{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "drawing": {
      "properties": {
        "background": {
          "description": "The sheet the drawing is on.",
          "knownValues": [
            "paper",
            "notebook"
          ],
          "maxLength": 64,
          "type": "string"
        },
        "block": {
          "description": "The drawing block's position in the document's content, counting from 0.",
          "minimum": 0,
          "type": "integer"
        },
        "guideFills": {
          "description": "The positions, from 0, of the block's fills that are the sheet rather than the writer's drawing.",
          "items": {
            "minimum": 0,
            "type": "integer"
          },
          "maxLength": 1000,
          "type": "array"
        },
        "guideStrokes": {
          "description": "The positions, from 0, of the block's strokes that are ruled lines rather than the writer's drawing.",
          "items": {
            "minimum": 0,
            "type": "integer"
          },
          "maxLength": 1000,
          "type": "array"
        }
      },
      "required": [
        "block",
        "background"
      ],
      "type": "object"
    },
    "galleryImage": {
      "properties": {
        "block": {
          "description": "The gallery block's position in the document's content, counting from 0.",
          "minimum": 0,
          "type": "integer"
        },
        "fullBleed": {
          "description": "The image runs to the page's edges, as a single image block's fullBleed.",
          "type": "boolean"
        },
        "image": {
          "description": "The image's position in the gallery, counting from 0.",
          "minimum": 0,
          "type": "integer"
        },
        "width": {
          "description": "The width the writer gave the image, in points, as a single image block's width.",
          "minimum": 1,
          "type": "integer"
        }
      },
      "required": [
        "block",
        "image"
      ],
      "type": "object"
    },
    "main": {
      "description": "One per reviewed book. The record key is the book's BookHive ID (hiveId), so a reader's review of a book can be found with a single getRecord. A book BookHive doesn't hold is keyed by a stand-in instead (isbn-…, resenha-… or popfeed-…), which is also its hiveId.",
      "key": "any",
      "record": {
        "properties": {
          "book": {
            "description": "The reader's record for the book: a buzz.bookhive.book or an ink.resenha.reading, whose review field holds the same review as plain text, or, for a book the reader keeps in Popfeed, a social.popfeed.feed.listItem, whose newest social.popfeed.feed.review holds it as plain text with a link to the formatted review.",
            "format": "at-uri",
            "type": "string"
          },
          "bookRef": {
            "description": "The book in every key anyone uses, so the review can be found for an edition no catalogue knows, by ISBN.",
            "ref": "ink.resenha.defs#bookRef",
            "type": "ref"
          },
          "createdAt": {
            "format": "datetime",
            "type": "string"
          },
          "document": {
            "description": "The site.standard.document that holds the review. Its content is the formatted review; its textContent is the same review as plain text.",
            "format": "at-uri",
            "type": "string"
          },
          "drawings": {
            "description": "How Resenha drew the document's drawing blocks: the sheet behind each and its ruled lines, which the blocks themselves hold as ordinary fills and strokes. One entry per drawing with a background.",
            "items": {
              "ref": "#drawing",
              "type": "ref"
            },
            "maxLength": 50,
            "type": "array"
          },
          "galleryImages": {
            "description": "The layout the writer gave images inside the document's gallery blocks, which a gallery's images don't hold themselves. A single image block keeps its width and fullBleed in the block.",
            "items": {
              "ref": "#galleryImage",
              "type": "ref"
            },
            "maxLength": 200,
            "type": "array"
          },
          "hiveId": {
            "description": "The book's BookHive ID, or the stand-in the record is keyed by for a book BookHive doesn't hold. Also the record key.",
            "maxLength": 64,
            "type": "string"
          },
          "langs": {
            "description": "The languages the review is written in, as the reader chose them. BCP-47 codes, as in a Bluesky post's langs.",
            "items": {
              "format": "language",
              "type": "string"
            },
            "maxLength": 3,
            "type": "array"
          },
          "lineSpacing": {
            "description": "The line spacing the writer chose, as a percentage of the font's own line height, as word processors count it. Known values: 100, 115, 150, 200. Absent for the usual spacing.",
            "maximum": 400,
            "minimum": 50,
            "type": "integer"
          },
          "paragraphSpacing": {
            "description": "The gap between paragraphs the writer chose, as a percentage of the text size. Known values: 40, 90, 150. Absent for the usual gap.",
            "maximum": 400,
            "minimum": 0,
            "type": "integer"
          },
          "spoiler": {
            "description": "The reader marked the review as giving away parts of the book. The document carries the same mark as a \"spoiler\" self-label.",
            "type": "boolean"
          }
        },
        "required": [
          "document",
          "book",
          "hiveId",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "description": "Connects a book review, published as a site.standard.document, to the book it reviews.",
  "id": "ink.resenha.bookReview",
  "lexicon": 1
}
