JSON Schema
This page shows a formatted version of the JSON schema, you can click on highlighted
objects to get a link to that section of the schema. You can also click on $ref
values to jump to the relevant section.
If you want you can also view the raw schema file.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://lottie.github.io/lottie-spec/1.0/specs/schema/",
"$ref": "#/$defs/composition/animation",
"$version": 10000,
"$defs": {
"assets": {
"precomposition" : {
"type": "object",
"title": "Precomposition",
"description": "Asset containing a composition that can be referenced by layers.",
"allOf": [
{
"$ref": "#/$defs/assets/asset"
},
{
"$ref": "#/$defs/composition/composition"
}
]
},
"asset" : {
"type": "object",
"title": "Asset",
"allOf": [
{
"$ref": "#/$defs/helpers/visual-object"
},
{
"type": "object",
"properties": {
"id": {
"title": "ID",
"description": "Unique identifier used by layers when referencing this asset",
"type": "string"
}
},
"required": [
"id"
]
}
]
},
"image" : {
"type": "object",
"title": "Image",
"description": "Asset containing an image that can be referenced by layers.",
"allOf": [
{
"$ref": "#/$defs/assets/asset"
},
{
"$ref": "#/$defs/helpers/slottable-object"
},
{
"type": "object",
"properties": {
"w": {
"title": "Width",
"description": "Width of the image",
"type": "number"
},
"h": {
"title": "Height",
"description": "Height of the image",
"type": "number"
},
"p": {
"title": "File Name",
"description": "Name of the image file or a data url",
"type": "string"
},
"u": {
"title": "File Path",
"description": "Path to the image file",
"type": "string"
},
"e": {
"title": "Embedded",
"description": "If '1', 'p' is a Data URL",
"$ref": "#/$defs/values/int-boolean"
}
},
"allOf": [
{
"if": {
"properties": {
"e": {
"const": 1
}
},
"required": [
"e"
]
},
"then": {
"properties": {
"p": {
"$ref": "#/$defs/values/data-url"
}
}
}
}
],
"if": {
"required": [
"sid"
]
},
"else": {
"required": [
"w",
"h",
"p"
]
}
}
]
},
"all-assets" : {
"oneOf": [
{
"$ref": "#/$defs/assets/precomposition"
},
{
"$ref": "#/$defs/assets/image"
}
]
}
},
"composition": {
"animation" : {
"type": "object",
"title": "Animation",
"description": "Top level object, describing the animation",
"allOf": [
{
"$ref": "#/$defs/helpers/visual-object"
},
{
"type": "object",
"properties": {
"ver": {
"title": "Specification Version",
"description": "Specification version this Lottie is targeting. This is a 6 digit number with version components encoded as MMmmpp
, with MM
being major version, mm
being minor and pp
being patch.",
"type": "integer",
"minimum": 10000
},
"fr": {
"title": "Framerate",
"description": "Framerate in frames per second",
"type": "number",
"exclusiveMinimum": 0
},
"ip": {
"title": "In Point",
"description": "Frame the animation starts at (usually 0)",
"type": "number"
},
"op": {
"title": "Out Point",
"description": "Frame the animation stops/loops at, which makes this the duration in frames when ip
is 0",
"type": "number"
},
"w": {
"title": "Width",
"description": "Width of the animation",
"type": "integer",
"minimum": 0
},
"h": {
"title": "Height",
"description": "Height of the animation",
"type": "integer",
"minimum": 0
},
"assets": {
"title": "Assets",
"type": "array",
"description": "List of assets that can be referenced by layers",
"items": {
"$ref": "#/$defs/assets/all-assets"
}
},
"markers": {
"title": "Markers",
"description": "Markers defining named sections of the composition.",
"type": "array",
"items": {
"$ref": "#/$defs/helpers/marker"
}
},
"slots": {
"title": "Slots",
"description": "Dictionary of slot ids that will replace matching properties.",
"type": "object",
"additionalProperties": {
"$ref": "#/$defs/helpers/slot"
}
}
},
"required": [
"w",
"h",
"fr",
"op",
"ip"
]
},
{
"$ref": "#/$defs/composition/composition"
}
]
},
"composition" : {
"type": "object",
"title": "Composition",
"description": "An object that contains a list of layers",
"properties": {
"layers": {
"title": "Layers",
"type": "array",
"items": {
"$ref": "#/$defs/layers/all-layers"
}
}
},
"required": [
"layers"
]
}
},
"constants": {
"gradient-type" : {
"type": "integer",
"title": "Gradient Type",
"description": "Whether a Gradient is a linear or radial.",
"oneOf": [
{
"title": "Linear",
"description": "Colors transition in a single linear direction.",
"const": 1
},
{
"title": "Radial",
"description": "Colors transition outward from a center point.",
"const": 2
}
]
},
"line-cap" : {
"type": "integer",
"title": "Line Cap",
"description": "Style at the end of a stoked line",
"oneOf": [
{
"title": "Butt",
"const": 1
},
{
"title": "Round",
"const": 2
},
{
"title": "Square",
"const": 3
}
]
},
"fill-rule" : {
"type": "integer",
"title": "Fill Rule",
"description": "Rule used to handle multiple shapes rendered with the same fill object",
"oneOf": [
{
"title": "Non Zero",
"description": "Everything is colored (You can think of this as an OR)",
"const": 1
},
{
"title": "Even Odd",
"description": "Colored based on intersections and path direction, can be used to create \"holes\"",
"const": 2
}
]
},
"matte-mode" : {
"type": "integer",
"title": "Matte Mode",
"description": "How a layer should mask another layer",
"oneOf": [
{
"title": "Normal",
"description": "The layer is not used as a track matte",
"const": 0
},
{
"title": "Alpha",
"description": "The masked layer opacity is modulated by the track matte layer opacity",
"const": 1
},
{
"title": "Inverted Alpha",
"description": "The masked layer opacity is modulated by the inverted track matte layer opacity",
"const": 2
},
{
"title": "Luma",
"description": "The masked layer opacity is modulated by the track matte layer luminance",
"const": 3
},
{
"title": "Inverted Luma",
"description": "The masked layer opacity is modulated by the inverted track matte layer luminance",
"const": 4
}
]
},
"star-type" : {
"type": "integer",
"title": "Star Type",
"description": "Whether a PolyStar is a star or a polygon",
"oneOf": [
{
"title": "Star",
"const": 1
},
{
"title": "Polygon",
"const": 2
}
]
},
"trim-multiple-shapes" : {
"type": "integer",
"title": "Trim Multiple Shapes",
"description": "How to handle multiple shapes in trim path",
"oneOf": [
{
"title": "Parallel",
"description": "All shapes apply the trim at the same time",
"const": 1
},
{
"title": "Sequential",
"description": "Shapes are considered as a continuous sequence",
"const": 2
}
]
},
"mask-mode" : {
"type": "string",
"title": "Mask Mode",
"description": "Describes how a mask interacts (blends) with the preceding masks in the stack.",
"oneOf": [
{
"title": "None",
"const": "n",
"description": "The mask is ignored."
},
{
"title": "Add",
"const": "a",
"description": "Mask coverage is added (Normal blending)."
},
{
"title": "Subtract",
"const": "s",
"description": "Mask coverage is subtracted (Subtract blending)."
},
{
"title": "Intersect",
"const": "i",
"description": "Mask coverage is intersected (Source-In blending)."
}
]
},
"line-join" : {
"type": "integer",
"title": "Line Join",
"description": "Style at a sharp corner of a stoked line",
"oneOf": [
{
"title": "Miter",
"const": 1
},
{
"title": "Round",
"const": 2
},
{
"title": "Bevel",
"const": 3
}
]
},
"shape-direction" : {
"type": "integer",
"title": "Shape Direction",
"description": "Drawing direction of the shape curve, useful for trim path",
"oneOf": [
{
"title": "Normal",
"description": "Usually clockwise",
"const": 1
},
{
"title": "Reversed",
"description": "Usually counter clockwise",
"const": 3
}
]
},
"stroke-dash-type" : {
"type": "string",
"title": "Stroke Dash Type",
"description": "Type of a dash item in a stroked line",
"oneOf": [
{
"title": "Dash",
"const": "d"
},
{
"title": "Gap",
"const": "g"
},
{
"title": "Offset",
"const": "o"
}
]
}
},
"helpers": {
"marker" : {
"type": "object",
"title": "Marker",
"description": "Defines named portions of the composition.",
"properties": {
"cm": {
"title": "Comment",
"type": "string"
},
"tm": {
"title": "Time",
"type": "number"
},
"dr": {
"title": "Duration",
"type": "number"
}
}
},
"slottable-object" : {
"type": "object",
"title": "Slottable Object",
"description": "Object that may have its value replaced with a slot value",
"properties": {
"sid": {
"title": "Slot Id",
"description": "Identifier to look up the slot",
"type": "string"
}
}
},
"transform" : {
"type": "object",
"title": "Transform",
"description": "Layer transform",
"allOf": [
{
"properties": {
"a": {
"title": "Anchor Point",
"description": "Anchor point: a position (relative to its parent) around which transformations are applied (ie: center for rotation / scale)",
"$ref": "#/$defs/properties/position-property"
},
"p": {
"title": "Position",
"description": "Position / Translation",
"$ref": "#/$defs/properties/splittable-position-property"
},
"r": {
"title": "Rotation",
"description": "Rotation in degrees, clockwise",
"$ref": "#/$defs/properties/scalar-property"
},
"s": {
"title": "Scale",
"description": "Scale factor, [100, 100]
for no scaling",
"$ref": "#/$defs/properties/vector-property"
},
"o": {
"title": "Opacity",
"$ref": "#/$defs/properties/scalar-property"
},
"sk": {
"title": "Skew",
"description": "Skew amount as an angle in degrees",
"$ref": "#/$defs/properties/scalar-property"
},
"sa": {
"title": "Skew Axis",
"description": "Direction along which skew is applied, in degrees (0
skews along the X axis, 90
along the Y axis)",
"$ref": "#/$defs/properties/scalar-property"
}
}
}
]
},
"mask" : {
"type": "object",
"title": "Mask",
"description": "Mask for layer content.",
"allOf": [
{
"properties": {
"mode": {
"title": "Mode",
"$ref": "#/$defs/constants/mask-mode",
"default": "i"
},
"o": {
"title": "Opacity",
"description": "Mask opacity, as a percentage [0..100].",
"$ref": "#/$defs/properties/scalar-property",
"default": 100
},
"pt": {
"title": "Shape",
"description": "Mask shape",
"$ref": "#/$defs/properties/bezier-property"
}
},
"required": [
"pt"
]
}
]
},
"slot" : {
"type": "object",
"title": "Slot",
"description": "Defines a property value that will be set to all matched properties",
"properties": {
"p": {
"title": "Property Value",
"description": "Property Value"
}
},
"required": [
"p"
]
},
"slottable-property" : {
"type": "object",
"title": "Slottable Property",
"description": "Property that may have its value replaced with a slot value",
"allOf": [
{
"$ref": "#/$defs/helpers/slottable-object"
}
],
"if": {
"required": [
"sid"
]
},
"else": {
"required": [
"a",
"k"
]
}
},
"visual-object" : {
"type": "object",
"title": "Visual Object",
"description": "",
"allOf": [
{
"type": "object",
"properties": {
"nm": {
"title": "Name",
"description": "Human readable name, as seen from editors and the like",
"type": "string"
}
},
"required": []
}
]
}
},
"layers": {
"solid-layer" : {
"type": "object",
"title": "Solid Layer",
"description": "Solid color, rectangle-shaped layer",
"allOf": [
{
"$ref": "#/$defs/layers/visual-layer"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Type",
"description": "Layer type",
"type": "integer",
"const": 1
},
"sw": {
"title": "Width",
"description": "Solid rectangle width",
"type": "integer"
},
"sh": {
"title": "Height",
"description": "Solid rectangle height",
"type": "integer"
},
"sc": {
"title": "Color",
"description": "Solid fill color",
"$ref": "#/$defs/values/hexcolor"
}
},
"required": [
"ty",
"sw",
"sh",
"sc"
]
}
]
},
"image-layer" : {
"type": "object",
"title": "Image Layer",
"description": "Layer containing an image",
"allOf": [
{
"$ref": "#/$defs/layers/visual-layer"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Type",
"description": "Layer type",
"type": "integer",
"const": 2
},
"refId": {
"title": "Reference Id",
"description": "ID of the image as specified in the assets",
"type": "string"
}
},
"required": [
"ty",
"refId"
]
}
]
},
"all-layers" : {
"oneOf": [
{
"$ref": "#/$defs/layers/precomposition-layer"
},
{
"$ref": "#/$defs/layers/image-layer"
},
{
"$ref": "#/$defs/layers/null-layer"
},
{
"$ref": "#/$defs/layers/solid-layer"
},
{
"$ref": "#/$defs/layers/shape-layer"
},
{
"$ref": "#/$defs/layers/unknown-layer"
}
]
},
"precomposition-layer" : {
"type": "object",
"title": "Precomposition Layer",
"description": "Layer that renders a Precomposition asset",
"allOf": [
{
"$ref": "#/$defs/layers/visual-layer"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Type",
"description": "Layer type",
"type": "integer",
"const": 0
},
"refId": {
"title": "Reference Id",
"description": "ID of the precomp as specified in the assets",
"type": "string"
},
"w": {
"title": "Width",
"description": "Width of the clipping rect",
"type": "integer"
},
"h": {
"title": "Height",
"description": "Height of the clipping rect",
"type": "integer"
},
"sr": {
"title": "Time Stretch",
"type": "number",
"default": 1
},
"st": {
"title": "Start Time",
"type": "number",
"default": 0
},
"tm": {
"title": "Time Remap",
"description": "Timeline remap function (frame index -> time in seconds)",
"$ref": "#/$defs/properties/scalar-property"
}
},
"required": [
"ty",
"refId"
]
}
]
},
"null-layer" : {
"type": "object",
"title": "Null Layer",
"description": "Layer with no data, useful to group layers together",
"allOf": [
{
"$ref": "#/$defs/layers/visual-layer"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Type",
"description": "Layer type",
"type": "integer",
"const": 3
}
},
"required": [
"ty"
]
}
]
},
"shape-layer" : {
"type": "object",
"title": "Shape Layer",
"description": "Layer containing Shapes",
"allOf": [
{
"$ref": "#/$defs/layers/visual-layer"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Type",
"description": "Layer type",
"type": "integer",
"const": 4
},
"shapes": {
"title": "Shapes",
"type": "array",
"items": {
"$ref": "#/$defs/shapes/all-graphic-elements"
}
}
},
"required": [
"ty",
"shapes"
]
}
]
},
"unknown-layer" : {
"type": "object",
"title": "Unknown layer types",
"description": "Unknown layer types. Types not defined by the specification are still allowed.",
"properties": {
"ty": {
"not": {
"$comment": "enum list is dynamically generated",
"enum": [
0,
2,
3,
1,
4
]
}
}
}
},
"visual-layer" : {
"type": "object",
"title": "Visual Layer",
"description": "Layer used to affect visual elements",
"allOf": [
{
"$ref": "#/$defs/layers/layer"
},
{
"type": "object",
"properties": {
"ks": {
"title": "Transform",
"description": "Layer transform",
"$ref": "#/$defs/helpers/transform"
},
"ao": {
"title": "Auto Orient",
"$ref": "#/$defs/values/int-boolean",
"default": 0,
"description": "If 1, the layer will rotate itself to match its animated position path"
},
"tt": {
"title": "Matte Mode",
"$ref": "#/$defs/constants/matte-mode",
"description": "Defines the track matte mode for the layer"
},
"tp": {
"title": "Matte Parent",
"type": "integer",
"description": "Index of the layer used as matte, if omitted assume the layer above the current one"
},
"masksProperties": {
"title": "Masks",
"description": "Optional array of masks for the layer.",
"type": "array",
"items": {
"$ref": "#/$defs/helpers/mask"
}
}
},
"required": [
"ks"
]
}
]
},
"layer" : {
"type": "object",
"title": "Layer",
"description": "Common properties for all layers",
"allOf": [
{
"$ref": "#/$defs/helpers/visual-object"
},
{
"type": "object",
"properties": {
"hd": {
"title": "Hidden",
"description": "Whether the layer is hidden",
"type": "boolean"
},
"ty": {
"title": "Type",
"description": "Layer Type",
"type": "integer"
},
"ind": {
"title": "Index",
"type": "integer",
"description": "Index that can be used for parenting and referenced in expressions"
},
"parent": {
"title": "Parent Index",
"description": "Must be the ind
property of another layer",
"type": "integer"
},
"ip": {
"title": "In Point",
"description": "Frame when the layer becomes visible",
"type": "number"
},
"op": {
"title": "Out Point",
"description": "Frame when the layer becomes invisible",
"type": "number"
}
},
"required": [
"ty",
"ip",
"op"
]
}
]
}
},
"properties": {
"vector-property" : {
"type": "object",
"title": "Vector Property",
"description": "An animatable property that holds an array of numbers",
"allOf": [
{
"$ref": "#/$defs/helpers/slottable-property"
}
],
"oneOf": [
{
"$comment": "Not animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 0
},
"k": {
"title": "Value",
"description": "Static Value",
"$ref": "#/$defs/values/vector"
}
}
},
{
"$comment": "Animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 1
},
"k": {
"type": "array",
"title": "Keyframes",
"description": "Array of keyframes",
"items": {
"$ref": "#/$defs/properties/vector-keyframe"
}
}
}
}
]
},
"vector-keyframe" : {
"type": "object",
"title": "Vector Keyframe",
"allOf": [
{
"$ref": "#/$defs/properties/base-keyframe"
},
{
"properties": {
"s": {
"title": "Value",
"description": "Value at this keyframe.",
"$ref": "#/$defs/values/vector"
}
}
}
],
"required": [
"s"
]
},
"gradient-keyframe" : {
"type": "object",
"title": "Gradient Keyframe",
"allOf": [
{
"$ref": "#/$defs/properties/base-keyframe"
},
{
"properties": {
"s": {
"title": "Value",
"description": "Value at this keyframe.",
"$ref": "#/$defs/values/gradient"
}
}
}
],
"required": [
"s"
]
},
"bezier-property" : {
"type": "object",
"title": "Bezier Property",
"description": "An animatable property that holds a Bezier shape",
"oneOf": [
{
"$comment": "Not animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 0
},
"k": {
"title": "Value",
"description": "Static Value",
"$ref": "#/$defs/values/bezier"
}
}
},
{
"$comment": "Animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 1
},
"k": {
"type": "array",
"title": "Keyframes",
"description": "Array of keyframes",
"items": {
"$ref": "#/$defs/properties/bezier-keyframe"
}
}
}
}
],
"required": [
"a",
"k"
]
},
"position-keyframe" : {
"type": "object",
"title": "Position Keyframe",
"allOf": [
{
"$ref": "#/$defs/properties/vector-keyframe"
},
{
"properties": {
"ti": {
"title": "Value In Tangent",
"description": "Tangent for values (eg: moving position around a curved path)",
"$ref": "#/$defs/values/vector"
},
"to": {
"title": "Value Out Tangent",
"description": "Tangent for values (eg: moving position around a curved path)",
"$ref": "#/$defs/values/vector"
}
}
}
]
},
"color-keyframe" : {
"type": "object",
"title": "Color Keyframe",
"allOf": [
{
"$ref": "#/$defs/properties/base-keyframe"
},
{
"properties": {
"s": {
"title": "Value",
"description": "Value at this keyframe.",
"$ref": "#/$defs/values/color"
}
}
}
],
"required": [
"s"
]
},
"scalar-property" : {
"type": "object",
"title": "Scalar Property",
"description": "An animatable property that holds a float",
"allOf": [
{
"$ref": "#/$defs/helpers/slottable-property"
}
],
"oneOf": [
{
"$comment": "Not animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 0
},
"k": {
"title": "Value",
"description": "Static Value",
"type": "number"
}
}
},
{
"$comment": "Animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 1
},
"k": {
"type": "array",
"title": "Keyframes",
"description": "Array of keyframes",
"items": {
"$ref": "#/$defs/properties/vector-keyframe"
}
}
}
}
]
},
"gradient-property" : {
"type": "object",
"title": "Gradient Property",
"description": "An animatable property that holds a Gradient",
"properties": {
"p": {
"title": "Color stop count",
"type": "number"
},
"k": {
"type": "object",
"title": "Gradient stops",
"description": "Animatable vector representing the gradient stops",
"oneOf": [
{
"$comment": "Not animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 0
},
"k": {
"title": "Value",
"description": "Static Value",
"$ref": "#/$defs/values/gradient"
}
}
},
{
"$comment": "Animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 1
},
"k": {
"type": "array",
"title": "Keyframes",
"description": "Array of keyframes",
"items": {
"$ref": "#/$defs/properties/gradient-keyframe"
}
}
}
}
],
"required": [
"a",
"k"
]
}
}
},
"easing-handle" : {
"type": "object",
"title": "Keyframe Easing",
"description": "Bezier handle for keyframe interpolation",
"properties": {
"x": {
"title": "X",
"description": "Time component:\n0 means start time of the keyframe,\n1 means time of the next keyframe.",
"oneOf": [
{
"type": "array",
"$ref": "#/$defs/values/vector",
"items": {
"type": "number",
"default": 0,
"minimum": 0,
"maximum": 1
},
"minItems": 1
},
{
"type": "number",
"default": 0,
"minimum": 0,
"maximum": 1
}
]
},
"y": {
"title": "Y",
"description": "Value interpolation component:\n0 means start value of the keyframe,\n1 means value at the next keyframe.",
"oneOf": [
{
"type": "array",
"$ref": "#/$defs/values/vector",
"items": {
"type": "number",
"default": 0
},
"minItems": 1
},
{
"type": "number",
"default": 0
}
]
}
},
"required": [
"x",
"y"
]
},
"base-keyframe" : {
"type": "object",
"title": "Base Keyframe",
"description": "A Keyframes specifies the value at a specific time and the interpolation function to reach the next keyframe.",
"allOf": [
{
"properties": {
"t": {
"title": "Time",
"description": "Frame number",
"type": "number",
"default": 0
},
"h": {
"title": "Hold",
"$ref": "#/$defs/values/int-boolean",
"default": 0
},
"i": {
"title": "In Tangent",
"description": "Easing tangent going into the next keyframe",
"$ref": "#/$defs/properties/easing-handle"
},
"o": {
"title": "Out Tangent",
"description": "Easing tangent leaving the current keyframe",
"$ref": "#/$defs/properties/easing-handle"
}
}
}
],
"required": [
"t"
]
},
"split-position" : {
"type": "object",
"title": "Split Position",
"description": "An animatable position where x and y are definied and animated separately.",
"properties": {
"s": {
"title": "Split",
"description": "Whether the position has split values",
"type": "boolean",
"const": true
},
"x": {
"title": "X Position",
"description": "X Position",
"$ref": "#/$defs/properties/scalar-property"
},
"y": {
"title": "Y Position",
"description": "Y Position",
"$ref": "#/$defs/properties/scalar-property"
}
},
"required": [
"s",
"x",
"y"
]
},
"bezier-keyframe" : {
"type": "object",
"title": "Shape Keyframe",
"allOf": [
{
"$ref": "#/$defs/properties/base-keyframe"
},
{
"properties": {
"s": {
"title": "Value",
"description": "Value at this keyframe.",
"type": "array",
"items": {
"$ref": "#/$defs/values/bezier"
},
"minItems": 1,
"maxItems": 1
}
}
}
],
"required": [
"s"
]
},
"position-property" : {
"type": "object",
"title": "Position Property",
"description": "An animatable property to represent a position in space",
"allOf": [
{
"$ref": "#/$defs/helpers/slottable-property"
}
],
"oneOf": [
{
"$comment": "Not animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 0
},
"k": {
"title": "Value",
"description": "Static Value",
"$ref": "#/$defs/values/vector"
}
}
},
{
"$comment": "Animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 1
},
"k": {
"type": "array",
"title": "Keyframes",
"description": "Array of keyframes",
"items": {
"$ref": "#/$defs/properties/position-keyframe"
}
}
}
}
],
"required": [
"a",
"k"
]
},
"color-property" : {
"type": "object",
"title": "Color Property",
"description": "An animatable property that holds a Color",
"allOf": [
{
"$ref": "#/$defs/helpers/slottable-property"
}
],
"oneOf": [
{
"$comment": "Not animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 0
},
"k": {
"title": "Value",
"description": "Static Value",
"$ref": "#/$defs/values/color"
}
}
},
{
"$comment": "Animated",
"properties": {
"a": {
"title": "Animated",
"description": "Whether the property is animated",
"$ref": "#/$defs/values/int-boolean",
"const": 1
},
"k": {
"type": "array",
"title": "Keyframes",
"description": "Array of keyframes",
"items": {
"$ref": "#/$defs/properties/color-keyframe"
}
}
}
}
]
},
"splittable-position-property" : {
"type": "object",
"title": "Splittable Position Property",
"description": "An animatable position where position values may be defined and animated separately.",
"oneOf": [
{
"$comment": "Grouped XY position coordinates",
"$ref": "#/$defs/properties/position-property",
"properties": {
"s": {
"title": "Split",
"description": "Whether the position has split values",
"type": "boolean",
"const": false
}
}
},
{
"$comment": "Split XY position coordinates",
"$ref": "#/$defs/properties/split-position"
}
]
}
},
"shapes": {
"all-graphic-elements" : {
"$comment": "List of valid shapes",
"oneOf": [
{
"$ref": "#/$defs/shapes/ellipse"
},
{
"$ref": "#/$defs/shapes/fill"
},
{
"$ref": "#/$defs/shapes/gradient-fill"
},
{
"$ref": "#/$defs/shapes/gradient-stroke"
},
{
"$ref": "#/$defs/shapes/group"
},
{
"$ref": "#/$defs/shapes/path"
},
{
"$ref": "#/$defs/shapes/polystar"
},
{
"$ref": "#/$defs/shapes/rectangle"
},
{
"$ref": "#/$defs/shapes/stroke"
},
{
"$ref": "#/$defs/shapes/transform"
},
{
"$ref": "#/$defs/shapes/trim-path"
},
{
"$ref": "#/$defs/shapes/unknown-shape"
}
]
},
"polystar" : {
"type": "object",
"title": "PolyStar",
"description": "Star or regular polygon",
"allOf": [
{
"$ref": "#/$defs/shapes/shape"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "sr"
},
"p": {
"title": "Position",
"$ref": "#/$defs/properties/position-property"
},
"or": {
"title": "Outer Radius",
"$ref": "#/$defs/properties/scalar-property"
},
"os": {
"title": "Outer Roundness",
"description": "Outer Roundness as a percentage",
"$ref": "#/$defs/properties/scalar-property"
},
"r": {
"title": "Rotation",
"description": "Rotation, clockwise in degrees",
"$ref": "#/$defs/properties/scalar-property"
},
"pt": {
"title": "Points",
"$ref": "#/$defs/properties/scalar-property"
},
"sy": {
"title": "Star Type",
"$ref": "#/$defs/constants/star-type",
"default": 1
},
"ir": {
"title": "Inner Radius",
"$ref": "#/$defs/properties/scalar-property"
},
"is": {
"title": "Inner Roundness",
"description": "Inner Roundness as a percentage",
"$ref": "#/$defs/properties/scalar-property"
}
},
"required": [
"ty",
"or",
"os",
"pt",
"p",
"r"
]
},
{
"if": {
"properties": {
"sy": {
"const": 1
}
}
},
"then": {
"required": [
"ir",
"is"
]
}
}
]
},
"group" : {
"type": "object",
"title": "Group",
"description": "Shape Element that can contain other shapes",
"allOf": [
{
"$ref": "#/$defs/shapes/graphic-element"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "gr"
},
"np": {
"title": "Number Of Properties",
"type": "number"
},
"it": {
"title": "Shapes",
"type": "array",
"items": {
"$ref": "#/$defs/shapes/all-graphic-elements"
}
}
},
"required": [
"ty"
]
}
]
},
"path" : {
"type": "object",
"title": "Path",
"description": "Custom Bezier shape",
"allOf": [
{
"$ref": "#/$defs/shapes/shape"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "sh"
},
"ks": {
"title": "Shape",
"description": "Bezier path",
"$ref": "#/$defs/properties/bezier-property"
}
},
"required": [
"ty",
"ks"
]
}
]
},
"shape-style" : {
"type": "object",
"title": "Shape Style",
"description": "Describes the visual appearance (like fill and stroke) of neighbouring shapes",
"allOf": [
{
"$ref": "#/$defs/shapes/graphic-element"
},
{
"type": "object",
"properties": {
"o": {
"title": "Opacity",
"description": "Opacity, 100 means fully opaque",
"$ref": "#/$defs/properties/scalar-property"
}
},
"required": [
"o"
]
}
]
},
"shape" : {
"type": "object",
"title": "Shape",
"description": "Drawable shape, defines the actual shape but not the style",
"allOf": [
{
"$ref": "#/$defs/shapes/graphic-element"
},
{
"type": "object",
"properties": {
"d": {
"title": "Direction",
"description": "Direction the shape is drawn as, mostly relevant when using trim path",
"$ref": "#/$defs/constants/shape-direction"
}
}
}
]
},
"fill" : {
"type": "object",
"title": "Fill",
"description": "Solid fill color",
"allOf": [
{
"$ref": "#/$defs/shapes/shape-style"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "fl"
},
"c": {
"title": "Color",
"$ref": "#/$defs/properties/color-property"
},
"r": {
"title": "Fill Rule",
"$ref": "#/$defs/constants/fill-rule"
}
},
"required": [
"ty",
"c"
]
}
]
},
"gradient-stroke" : {
"type": "object",
"title": "Gradient Stroke",
"description": "Gradient stroke",
"allOf": [
{
"$ref": "#/$defs/shapes/shape-style"
},
{
"$ref": "#/$defs/shapes/base-stroke"
},
{
"$ref": "#/$defs/shapes/base-gradient"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "gs"
}
},
"required": [
"ty"
]
}
]
},
"trim-path" : {
"type": "object",
"title": "Trim Path",
"description": "Trims shapes into a segment",
"allOf": [
{
"$ref": "#/$defs/shapes/modifier"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "tm"
},
"s": {
"title": "Start",
"description": "Segment start",
"$ref": "#/$defs/properties/scalar-property"
},
"e": {
"title": "End",
"description": "Segment end",
"$ref": "#/$defs/properties/scalar-property"
},
"o": {
"title": "Offset",
"$ref": "#/$defs/properties/scalar-property"
},
"m": {
"title": "Multiple",
"description": "How to treat multiple copies",
"$ref": "#/$defs/constants/trim-multiple-shapes"
}
},
"required": [
"ty",
"o",
"s",
"e"
]
}
]
},
"transform" : {
"type": "object",
"title": "Transform Shape",
"description": "Group transform",
"allOf": [
{
"$ref": "#/$defs/shapes/graphic-element"
},
{
"$ref": "#/$defs/helpers/transform"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "tr"
}
},
"required": [
"ty"
]
}
]
},
"rectangle" : {
"type": "object",
"title": "Rectangle",
"description": "A simple rectangle shape",
"allOf": [
{
"$ref": "#/$defs/shapes/shape"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "rc"
},
"p": {
"title": "Position",
"description": "Center of the rectangle",
"$ref": "#/$defs/properties/position-property"
},
"s": {
"title": "Size",
"$ref": "#/$defs/properties/vector-property"
},
"r": {
"title": "Rounded",
"description": "Rounded corners radius",
"$ref": "#/$defs/properties/scalar-property"
}
},
"required": [
"ty",
"s",
"p"
]
}
]
},
"base-gradient" : {
"type": "object",
"title": "Base Gradient",
"description": "Common properties for gradients",
"allOf": [
{
"type": "object",
"properties": {
"g": {
"title": "Colors",
"description": "Gradient colors",
"$ref": "#/$defs/properties/gradient-property"
},
"s": {
"title": "Start Point",
"description": "Starting point for the gradient",
"$ref": "#/$defs/properties/position-property"
},
"e": {
"title": "End Point",
"description": "End point for the gradient",
"$ref": "#/$defs/properties/position-property"
},
"t": {
"title": "Gradient Type",
"description": "Type of the gradient",
"$ref": "#/$defs/constants/gradient-type"
},
"h": {
"title": "Highlight Length",
"description": "Highlight Length, as a percentage between s
and e
",
"$ref": "#/$defs/properties/scalar-property"
},
"a": {
"title": "Highlight Angle",
"description": "Highlight Angle in clockwise degrees, relative to the direction from s
to e
",
"$ref": "#/$defs/properties/scalar-property"
}
},
"required": [
"s",
"e",
"g",
"t"
]
}
]
},
"graphic-element" : {
"type": "object",
"title": "Graphic Element",
"description": "Element used to display vector data in a shape layer",
"allOf": [
{
"$ref": "#/$defs/helpers/visual-object"
},
{
"type": "object",
"properties": {
"hd": {
"title": "Hidden",
"description": "Whether the shape is hidden",
"type": "boolean"
},
"ty": {
"title": "Shape Type",
"type": "string"
}
},
"required": [
"ty"
]
}
]
},
"stroke-dash" : {
"type": "object",
"title": "Stroke Dash",
"description": "An item used to described the dash pattern in a stroked path",
"allOf": [
{
"$ref": "#/$defs/helpers/visual-object"
},
{
"type": "object",
"properties": {
"n": {
"title": "Dash Type",
"$ref": "#/$defs/constants/stroke-dash-type",
"default": "d"
},
"v": {
"title": "Length",
"description": "Length of the dash",
"$ref": "#/$defs/properties/scalar-property"
}
},
"required": []
}
]
},
"gradient-fill" : {
"type": "object",
"title": "Gradient",
"description": "Gradient fill color",
"allOf": [
{
"$ref": "#/$defs/shapes/shape-style"
},
{
"$ref": "#/$defs/shapes/base-gradient"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "gf"
},
"r": {
"title": "Fill Rule",
"$ref": "#/$defs/constants/fill-rule"
}
},
"required": [
"ty"
]
}
]
},
"base-stroke" : {
"type": "object",
"title": "Base Stroke",
"description": "Common properties for stroke styles",
"allOf": [
{
"type": "object",
"properties": {
"lc": {
"title": "Line Cap",
"$ref": "#/$defs/constants/line-cap",
"default": 2
},
"lj": {
"title": "Line Join",
"$ref": "#/$defs/constants/line-join",
"default": 2
},
"ml": {
"title": "Miter Limit",
"type": "number",
"default": 0
},
"ml2": {
"title": "Miter Limit",
"description": "Animatable alternative to ml",
"$ref": "#/$defs/properties/scalar-property"
},
"w": {
"title": "Width",
"description": "Stroke width",
"$ref": "#/$defs/properties/scalar-property"
},
"d": {
"title": "Dashes",
"description": "Dashed line definition",
"type": "array",
"items": {
"$ref": "#/$defs/shapes/stroke-dash"
}
}
},
"required": [
"w"
]
}
]
},
"unknown-shape" : {
"type": "object",
"title": "Unknown shape types",
"description": "Unknown shape types. Types not defined by the specification are still allowed.",
"properties": {
"ty": {
"not": {
"$comment": "enum list is dynamically generated",
"enum": [
"el",
"fl",
"gf",
"gs",
"gr",
"sh",
"sr",
"rc",
"st",
"tr",
"tm"
]
}
}
}
},
"ellipse" : {
"type": "object",
"title": "Ellipse",
"description": "Ellipse shape",
"allOf": [
{
"$ref": "#/$defs/shapes/shape"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "el"
},
"p": {
"title": "Position",
"$ref": "#/$defs/properties/position-property"
},
"s": {
"title": "Size",
"$ref": "#/$defs/properties/vector-property"
}
},
"required": [
"ty",
"s",
"p"
]
}
]
},
"modifier" : {
"type": "object",
"title": "Modifier",
"description": "Modifiers change the bezier curves of neighbouring shapes",
"allOf": [
{
"$ref": "#/$defs/shapes/graphic-element"
}
]
},
"stroke" : {
"type": "object",
"title": "Stroke",
"description": "Solid stroke",
"allOf": [
{
"$ref": "#/$defs/shapes/shape-style"
},
{
"$ref": "#/$defs/shapes/base-stroke"
},
{
"type": "object",
"properties": {
"ty": {
"title": "Shape Type",
"type": "string",
"const": "st"
},
"c": {
"title": "Color",
"description": "Stroke color",
"$ref": "#/$defs/properties/color-property"
}
},
"required": [
"ty",
"c"
]
}
]
}
},
"values": {
"hexcolor" : {
"type": "string",
"title": "Hex Color",
"description": "Color value in hexadecimal format, with two digits per component ('#RRGGBB')",
"pattern": "^#([a-fA-F0-9]{6})$",
"examples": [
"#FF00AA"
]
},
"bezier" : {
"type": "object",
"title": "Bezier",
"description": "Cubic polybezier",
"properties": {
"c": {
"title": "Closed",
"type": "boolean",
"default": false
},
"i": {
"title": "In Tangents",
"type": "array",
"description": "Array of points, each point is an array of coordinates.\nThese points are along the in
tangents relative to the corresponding v
.",
"items": {
"$ref": "#/$defs/values/vector",
"default": []
}
},
"o": {
"title": "Out Tangents",
"type": "array",
"description": "Array of points, each point is an array of coordinates.\nThese points are along the out
tangents relative to the corresponding v
.",
"items": {
"$ref": "#/$defs/values/vector",
"default": []
}
},
"v": {
"title": "Vertices",
"description": "Array of points, each point is an array of coordinates.\nThese points are along the bezier path",
"type": "array",
"items": {
"$ref": "#/$defs/values/vector",
"default": []
}
}
},
"required": [
"i",
"v",
"o"
]
},
"data-url" : {
"type": "string",
"title": "Data URL",
"description": "An embedded data object",
"pattern": "^data:([\w/]+)(;base64)?,(.+)$"
},
"color" : {
"type": "array",
"title": "Color",
"description": "Color as a [r, g, b] array with values in [0, 1]",
"items": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"minItems": 3,
"maxItems": 4
},
"int-boolean" : {
"type": "integer",
"title": "Integer Boolean",
"description": "Represents boolean values as an integer. 0
is false, 1
is true.",
"default": 0,
"examples": [
0
],
"enum": [
0,
1
],
"oneOf": [
{
"title": "True",
"const": 1
},
{
"title": "False",
"const": 0
}
]
},
"vector" : {
"type": "array",
"title": "Vector",
"description": "An array of numbers",
"items": {
"type": "number"
}
},
"gradient" : {
"type": "array",
"title": "Gradient",
"description": "A flat list of color stops followed by optional transparency stops. A color stop is [offset, red, green, blue]. A transparency stop is [offset, transparency]. All values are between 0 and 1",
"items": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
}
}