Skip to content
Sequential.work

Shared definitions

work.sequential.defs

Panels, localized text and images, versions, credits and more.

PropertyTypeDescription
imagerequiredblobThe localized image.
≤ 4 MiB
Acceptsimage/jpegimage/pngimage/webpimage/avif
langrequiredlanguageBCP-47 language tag for this image (e.g. 'en', 'pt-BR').

Localized alt text. Describes the art and transcribes the dialogue, captions and sound effects.

PropertyTypeDescription
langrequiredlanguageBCP-47 language tag for this text.
textrequiredstring
≤ 10000 graphemes
PropertyTypeDescription
langrequiredlanguageBCP-47 language tag for this title.
textrequiredstring
≤ 100 graphemes
PropertyTypeDescription
langrequiredlanguageBCP-47 language tag for this description.
textrequiredstring
≤ 3000 graphemes
PropertyTypeDescription
langrequiredlanguageBCP-47 language tag for this text.
textrequiredstring
≤ 1000 graphemes

#version

object

Another version of the same artwork, such as a production stage (pencils, inks) or an alternate treatment (virgin, black and white).

PropertyTypeDescription
imagerequiredblobThe version image.
≤ 4 MiB
Acceptsimage/jpegimage/pngimage/webpimage/avif
kindrequiredstringWhat this version shows. AppViews may define their own kinds.
≤ 64 graphemes
Knownthumbnailslayoutroughspencilslineartinksflatscolorsletters
PropertyTypeDescription
widthrequiredinteger
≥ 1
heightrequiredinteger
≥ 1

#credit

object
PropertyTypeDescription
displayNamerequiredstring
≤ 100 graphemes
diddid
rolerequiredstringThe role of the credit. AppViews may define their own roles.
≤ 64 graphemes
KnownwriterpencilerinkercoloristflatsletterercovercreatoreditoreditorInChiefassociateEditorassistantEditordesignerartisttranslatorpainterbackgrounds

#category

string

A category for a series. AppViews may define their own categories.

string
≤ 64 graphemes

#tag

string

A free-form tag, without a leading '#'.

string
≤ 64 graphemes

#panel

object

A panel on a page or strip. Carries the image's alt text, one description per panel, and optionally its position for panel-by-panel reading. A splash page or single-panel strip is a single panel.

PropertyTypeDescription
bounds#boundsWhere the panel sits on the image. Optional, so alt text can be added without mapping panel positions.
altdefs#localizedAlt[]Localized alt text for this panel: describes the art and transcribes the dialogue, captions and sound effects.
≤ 100 items
background#rgbaWhen reading panel-by-panel, fills the viewport around the panel if the panel's aspect ratio differs from the viewport's. The alpha is the opacity: 0 shows the panel with the surrounding page still visible, 100 hides the page behind a solid color so the panel stands on its own. Treated as fully transparent when omitted.
maskblobBlack and white mask of the panel's exact shape, for panels that aren't rectangles or whose art bleeds past the panel border. Covers the panel's bounds, at the same size or aspect ratio, so the bounds must enclose everything the mask shows. Ignored when bounds are omitted. White shows the art, black hides it, and grays blend for soft edges.
≤ 4 MiB
Acceptsimage/png
transitionstringWhen reading panel-by-panel, how the app moves to this panel from the previous one. Played in reverse when reading backward. 'none' switches instantly, 'pan' moves the view across the image to the panel, 'fade' crossfades from the previous panel, and 'zoom' pulls back to show the whole image then pushes in to the panel. Duration is up to the AppView. AppViews treat unknown values as 'none'.
default: none
Knownnonepanfadezoom

#rgba

object

A color with opacity.

PropertyTypeDescription
rrequiredinteger
0–255
grequiredinteger
0–255
brequiredinteger
0–255
arequiredintegerOpacity, from 0 (fully transparent) to 100 (fully opaque).
0–100

#bounds

object

A rectangle relative to an image, in ten-thousandths of the image's width and height (0-10000), with the origin at the top left.

PropertyTypeDescription
xrequiredinteger
0–10000
yrequiredinteger
0–10000
widthrequiredinteger
1–10000
heightrequiredinteger
1–10000

Raw schema

