{
"id": "art.graphik.issue",
"defs": {
"main": {
"key": "tid",
"type": "record",
"record": {
"type": "object",
"required": [
"pages",
"createdAt"
],
"properties": {
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 64
},
"maxLength": 32
},
"cover": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp",
"image/avif"
],
"maxSize": 10000000
},
"pages": {
"type": "array",
"items": {
"ref": "#page",
"type": "ref"
},
"maxLength": 1000,
"description": "The pages, in reading order."
},
"title": {
"type": "string",
"maxLength": 1000,
"description": "Display label when the number alone isn't the name.",
"maxGraphemes": 100
},
"format": {
"type": "string",
"maxLength": 16,
"description": "Per-issue override; inherits from the series when absent.",
"knownValues": [
"page",
"strip"
]
},
"number": {
"type": "integer",
"description": "Issue number. Fractional numbering is expressed via `numberDecimal` so an interlude can sit between 1 and 2 without renumbering anything."
},
"series": {
"type": "string",
"format": "at-uri",
"description": "AT-URI of the art.graphik.series this belongs to. Absent for a one-shot."
},
"createdAt": {
"type": "string",
"format": "datetime"
},
"description": {
"type": "string",
"maxLength": 10000,
"description": "Author's note or synopsis for this issue.",
"maxGraphemes": 1000
},
"publishedAt": {
"type": "string",
"format": "datetime",
"description": "The date the creator claims for this issue. Feeds sort on this, not on when we indexed it."
},
"contributors": {
"type": "array",
"items": {
"ref": "art.graphik.series#contributor",
"type": "ref"
},
"maxLength": 64
},
"contentRating": {
"type": "string",
"maxLength": 16,
"knownValues": [
"all-ages",
"teen",
"mature",
"explicit"
]
},
"numberDecimal": {
"type": "string",
"maxLength": 16,
"description": "Issue number as a decimal string (e.g. \"1.5\"). Takes precedence over `number` when both are present."
},
"readingDirection": {
"type": "string",
"maxLength": 16,
"description": "Per-issue override; inherits from the series when absent.",
"knownValues": [
"ltr",
"rtl"
]
}
}
},
"description": "One issue or chapter. Points at its series by AT-URI rather than being nested inside it, so a series record does not have to be rewritten (and re-synced) every time a chapter ships, and so an anthology can accept an issue from another repo."
},
"page": {
"type": "object",
"required": [
"image"
],
"properties": {
"alt": {
"type": "string",
"maxLength": 2000,
"description": "Alt text. Comics are images; without this the work is simply unavailable to a screen-reader user."
},
"image": {
"type": "blob",
"accept": [
"image/png",
"image/jpeg",
"image/webp",
"image/avif"
],
"maxSize": 20000000,
"description": "The page art."
},
"width": {
"type": "integer",
"description": "Intrinsic pixel width, so a reader can reserve the right box before the image decodes."
},
"height": {
"type": "integer",
"description": "Intrinsic pixel height."
},
"spread": {
"type": "boolean",
"description": "A two-page spread that should render across the fold rather than being paired with a neighbour."
},
"placeholder": {
"type": "string",
"maxLength": 8000,
"description": "Tiny inline preview (blurhash or data URI) shown while the full page streams in."
}
}
}
},
"$type": "com.atproto.lexicon.schema",
"lexicon": 1
}