work.sequential.defs.json
{
  "lexicon": 1,
  "id": "work.sequential.defs",
  "defs": {
    "localizedImage": {
      "type": "object",
      "properties": {
        "image": {
          "type": "blob",
          "maxSize": 4194304,
          "accept": [
            "image/jpeg",
            "image/png",
            "image/webp",
            "image/avif"
          ],
          "description": "The localized image."
        },
        "lang": {
          "type": "string",
          "format": "language",
          "description": "BCP-47 language tag for this image (e.g. 'en', 'pt-BR')."
        }
      },
      "required": [
        "image",
        "lang"
      ]
    },
    "localizedAlt": {
      "type": "object",
      "properties": {
        "lang": {
          "type": "string",
          "format": "language",
          "description": "BCP-47 language tag for this text."
        },
        "text": {
          "type": "string",
          "maxLength": 100000,
          "maxGraphemes": 10000
        }
      },
      "description": "Localized alt text. Describes the art and transcribes the dialogue, captions and sound effects.",
      "required": [
        "lang",
        "text"
      ]
    },
    "localizedTitle": {
      "type": "object",
      "properties": {
        "lang": {
          "type": "string",
          "format": "language",
          "description": "BCP-47 language tag for this title."
        },
        "text": {
          "type": "string",
          "maxLength": 1000,
          "maxGraphemes": 100
        }
      },
      "required": [
        "lang",
        "text"
      ]
    },
    "localizedDescription": {
      "type": "object",
      "properties": {
        "lang": {
          "type": "string",
          "format": "language",
          "description": "BCP-47 language tag for this description."
        },
        "text": {
          "type": "string",
          "maxLength": 30000,
          "maxGraphemes": 3000
        }
      },
      "required": [
        "lang",
        "text"
      ]
    },
    "localizedText": {
      "type": "object",
      "properties": {
        "lang": {
          "type": "string",
          "format": "language",
          "description": "BCP-47 language tag for this text."
        },
        "text": {
          "type": "string",
          "maxLength": 10000,
          "maxGraphemes": 1000
        }
      },
      "required": [
        "lang",
        "text"
      ]
    },
    "version": {
      "type": "object",
      "properties": {
        "image": {
          "type": "blob",
          "maxSize": 4194304,
          "accept": [
            "image/jpeg",
            "image/png",
            "image/webp",
            "image/avif"
          ],
          "description": "The version image."
        },
        "kind": {
          "type": "string",
          "maxLength": 640,
          "maxGraphemes": 64,
          "knownValues": [
            "thumbnails",
            "layout",
            "roughs",
            "pencils",
            "lineart",
            "inks",
            "flats",
            "colors",
            "letters"
          ],
          "description": "What this version shows. AppViews may define their own kinds."
        }
      },
      "description": "Another version of the same artwork, such as a production stage (pencils, inks) or an alternate treatment (virgin, black and white).",
      "required": [
        "image",
        "kind"
      ]
    },
    "aspectRatio": {
      "type": "object",
      "properties": {
        "width": {
          "type": "integer",
          "minimum": 1
        },
        "height": {
          "type": "integer",
          "minimum": 1
        }
      },
      "required": [
        "width",
        "height"
      ]
    },
    "credit": {
      "type": "object",
      "properties": {
        "displayName": {
          "type": "string",
          "maxLength": 1000,
          "maxGraphemes": 100
        },
        "did": {
          "type": "string",
          "format": "did"
        },
        "role": {
          "type": "string",
          "maxLength": 640,
          "maxGraphemes": 64,
          "knownValues": [
            "writer",
            "penciler",
            "inker",
            "colorist",
            "flats",
            "letterer",
            "cover",
            "creator",
            "editor",
            "editorInChief",
            "associateEditor",
            "assistantEditor",
            "designer",
            "artist",
            "translator",
            "painter",
            "backgrounds"
          ],
          "description": "The role of the credit. AppViews may define their own roles."
        }
      },
      "required": [
        "displayName",
        "role"
      ]
    },
    "category": {
      "type": "string",
      "maxLength": 640,
      "maxGraphemes": 64,
      "description": "A category for a series. AppViews may define their own categories."
    },
    "tag": {
      "type": "string",
      "maxLength": 640,
      "maxGraphemes": 64,
      "description": "A free-form tag, without a leading '#'."
    },
    "panel": {
      "type": "object",
      "properties": {
        "bounds": {
          "type": "ref",
          "ref": "#bounds",
          "description": "Where the panel sits on the image. Optional, so alt text can be added without mapping panel positions."
        },
        "alt": {
          "type": "array",
          "items": {
            "type": "ref",
            "ref": "work.sequential.defs#localizedAlt"
          },
          "maxLength": 100,
          "description": "Localized alt text for this panel: describes the art and transcribes the dialogue, captions and sound effects."
        },
        "background": {
          "type": "ref",
          "ref": "#rgba",
          "description": "When reading panel-by-panel, fills the viewport around the panel if the panel's aspect ratio differs from the viewport's. The alpha is the opacity: 0 shows the panel with the surrounding page still visible, 100 hides the page behind a solid color so the panel stands on its own. Treated as fully transparent when omitted."
        },
        "mask": {
          "type": "blob",
          "maxSize": 4194304,
          "accept": [
            "image/png"
          ],
          "description": "Black and white mask of the panel's exact shape, for panels that aren't rectangles or whose art bleeds past the panel border. Covers the panel's bounds, at the same size or aspect ratio, so the bounds must enclose everything the mask shows. Ignored when bounds are omitted. White shows the art, black hides it, and grays blend for soft edges."
        },
        "transition": {
          "type": "string",
          "knownValues": [
            "none",
            "pan",
            "fade",
            "zoom"
          ],
          "default": "none",
          "description": "When reading panel-by-panel, how the app moves to this panel from the previous one. Played in reverse when reading backward. 'none' switches instantly, 'pan' moves the view across the image to the panel, 'fade' crossfades from the previous panel, and 'zoom' pulls back to show the whole image then pushes in to the panel. Duration is up to the AppView. AppViews treat unknown values as 'none'."
        }
      },
      "description": "A panel on a page or strip. Carries the image's alt text, one description per panel, and optionally its position for panel-by-panel reading. A splash page or single-panel strip is a single panel."
    },
    "rgba": {
      "type": "object",
      "properties": {
        "r": {
          "type": "integer",
          "minimum": 0,
          "maximum": 255
        },
        "g": {
          "type": "integer",
          "minimum": 0,
          "maximum": 255
        },
        "b": {
          "type": "integer",
          "minimum": 0,
          "maximum": 255
        },
        "a": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "description": "Opacity, from 0 (fully transparent) to 100 (fully opaque)."
        }
      },
      "description": "A color with opacity.",
      "required": [
        "r",
        "g",
        "b",
        "a"
      ]
    },
    "bounds": {
      "type": "object",
      "properties": {
        "x": {
          "type": "integer",
          "minimum": 0,
          "maximum": 10000
        },
        "y": {
          "type": "integer",
          "minimum": 0,
          "maximum": 10000
        },
        "width": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10000
        },
        "height": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10000
        }
      },
      "description": "A rectangle relative to an image, in ten-thousandths of the image's width and height (0-10000), with the origin at the top left.",
      "required": [
        "x",
        "y",
        "width",
        "height"
      ]
    }
  }
}