{
  "$defs": {
    "Align": {
      "description": "Text alignment enum supporting all 9 combinations of horizontal and vertical alignment.",
      "enum": [
        "center",
        "top-left",
        "top-center",
        "top-right",
        "left",
        "right",
        "bottom-left",
        "bottom-center",
        "bottom-right"
      ],
      "title": "Align",
      "type": "string"
    },
    "AnimatedTextValue": {
      "additionalProperties": false,
      "description": "A deterministic numeric value sampled by a TextLayer's render time.",
      "properties": {
        "decimals": {
          "default": 0,
          "minimum": 0,
          "title": "Decimals",
          "type": "integer"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0.0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "exclusiveMinimum": 0.0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease_out",
          "enum": [
            "linear",
            "ease_in",
            "ease_out",
            "ease_in_out"
          ],
          "title": "Easing",
          "type": "string"
        },
        "from": {
          "title": "From",
          "type": "number"
        },
        "grouping": {
          "default": false,
          "title": "Grouping",
          "type": "boolean"
        },
        "minimum_integer_digits": {
          "default": 1,
          "exclusiveMinimum": 0,
          "title": "Minimum Integer Digits",
          "type": "integer"
        },
        "prefix": {
          "default": "",
          "title": "Prefix",
          "type": "string"
        },
        "style": {
          "default": "odometer",
          "enum": [
            "plain",
            "odometer",
            "flip"
          ],
          "title": "Style",
          "type": "string"
        },
        "suffix": {
          "default": "",
          "title": "Suffix",
          "type": "string"
        },
        "to": {
          "title": "To",
          "type": "number"
        }
      },
      "required": [
        "from",
        "to",
        "duration"
      ],
      "title": "AnimatedTextValue",
      "type": "object"
    },
    "AnimationEffect": {
      "additionalProperties": false,
      "description": "Validated semantic preset options used by `AnimationSpec`.",
      "properties": {
        "direction": {
          "anyOf": [
            {
              "enum": [
                "in",
                "out"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Direction"
        },
        "distance": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Distance"
        },
        "easing": {
          "anyOf": [
            {
              "enum": [
                "linear",
                "ease",
                "ease_in",
                "ease_out",
                "ease_in_out",
                "ease_in_quad",
                "ease_out_quad",
                "ease_in_out_quad",
                "ease_in_cubic",
                "ease_out_cubic",
                "ease_in_out_cubic",
                "ease_in_quart",
                "ease_out_quart",
                "ease_in_out_quart",
                "ease_in_quint",
                "ease_out_quint",
                "ease_in_out_quint",
                "ease_in_sine",
                "ease_out_sine",
                "ease_in_out_sine",
                "ease_in_back",
                "ease_out_back",
                "ease_in_out_back"
              ],
              "type": "string"
            },
            {
              "$ref": "#/$defs/CubicBezierEasing"
            },
            {
              "$ref": "#/$defs/SpringEasing"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Easing"
        },
        "feel": {
          "anyOf": [
            {
              "enum": [
                "gentle",
                "soft",
                "snappy",
                "dramatic",
                "minimal"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Feel"
        },
        "focal_point": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                },
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Focal Point"
        },
        "from": {
          "anyOf": [
            {
              "enum": [
                "top",
                "bottom",
                "left",
                "right",
                "center"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "From"
        },
        "type": {
          "enum": [
            "fade",
            "rise",
            "fall",
            "slide",
            "zoom",
            "pop",
            "float",
            "pulse",
            "shake",
            "ken_burns",
            "pan",
            "typewriter",
            "bar_grow",
            "line_draw",
            "area_reveal",
            "point_pop",
            "value_count_up",
            "qr_reveal"
          ],
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "title": "AnimationEffect",
      "type": "object"
    },
    "AnimationSpec": {
      "additionalProperties": false,
      "description": "Canonical layer-motion contract for preset or advanced timeline animation.",
      "oneOf": [
        {
          "properties": {
            "effect": {
              "$ref": "#/$defs/AnimationEffect"
            },
            "tracks": {
              "type": "null"
            }
          },
          "required": [
            "effect"
          ]
        },
        {
          "properties": {
            "effect": {
              "type": "null"
            },
            "tracks": {
              "minItems": 1,
              "type": "array"
            }
          },
          "required": [
            "tracks"
          ]
        }
      ],
      "properties": {
        "easing": {
          "anyOf": [
            {
              "enum": [
                "linear",
                "ease",
                "ease_in",
                "ease_out",
                "ease_in_out",
                "ease_in_quad",
                "ease_out_quad",
                "ease_in_out_quad",
                "ease_in_cubic",
                "ease_out_cubic",
                "ease_in_out_cubic",
                "ease_in_quart",
                "ease_out_quart",
                "ease_in_out_quart",
                "ease_in_quint",
                "ease_out_quint",
                "ease_in_out_quint",
                "ease_in_sine",
                "ease_out_sine",
                "ease_in_out_sine",
                "ease_in_back",
                "ease_out_back",
                "ease_in_out_back"
              ],
              "type": "string"
            },
            {
              "$ref": "#/$defs/CubicBezierEasing"
            },
            {
              "$ref": "#/$defs/SpringEasing"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Easing"
        },
        "effect": {
          "anyOf": [
            {
              "$ref": "#/$defs/AnimationEffect"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "selector": {
          "anyOf": [
            {
              "$ref": "#/$defs/RangeSelector"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "stagger": {
          "anyOf": [
            {
              "$ref": "#/$defs/StaggerSpec"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "timing": {
          "anyOf": [
            {
              "$ref": "#/$defs/TimingSpec"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "tracks": {
          "anyOf": [
            {
              "items": {
                "discriminator": {
                  "mapping": {
                    "blur": "#/$defs/BlurTrack",
                    "clip_progress": "#/$defs/ClipProgressTrack",
                    "color": "#/$defs/ColorTrack",
                    "dash_offset": "#/$defs/DashOffsetTrack",
                    "image_pan": "#/$defs/ImagePanTrack",
                    "image_zoom": "#/$defs/ImageZoomTrack",
                    "mask_feather": "#/$defs/MaskFeatherTrack",
                    "mask_position": "#/$defs/MaskPositionTrack",
                    "mask_size": "#/$defs/MaskSizeTrack",
                    "opacity": "#/$defs/OpacityTrack",
                    "path_morph": "#/$defs/PathMorphTrack",
                    "position": "#/$defs/PositionTrack",
                    "rotation": "#/$defs/RotationTrack",
                    "scale": "#/$defs/ScaleTrack",
                    "scale_x": "#/$defs/ScaleXTrack",
                    "scale_y": "#/$defs/ScaleYTrack",
                    "trim_end": "#/$defs/TrimEndTrack",
                    "trim_offset": "#/$defs/TrimOffsetTrack",
                    "trim_start": "#/$defs/TrimStartTrack"
                  },
                  "propertyName": "type"
                },
                "oneOf": [
                  {
                    "$ref": "#/$defs/PositionTrack"
                  },
                  {
                    "$ref": "#/$defs/MaskPositionTrack"
                  },
                  {
                    "$ref": "#/$defs/MaskSizeTrack"
                  },
                  {
                    "$ref": "#/$defs/MaskFeatherTrack"
                  },
                  {
                    "$ref": "#/$defs/ImagePanTrack"
                  },
                  {
                    "$ref": "#/$defs/ScaleTrack"
                  },
                  {
                    "$ref": "#/$defs/ScaleXTrack"
                  },
                  {
                    "$ref": "#/$defs/ScaleYTrack"
                  },
                  {
                    "$ref": "#/$defs/ImageZoomTrack"
                  },
                  {
                    "$ref": "#/$defs/RotationTrack"
                  },
                  {
                    "$ref": "#/$defs/DashOffsetTrack"
                  },
                  {
                    "$ref": "#/$defs/TrimStartTrack"
                  },
                  {
                    "$ref": "#/$defs/TrimEndTrack"
                  },
                  {
                    "$ref": "#/$defs/TrimOffsetTrack"
                  },
                  {
                    "$ref": "#/$defs/OpacityTrack"
                  },
                  {
                    "$ref": "#/$defs/ClipProgressTrack"
                  },
                  {
                    "$ref": "#/$defs/BlurTrack"
                  },
                  {
                    "$ref": "#/$defs/ColorTrack"
                  },
                  {
                    "$ref": "#/$defs/PathMorphTrack"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Tracks"
        },
        "type": {
          "const": "animation",
          "default": "animation",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "title": "AnimationSpec",
      "type": "object"
    },
    "Appear": {
      "additionalProperties": false,
      "description": "Instantly show (entrance) or hide (exit) the layer with no motion.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "appear",
          "default": "appear",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Appear",
      "type": "object"
    },
    "BackdropBlur": {
      "additionalProperties": false,
      "properties": {
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "radius": {
          "exclusiveMinimum": 0,
          "title": "Radius",
          "type": "integer"
        },
        "type": {
          "const": "backdrop_blur",
          "default": "backdrop_blur",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "radius"
      ],
      "title": "BackdropBlur",
      "type": "object"
    },
    "Background": {
      "additionalProperties": false,
      "properties": {
        "border_radius": {
          "default": 0,
          "title": "Border Radius",
          "type": "integer"
        },
        "color": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "padding": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                }
              ],
              "type": "array"
            },
            {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                }
              ],
              "type": "array"
            }
          ],
          "default": 0,
          "title": "Padding"
        },
        "type": {
          "const": "background",
          "default": "background",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "color"
      ],
      "title": "Background",
      "type": "object"
    },
    "BackgroundLayer": {
      "additionalProperties": false,
      "properties": {
        "blend_mode": {
          "anyOf": [
            {
              "$ref": "#/$defs/BlendMode"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "color": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "items": {},
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Color"
        },
        "effects": {
          "default": [],
          "items": {
            "discriminator": {
              "mapping": {
                "filter": "#/$defs/Filter",
                "grain": "#/$defs/Grain"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Filter"
              },
              {
                "$ref": "#/$defs/Grain"
              }
            ]
          },
          "title": "Effects",
          "type": "array"
        },
        "faces": {
          "default": [],
          "items": {
            "$ref": "#/$defs/FaceRegion"
          },
          "title": "Faces",
          "type": "array"
        },
        "fit": {
          "anyOf": [
            {
              "$ref": "#/$defs/FitMode"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "focal_point": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                },
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Focal Point"
        },
        "gradient": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "linear": "#/$defs/LinearGradient",
                  "radial": "#/$defs/RadialGradient"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/LinearGradient"
                },
                {
                  "$ref": "#/$defs/RadialGradient"
                }
              ]
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Gradient"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "image": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Image"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "type": {
          "const": "background",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "title": "BackgroundLayer",
      "type": "object"
    },
    "BarChartSpec": {
      "additionalProperties": false,
      "description": "Validated bar chart data and bar-specific options.",
      "properties": {
        "data": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/$defs/ChartData"
            }
          ],
          "title": "Data"
        },
        "style": {
          "$ref": "#/$defs/BarChartStyle"
        },
        "type": {
          "const": "bar",
          "default": "bar",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "data"
      ],
      "title": "BarChartSpec",
      "type": "object"
    },
    "BarChartStyle": {
      "additionalProperties": false,
      "description": "Deterministic paint and geometry options for bar charts.",
      "properties": {
        "bar_gap": {
          "default": 0.2,
          "exclusiveMaximum": 1.0,
          "minimum": 0.0,
          "title": "Bar Gap",
          "type": "number"
        },
        "color": {
          "default": "#2563EB",
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "negative_color": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Negative Color"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "padding": {
          "default": 0,
          "minimum": 0,
          "title": "Padding",
          "type": "integer"
        },
        "show_values": {
          "default": false,
          "title": "Show Values",
          "type": "boolean"
        }
      },
      "title": "BarChartStyle",
      "type": "object"
    },
    "BlendMode": {
      "enum": [
        "multiply",
        "overlay",
        "screen",
        "darken",
        "lighten",
        "normal"
      ],
      "title": "BlendMode",
      "type": "string"
    },
    "Blinds": {
      "additionalProperties": false,
      "description": "Reveal the layer through horizontal or vertical blinds.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "blinds",
          "default": "blinds",
          "title": "Effect",
          "type": "string"
        },
        "orientation": {
          "default": "horizontal",
          "enum": [
            "horizontal",
            "vertical"
          ],
          "title": "Orientation",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Blinds",
      "type": "object"
    },
    "BlurTrack": {
      "additionalProperties": false,
      "description": "A non-negative blur-radius track.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "blur",
          "default": "blur",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "BlurTrack",
      "type": "object"
    },
    "Box": {
      "additionalProperties": false,
      "description": "Reveal or conceal the layer with a box growing in or shrinking out.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "direction": {
          "default": "in",
          "enum": [
            "in",
            "out"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "box",
          "default": "box",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Box",
      "type": "object"
    },
    "CanvasDocument": {
      "additionalProperties": false,
      "anyOf": [
        {
          "properties": {
            "height": {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            "width": {
              "exclusiveMinimum": 0,
              "type": "integer"
            }
          },
          "required": [
            "width",
            "height"
          ]
        },
        {
          "not": {
            "anyOf": [
              {
                "required": [
                  "width"
                ]
              },
              {
                "required": [
                  "height"
                ]
              }
            ]
          },
          "properties": {
            "platform": {
              "enum": [
                "instagram-reel",
                "instagram-reels",
                "instagram-square",
                "tiktok",
                "youtube",
                "youtube-shorts",
                "youtube-thumbnail"
              ],
              "type": "string"
            }
          },
          "required": [
            "platform"
          ]
        }
      ],
      "description": "A quickthumb canvas spec accepted by the quickthumb CLI. Canvas.from_json() also requires the top-level kind discriminator to be 'canvas'.",
      "properties": {
        "height": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Height"
        },
        "kind": {
          "const": "canvas",
          "type": "string"
        },
        "layers": {
          "items": {
            "discriminator": {
              "mapping": {
                "background": "#/$defs/BackgroundLayer",
                "chart": "#/$defs/ChartLayer",
                "group": "#/$defs/GroupLayer",
                "image": "#/$defs/ImageLayer",
                "null": "#/$defs/NullLayer",
                "outline": "#/$defs/OutlineLayer",
                "path": "#/$defs/PathLayer",
                "plugin": "#/$defs/PluginLayer",
                "qr_code": "#/$defs/QRCodeLayer",
                "shape": "#/$defs/ShapeLayer",
                "svg": "#/$defs/SvgLayer",
                "text": "#/$defs/TextLayer",
                "video": "#/$defs/VideoLayer"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/BackgroundLayer"
              },
              {
                "$ref": "#/$defs/TextLayer"
              },
              {
                "$ref": "#/$defs/OutlineLayer"
              },
              {
                "$ref": "#/$defs/ImageLayer"
              },
              {
                "$ref": "#/$defs/ShapeLayer"
              },
              {
                "$ref": "#/$defs/PathLayer"
              },
              {
                "$ref": "#/$defs/SvgLayer"
              },
              {
                "$ref": "#/$defs/ChartLayer"
              },
              {
                "$ref": "#/$defs/QRCodeLayer"
              },
              {
                "$ref": "#/$defs/VideoLayer"
              },
              {
                "$ref": "#/$defs/PluginLayer"
              },
              {
                "$ref": "#/$defs/NullLayer"
              },
              {
                "$ref": "#/$defs/GroupLayer"
              }
            ]
          },
          "title": "Layers",
          "type": "array"
        },
        "platform": {
          "anyOf": [
            {
              "enum": [
                "instagram-reel",
                "instagram-reels",
                "instagram-square",
                "tiktok",
                "youtube",
                "youtube-shorts",
                "youtube-thumbnail"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Platform"
        },
        "theme": {
          "additionalProperties": true,
          "title": "Theme",
          "type": "object"
        },
        "width": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Width"
        }
      },
      "required": [
        "kind",
        "layers"
      ],
      "title": "quickthumb Canvas JSON Spec",
      "type": "object"
    },
    "ChartData": {
      "additionalProperties": false,
      "description": "Validated numeric samples shared by the chart layer models.",
      "properties": {
        "values": {
          "items": {
            "type": "number"
          },
          "title": "Values",
          "type": "array"
        }
      },
      "title": "ChartData",
      "type": "object"
    },
    "ChartLayer": {
      "additionalProperties": false,
      "description": "A deterministic data visualization layer selected by its spec.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": "top-left"
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "position": {
          "default": [
            0,
            0
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "spec": {
          "discriminator": {
            "mapping": {
              "bar": "#/$defs/BarChartSpec",
              "line": "#/$defs/LineChartSpec"
            },
            "propertyName": "type"
          },
          "oneOf": [
            {
              "$ref": "#/$defs/BarChartSpec"
            },
            {
              "$ref": "#/$defs/LineChartSpec"
            }
          ],
          "title": "Spec"
        },
        "type": {
          "const": "chart",
          "default": "chart",
          "title": "Type",
          "type": "string"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "width",
        "height",
        "spec"
      ],
      "title": "ChartLayer",
      "type": "object"
    },
    "Checkerboard": {
      "additionalProperties": false,
      "description": "Reveal the layer through a checkerboard sweeping across or down.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "direction": {
          "default": "across",
          "enum": [
            "across",
            "down"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "checkerboard",
          "default": "checkerboard",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Checkerboard",
      "type": "object"
    },
    "Circle": {
      "additionalProperties": false,
      "description": "Reveal or conceal the layer through an expanding/contracting circle.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "circle",
          "default": "circle",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Circle",
      "type": "object"
    },
    "ClipProgressTrack": {
      "additionalProperties": false,
      "description": "A clip/reveal progress track constrained to the unit interval.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "clip_progress",
          "default": "clip_progress",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "ClipProgressTrack",
      "type": "object"
    },
    "ColorTrack": {
      "additionalProperties": false,
      "description": "A text/shape fill track interpolated in premultiplied Oklab and linear alpha.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "color",
          "default": "color",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "default": null,
          "title": "Wiggle",
          "type": "null"
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "ColorTrack",
      "type": "object"
    },
    "CubicBezierEasing": {
      "additionalProperties": false,
      "description": "A custom CSS-style cubic-bezier easing curve.\n\n`points` are the two control points `[x1, y1, x2, y2]`. The x coordinates\nmust stay within `[0, 1]` so time remains monotonic; y may overshoot.",
      "properties": {
        "points": {
          "maxItems": 4,
          "minItems": 4,
          "prefixItems": [
            {
              "type": "number"
            },
            {
              "type": "number"
            },
            {
              "type": "number"
            },
            {
              "type": "number"
            }
          ],
          "title": "Points",
          "type": "array"
        },
        "type": {
          "const": "cubic_bezier",
          "default": "cubic_bezier",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "type",
        "points"
      ],
      "title": "CubicBezierEasing",
      "type": "object"
    },
    "DashOffsetTrack": {
      "additionalProperties": false,
      "description": "Relative Path dash phase in local SVG/viewBox distance units.",
      "properties": {
        "blend": {
          "default": "replace",
          "enum": [
            "replace",
            "add"
          ],
          "title": "Blend",
          "type": "string"
        },
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "dash_offset",
          "default": "dash_offset",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "DashOffsetTrack",
      "type": "object"
    },
    "DeckDocument": {
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "required": [
              "width"
            ]
          },
          "then": {
            "required": [
              "height"
            ]
          }
        },
        {
          "if": {
            "required": [
              "height"
            ]
          },
          "then": {
            "required": [
              "width"
            ]
          }
        },
        {
          "if": {
            "not": {
              "anyOf": [
                {
                  "required": [
                    "width"
                  ]
                },
                {
                  "required": [
                    "height"
                  ]
                }
              ]
            }
          },
          "then": {
            "properties": {
              "slides": {
                "items": {
                  "$ref": "#/$defs/SizedDeckSlideDocument"
                }
              }
            }
          }
        }
      ],
      "properties": {
        "height": {
          "exclusiveMinimum": 0,
          "type": "integer"
        },
        "kind": {
          "const": "deck",
          "type": "string"
        },
        "slides": {
          "items": {
            "$ref": "#/$defs/DeckSlideDocument"
          },
          "type": "array"
        },
        "theme": {
          "type": "object"
        },
        "transition": {
          "discriminator": {
            "mapping": {
              "blinds": "#/$defs/Transition_Blinds",
              "checker": "#/$defs/Transition_Checker",
              "circle": "#/$defs/Transition_Circle",
              "comb": "#/$defs/Transition_Comb",
              "cover": "#/$defs/Transition_Cover",
              "cut": "#/$defs/Transition_Cut",
              "diamond": "#/$defs/Transition_Diamond",
              "dissolve": "#/$defs/Transition_Dissolve",
              "fade": "#/$defs/Transition_Fade",
              "morph": "#/$defs/Transition_Morph",
              "newsflash": "#/$defs/Transition_Newsflash",
              "push": "#/$defs/Transition_Push",
              "random": "#/$defs/Transition_Random",
              "split": "#/$defs/Transition_Split",
              "uncover": "#/$defs/Transition_Uncover",
              "wedge": "#/$defs/Transition_Wedge",
              "wheel": "#/$defs/Transition_Wheel",
              "wipe": "#/$defs/Transition_Wipe",
              "zoom": "#/$defs/Transition_Zoom"
            },
            "propertyName": "effect"
          },
          "oneOf": [
            {
              "$ref": "#/$defs/Transition_Cut"
            },
            {
              "$ref": "#/$defs/Transition_Fade"
            },
            {
              "$ref": "#/$defs/Transition_Morph"
            },
            {
              "$ref": "#/$defs/Transition_Dissolve"
            },
            {
              "$ref": "#/$defs/Transition_Newsflash"
            },
            {
              "$ref": "#/$defs/Transition_Wedge"
            },
            {
              "$ref": "#/$defs/Transition_Circle"
            },
            {
              "$ref": "#/$defs/Transition_Diamond"
            },
            {
              "$ref": "#/$defs/Transition_Random"
            },
            {
              "$ref": "#/$defs/Transition_Wheel"
            },
            {
              "$ref": "#/$defs/Transition_Push"
            },
            {
              "$ref": "#/$defs/Transition_Wipe"
            },
            {
              "$ref": "#/$defs/Transition_Cover"
            },
            {
              "$ref": "#/$defs/Transition_Uncover"
            },
            {
              "$ref": "#/$defs/Transition_Zoom"
            },
            {
              "$ref": "#/$defs/Transition_Split"
            },
            {
              "$ref": "#/$defs/Transition_Blinds"
            },
            {
              "$ref": "#/$defs/Transition_Checker"
            },
            {
              "$ref": "#/$defs/Transition_Comb"
            }
          ]
        },
        "width": {
          "exclusiveMinimum": 0,
          "type": "integer"
        }
      },
      "required": [
        "kind",
        "slides"
      ],
      "title": "quickthumb Deck JSON Spec",
      "type": "object"
    },
    "DeckSlideDocument": {
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "required": [
              "width"
            ]
          },
          "then": {
            "required": [
              "height"
            ]
          }
        },
        {
          "if": {
            "required": [
              "height"
            ]
          },
          "then": {
            "required": [
              "width"
            ]
          }
        }
      ],
      "description": "A quickthumb canvas spec accepted by the quickthumb CLI. Canvas.from_json() also requires the top-level kind discriminator to be 'canvas'.",
      "properties": {
        "audio": {
          "additionalProperties": false,
          "properties": {
            "fade_out": {
              "minimum": 0,
              "type": "number"
            },
            "loop": {
              "type": "boolean"
            },
            "path": {
              "type": "string"
            },
            "volume": {
              "minimum": 0,
              "type": "number"
            }
          },
          "required": [
            "path"
          ],
          "type": "object"
        },
        "duration": {
          "exclusiveMinimum": 0,
          "type": "number"
        },
        "height": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Height"
        },
        "kind": {
          "const": "canvas",
          "type": "string"
        },
        "layers": {
          "items": {
            "discriminator": {
              "mapping": {
                "background": "#/$defs/BackgroundLayer",
                "chart": "#/$defs/ChartLayer",
                "group": "#/$defs/GroupLayer",
                "image": "#/$defs/ImageLayer",
                "null": "#/$defs/NullLayer",
                "outline": "#/$defs/OutlineLayer",
                "path": "#/$defs/PathLayer",
                "plugin": "#/$defs/PluginLayer",
                "qr_code": "#/$defs/QRCodeLayer",
                "shape": "#/$defs/ShapeLayer",
                "svg": "#/$defs/SvgLayer",
                "text": "#/$defs/TextLayer",
                "video": "#/$defs/VideoLayer"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/BackgroundLayer"
              },
              {
                "$ref": "#/$defs/TextLayer"
              },
              {
                "$ref": "#/$defs/OutlineLayer"
              },
              {
                "$ref": "#/$defs/ImageLayer"
              },
              {
                "$ref": "#/$defs/ShapeLayer"
              },
              {
                "$ref": "#/$defs/PathLayer"
              },
              {
                "$ref": "#/$defs/SvgLayer"
              },
              {
                "$ref": "#/$defs/ChartLayer"
              },
              {
                "$ref": "#/$defs/QRCodeLayer"
              },
              {
                "$ref": "#/$defs/VideoLayer"
              },
              {
                "$ref": "#/$defs/PluginLayer"
              },
              {
                "$ref": "#/$defs/NullLayer"
              },
              {
                "$ref": "#/$defs/GroupLayer"
              }
            ]
          },
          "title": "Layers",
          "type": "array"
        },
        "notes": {
          "type": "string"
        },
        "platform": {
          "anyOf": [
            {
              "enum": [
                "instagram-reel",
                "instagram-reels",
                "instagram-square",
                "tiktok",
                "youtube",
                "youtube-shorts",
                "youtube-thumbnail"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Platform"
        },
        "theme": {
          "additionalProperties": true,
          "title": "Theme",
          "type": "object"
        },
        "transition": {
          "discriminator": {
            "mapping": {
              "blinds": "#/$defs/Transition_Blinds",
              "checker": "#/$defs/Transition_Checker",
              "circle": "#/$defs/Transition_Circle",
              "comb": "#/$defs/Transition_Comb",
              "cover": "#/$defs/Transition_Cover",
              "cut": "#/$defs/Transition_Cut",
              "diamond": "#/$defs/Transition_Diamond",
              "dissolve": "#/$defs/Transition_Dissolve",
              "fade": "#/$defs/Transition_Fade",
              "morph": "#/$defs/Transition_Morph",
              "newsflash": "#/$defs/Transition_Newsflash",
              "push": "#/$defs/Transition_Push",
              "random": "#/$defs/Transition_Random",
              "split": "#/$defs/Transition_Split",
              "uncover": "#/$defs/Transition_Uncover",
              "wedge": "#/$defs/Transition_Wedge",
              "wheel": "#/$defs/Transition_Wheel",
              "wipe": "#/$defs/Transition_Wipe",
              "zoom": "#/$defs/Transition_Zoom"
            },
            "propertyName": "effect"
          },
          "oneOf": [
            {
              "$ref": "#/$defs/Transition_Cut"
            },
            {
              "$ref": "#/$defs/Transition_Fade"
            },
            {
              "$ref": "#/$defs/Transition_Morph"
            },
            {
              "$ref": "#/$defs/Transition_Dissolve"
            },
            {
              "$ref": "#/$defs/Transition_Newsflash"
            },
            {
              "$ref": "#/$defs/Transition_Wedge"
            },
            {
              "$ref": "#/$defs/Transition_Circle"
            },
            {
              "$ref": "#/$defs/Transition_Diamond"
            },
            {
              "$ref": "#/$defs/Transition_Random"
            },
            {
              "$ref": "#/$defs/Transition_Wheel"
            },
            {
              "$ref": "#/$defs/Transition_Push"
            },
            {
              "$ref": "#/$defs/Transition_Wipe"
            },
            {
              "$ref": "#/$defs/Transition_Cover"
            },
            {
              "$ref": "#/$defs/Transition_Uncover"
            },
            {
              "$ref": "#/$defs/Transition_Zoom"
            },
            {
              "$ref": "#/$defs/Transition_Split"
            },
            {
              "$ref": "#/$defs/Transition_Blinds"
            },
            {
              "$ref": "#/$defs/Transition_Checker"
            },
            {
              "$ref": "#/$defs/Transition_Comb"
            }
          ]
        },
        "width": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Width"
        }
      },
      "required": [
        "kind",
        "layers"
      ],
      "title": "quickthumb Deck Slide JSON Spec",
      "type": "object"
    },
    "Diamond": {
      "additionalProperties": false,
      "description": "Reveal or conceal the layer through an expanding/contracting diamond.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "diamond",
          "default": "diamond",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Diamond",
      "type": "object"
    },
    "Dissolve": {
      "additionalProperties": false,
      "description": "Dissolve the layer in or out through a speckled mask.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "dissolve",
          "default": "dissolve",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Dissolve",
      "type": "object"
    },
    "Duotone": {
      "additionalProperties": false,
      "properties": {
        "highlights": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Highlights",
          "type": "string"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "shadows": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Shadows",
          "type": "string"
        },
        "type": {
          "const": "duotone",
          "default": "duotone",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "shadows",
        "highlights"
      ],
      "title": "Duotone",
      "type": "object"
    },
    "ExportDiagnostic": {
      "additionalProperties": false,
      "description": "Structured explanation of exporter support or fallback behavior.",
      "properties": {
        "fallback": {
          "anyOf": [
            {
              "enum": [
                "fade",
                "rasterize",
                "static"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fallback"
        },
        "feature": {
          "title": "Feature",
          "type": "string"
        },
        "layer_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Layer Id"
        },
        "layer_ids": {
          "items": {
            "type": "string"
          },
          "title": "Layer Ids",
          "type": "array"
        },
        "message": {
          "title": "Message",
          "type": "string"
        },
        "native_attempt": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Native Attempt"
        },
        "slide_index": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Slide Index"
        },
        "support": {
          "enum": [
            "full",
            "native",
            "partial",
            "fallback",
            "unsupported"
          ],
          "title": "Support",
          "type": "string"
        },
        "target": {
          "title": "Target",
          "type": "string"
        }
      },
      "required": [
        "feature",
        "target",
        "support",
        "message"
      ],
      "title": "ExportDiagnostic",
      "type": "object"
    },
    "ExportPolicy": {
      "$defs": {
        "_FidelityLimits": {
          "additionalProperties": false,
          "description": "Caller-selected acceptance limits for an optional static comparison.",
          "properties": {
            "max_different_pixel_ratio": {
              "maximum": 1,
              "minimum": 0,
              "title": "Max Different Pixel Ratio",
              "type": "number"
            },
            "min_hash_similarity": {
              "maximum": 1,
              "minimum": 0,
              "title": "Min Hash Similarity",
              "type": "number"
            },
            "pixel_tolerance": {
              "maximum": 255,
              "minimum": 0,
              "title": "Pixel Tolerance",
              "type": "integer"
            }
          },
          "required": [
            "pixel_tolerance",
            "max_different_pixel_ratio",
            "min_hash_similarity"
          ],
          "title": "_FidelityLimits",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "Motion handling and opt-in, report-only static fidelity checks.",
      "properties": {
        "fidelity": {
          "additionalProperties": {
            "$ref": "#/$defs/_FidelityLimits"
          },
          "propertyNames": {
            "enum": [
              "svg",
              "pdf"
            ]
          },
          "title": "Fidelity",
          "type": "object"
        },
        "pptx": {
          "additionalProperties": {
            "enum": [
              "native",
              "rasterize",
              "static"
            ],
            "type": "string"
          },
          "default": {},
          "title": "Pptx",
          "type": "object"
        },
        "reduced_motion": {
          "default": false,
          "title": "Reduced Motion",
          "type": "boolean"
        },
        "unsupported_motion": {
          "default": "warn",
          "enum": [
            "error",
            "warn",
            "rasterize",
            "static"
          ],
          "title": "Unsupported Motion",
          "type": "string"
        }
      },
      "title": "ExportPolicy",
      "type": "object"
    },
    "FaceRegion": {
      "additionalProperties": false,
      "description": "Normalized source-image face box used to guide cover crops.",
      "properties": {
        "height": {
          "exclusiveMinimum": 0.0,
          "maximum": 1.0,
          "title": "Height",
          "type": "number"
        },
        "width": {
          "exclusiveMinimum": 0.0,
          "maximum": 1.0,
          "title": "Width",
          "type": "number"
        },
        "x": {
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "X",
          "type": "number"
        },
        "y": {
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Y",
          "type": "number"
        }
      },
      "required": [
        "x",
        "y",
        "width",
        "height"
      ],
      "title": "FaceRegion",
      "type": "object"
    },
    "Fade": {
      "additionalProperties": false,
      "description": "Fade the layer in or out.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "fade",
          "default": "fade",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Fade",
      "type": "object"
    },
    "Filter": {
      "additionalProperties": false,
      "properties": {
        "blur": {
          "default": 0,
          "minimum": 0,
          "title": "Blur",
          "type": "integer"
        },
        "brightness": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Brightness",
          "type": "number"
        },
        "contrast": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Contrast",
          "type": "number"
        },
        "saturation": {
          "default": 1.0,
          "title": "Saturation",
          "type": "number"
        },
        "type": {
          "const": "filter",
          "default": "filter",
          "title": "Type",
          "type": "string"
        }
      },
      "title": "Filter",
      "type": "object"
    },
    "FitMode": {
      "enum": [
        "cover",
        "contain",
        "fill"
      ],
      "title": "FitMode",
      "type": "string"
    },
    "Glow": {
      "additionalProperties": false,
      "properties": {
        "color": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "radius": {
          "exclusiveMinimum": 0,
          "title": "Radius",
          "type": "integer"
        },
        "type": {
          "const": "glow",
          "default": "glow",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "color",
        "radius"
      ],
      "title": "Glow",
      "type": "object"
    },
    "Grain": {
      "additionalProperties": false,
      "properties": {
        "blend_mode": {
          "default": "overlay",
          "title": "Blend Mode",
          "type": "string"
        },
        "intensity": {
          "title": "Intensity",
          "type": "number"
        },
        "monochrome": {
          "default": true,
          "title": "Monochrome",
          "type": "boolean"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "seed": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Seed"
        },
        "type": {
          "const": "grain",
          "default": "grain",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "intensity"
      ],
      "title": "Grain",
      "type": "object"
    },
    "GroupLayer": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "children": {
          "items": {
            "discriminator": {
              "mapping": {
                "chart": "#/$defs/ChartLayer",
                "group": "#/$defs/GroupLayer",
                "image": "#/$defs/ImageLayer",
                "plugin": "#/$defs/PluginLayer",
                "qr_code": "#/$defs/QRCodeLayer",
                "shape": "#/$defs/ShapeLayer",
                "svg": "#/$defs/SvgLayer",
                "text": "#/$defs/TextLayer"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/TextLayer"
              },
              {
                "$ref": "#/$defs/ImageLayer"
              },
              {
                "$ref": "#/$defs/ShapeLayer"
              },
              {
                "$ref": "#/$defs/SvgLayer"
              },
              {
                "$ref": "#/$defs/ChartLayer"
              },
              {
                "$ref": "#/$defs/QRCodeLayer"
              },
              {
                "$ref": "#/$defs/PluginLayer"
              },
              {
                "$ref": "#/$defs/GroupLayer"
              }
            ]
          },
          "title": "Children",
          "type": "array"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "direction": {
          "default": "column",
          "enum": [
            "row",
            "column"
          ],
          "title": "Direction",
          "type": "string"
        },
        "gap": {
          "default": 0,
          "minimum": 0,
          "title": "Gap",
          "type": "integer"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "item_align": {
          "default": "start",
          "enum": [
            "start",
            "center",
            "end"
          ],
          "title": "Item Align",
          "type": "string"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "padding": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                }
              ],
              "type": "array"
            },
            {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                }
              ],
              "type": "array"
            }
          ],
          "default": 0,
          "title": "Padding"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "position": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                },
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Position"
        },
        "type": {
          "const": "group",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "type",
        "children"
      ],
      "title": "GroupLayer",
      "type": "object"
    },
    "ImageLayer": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": "top-left"
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "blend_mode": {
          "anyOf": [
            {
              "$ref": "#/$defs/BlendMode"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "border_radius": {
          "default": 0,
          "minimum": 0,
          "title": "Border Radius",
          "type": "integer"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "effects": {
          "default": [],
          "items": {
            "discriminator": {
              "mapping": {
                "backdrop_blur": "#/$defs/BackdropBlur",
                "duotone": "#/$defs/Duotone",
                "filter": "#/$defs/Filter",
                "glow": "#/$defs/Glow",
                "grain": "#/$defs/Grain",
                "inner_shadow": "#/$defs/InnerShadow",
                "shadow": "#/$defs/Shadow",
                "stroke": "#/$defs/Stroke"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Stroke"
              },
              {
                "$ref": "#/$defs/Shadow"
              },
              {
                "$ref": "#/$defs/Glow"
              },
              {
                "$ref": "#/$defs/Filter"
              },
              {
                "$ref": "#/$defs/Grain"
              },
              {
                "$ref": "#/$defs/Duotone"
              },
              {
                "$ref": "#/$defs/InnerShadow"
              },
              {
                "$ref": "#/$defs/BackdropBlur"
              }
            ]
          },
          "title": "Effects",
          "type": "array"
        },
        "faces": {
          "default": [],
          "items": {
            "$ref": "#/$defs/FaceRegion"
          },
          "title": "Faces",
          "type": "array"
        },
        "fit": {
          "anyOf": [
            {
              "$ref": "#/$defs/FitMode"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "focal_point": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                },
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Focal Point"
        },
        "height": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Height"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "path": {
          "title": "Path",
          "type": "string"
        },
        "position": {
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "remove_background": {
          "default": false,
          "title": "Remove Background",
          "type": "boolean"
        },
        "rotation": {
          "default": 0.0,
          "title": "Rotation",
          "type": "number"
        },
        "type": {
          "const": "image",
          "title": "Type",
          "type": "string"
        },
        "width": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Width"
        }
      },
      "required": [
        "type",
        "path",
        "position"
      ],
      "title": "ImageLayer",
      "type": "object"
    },
    "ImagePanTrack": {
      "additionalProperties": false,
      "description": "A normalized source-viewport pan track for image layers.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "image_pan",
          "default": "image_pan",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "keyframes"
      ],
      "title": "ImagePanTrack",
      "type": "object"
    },
    "ImageZoomTrack": {
      "additionalProperties": false,
      "description": "A positive source-viewport zoom track for image layers.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "image_zoom",
          "default": "image_zoom",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "keyframes"
      ],
      "title": "ImageZoomTrack",
      "type": "object"
    },
    "InnerShadow": {
      "additionalProperties": false,
      "properties": {
        "blur_radius": {
          "default": 0,
          "minimum": 0,
          "title": "Blur Radius",
          "type": "integer"
        },
        "color": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "offset_x": {
          "default": 0,
          "title": "Offset X",
          "type": "integer"
        },
        "offset_y": {
          "default": 0,
          "title": "Offset Y",
          "type": "integer"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "type": {
          "const": "inner_shadow",
          "default": "inner_shadow",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "color"
      ],
      "title": "InnerShadow",
      "type": "object"
    },
    "JsonObject": {
      "additionalProperties": {
        "$ref": "#/$defs/JsonValue"
      },
      "type": "object"
    },
    "JsonValue": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "integer"
        },
        {
          "type": "number"
        },
        {
          "type": "string"
        },
        {
          "items": {
            "$ref": "#/$defs/JsonValue"
          },
          "type": "array"
        },
        {
          "additionalProperties": {
            "$ref": "#/$defs/JsonValue"
          },
          "type": "object"
        },
        {
          "type": "null"
        }
      ]
    },
    "KeyframeSpec": {
      "additionalProperties": false,
      "description": "A property value at a non-negative point on an animation timeline.\n\n`easing` shapes the segment *leaving* this keyframe and falls back to the\nanimation's easing when omitted. `hold` keeps this value until the next\nkeyframe, then steps to it; a hold takes precedence over `easing`.",
      "properties": {
        "easing": {
          "anyOf": [
            {
              "enum": [
                "linear",
                "ease",
                "ease_in",
                "ease_out",
                "ease_in_out",
                "ease_in_quad",
                "ease_out_quad",
                "ease_in_out_quad",
                "ease_in_cubic",
                "ease_out_cubic",
                "ease_in_out_cubic",
                "ease_in_quart",
                "ease_out_quart",
                "ease_in_out_quart",
                "ease_in_quint",
                "ease_out_quint",
                "ease_in_out_quint",
                "ease_in_sine",
                "ease_out_sine",
                "ease_in_out_sine",
                "ease_in_back",
                "ease_out_back",
                "ease_in_out_back"
              ],
              "type": "string"
            },
            {
              "$ref": "#/$defs/CubicBezierEasing"
            },
            {
              "$ref": "#/$defs/SpringEasing"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Easing"
        },
        "hold": {
          "default": false,
          "title": "Hold",
          "type": "boolean"
        },
        "time": {
          "minimum": 0.0,
          "title": "Time",
          "type": "number"
        },
        "type": {
          "const": "keyframe",
          "default": "keyframe",
          "title": "Type",
          "type": "string"
        },
        "value": {
          "title": "Value"
        }
      },
      "required": [
        "type",
        "time",
        "value"
      ],
      "title": "KeyframeSpec",
      "type": "object"
    },
    "LayerClip": {
      "additionalProperties": false,
      "description": "Canvas-space rectangle that clips a layer after it is rendered.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": "top-left"
        },
        "border_radius": {
          "default": 0,
          "minimum": 0,
          "title": "Border Radius",
          "type": "integer"
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "position": {
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "type": {
          "const": "rect",
          "default": "rect",
          "title": "Type",
          "type": "string"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "position",
        "width",
        "height"
      ],
      "title": "LayerClip",
      "type": "object"
    },
    "LayerMask": {
      "additionalProperties": false,
      "description": "Canvas-space alpha mask applied to a layer after it is rendered.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": "top-left"
        },
        "d": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "D"
        },
        "feather": {
          "default": 0,
          "minimum": 0.0,
          "title": "Feather",
          "type": "number"
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "invert": {
          "default": false,
          "title": "Invert",
          "type": "boolean"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "points": {
          "anyOf": [
            {
              "items": {
                "maxItems": 2,
                "minItems": 2,
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "type": "array"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Points"
        },
        "position": {
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "shape": {
          "default": "rectangle",
          "enum": [
            "rectangle",
            "ellipse",
            "pill",
            "polygon",
            "path"
          ],
          "title": "Shape",
          "type": "string"
        },
        "type": {
          "const": "shape",
          "default": "shape",
          "title": "Type",
          "type": "string"
        },
        "view_box": {
          "anyOf": [
            {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "exclusiveMinimum": 0.0,
                  "type": "number"
                },
                {
                  "exclusiveMinimum": 0.0,
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "View Box"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "position",
        "width",
        "height"
      ],
      "title": "LayerMask",
      "type": "object"
    },
    "LineChartSpec": {
      "additionalProperties": false,
      "description": "Validated line chart data and line-specific options.",
      "properties": {
        "data": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "$ref": "#/$defs/ChartData"
            }
          ],
          "title": "Data"
        },
        "style": {
          "$ref": "#/$defs/LineChartStyle"
        },
        "type": {
          "const": "line",
          "default": "line",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "data"
      ],
      "title": "LineChartSpec",
      "type": "object"
    },
    "LineChartStyle": {
      "additionalProperties": false,
      "description": "Deterministic paint and geometry options for line charts.",
      "properties": {
        "color": {
          "default": "#2563EB",
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "fill": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fill"
        },
        "fill_opacity": {
          "default": 0.16,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Fill Opacity",
          "type": "number"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "padding": {
          "default": 0,
          "minimum": 0,
          "title": "Padding",
          "type": "integer"
        },
        "point_radius": {
          "default": 2,
          "minimum": 0,
          "title": "Point Radius",
          "type": "integer"
        },
        "show_points": {
          "default": true,
          "title": "Show Points",
          "type": "boolean"
        },
        "show_values": {
          "default": false,
          "title": "Show Values",
          "type": "boolean"
        },
        "stroke_width": {
          "default": 2,
          "exclusiveMinimum": 0,
          "title": "Stroke Width",
          "type": "integer"
        }
      },
      "title": "LineChartStyle",
      "type": "object"
    },
    "LinearGradient": {
      "additionalProperties": false,
      "properties": {
        "angle": {
          "title": "Angle",
          "type": "number"
        },
        "stops": {
          "items": {
            "maxItems": 2,
            "minItems": 2,
            "prefixItems": [
              {
                "type": "string"
              },
              {
                "type": "number"
              }
            ],
            "type": "array"
          },
          "title": "Stops",
          "type": "array"
        },
        "type": {
          "const": "linear",
          "default": "linear",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "angle",
        "stops"
      ],
      "title": "LinearGradient",
      "type": "object"
    },
    "MaskFeatherTrack": {
      "additionalProperties": false,
      "description": "A nonnegative Gaussian feather radius in local pixels.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "mask_feather",
          "default": "mask_feather",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "keyframes"
      ],
      "title": "MaskFeatherTrack",
      "type": "object"
    },
    "MaskPositionTrack": {
      "additionalProperties": false,
      "description": "Local pixel translation relative to the authored shape mask position.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "mask_position",
          "default": "mask_position",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "keyframes"
      ],
      "title": "MaskPositionTrack",
      "type": "object"
    },
    "MaskSizeTrack": {
      "additionalProperties": false,
      "description": "Absolute positive local width and height of a shape mask.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "mask_size",
          "default": "mask_size",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "keyframes"
      ],
      "title": "MaskSizeTrack",
      "type": "object"
    },
    "MotionCapabilityInspection": {
      "additionalProperties": false,
      "description": "Capability registry information for one exporter feature.",
      "properties": {
        "fallback": {
          "anyOf": [
            {
              "enum": [
                "fade",
                "rasterize",
                "static"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fallback"
        },
        "feature": {
          "title": "Feature",
          "type": "string"
        },
        "support": {
          "enum": [
            "full",
            "native",
            "partial",
            "fallback",
            "unsupported"
          ],
          "title": "Support",
          "type": "string"
        },
        "target": {
          "title": "Target",
          "type": "string"
        }
      },
      "required": [
        "feature",
        "target",
        "support"
      ],
      "title": "MotionCapabilityInspection",
      "type": "object"
    },
    "MotionEventInspection": {
      "$defs": {
        "CubicBezierEasing": {
          "additionalProperties": false,
          "description": "A custom CSS-style cubic-bezier easing curve.\n\n`points` are the two control points `[x1, y1, x2, y2]`. The x coordinates\nmust stay within `[0, 1]` so time remains monotonic; y may overshoot.",
          "properties": {
            "points": {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "title": "Points",
              "type": "array"
            },
            "type": {
              "const": "cubic_bezier",
              "default": "cubic_bezier",
              "title": "Type",
              "type": "string"
            }
          },
          "required": [
            "points"
          ],
          "title": "CubicBezierEasing",
          "type": "object"
        },
        "KeyframeSpec": {
          "additionalProperties": false,
          "description": "A property value at a non-negative point on an animation timeline.\n\n`easing` shapes the segment *leaving* this keyframe and falls back to the\nanimation's easing when omitted. `hold` keeps this value until the next\nkeyframe, then steps to it; a hold takes precedence over `easing`.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "time": {
              "minimum": 0.0,
              "title": "Time",
              "type": "number"
            },
            "type": {
              "const": "keyframe",
              "default": "keyframe",
              "title": "Type",
              "type": "string"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "KeyframeSpec",
          "type": "object"
        },
        "MotionKeyframeInspection": {
          "additionalProperties": false,
          "description": "One normalized keyframe exposed by motion inspection.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "in_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "In Tangent"
            },
            "out_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Out Tangent"
            },
            "time": {
              "title": "Time",
              "type": "number"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "MotionKeyframeInspection",
          "type": "object"
        },
        "MotionTrackInspection": {
          "additionalProperties": false,
          "description": "A resolved property track in canonical timeline order.",
          "properties": {
            "auto_orient": {
              "default": false,
              "title": "Auto Orient",
              "type": "boolean"
            },
            "keyframes": {
              "items": {
                "$ref": "#/$defs/MotionKeyframeInspection"
              },
              "title": "Keyframes",
              "type": "array"
            },
            "type": {
              "title": "Type",
              "type": "string"
            },
            "wiggle": {
              "anyOf": [
                {
                  "$ref": "#/$defs/Wiggle"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            }
          },
          "required": [
            "type",
            "keyframes"
          ],
          "title": "MotionTrackInspection",
          "type": "object"
        },
        "RangeSelector": {
          "additionalProperties": false,
          "description": "Keyframeable percentage range over source codepoint, word or line centers.",
          "properties": {
            "end": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 100,
              "title": "End"
            },
            "offset": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Offset"
            },
            "shape": {
              "default": "square",
              "enum": [
                "square",
                "ramp",
                "triangle",
                "smooth"
              ],
              "title": "Shape",
              "type": "string"
            },
            "start": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Start"
            },
            "target": {
              "default": "words",
              "enum": [
                "characters",
                "words",
                "lines"
              ],
              "title": "Target",
              "type": "string"
            }
          },
          "title": "RangeSelector",
          "type": "object"
        },
        "SpringEasing": {
          "additionalProperties": false,
          "description": "A unit step response of a damped spring, sampled without integration.\n\nThe response runs over one normalized second per keyframe interval. The\ndeclared interval always ends at its target, even if the spring has not\nsettled naturally.",
          "properties": {
            "damping": {
              "default": 10.0,
              "minimum": 0.0,
              "title": "Damping",
              "type": "number"
            },
            "mass": {
              "default": 1.0,
              "exclusiveMinimum": 0.0,
              "title": "Mass",
              "type": "number"
            },
            "stiffness": {
              "default": 100.0,
              "exclusiveMinimum": 0.0,
              "title": "Stiffness",
              "type": "number"
            },
            "type": {
              "const": "spring",
              "default": "spring",
              "title": "Type",
              "type": "string"
            }
          },
          "title": "SpringEasing",
          "type": "object"
        },
        "Wiggle": {
          "additionalProperties": false,
          "description": "Seeded band-limited offsets added to a numeric track on its event clock.",
          "properties": {
            "amplitude": {
              "default": 1.0,
              "minimum": 0.0,
              "title": "Amplitude",
              "type": "number"
            },
            "frequency": {
              "default": 2.0,
              "exclusiveMinimum": 0.0,
              "title": "Frequency",
              "type": "number"
            },
            "seed": {
              "default": 0,
              "maximum": 4294967295,
              "minimum": 0,
              "title": "Seed",
              "type": "integer"
            }
          },
          "title": "Wiggle",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "A resolved timeline event, including its effective timing.",
      "properties": {
        "active_start": {
          "title": "Active Start",
          "type": "number"
        },
        "delay": {
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Effect"
        },
        "end": {
          "title": "End",
          "type": "number"
        },
        "progress": {
          "items": {
            "type": "number"
          },
          "title": "Progress",
          "type": "array"
        },
        "selector": {
          "anyOf": [
            {
              "$ref": "#/$defs/RangeSelector"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "selector_weights": {
          "items": {
            "items": {
              "type": "number"
            },
            "type": "array"
          },
          "title": "Selector Weights",
          "type": "array"
        },
        "source": {
          "enum": [
            "effect",
            "timeline",
            "legacy",
            "transition"
          ],
          "title": "Source",
          "type": "string"
        },
        "stagger": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Stagger"
        },
        "start": {
          "title": "Start",
          "type": "number"
        },
        "tracks": {
          "items": {
            "$ref": "#/$defs/MotionTrackInspection"
          },
          "title": "Tracks",
          "type": "array"
        },
        "trigger": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Trigger"
        }
      },
      "required": [
        "source",
        "start",
        "delay",
        "active_start",
        "duration",
        "end"
      ],
      "title": "MotionEventInspection",
      "type": "object"
    },
    "MotionInspection": {
      "$defs": {
        "CubicBezierEasing": {
          "additionalProperties": false,
          "description": "A custom CSS-style cubic-bezier easing curve.\n\n`points` are the two control points `[x1, y1, x2, y2]`. The x coordinates\nmust stay within `[0, 1]` so time remains monotonic; y may overshoot.",
          "properties": {
            "points": {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "title": "Points",
              "type": "array"
            },
            "type": {
              "const": "cubic_bezier",
              "default": "cubic_bezier",
              "title": "Type",
              "type": "string"
            }
          },
          "required": [
            "points"
          ],
          "title": "CubicBezierEasing",
          "type": "object"
        },
        "ExportDiagnostic": {
          "additionalProperties": false,
          "description": "Structured explanation of exporter support or fallback behavior.",
          "properties": {
            "fallback": {
              "anyOf": [
                {
                  "enum": [
                    "fade",
                    "rasterize",
                    "static"
                  ],
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Fallback"
            },
            "feature": {
              "title": "Feature",
              "type": "string"
            },
            "layer_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Layer Id"
            },
            "layer_ids": {
              "items": {
                "type": "string"
              },
              "title": "Layer Ids",
              "type": "array"
            },
            "message": {
              "title": "Message",
              "type": "string"
            },
            "native_attempt": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Native Attempt"
            },
            "slide_index": {
              "anyOf": [
                {
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Slide Index"
            },
            "support": {
              "enum": [
                "full",
                "native",
                "partial",
                "fallback",
                "unsupported"
              ],
              "title": "Support",
              "type": "string"
            },
            "target": {
              "title": "Target",
              "type": "string"
            }
          },
          "required": [
            "feature",
            "target",
            "support",
            "message"
          ],
          "title": "ExportDiagnostic",
          "type": "object"
        },
        "KeyframeSpec": {
          "additionalProperties": false,
          "description": "A property value at a non-negative point on an animation timeline.\n\n`easing` shapes the segment *leaving* this keyframe and falls back to the\nanimation's easing when omitted. `hold` keeps this value until the next\nkeyframe, then steps to it; a hold takes precedence over `easing`.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "time": {
              "minimum": 0.0,
              "title": "Time",
              "type": "number"
            },
            "type": {
              "const": "keyframe",
              "default": "keyframe",
              "title": "Type",
              "type": "string"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "KeyframeSpec",
          "type": "object"
        },
        "MotionCapabilityInspection": {
          "additionalProperties": false,
          "description": "Capability registry information for one exporter feature.",
          "properties": {
            "fallback": {
              "anyOf": [
                {
                  "enum": [
                    "fade",
                    "rasterize",
                    "static"
                  ],
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Fallback"
            },
            "feature": {
              "title": "Feature",
              "type": "string"
            },
            "support": {
              "enum": [
                "full",
                "native",
                "partial",
                "fallback",
                "unsupported"
              ],
              "title": "Support",
              "type": "string"
            },
            "target": {
              "title": "Target",
              "type": "string"
            }
          },
          "required": [
            "feature",
            "target",
            "support"
          ],
          "title": "MotionCapabilityInspection",
          "type": "object"
        },
        "MotionEventInspection": {
          "additionalProperties": false,
          "description": "A resolved timeline event, including its effective timing.",
          "properties": {
            "active_start": {
              "title": "Active Start",
              "type": "number"
            },
            "delay": {
              "title": "Delay",
              "type": "number"
            },
            "duration": {
              "title": "Duration",
              "type": "number"
            },
            "effect": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Effect"
            },
            "end": {
              "title": "End",
              "type": "number"
            },
            "progress": {
              "items": {
                "type": "number"
              },
              "title": "Progress",
              "type": "array"
            },
            "selector": {
              "anyOf": [
                {
                  "$ref": "#/$defs/RangeSelector"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            },
            "selector_weights": {
              "items": {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              "title": "Selector Weights",
              "type": "array"
            },
            "source": {
              "enum": [
                "effect",
                "timeline",
                "legacy",
                "transition"
              ],
              "title": "Source",
              "type": "string"
            },
            "stagger": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Stagger"
            },
            "start": {
              "title": "Start",
              "type": "number"
            },
            "tracks": {
              "items": {
                "$ref": "#/$defs/MotionTrackInspection"
              },
              "title": "Tracks",
              "type": "array"
            },
            "trigger": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Trigger"
            }
          },
          "required": [
            "source",
            "start",
            "delay",
            "active_start",
            "duration",
            "end"
          ],
          "title": "MotionEventInspection",
          "type": "object"
        },
        "MotionKeyframeInspection": {
          "additionalProperties": false,
          "description": "One normalized keyframe exposed by motion inspection.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "in_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "In Tangent"
            },
            "out_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Out Tangent"
            },
            "time": {
              "title": "Time",
              "type": "number"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "MotionKeyframeInspection",
          "type": "object"
        },
        "MotionLayerInspection": {
          "additionalProperties": false,
          "description": "Resolved motion for one stable layer identity.",
          "properties": {
            "duration": {
              "default": 0.0,
              "title": "Duration",
              "type": "number"
            },
            "events": {
              "items": {
                "$ref": "#/$defs/MotionEventInspection"
              },
              "title": "Events",
              "type": "array"
            },
            "final_state": {
              "additionalProperties": true,
              "title": "Final State",
              "type": "object"
            },
            "initial_state": {
              "additionalProperties": true,
              "title": "Initial State",
              "type": "object"
            },
            "layer_id": {
              "title": "Layer Id",
              "type": "string"
            },
            "layer_type": {
              "title": "Layer Type",
              "type": "string"
            },
            "parent": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Parent"
            },
            "sample_times": {
              "items": {
                "type": "number"
              },
              "title": "Sample Times",
              "type": "array"
            },
            "samples": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Samples",
              "type": "array"
            },
            "static_state": {
              "additionalProperties": true,
              "title": "Static State",
              "type": "object"
            },
            "targets": {
              "items": {
                "$ref": "#/$defs/MotionTargetInspection"
              },
              "title": "Targets",
              "type": "array"
            }
          },
          "required": [
            "layer_id",
            "layer_type"
          ],
          "title": "MotionLayerInspection",
          "type": "object"
        },
        "MotionMatchInspection": {
          "additionalProperties": false,
          "description": "A deterministic cross-scene identity match.",
          "properties": {
            "behavior": {
              "default": "match",
              "enum": [
                "match",
                "crossfade"
              ],
              "title": "Behavior",
              "type": "string"
            },
            "motion_key": {
              "title": "Motion Key",
              "type": "string"
            },
            "source_id": {
              "title": "Source Id",
              "type": "string"
            },
            "target_id": {
              "title": "Target Id",
              "type": "string"
            }
          },
          "required": [
            "source_id",
            "target_id",
            "motion_key"
          ],
          "title": "MotionMatchInspection",
          "type": "object"
        },
        "MotionSlideInspection": {
          "additionalProperties": false,
          "description": "Motion inspection for one canvas, optionally within a deck.",
          "properties": {
            "duration": {
              "default": 0.0,
              "title": "Duration",
              "type": "number"
            },
            "height": {
              "exclusiveMinimum": 0,
              "title": "Height",
              "type": "integer"
            },
            "layers": {
              "items": {
                "$ref": "#/$defs/MotionLayerInspection"
              },
              "title": "Layers",
              "type": "array"
            },
            "matches": {
              "items": {
                "$ref": "#/$defs/MotionMatchInspection"
              },
              "title": "Matches",
              "type": "array"
            },
            "slide_index": {
              "anyOf": [
                {
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Slide Index"
            },
            "transition": {
              "anyOf": [
                {
                  "$ref": "#/$defs/MotionEventInspection"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            },
            "width": {
              "exclusiveMinimum": 0,
              "title": "Width",
              "type": "integer"
            }
          },
          "required": [
            "width",
            "height"
          ],
          "title": "MotionSlideInspection",
          "type": "object"
        },
        "MotionTargetInspection": {
          "additionalProperties": false,
          "description": "A deterministic semantic target resolved from a layer.",
          "properties": {
            "index": {
              "minimum": 0,
              "title": "Index",
              "type": "integer"
            },
            "position": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Position"
            },
            "samples": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Samples",
              "type": "array"
            },
            "size": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Size"
            },
            "source_range": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "minimum": 0,
                      "type": "integer"
                    },
                    {
                      "minimum": 0,
                      "type": "integer"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Source Range"
            },
            "target": {
              "title": "Target",
              "type": "string"
            }
          },
          "required": [
            "target",
            "index"
          ],
          "title": "MotionTargetInspection",
          "type": "object"
        },
        "MotionTrackInspection": {
          "additionalProperties": false,
          "description": "A resolved property track in canonical timeline order.",
          "properties": {
            "auto_orient": {
              "default": false,
              "title": "Auto Orient",
              "type": "boolean"
            },
            "keyframes": {
              "items": {
                "$ref": "#/$defs/MotionKeyframeInspection"
              },
              "title": "Keyframes",
              "type": "array"
            },
            "type": {
              "title": "Type",
              "type": "string"
            },
            "wiggle": {
              "anyOf": [
                {
                  "$ref": "#/$defs/Wiggle"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            }
          },
          "required": [
            "type",
            "keyframes"
          ],
          "title": "MotionTrackInspection",
          "type": "object"
        },
        "RangeSelector": {
          "additionalProperties": false,
          "description": "Keyframeable percentage range over source codepoint, word or line centers.",
          "properties": {
            "end": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 100,
              "title": "End"
            },
            "offset": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Offset"
            },
            "shape": {
              "default": "square",
              "enum": [
                "square",
                "ramp",
                "triangle",
                "smooth"
              ],
              "title": "Shape",
              "type": "string"
            },
            "start": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Start"
            },
            "target": {
              "default": "words",
              "enum": [
                "characters",
                "words",
                "lines"
              ],
              "title": "Target",
              "type": "string"
            }
          },
          "title": "RangeSelector",
          "type": "object"
        },
        "ReducedMotionInspection": {
          "additionalProperties": false,
          "description": "The effective accessibility policy applied to the inspected result.",
          "properties": {
            "enabled": {
              "default": false,
              "title": "Enabled",
              "type": "boolean"
            },
            "mode": {
              "default": "normal",
              "enum": [
                "normal",
                "static"
              ],
              "title": "Mode",
              "type": "string"
            },
            "original_duration": {
              "default": 0.0,
              "title": "Original Duration",
              "type": "number"
            },
            "removed_features": {
              "items": {
                "type": "string"
              },
              "title": "Removed Features",
              "type": "array"
            },
            "resolved_duration": {
              "default": 0.0,
              "title": "Resolved Duration",
              "type": "number"
            }
          },
          "title": "ReducedMotionInspection",
          "type": "object"
        },
        "SpringEasing": {
          "additionalProperties": false,
          "description": "A unit step response of a damped spring, sampled without integration.\n\nThe response runs over one normalized second per keyframe interval. The\ndeclared interval always ends at its target, even if the spring has not\nsettled naturally.",
          "properties": {
            "damping": {
              "default": 10.0,
              "minimum": 0.0,
              "title": "Damping",
              "type": "number"
            },
            "mass": {
              "default": 1.0,
              "exclusiveMinimum": 0.0,
              "title": "Mass",
              "type": "number"
            },
            "stiffness": {
              "default": 100.0,
              "exclusiveMinimum": 0.0,
              "title": "Stiffness",
              "type": "number"
            },
            "type": {
              "const": "spring",
              "default": "spring",
              "title": "Type",
              "type": "string"
            }
          },
          "title": "SpringEasing",
          "type": "object"
        },
        "Wiggle": {
          "additionalProperties": false,
          "description": "Seeded band-limited offsets added to a numeric track on its event clock.",
          "properties": {
            "amplitude": {
              "default": 1.0,
              "minimum": 0.0,
              "title": "Amplitude",
              "type": "number"
            },
            "frequency": {
              "default": 2.0,
              "exclusiveMinimum": 0.0,
              "title": "Frequency",
              "type": "number"
            },
            "seed": {
              "default": 0,
              "maximum": 4294967295,
              "minimum": 0,
              "title": "Seed",
              "type": "integer"
            }
          },
          "title": "Wiggle",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "Public, JSON-serializable motion inspection report.",
      "properties": {
        "capabilities": {
          "items": {
            "$ref": "#/$defs/MotionCapabilityInspection"
          },
          "title": "Capabilities",
          "type": "array"
        },
        "diagnostics": {
          "items": {
            "$ref": "#/$defs/ExportDiagnostic"
          },
          "title": "Diagnostics",
          "type": "array"
        },
        "duration": {
          "default": 0.0,
          "title": "Duration",
          "type": "number"
        },
        "fps": {
          "title": "Fps",
          "type": "number"
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "max_samples": {
          "default": 10000,
          "exclusiveMinimum": 0,
          "title": "Max Samples",
          "type": "integer"
        },
        "reduced_motion": {
          "$ref": "#/$defs/ReducedMotionInspection"
        },
        "sample_times": {
          "items": {
            "type": "number"
          },
          "title": "Sample Times",
          "type": "array"
        },
        "slides": {
          "items": {
            "$ref": "#/$defs/MotionSlideInspection"
          },
          "title": "Slides",
          "type": "array"
        },
        "version": {
          "const": "1",
          "default": "1",
          "title": "Version",
          "type": "string"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "width",
        "height",
        "fps"
      ],
      "title": "MotionInspection",
      "type": "object"
    },
    "MotionKeyframeInspection": {
      "$defs": {
        "CubicBezierEasing": {
          "additionalProperties": false,
          "description": "A custom CSS-style cubic-bezier easing curve.\n\n`points` are the two control points `[x1, y1, x2, y2]`. The x coordinates\nmust stay within `[0, 1]` so time remains monotonic; y may overshoot.",
          "properties": {
            "points": {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "title": "Points",
              "type": "array"
            },
            "type": {
              "const": "cubic_bezier",
              "default": "cubic_bezier",
              "title": "Type",
              "type": "string"
            }
          },
          "required": [
            "points"
          ],
          "title": "CubicBezierEasing",
          "type": "object"
        },
        "SpringEasing": {
          "additionalProperties": false,
          "description": "A unit step response of a damped spring, sampled without integration.\n\nThe response runs over one normalized second per keyframe interval. The\ndeclared interval always ends at its target, even if the spring has not\nsettled naturally.",
          "properties": {
            "damping": {
              "default": 10.0,
              "minimum": 0.0,
              "title": "Damping",
              "type": "number"
            },
            "mass": {
              "default": 1.0,
              "exclusiveMinimum": 0.0,
              "title": "Mass",
              "type": "number"
            },
            "stiffness": {
              "default": 100.0,
              "exclusiveMinimum": 0.0,
              "title": "Stiffness",
              "type": "number"
            },
            "type": {
              "const": "spring",
              "default": "spring",
              "title": "Type",
              "type": "string"
            }
          },
          "title": "SpringEasing",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "One normalized keyframe exposed by motion inspection.",
      "properties": {
        "easing": {
          "anyOf": [
            {
              "enum": [
                "linear",
                "ease",
                "ease_in",
                "ease_out",
                "ease_in_out",
                "ease_in_quad",
                "ease_out_quad",
                "ease_in_out_quad",
                "ease_in_cubic",
                "ease_out_cubic",
                "ease_in_out_cubic",
                "ease_in_quart",
                "ease_out_quart",
                "ease_in_out_quart",
                "ease_in_quint",
                "ease_out_quint",
                "ease_in_out_quint",
                "ease_in_sine",
                "ease_out_sine",
                "ease_in_out_sine",
                "ease_in_back",
                "ease_out_back",
                "ease_in_out_back"
              ],
              "type": "string"
            },
            {
              "$ref": "#/$defs/CubicBezierEasing"
            },
            {
              "$ref": "#/$defs/SpringEasing"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Easing"
        },
        "hold": {
          "default": false,
          "title": "Hold",
          "type": "boolean"
        },
        "in_tangent": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "In Tangent"
        },
        "out_tangent": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Out Tangent"
        },
        "time": {
          "title": "Time",
          "type": "number"
        },
        "value": {
          "title": "Value"
        }
      },
      "required": [
        "time",
        "value"
      ],
      "title": "MotionKeyframeInspection",
      "type": "object"
    },
    "MotionLayerInspection": {
      "$defs": {
        "CubicBezierEasing": {
          "additionalProperties": false,
          "description": "A custom CSS-style cubic-bezier easing curve.\n\n`points` are the two control points `[x1, y1, x2, y2]`. The x coordinates\nmust stay within `[0, 1]` so time remains monotonic; y may overshoot.",
          "properties": {
            "points": {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "title": "Points",
              "type": "array"
            },
            "type": {
              "const": "cubic_bezier",
              "default": "cubic_bezier",
              "title": "Type",
              "type": "string"
            }
          },
          "required": [
            "points"
          ],
          "title": "CubicBezierEasing",
          "type": "object"
        },
        "KeyframeSpec": {
          "additionalProperties": false,
          "description": "A property value at a non-negative point on an animation timeline.\n\n`easing` shapes the segment *leaving* this keyframe and falls back to the\nanimation's easing when omitted. `hold` keeps this value until the next\nkeyframe, then steps to it; a hold takes precedence over `easing`.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "time": {
              "minimum": 0.0,
              "title": "Time",
              "type": "number"
            },
            "type": {
              "const": "keyframe",
              "default": "keyframe",
              "title": "Type",
              "type": "string"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "KeyframeSpec",
          "type": "object"
        },
        "MotionEventInspection": {
          "additionalProperties": false,
          "description": "A resolved timeline event, including its effective timing.",
          "properties": {
            "active_start": {
              "title": "Active Start",
              "type": "number"
            },
            "delay": {
              "title": "Delay",
              "type": "number"
            },
            "duration": {
              "title": "Duration",
              "type": "number"
            },
            "effect": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Effect"
            },
            "end": {
              "title": "End",
              "type": "number"
            },
            "progress": {
              "items": {
                "type": "number"
              },
              "title": "Progress",
              "type": "array"
            },
            "selector": {
              "anyOf": [
                {
                  "$ref": "#/$defs/RangeSelector"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            },
            "selector_weights": {
              "items": {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              "title": "Selector Weights",
              "type": "array"
            },
            "source": {
              "enum": [
                "effect",
                "timeline",
                "legacy",
                "transition"
              ],
              "title": "Source",
              "type": "string"
            },
            "stagger": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Stagger"
            },
            "start": {
              "title": "Start",
              "type": "number"
            },
            "tracks": {
              "items": {
                "$ref": "#/$defs/MotionTrackInspection"
              },
              "title": "Tracks",
              "type": "array"
            },
            "trigger": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Trigger"
            }
          },
          "required": [
            "source",
            "start",
            "delay",
            "active_start",
            "duration",
            "end"
          ],
          "title": "MotionEventInspection",
          "type": "object"
        },
        "MotionKeyframeInspection": {
          "additionalProperties": false,
          "description": "One normalized keyframe exposed by motion inspection.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "in_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "In Tangent"
            },
            "out_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Out Tangent"
            },
            "time": {
              "title": "Time",
              "type": "number"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "MotionKeyframeInspection",
          "type": "object"
        },
        "MotionTargetInspection": {
          "additionalProperties": false,
          "description": "A deterministic semantic target resolved from a layer.",
          "properties": {
            "index": {
              "minimum": 0,
              "title": "Index",
              "type": "integer"
            },
            "position": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Position"
            },
            "samples": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Samples",
              "type": "array"
            },
            "size": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Size"
            },
            "source_range": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "minimum": 0,
                      "type": "integer"
                    },
                    {
                      "minimum": 0,
                      "type": "integer"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Source Range"
            },
            "target": {
              "title": "Target",
              "type": "string"
            }
          },
          "required": [
            "target",
            "index"
          ],
          "title": "MotionTargetInspection",
          "type": "object"
        },
        "MotionTrackInspection": {
          "additionalProperties": false,
          "description": "A resolved property track in canonical timeline order.",
          "properties": {
            "auto_orient": {
              "default": false,
              "title": "Auto Orient",
              "type": "boolean"
            },
            "keyframes": {
              "items": {
                "$ref": "#/$defs/MotionKeyframeInspection"
              },
              "title": "Keyframes",
              "type": "array"
            },
            "type": {
              "title": "Type",
              "type": "string"
            },
            "wiggle": {
              "anyOf": [
                {
                  "$ref": "#/$defs/Wiggle"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            }
          },
          "required": [
            "type",
            "keyframes"
          ],
          "title": "MotionTrackInspection",
          "type": "object"
        },
        "RangeSelector": {
          "additionalProperties": false,
          "description": "Keyframeable percentage range over source codepoint, word or line centers.",
          "properties": {
            "end": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 100,
              "title": "End"
            },
            "offset": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Offset"
            },
            "shape": {
              "default": "square",
              "enum": [
                "square",
                "ramp",
                "triangle",
                "smooth"
              ],
              "title": "Shape",
              "type": "string"
            },
            "start": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Start"
            },
            "target": {
              "default": "words",
              "enum": [
                "characters",
                "words",
                "lines"
              ],
              "title": "Target",
              "type": "string"
            }
          },
          "title": "RangeSelector",
          "type": "object"
        },
        "SpringEasing": {
          "additionalProperties": false,
          "description": "A unit step response of a damped spring, sampled without integration.\n\nThe response runs over one normalized second per keyframe interval. The\ndeclared interval always ends at its target, even if the spring has not\nsettled naturally.",
          "properties": {
            "damping": {
              "default": 10.0,
              "minimum": 0.0,
              "title": "Damping",
              "type": "number"
            },
            "mass": {
              "default": 1.0,
              "exclusiveMinimum": 0.0,
              "title": "Mass",
              "type": "number"
            },
            "stiffness": {
              "default": 100.0,
              "exclusiveMinimum": 0.0,
              "title": "Stiffness",
              "type": "number"
            },
            "type": {
              "const": "spring",
              "default": "spring",
              "title": "Type",
              "type": "string"
            }
          },
          "title": "SpringEasing",
          "type": "object"
        },
        "Wiggle": {
          "additionalProperties": false,
          "description": "Seeded band-limited offsets added to a numeric track on its event clock.",
          "properties": {
            "amplitude": {
              "default": 1.0,
              "minimum": 0.0,
              "title": "Amplitude",
              "type": "number"
            },
            "frequency": {
              "default": 2.0,
              "exclusiveMinimum": 0.0,
              "title": "Frequency",
              "type": "number"
            },
            "seed": {
              "default": 0,
              "maximum": 4294967295,
              "minimum": 0,
              "title": "Seed",
              "type": "integer"
            }
          },
          "title": "Wiggle",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "Resolved motion for one stable layer identity.",
      "properties": {
        "duration": {
          "default": 0.0,
          "title": "Duration",
          "type": "number"
        },
        "events": {
          "items": {
            "$ref": "#/$defs/MotionEventInspection"
          },
          "title": "Events",
          "type": "array"
        },
        "final_state": {
          "additionalProperties": true,
          "title": "Final State",
          "type": "object"
        },
        "initial_state": {
          "additionalProperties": true,
          "title": "Initial State",
          "type": "object"
        },
        "layer_id": {
          "title": "Layer Id",
          "type": "string"
        },
        "layer_type": {
          "title": "Layer Type",
          "type": "string"
        },
        "parent": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Parent"
        },
        "sample_times": {
          "items": {
            "type": "number"
          },
          "title": "Sample Times",
          "type": "array"
        },
        "samples": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Samples",
          "type": "array"
        },
        "static_state": {
          "additionalProperties": true,
          "title": "Static State",
          "type": "object"
        },
        "targets": {
          "items": {
            "$ref": "#/$defs/MotionTargetInspection"
          },
          "title": "Targets",
          "type": "array"
        }
      },
      "required": [
        "layer_id",
        "layer_type"
      ],
      "title": "MotionLayerInspection",
      "type": "object"
    },
    "MotionMatchInspection": {
      "additionalProperties": false,
      "description": "A deterministic cross-scene identity match.",
      "properties": {
        "behavior": {
          "default": "match",
          "enum": [
            "match",
            "crossfade"
          ],
          "title": "Behavior",
          "type": "string"
        },
        "motion_key": {
          "title": "Motion Key",
          "type": "string"
        },
        "source_id": {
          "title": "Source Id",
          "type": "string"
        },
        "target_id": {
          "title": "Target Id",
          "type": "string"
        }
      },
      "required": [
        "source_id",
        "target_id",
        "motion_key"
      ],
      "title": "MotionMatchInspection",
      "type": "object"
    },
    "MotionProfile": {
      "additionalProperties": false,
      "description": "Deck-wide defaults for motion speed and visual feel.",
      "properties": {
        "feel": {
          "default": "soft",
          "enum": [
            "gentle",
            "soft",
            "snappy",
            "dramatic",
            "minimal"
          ],
          "title": "Feel",
          "type": "string"
        },
        "name": {
          "enum": [
            "presentation",
            "social",
            "cinematic",
            "minimal"
          ],
          "title": "Name",
          "type": "string"
        },
        "speed": {
          "default": 1.0,
          "exclusiveMinimum": 0.0,
          "title": "Speed",
          "type": "number"
        }
      },
      "required": [
        "name"
      ],
      "title": "MotionProfile",
      "type": "object"
    },
    "MotionSlideInspection": {
      "$defs": {
        "CubicBezierEasing": {
          "additionalProperties": false,
          "description": "A custom CSS-style cubic-bezier easing curve.\n\n`points` are the two control points `[x1, y1, x2, y2]`. The x coordinates\nmust stay within `[0, 1]` so time remains monotonic; y may overshoot.",
          "properties": {
            "points": {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "title": "Points",
              "type": "array"
            },
            "type": {
              "const": "cubic_bezier",
              "default": "cubic_bezier",
              "title": "Type",
              "type": "string"
            }
          },
          "required": [
            "points"
          ],
          "title": "CubicBezierEasing",
          "type": "object"
        },
        "KeyframeSpec": {
          "additionalProperties": false,
          "description": "A property value at a non-negative point on an animation timeline.\n\n`easing` shapes the segment *leaving* this keyframe and falls back to the\nanimation's easing when omitted. `hold` keeps this value until the next\nkeyframe, then steps to it; a hold takes precedence over `easing`.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "time": {
              "minimum": 0.0,
              "title": "Time",
              "type": "number"
            },
            "type": {
              "const": "keyframe",
              "default": "keyframe",
              "title": "Type",
              "type": "string"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "KeyframeSpec",
          "type": "object"
        },
        "MotionEventInspection": {
          "additionalProperties": false,
          "description": "A resolved timeline event, including its effective timing.",
          "properties": {
            "active_start": {
              "title": "Active Start",
              "type": "number"
            },
            "delay": {
              "title": "Delay",
              "type": "number"
            },
            "duration": {
              "title": "Duration",
              "type": "number"
            },
            "effect": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Effect"
            },
            "end": {
              "title": "End",
              "type": "number"
            },
            "progress": {
              "items": {
                "type": "number"
              },
              "title": "Progress",
              "type": "array"
            },
            "selector": {
              "anyOf": [
                {
                  "$ref": "#/$defs/RangeSelector"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            },
            "selector_weights": {
              "items": {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              "title": "Selector Weights",
              "type": "array"
            },
            "source": {
              "enum": [
                "effect",
                "timeline",
                "legacy",
                "transition"
              ],
              "title": "Source",
              "type": "string"
            },
            "stagger": {
              "anyOf": [
                {
                  "additionalProperties": true,
                  "type": "object"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Stagger"
            },
            "start": {
              "title": "Start",
              "type": "number"
            },
            "tracks": {
              "items": {
                "$ref": "#/$defs/MotionTrackInspection"
              },
              "title": "Tracks",
              "type": "array"
            },
            "trigger": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Trigger"
            }
          },
          "required": [
            "source",
            "start",
            "delay",
            "active_start",
            "duration",
            "end"
          ],
          "title": "MotionEventInspection",
          "type": "object"
        },
        "MotionKeyframeInspection": {
          "additionalProperties": false,
          "description": "One normalized keyframe exposed by motion inspection.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "in_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "In Tangent"
            },
            "out_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Out Tangent"
            },
            "time": {
              "title": "Time",
              "type": "number"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "MotionKeyframeInspection",
          "type": "object"
        },
        "MotionLayerInspection": {
          "additionalProperties": false,
          "description": "Resolved motion for one stable layer identity.",
          "properties": {
            "duration": {
              "default": 0.0,
              "title": "Duration",
              "type": "number"
            },
            "events": {
              "items": {
                "$ref": "#/$defs/MotionEventInspection"
              },
              "title": "Events",
              "type": "array"
            },
            "final_state": {
              "additionalProperties": true,
              "title": "Final State",
              "type": "object"
            },
            "initial_state": {
              "additionalProperties": true,
              "title": "Initial State",
              "type": "object"
            },
            "layer_id": {
              "title": "Layer Id",
              "type": "string"
            },
            "layer_type": {
              "title": "Layer Type",
              "type": "string"
            },
            "parent": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Parent"
            },
            "sample_times": {
              "items": {
                "type": "number"
              },
              "title": "Sample Times",
              "type": "array"
            },
            "samples": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Samples",
              "type": "array"
            },
            "static_state": {
              "additionalProperties": true,
              "title": "Static State",
              "type": "object"
            },
            "targets": {
              "items": {
                "$ref": "#/$defs/MotionTargetInspection"
              },
              "title": "Targets",
              "type": "array"
            }
          },
          "required": [
            "layer_id",
            "layer_type"
          ],
          "title": "MotionLayerInspection",
          "type": "object"
        },
        "MotionMatchInspection": {
          "additionalProperties": false,
          "description": "A deterministic cross-scene identity match.",
          "properties": {
            "behavior": {
              "default": "match",
              "enum": [
                "match",
                "crossfade"
              ],
              "title": "Behavior",
              "type": "string"
            },
            "motion_key": {
              "title": "Motion Key",
              "type": "string"
            },
            "source_id": {
              "title": "Source Id",
              "type": "string"
            },
            "target_id": {
              "title": "Target Id",
              "type": "string"
            }
          },
          "required": [
            "source_id",
            "target_id",
            "motion_key"
          ],
          "title": "MotionMatchInspection",
          "type": "object"
        },
        "MotionTargetInspection": {
          "additionalProperties": false,
          "description": "A deterministic semantic target resolved from a layer.",
          "properties": {
            "index": {
              "minimum": 0,
              "title": "Index",
              "type": "integer"
            },
            "position": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Position"
            },
            "samples": {
              "items": {
                "additionalProperties": true,
                "type": "object"
              },
              "title": "Samples",
              "type": "array"
            },
            "size": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Size"
            },
            "source_range": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "minimum": 0,
                      "type": "integer"
                    },
                    {
                      "minimum": 0,
                      "type": "integer"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Source Range"
            },
            "target": {
              "title": "Target",
              "type": "string"
            }
          },
          "required": [
            "target",
            "index"
          ],
          "title": "MotionTargetInspection",
          "type": "object"
        },
        "MotionTrackInspection": {
          "additionalProperties": false,
          "description": "A resolved property track in canonical timeline order.",
          "properties": {
            "auto_orient": {
              "default": false,
              "title": "Auto Orient",
              "type": "boolean"
            },
            "keyframes": {
              "items": {
                "$ref": "#/$defs/MotionKeyframeInspection"
              },
              "title": "Keyframes",
              "type": "array"
            },
            "type": {
              "title": "Type",
              "type": "string"
            },
            "wiggle": {
              "anyOf": [
                {
                  "$ref": "#/$defs/Wiggle"
                },
                {
                  "type": "null"
                }
              ],
              "default": null
            }
          },
          "required": [
            "type",
            "keyframes"
          ],
          "title": "MotionTrackInspection",
          "type": "object"
        },
        "RangeSelector": {
          "additionalProperties": false,
          "description": "Keyframeable percentage range over source codepoint, word or line centers.",
          "properties": {
            "end": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 100,
              "title": "End"
            },
            "offset": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Offset"
            },
            "shape": {
              "default": "square",
              "enum": [
                "square",
                "ramp",
                "triangle",
                "smooth"
              ],
              "title": "Shape",
              "type": "string"
            },
            "start": {
              "anyOf": [
                {
                  "maximum": 100,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "items": {
                    "$ref": "#/$defs/KeyframeSpec"
                  },
                  "minItems": 1,
                  "type": "array"
                }
              ],
              "default": 0,
              "title": "Start"
            },
            "target": {
              "default": "words",
              "enum": [
                "characters",
                "words",
                "lines"
              ],
              "title": "Target",
              "type": "string"
            }
          },
          "title": "RangeSelector",
          "type": "object"
        },
        "SpringEasing": {
          "additionalProperties": false,
          "description": "A unit step response of a damped spring, sampled without integration.\n\nThe response runs over one normalized second per keyframe interval. The\ndeclared interval always ends at its target, even if the spring has not\nsettled naturally.",
          "properties": {
            "damping": {
              "default": 10.0,
              "minimum": 0.0,
              "title": "Damping",
              "type": "number"
            },
            "mass": {
              "default": 1.0,
              "exclusiveMinimum": 0.0,
              "title": "Mass",
              "type": "number"
            },
            "stiffness": {
              "default": 100.0,
              "exclusiveMinimum": 0.0,
              "title": "Stiffness",
              "type": "number"
            },
            "type": {
              "const": "spring",
              "default": "spring",
              "title": "Type",
              "type": "string"
            }
          },
          "title": "SpringEasing",
          "type": "object"
        },
        "Wiggle": {
          "additionalProperties": false,
          "description": "Seeded band-limited offsets added to a numeric track on its event clock.",
          "properties": {
            "amplitude": {
              "default": 1.0,
              "minimum": 0.0,
              "title": "Amplitude",
              "type": "number"
            },
            "frequency": {
              "default": 2.0,
              "exclusiveMinimum": 0.0,
              "title": "Frequency",
              "type": "number"
            },
            "seed": {
              "default": 0,
              "maximum": 4294967295,
              "minimum": 0,
              "title": "Seed",
              "type": "integer"
            }
          },
          "title": "Wiggle",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "Motion inspection for one canvas, optionally within a deck.",
      "properties": {
        "duration": {
          "default": 0.0,
          "title": "Duration",
          "type": "number"
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "layers": {
          "items": {
            "$ref": "#/$defs/MotionLayerInspection"
          },
          "title": "Layers",
          "type": "array"
        },
        "matches": {
          "items": {
            "$ref": "#/$defs/MotionMatchInspection"
          },
          "title": "Matches",
          "type": "array"
        },
        "slide_index": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Slide Index"
        },
        "transition": {
          "anyOf": [
            {
              "$ref": "#/$defs/MotionEventInspection"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "width",
        "height"
      ],
      "title": "MotionSlideInspection",
      "type": "object"
    },
    "MotionTargetInspection": {
      "additionalProperties": false,
      "description": "A deterministic semantic target resolved from a layer.",
      "properties": {
        "index": {
          "minimum": 0,
          "title": "Index",
          "type": "integer"
        },
        "position": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Position"
        },
        "samples": {
          "items": {
            "additionalProperties": true,
            "type": "object"
          },
          "title": "Samples",
          "type": "array"
        },
        "size": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Size"
        },
        "source_range": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "minimum": 0,
                  "type": "integer"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Source Range"
        },
        "target": {
          "title": "Target",
          "type": "string"
        }
      },
      "required": [
        "target",
        "index"
      ],
      "title": "MotionTargetInspection",
      "type": "object"
    },
    "MotionTrackInspection": {
      "$defs": {
        "CubicBezierEasing": {
          "additionalProperties": false,
          "description": "A custom CSS-style cubic-bezier easing curve.\n\n`points` are the two control points `[x1, y1, x2, y2]`. The x coordinates\nmust stay within `[0, 1]` so time remains monotonic; y may overshoot.",
          "properties": {
            "points": {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "title": "Points",
              "type": "array"
            },
            "type": {
              "const": "cubic_bezier",
              "default": "cubic_bezier",
              "title": "Type",
              "type": "string"
            }
          },
          "required": [
            "points"
          ],
          "title": "CubicBezierEasing",
          "type": "object"
        },
        "MotionKeyframeInspection": {
          "additionalProperties": false,
          "description": "One normalized keyframe exposed by motion inspection.",
          "properties": {
            "easing": {
              "anyOf": [
                {
                  "enum": [
                    "linear",
                    "ease",
                    "ease_in",
                    "ease_out",
                    "ease_in_out",
                    "ease_in_quad",
                    "ease_out_quad",
                    "ease_in_out_quad",
                    "ease_in_cubic",
                    "ease_out_cubic",
                    "ease_in_out_cubic",
                    "ease_in_quart",
                    "ease_out_quart",
                    "ease_in_out_quart",
                    "ease_in_quint",
                    "ease_out_quint",
                    "ease_in_out_quint",
                    "ease_in_sine",
                    "ease_out_sine",
                    "ease_in_out_sine",
                    "ease_in_back",
                    "ease_out_back",
                    "ease_in_out_back"
                  ],
                  "type": "string"
                },
                {
                  "$ref": "#/$defs/CubicBezierEasing"
                },
                {
                  "$ref": "#/$defs/SpringEasing"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Easing"
            },
            "hold": {
              "default": false,
              "title": "Hold",
              "type": "boolean"
            },
            "in_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "In Tangent"
            },
            "out_tangent": {
              "anyOf": [
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Out Tangent"
            },
            "time": {
              "title": "Time",
              "type": "number"
            },
            "value": {
              "title": "Value"
            }
          },
          "required": [
            "time",
            "value"
          ],
          "title": "MotionKeyframeInspection",
          "type": "object"
        },
        "SpringEasing": {
          "additionalProperties": false,
          "description": "A unit step response of a damped spring, sampled without integration.\n\nThe response runs over one normalized second per keyframe interval. The\ndeclared interval always ends at its target, even if the spring has not\nsettled naturally.",
          "properties": {
            "damping": {
              "default": 10.0,
              "minimum": 0.0,
              "title": "Damping",
              "type": "number"
            },
            "mass": {
              "default": 1.0,
              "exclusiveMinimum": 0.0,
              "title": "Mass",
              "type": "number"
            },
            "stiffness": {
              "default": 100.0,
              "exclusiveMinimum": 0.0,
              "title": "Stiffness",
              "type": "number"
            },
            "type": {
              "const": "spring",
              "default": "spring",
              "title": "Type",
              "type": "string"
            }
          },
          "title": "SpringEasing",
          "type": "object"
        },
        "Wiggle": {
          "additionalProperties": false,
          "description": "Seeded band-limited offsets added to a numeric track on its event clock.",
          "properties": {
            "amplitude": {
              "default": 1.0,
              "minimum": 0.0,
              "title": "Amplitude",
              "type": "number"
            },
            "frequency": {
              "default": 2.0,
              "exclusiveMinimum": 0.0,
              "title": "Frequency",
              "type": "number"
            },
            "seed": {
              "default": 0,
              "maximum": 4294967295,
              "minimum": 0,
              "title": "Seed",
              "type": "integer"
            }
          },
          "title": "Wiggle",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "A resolved property track in canonical timeline order.",
      "properties": {
        "auto_orient": {
          "default": false,
          "title": "Auto Orient",
          "type": "boolean"
        },
        "keyframes": {
          "items": {
            "$ref": "#/$defs/MotionKeyframeInspection"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "MotionTrackInspection",
      "type": "object"
    },
    "NullLayer": {
      "additionalProperties": false,
      "description": "An invisible, zero-size transform controller; it never contributes pixels.",
      "properties": {
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "position": {
          "default": [
            0,
            0
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "rotation": {
          "default": 0.0,
          "title": "Rotation",
          "type": "number"
        },
        "type": {
          "const": "null",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "type"
      ],
      "title": "NullLayer",
      "type": "object"
    },
    "OpacityTrack": {
      "additionalProperties": false,
      "description": "An opacity track constrained to the inclusive unit interval.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "opacity",
          "default": "opacity",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "OpacityTrack",
      "type": "object"
    },
    "OutlineLayer": {
      "additionalProperties": false,
      "properties": {
        "color": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "offset": {
          "default": 0,
          "minimum": 0,
          "title": "Offset",
          "type": "integer"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "type": {
          "const": "outline",
          "title": "Type",
          "type": "string"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "type",
        "width",
        "color"
      ],
      "title": "OutlineLayer",
      "type": "object"
    },
    "PathLayer": {
      "additionalProperties": false,
      "description": "A filled or stroked SVG path, with motion anchored in its fixed viewport.",
      "properties": {
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "color": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": "#000000",
          "title": "Color"
        },
        "d": {
          "description": "SVG path data: M/L/H/V/C/S/Q/T/A/Z, absolute or relative.",
          "title": "D",
          "type": "string"
        },
        "dash_array": {
          "anyOf": [
            {
              "items": {
                "minimum": 0.0,
                "type": "number"
              },
              "maxItems": 65536,
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Dash Array"
        },
        "dash_offset": {
          "default": 0.0,
          "title": "Dash Offset",
          "type": "number"
        },
        "fill": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "linear": "#/$defs/LinearGradient",
                  "radial": "#/$defs/RadialGradient"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/LinearGradient"
                },
                {
                  "$ref": "#/$defs/RadialGradient"
                }
              ]
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fill"
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "line_cap": {
          "default": "butt",
          "enum": [
            "butt",
            "round",
            "square"
          ],
          "title": "Line Cap",
          "type": "string"
        },
        "line_join": {
          "default": "miter",
          "enum": [
            "miter",
            "bevel",
            "round"
          ],
          "title": "Line Join",
          "type": "string"
        },
        "miter_limit": {
          "default": 4.0,
          "minimum": 1,
          "title": "Miter Limit",
          "type": "number"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "position": {
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "rotation": {
          "default": 0.0,
          "title": "Rotation",
          "type": "number"
        },
        "stroke": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Stroke"
        },
        "stroke_width": {
          "default": 1.0,
          "exclusiveMinimum": 0.0,
          "title": "Stroke Width",
          "type": "number"
        },
        "trim_end": {
          "default": 1.0,
          "maximum": 1,
          "minimum": 0,
          "title": "Trim End",
          "type": "number"
        },
        "trim_offset": {
          "default": 0.0,
          "title": "Trim Offset",
          "type": "number"
        },
        "trim_start": {
          "default": 0.0,
          "maximum": 1,
          "minimum": 0,
          "title": "Trim Start",
          "type": "number"
        },
        "type": {
          "const": "path",
          "title": "Type",
          "type": "string"
        },
        "view_box": {
          "anyOf": [
            {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                },
                {
                  "exclusiveMinimum": 0.0,
                  "type": "number"
                },
                {
                  "exclusiveMinimum": 0.0,
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "View Box"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "type",
        "d",
        "position",
        "width",
        "height"
      ],
      "title": "PathLayer",
      "type": "object"
    },
    "PathMorphTrack": {
      "additionalProperties": false,
      "description": "Absolute SVG d-string keyframes with bounded local arc-length correspondence.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "path_morph",
          "default": "path_morph",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "default": null,
          "title": "Wiggle",
          "type": "null"
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "PathMorphTrack",
      "type": "object"
    },
    "PluginLayer": {
      "$defs": {
        "Align": {
          "description": "Text alignment enum supporting all 9 combinations of horizontal and vertical alignment.",
          "enum": [
            "center",
            "top-left",
            "top-center",
            "top-right",
            "left",
            "right",
            "bottom-left",
            "bottom-center",
            "bottom-right"
          ],
          "title": "Align",
          "type": "string"
        },
        "JsonObject": {
          "additionalProperties": {
            "$ref": "#/$defs/JsonValue"
          },
          "type": "object"
        },
        "JsonValue": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "integer"
            },
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "items": {
                "$ref": "#/$defs/JsonValue"
              },
              "type": "array"
            },
            {
              "additionalProperties": {
                "$ref": "#/$defs/JsonValue"
              },
              "type": "object"
            },
            {
              "type": "null"
            }
          ]
        },
        "LayerClip": {
          "description": "Canvas-space rectangle that clips a layer after it is rendered.",
          "properties": {
            "align": {
              "anyOf": [
                {
                  "$ref": "#/$defs/Align"
                },
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "enum": [
                        "left",
                        "center",
                        "right"
                      ],
                      "type": "string"
                    },
                    {
                      "enum": [
                        "top",
                        "middle",
                        "bottom"
                      ],
                      "type": "string"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": "top-left"
            },
            "border_radius": {
              "default": 0,
              "minimum": 0,
              "title": "Border Radius",
              "type": "integer"
            },
            "height": {
              "exclusiveMinimum": 0,
              "title": "Height",
              "type": "integer"
            },
            "position": {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                },
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                }
              ],
              "title": "Position",
              "type": "array"
            },
            "type": {
              "const": "rect",
              "default": "rect",
              "title": "Type",
              "type": "string"
            },
            "width": {
              "exclusiveMinimum": 0,
              "title": "Width",
              "type": "integer"
            }
          },
          "required": [
            "position",
            "width",
            "height"
          ],
          "title": "LayerClip",
          "type": "object"
        },
        "LayerMask": {
          "description": "Canvas-space alpha mask applied to a layer after it is rendered.",
          "properties": {
            "align": {
              "anyOf": [
                {
                  "$ref": "#/$defs/Align"
                },
                {
                  "maxItems": 2,
                  "minItems": 2,
                  "prefixItems": [
                    {
                      "enum": [
                        "left",
                        "center",
                        "right"
                      ],
                      "type": "string"
                    },
                    {
                      "enum": [
                        "top",
                        "middle",
                        "bottom"
                      ],
                      "type": "string"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": "top-left"
            },
            "d": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "D"
            },
            "feather": {
              "default": 0,
              "minimum": 0.0,
              "title": "Feather",
              "type": "number"
            },
            "height": {
              "exclusiveMinimum": 0,
              "title": "Height",
              "type": "integer"
            },
            "invert": {
              "default": false,
              "title": "Invert",
              "type": "boolean"
            },
            "opacity": {
              "default": 1.0,
              "maximum": 1.0,
              "minimum": 0.0,
              "title": "Opacity",
              "type": "number"
            },
            "points": {
              "anyOf": [
                {
                  "items": {
                    "maxItems": 2,
                    "minItems": 2,
                    "prefixItems": [
                      {
                        "type": "number"
                      },
                      {
                        "type": "number"
                      }
                    ],
                    "type": "array"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "Points"
            },
            "position": {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                },
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                }
              ],
              "title": "Position",
              "type": "array"
            },
            "shape": {
              "default": "rectangle",
              "enum": [
                "rectangle",
                "ellipse",
                "pill",
                "polygon",
                "path"
              ],
              "title": "Shape",
              "type": "string"
            },
            "type": {
              "const": "shape",
              "default": "shape",
              "title": "Type",
              "type": "string"
            },
            "view_box": {
              "anyOf": [
                {
                  "maxItems": 4,
                  "minItems": 4,
                  "prefixItems": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "number"
                    },
                    {
                      "exclusiveMinimum": 0.0,
                      "type": "number"
                    },
                    {
                      "exclusiveMinimum": 0.0,
                      "type": "number"
                    }
                  ],
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "default": null,
              "title": "View Box"
            },
            "width": {
              "exclusiveMinimum": 0,
              "title": "Width",
              "type": "integer"
            }
          },
          "required": [
            "position",
            "width",
            "height"
          ],
          "title": "LayerMask",
          "type": "object"
        }
      },
      "additionalProperties": false,
      "description": "A named renderer invocation carried by the canonical JSON contract.\n\nA registered raster callback supplies the local box's straight-alpha RGBA8\nbytes. Parameters and declared asset references remain JSON data; executable\ncallbacks belong to the application's explicit registry.",
      "not": {},
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": "top-left"
        },
        "assets": {
          "additionalProperties": {
            "type": "string"
          },
          "title": "Assets",
          "type": "object"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "params": {
          "$ref": "#/$defs/JsonObject"
        },
        "position": {
          "default": [
            0,
            0
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "renderer": {
          "minLength": 1,
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
          "title": "Renderer",
          "type": "string"
        },
        "type": {
          "const": "plugin",
          "title": "Type",
          "type": "string"
        },
        "version": {
          "minLength": 1,
          "pattern": "^\\S(?:.*\\S)?$",
          "title": "Version",
          "type": "string"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "type",
        "renderer",
        "version",
        "params",
        "width",
        "height"
      ],
      "title": "quickthumb Plugin Layer JSON Spec",
      "type": "object"
    },
    "PositionKeyframeSpec": {
      "additionalProperties": false,
      "description": "A position with optional relative incoming/outgoing cubic control handles.",
      "properties": {
        "easing": {
          "anyOf": [
            {
              "enum": [
                "linear",
                "ease",
                "ease_in",
                "ease_out",
                "ease_in_out",
                "ease_in_quad",
                "ease_out_quad",
                "ease_in_out_quad",
                "ease_in_cubic",
                "ease_out_cubic",
                "ease_in_out_cubic",
                "ease_in_quart",
                "ease_out_quart",
                "ease_in_out_quart",
                "ease_in_quint",
                "ease_out_quint",
                "ease_in_out_quint",
                "ease_in_sine",
                "ease_out_sine",
                "ease_in_out_sine",
                "ease_in_back",
                "ease_out_back",
                "ease_in_out_back"
              ],
              "type": "string"
            },
            {
              "$ref": "#/$defs/CubicBezierEasing"
            },
            {
              "$ref": "#/$defs/SpringEasing"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Easing"
        },
        "hold": {
          "default": false,
          "title": "Hold",
          "type": "boolean"
        },
        "in_tangent": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "In Tangent"
        },
        "out_tangent": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "number"
                },
                {
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Out Tangent"
        },
        "time": {
          "minimum": 0.0,
          "title": "Time",
          "type": "number"
        },
        "type": {
          "const": "keyframe",
          "default": "keyframe",
          "title": "Type",
          "type": "string"
        },
        "value": {
          "title": "Value"
        }
      },
      "required": [
        "type",
        "time",
        "value"
      ],
      "title": "PositionKeyframeSpec",
      "type": "object"
    },
    "PositionTrack": {
      "additionalProperties": false,
      "description": "Pixel translations; optional handles use constant arc-length progress.",
      "examples": [
        {
          "auto_orient": true,
          "keyframes": [
            {
              "out_tangent": [
                0,
                80
              ],
              "time": 0,
              "type": "keyframe",
              "value": [
                0,
                0
              ]
            },
            {
              "in_tangent": [
                0,
                80
              ],
              "time": 1,
              "type": "keyframe",
              "value": [
                100,
                0
              ]
            }
          ],
          "type": "position"
        }
      ],
      "properties": {
        "auto_orient": {
          "default": false,
          "title": "Auto Orient",
          "type": "boolean"
        },
        "keyframes": {
          "items": {
            "anyOf": [
              {
                "$ref": "#/$defs/PositionKeyframeSpec"
              },
              {
                "$ref": "#/$defs/KeyframeSpec"
              }
            ]
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "position",
          "default": "position",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "PositionTrack",
      "type": "object"
    },
    "QRCodeLayer": {
      "additionalProperties": false,
      "description": "A deterministic QR code rendered into a square canvas region.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": "top-left"
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "background": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": "#FFFFFF",
          "title": "Background"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "data": {
          "minLength": 1,
          "title": "Data",
          "type": "string"
        },
        "error_correction": {
          "default": "M",
          "enum": [
            "L",
            "M",
            "Q",
            "H"
          ],
          "title": "Error Correction",
          "type": "string"
        },
        "foreground": {
          "default": "#000000",
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Foreground",
          "type": "string"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "position": {
          "default": [
            0,
            0
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "quiet_zone": {
          "default": 4,
          "minimum": 0,
          "title": "Quiet Zone",
          "type": "integer"
        },
        "size": {
          "exclusiveMinimum": 0,
          "title": "Size",
          "type": "integer"
        },
        "type": {
          "const": "qr_code",
          "default": "qr_code",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "data",
        "size"
      ],
      "title": "QRCodeLayer",
      "type": "object"
    },
    "RadialGradient": {
      "additionalProperties": false,
      "properties": {
        "center": {
          "default": [
            0.5,
            0.5
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "type": "number"
            },
            {
              "type": "number"
            }
          ],
          "title": "Center",
          "type": "array"
        },
        "stops": {
          "items": {
            "maxItems": 2,
            "minItems": 2,
            "prefixItems": [
              {
                "type": "string"
              },
              {
                "type": "number"
              }
            ],
            "type": "array"
          },
          "title": "Stops",
          "type": "array"
        },
        "type": {
          "const": "radial",
          "default": "radial",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "stops"
      ],
      "title": "RadialGradient",
      "type": "object"
    },
    "RangeSelector": {
      "additionalProperties": false,
      "description": "Keyframeable percentage range over source codepoint, word or line centers.",
      "properties": {
        "end": {
          "anyOf": [
            {
              "maximum": 100,
              "minimum": 0,
              "type": "number"
            },
            {
              "items": {
                "$ref": "#/$defs/KeyframeSpec"
              },
              "minItems": 1,
              "type": "array"
            }
          ],
          "default": 100,
          "title": "End"
        },
        "offset": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "items": {
                "$ref": "#/$defs/KeyframeSpec"
              },
              "minItems": 1,
              "type": "array"
            }
          ],
          "default": 0,
          "title": "Offset"
        },
        "shape": {
          "default": "square",
          "enum": [
            "square",
            "ramp",
            "triangle",
            "smooth"
          ],
          "title": "Shape",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "maximum": 100,
              "minimum": 0,
              "type": "number"
            },
            {
              "items": {
                "$ref": "#/$defs/KeyframeSpec"
              },
              "minItems": 1,
              "type": "array"
            }
          ],
          "default": 0,
          "title": "Start"
        },
        "target": {
          "default": "words",
          "enum": [
            "characters",
            "words",
            "lines"
          ],
          "title": "Target",
          "type": "string"
        }
      },
      "title": "RangeSelector",
      "type": "object"
    },
    "ReducedMotionInspection": {
      "additionalProperties": false,
      "description": "The effective accessibility policy applied to the inspected result.",
      "properties": {
        "enabled": {
          "default": false,
          "title": "Enabled",
          "type": "boolean"
        },
        "mode": {
          "default": "normal",
          "enum": [
            "normal",
            "static"
          ],
          "title": "Mode",
          "type": "string"
        },
        "original_duration": {
          "default": 0.0,
          "title": "Original Duration",
          "type": "number"
        },
        "removed_features": {
          "items": {
            "type": "string"
          },
          "title": "Removed Features",
          "type": "array"
        },
        "resolved_duration": {
          "default": 0.0,
          "title": "Resolved Duration",
          "type": "number"
        }
      },
      "title": "ReducedMotionInspection",
      "type": "object"
    },
    "RotationTrack": {
      "additionalProperties": false,
      "description": "Clockwise rotation in degrees, added to path heading with auto-orient.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "rotation",
          "default": "rotation",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "RotationTrack",
      "type": "object"
    },
    "ScaleTrack": {
      "additionalProperties": false,
      "description": "Uniform outer-object scale about the layer anchor, including image layers.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "scale",
          "default": "scale",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "ScaleTrack",
      "type": "object"
    },
    "ScaleXTrack": {
      "additionalProperties": false,
      "description": "Horizontal layer scale, multiplied by the uniform scale.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "scale_x",
          "default": "scale_x",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "ScaleXTrack",
      "type": "object"
    },
    "ScaleYTrack": {
      "additionalProperties": false,
      "description": "Vertical layer scale, multiplied by the uniform scale.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "scale_y",
          "default": "scale_y",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "ScaleYTrack",
      "type": "object"
    },
    "Shadow": {
      "additionalProperties": false,
      "properties": {
        "blur_radius": {
          "default": 0,
          "title": "Blur Radius",
          "type": "integer"
        },
        "color": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "offset_x": {
          "title": "Offset X",
          "type": "integer"
        },
        "offset_y": {
          "title": "Offset Y",
          "type": "integer"
        },
        "type": {
          "const": "shadow",
          "default": "shadow",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "offset_x",
        "offset_y",
        "color"
      ],
      "title": "Shadow",
      "type": "object"
    },
    "ShapeLayer": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "border_radius": {
          "default": 0,
          "minimum": 0,
          "title": "Border Radius",
          "type": "integer"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "color": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "effects": {
          "default": [],
          "items": {
            "discriminator": {
              "mapping": {
                "backdrop_blur": "#/$defs/BackdropBlur",
                "glow": "#/$defs/Glow",
                "inner_shadow": "#/$defs/InnerShadow",
                "shadow": "#/$defs/Shadow",
                "stroke": "#/$defs/Stroke"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Stroke"
              },
              {
                "$ref": "#/$defs/Shadow"
              },
              {
                "$ref": "#/$defs/Glow"
              },
              {
                "$ref": "#/$defs/InnerShadow"
              },
              {
                "$ref": "#/$defs/BackdropBlur"
              }
            ]
          },
          "title": "Effects",
          "type": "array"
        },
        "fill": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "linear": "#/$defs/LinearGradient",
                  "radial": "#/$defs/RadialGradient"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/LinearGradient"
                },
                {
                  "$ref": "#/$defs/RadialGradient"
                }
              ]
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fill"
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "inner_radius": {
          "default": 0.5,
          "title": "Inner Radius",
          "type": "number"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "points": {
          "anyOf": [
            {
              "items": {
                "maxItems": 2,
                "minItems": 2,
                "prefixItems": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "number"
                  }
                ],
                "type": "array"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Points"
        },
        "position": {
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "rotation": {
          "default": 0.0,
          "title": "Rotation",
          "type": "number"
        },
        "shape": {
          "enum": [
            "rectangle",
            "ellipse",
            "pill",
            "triangle",
            "star",
            "polygon"
          ],
          "title": "Shape",
          "type": "string"
        },
        "star_points": {
          "default": 5,
          "title": "Star Points",
          "type": "integer"
        },
        "type": {
          "const": "shape",
          "title": "Type",
          "type": "string"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "type",
        "shape",
        "position",
        "width",
        "height",
        "color"
      ],
      "title": "ShapeLayer",
      "type": "object"
    },
    "SizedDeckSlideDocument": {
      "additionalProperties": false,
      "anyOf": [
        {
          "properties": {
            "height": {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            "width": {
              "exclusiveMinimum": 0,
              "type": "integer"
            }
          },
          "required": [
            "width",
            "height"
          ]
        },
        {
          "not": {
            "anyOf": [
              {
                "required": [
                  "width"
                ]
              },
              {
                "required": [
                  "height"
                ]
              }
            ]
          },
          "properties": {
            "platform": {
              "enum": [
                "instagram-reel",
                "instagram-reels",
                "instagram-square",
                "tiktok",
                "youtube",
                "youtube-shorts",
                "youtube-thumbnail"
              ],
              "type": "string"
            }
          },
          "required": [
            "platform"
          ]
        }
      ],
      "description": "A quickthumb canvas spec accepted by the quickthumb CLI. Canvas.from_json() also requires the top-level kind discriminator to be 'canvas'.",
      "properties": {
        "audio": {
          "additionalProperties": false,
          "properties": {
            "fade_out": {
              "minimum": 0,
              "type": "number"
            },
            "loop": {
              "type": "boolean"
            },
            "path": {
              "type": "string"
            },
            "volume": {
              "minimum": 0,
              "type": "number"
            }
          },
          "required": [
            "path"
          ],
          "type": "object"
        },
        "duration": {
          "exclusiveMinimum": 0,
          "type": "number"
        },
        "height": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Height"
        },
        "kind": {
          "const": "canvas",
          "type": "string"
        },
        "layers": {
          "items": {
            "discriminator": {
              "mapping": {
                "background": "#/$defs/BackgroundLayer",
                "chart": "#/$defs/ChartLayer",
                "group": "#/$defs/GroupLayer",
                "image": "#/$defs/ImageLayer",
                "null": "#/$defs/NullLayer",
                "outline": "#/$defs/OutlineLayer",
                "path": "#/$defs/PathLayer",
                "plugin": "#/$defs/PluginLayer",
                "qr_code": "#/$defs/QRCodeLayer",
                "shape": "#/$defs/ShapeLayer",
                "svg": "#/$defs/SvgLayer",
                "text": "#/$defs/TextLayer",
                "video": "#/$defs/VideoLayer"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/BackgroundLayer"
              },
              {
                "$ref": "#/$defs/TextLayer"
              },
              {
                "$ref": "#/$defs/OutlineLayer"
              },
              {
                "$ref": "#/$defs/ImageLayer"
              },
              {
                "$ref": "#/$defs/ShapeLayer"
              },
              {
                "$ref": "#/$defs/PathLayer"
              },
              {
                "$ref": "#/$defs/SvgLayer"
              },
              {
                "$ref": "#/$defs/ChartLayer"
              },
              {
                "$ref": "#/$defs/QRCodeLayer"
              },
              {
                "$ref": "#/$defs/VideoLayer"
              },
              {
                "$ref": "#/$defs/PluginLayer"
              },
              {
                "$ref": "#/$defs/NullLayer"
              },
              {
                "$ref": "#/$defs/GroupLayer"
              }
            ]
          },
          "title": "Layers",
          "type": "array"
        },
        "notes": {
          "type": "string"
        },
        "platform": {
          "anyOf": [
            {
              "enum": [
                "instagram-reel",
                "instagram-reels",
                "instagram-square",
                "tiktok",
                "youtube",
                "youtube-shorts",
                "youtube-thumbnail"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Platform"
        },
        "theme": {
          "additionalProperties": true,
          "title": "Theme",
          "type": "object"
        },
        "transition": {
          "$ref": "#/$defs/TransitionDocument"
        },
        "width": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Width"
        }
      },
      "required": [
        "kind",
        "layers"
      ],
      "title": "quickthumb Sized Deck Slide JSON Spec",
      "type": "object"
    },
    "SpringEasing": {
      "additionalProperties": false,
      "description": "A unit step response of a damped spring, sampled without integration.\n\nThe response runs over one normalized second per keyframe interval. The\ndeclared interval always ends at its target, even if the spring has not\nsettled naturally.",
      "properties": {
        "damping": {
          "default": 10.0,
          "minimum": 0.0,
          "title": "Damping",
          "type": "number"
        },
        "mass": {
          "default": 1.0,
          "exclusiveMinimum": 0.0,
          "title": "Mass",
          "type": "number"
        },
        "stiffness": {
          "default": 100.0,
          "exclusiveMinimum": 0.0,
          "title": "Stiffness",
          "type": "number"
        },
        "type": {
          "const": "spring",
          "default": "spring",
          "title": "Type",
          "type": "string"
        }
      },
      "title": "SpringEasing",
      "type": "object"
    },
    "StaggerSpec": {
      "additionalProperties": false,
      "description": "A deterministic interval for sequencing a target collection.",
      "properties": {
        "delay": {
          "minimum": 0.0,
          "title": "Delay",
          "type": "number"
        },
        "order": {
          "default": "document",
          "enum": [
            "document",
            "top_to_bottom",
            "left_to_right",
            "reverse"
          ],
          "title": "Order",
          "type": "string"
        },
        "target": {
          "default": "children",
          "enum": [
            "layer",
            "children",
            "characters",
            "words",
            "lines",
            "bars",
            "points"
          ],
          "title": "Target",
          "type": "string"
        }
      },
      "required": [
        "delay"
      ],
      "title": "StaggerSpec",
      "type": "object"
    },
    "Stroke": {
      "additionalProperties": false,
      "properties": {
        "color": {
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "type": {
          "const": "stroke",
          "default": "stroke",
          "title": "Type",
          "type": "string"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "width",
        "color"
      ],
      "title": "Stroke",
      "type": "object"
    },
    "SvgLayer": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": "top-left"
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "blend_mode": {
          "anyOf": [
            {
              "$ref": "#/$defs/BlendMode"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "effects": {
          "default": [],
          "items": {
            "discriminator": {
              "mapping": {
                "backdrop_blur": "#/$defs/BackdropBlur",
                "duotone": "#/$defs/Duotone",
                "filter": "#/$defs/Filter",
                "glow": "#/$defs/Glow",
                "grain": "#/$defs/Grain",
                "inner_shadow": "#/$defs/InnerShadow",
                "shadow": "#/$defs/Shadow",
                "stroke": "#/$defs/Stroke"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Stroke"
              },
              {
                "$ref": "#/$defs/Shadow"
              },
              {
                "$ref": "#/$defs/Glow"
              },
              {
                "$ref": "#/$defs/Filter"
              },
              {
                "$ref": "#/$defs/Grain"
              },
              {
                "$ref": "#/$defs/Duotone"
              },
              {
                "$ref": "#/$defs/InnerShadow"
              },
              {
                "$ref": "#/$defs/BackdropBlur"
              }
            ]
          },
          "title": "Effects",
          "type": "array"
        },
        "height": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Height"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "path": {
          "title": "Path",
          "type": "string"
        },
        "position": {
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "rotation": {
          "default": 0.0,
          "title": "Rotation",
          "type": "number"
        },
        "type": {
          "const": "svg",
          "title": "Type",
          "type": "string"
        },
        "width": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Width"
        }
      },
      "required": [
        "type",
        "path",
        "position"
      ],
      "title": "SvgLayer",
      "type": "object"
    },
    "TextFillImage": {
      "additionalProperties": false,
      "properties": {
        "faces": {
          "default": [],
          "items": {
            "$ref": "#/$defs/FaceRegion"
          },
          "title": "Faces",
          "type": "array"
        },
        "fit": {
          "$ref": "#/$defs/FitMode",
          "default": "cover"
        },
        "focal_point": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                },
                {
                  "maximum": 1.0,
                  "minimum": 0.0,
                  "type": "number"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Focal Point"
        },
        "path": {
          "title": "Path",
          "type": "string"
        },
        "type": {
          "const": "image",
          "default": "image",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "path"
      ],
      "title": "TextFillImage",
      "type": "object"
    },
    "TextLayer": {
      "additionalProperties": false,
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "auto_scale": {
          "default": false,
          "title": "Auto Scale",
          "type": "boolean"
        },
        "balance_lines": {
          "default": false,
          "title": "Balance Lines",
          "type": "boolean"
        },
        "bold": {
          "default": false,
          "title": "Bold",
          "type": "boolean"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "color": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Color"
        },
        "content": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "items": {
                "$ref": "#/$defs/TextPart"
              },
              "type": "array"
            }
          ],
          "title": "Content"
        },
        "effects": {
          "default": [],
          "items": {
            "discriminator": {
              "mapping": {
                "background": "#/$defs/Background",
                "glow": "#/$defs/Glow",
                "shadow": "#/$defs/Shadow",
                "stroke": "#/$defs/Stroke"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Stroke"
              },
              {
                "$ref": "#/$defs/Shadow"
              },
              {
                "$ref": "#/$defs/Glow"
              },
              {
                "$ref": "#/$defs/Background"
              }
            ]
          },
          "title": "Effects",
          "type": "array"
        },
        "emoji_style": {
          "default": "monochrome",
          "enum": [
            "monochrome",
            "color"
          ],
          "title": "Emoji Style",
          "type": "string"
        },
        "fill": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "image": "#/$defs/TextFillImage",
                  "linear": "#/$defs/LinearGradient",
                  "radial": "#/$defs/RadialGradient"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/LinearGradient"
                },
                {
                  "$ref": "#/$defs/RadialGradient"
                },
                {
                  "$ref": "#/$defs/TextFillImage"
                }
              ]
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fill"
        },
        "font": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Font"
        },
        "font_source": {
          "default": "auto",
          "enum": [
            "auto",
            "system",
            "google"
          ],
          "title": "Font Source",
          "type": "string"
        },
        "font_variations": {
          "additionalProperties": {
            "type": "number"
          },
          "title": "Font Variations",
          "type": "object"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "italic": {
          "default": false,
          "title": "Italic",
          "type": "boolean"
        },
        "letter_spacing": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Letter Spacing"
        },
        "line_height": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Line Height"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "max_height": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "pattern": "^(\\d+(\\.\\d+)?)%$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Max Height"
        },
        "max_width": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "pattern": "^(\\d+(\\.\\d+)?)%$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Max Width"
        },
        "min_size": {
          "default": 1,
          "exclusiveMinimum": 0,
          "title": "Min Size",
          "type": "integer"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "position": {
          "anyOf": [
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                },
                {
                  "anyOf": [
                    {
                      "type": "integer"
                    },
                    {
                      "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                      "type": "string"
                    }
                  ]
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Position"
        },
        "rotation": {
          "default": 0.0,
          "title": "Rotation",
          "type": "number"
        },
        "size": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Size"
        },
        "type": {
          "const": "text",
          "title": "Type",
          "type": "string"
        },
        "value": {
          "anyOf": [
            {
              "$ref": "#/$defs/AnimatedTextValue"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "weight": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Weight"
        }
      },
      "required": [
        "type",
        "content"
      ],
      "title": "TextLayer",
      "type": "object"
    },
    "TextPart": {
      "additionalProperties": false,
      "properties": {
        "bold": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Bold"
        },
        "color": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Color"
        },
        "effects": {
          "default": [],
          "items": {
            "discriminator": {
              "mapping": {
                "background": "#/$defs/Background",
                "glow": "#/$defs/Glow",
                "shadow": "#/$defs/Shadow",
                "stroke": "#/$defs/Stroke"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Stroke"
              },
              {
                "$ref": "#/$defs/Shadow"
              },
              {
                "$ref": "#/$defs/Glow"
              },
              {
                "$ref": "#/$defs/Background"
              }
            ]
          },
          "title": "Effects",
          "type": "array"
        },
        "emoji_style": {
          "anyOf": [
            {
              "enum": [
                "monochrome",
                "color"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Emoji Style"
        },
        "fill": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "image": "#/$defs/TextFillImage",
                  "linear": "#/$defs/LinearGradient",
                  "radial": "#/$defs/RadialGradient"
                },
                "propertyName": "type"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/LinearGradient"
                },
                {
                  "$ref": "#/$defs/RadialGradient"
                },
                {
                  "$ref": "#/$defs/TextFillImage"
                }
              ]
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Fill"
        },
        "font": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Font"
        },
        "font_source": {
          "anyOf": [
            {
              "enum": [
                "auto",
                "system",
                "google"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Font Source"
        },
        "font_variations": {
          "anyOf": [
            {
              "additionalProperties": {
                "type": "number"
              },
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Font Variations"
        },
        "italic": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Italic"
        },
        "letter_spacing": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Letter Spacing"
        },
        "line_height": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Line Height"
        },
        "size": {
          "anyOf": [
            {
              "exclusiveMinimum": 0,
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Size"
        },
        "text": {
          "title": "Text",
          "type": "string"
        },
        "weight": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Weight"
        }
      },
      "required": [
        "text"
      ],
      "title": "TextPart",
      "type": "object"
    },
    "TimingSpec": {
      "additionalProperties": false,
      "description": "Relative or absolute timing; the two forms cannot be mixed.",
      "properties": {
        "delay": {
          "default": 0.0,
          "minimum": 0.0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0.0,
          "title": "Duration",
          "type": "number"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "anyOf": [
            {
              "enum": [
                "on_click",
                "with_previous",
                "after_previous"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Trigger"
        }
      },
      "title": "TimingSpec",
      "type": "object"
    },
    "TrackMatte": {
      "additionalProperties": false,
      "description": "Use a hidden, reusable top-level layer's sampled alpha or luminance as a mask.",
      "properties": {
        "invert": {
          "default": false,
          "title": "Invert",
          "type": "boolean"
        },
        "layer": {
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
          "title": "Layer",
          "type": "string"
        },
        "mode": {
          "default": "alpha",
          "enum": [
            "alpha",
            "luma"
          ],
          "title": "Mode",
          "type": "string"
        },
        "type": {
          "const": "layer",
          "default": "layer",
          "title": "Type",
          "type": "string"
        }
      },
      "required": [
        "layer"
      ],
      "title": "TrackMatte",
      "type": "object"
    },
    "TransitionDocument": {
      "discriminator": {
        "mapping": {
          "blinds": "#/$defs/Transition_Blinds",
          "checker": "#/$defs/Transition_Checker",
          "circle": "#/$defs/Transition_Circle",
          "comb": "#/$defs/Transition_Comb",
          "cover": "#/$defs/Transition_Cover",
          "cut": "#/$defs/Transition_Cut",
          "diamond": "#/$defs/Transition_Diamond",
          "dissolve": "#/$defs/Transition_Dissolve",
          "fade": "#/$defs/Transition_Fade",
          "morph": "#/$defs/Transition_Morph",
          "newsflash": "#/$defs/Transition_Newsflash",
          "push": "#/$defs/Transition_Push",
          "random": "#/$defs/Transition_Random",
          "split": "#/$defs/Transition_Split",
          "uncover": "#/$defs/Transition_Uncover",
          "wedge": "#/$defs/Transition_Wedge",
          "wheel": "#/$defs/Transition_Wheel",
          "wipe": "#/$defs/Transition_Wipe",
          "zoom": "#/$defs/Transition_Zoom"
        },
        "propertyName": "effect"
      },
      "oneOf": [
        {
          "$ref": "#/$defs/Transition_Cut"
        },
        {
          "$ref": "#/$defs/Transition_Fade"
        },
        {
          "$ref": "#/$defs/Transition_Morph"
        },
        {
          "$ref": "#/$defs/Transition_Dissolve"
        },
        {
          "$ref": "#/$defs/Transition_Newsflash"
        },
        {
          "$ref": "#/$defs/Transition_Wedge"
        },
        {
          "$ref": "#/$defs/Transition_Circle"
        },
        {
          "$ref": "#/$defs/Transition_Diamond"
        },
        {
          "$ref": "#/$defs/Transition_Random"
        },
        {
          "$ref": "#/$defs/Transition_Wheel"
        },
        {
          "$ref": "#/$defs/Transition_Push"
        },
        {
          "$ref": "#/$defs/Transition_Wipe"
        },
        {
          "$ref": "#/$defs/Transition_Cover"
        },
        {
          "$ref": "#/$defs/Transition_Uncover"
        },
        {
          "$ref": "#/$defs/Transition_Zoom"
        },
        {
          "$ref": "#/$defs/Transition_Split"
        },
        {
          "$ref": "#/$defs/Transition_Blinds"
        },
        {
          "$ref": "#/$defs/Transition_Checker"
        },
        {
          "$ref": "#/$defs/Transition_Comb"
        }
      ]
    },
    "Transition_Blinds": {
      "additionalProperties": false,
      "description": "Reveal the slide through horizontal or vertical blinds.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "blinds",
          "default": "blinds",
          "title": "Effect",
          "type": "string"
        },
        "orientation": {
          "default": "horizontal",
          "enum": [
            "horizontal",
            "vertical"
          ],
          "title": "Orientation",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Blinds",
      "type": "object"
    },
    "Transition_Checker": {
      "additionalProperties": false,
      "description": "Reveal the slide through a sweeping checkerboard.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "checker",
          "default": "checker",
          "title": "Effect",
          "type": "string"
        },
        "orientation": {
          "default": "horizontal",
          "enum": [
            "horizontal",
            "vertical"
          ],
          "title": "Orientation",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Checker",
      "type": "object"
    },
    "Transition_Circle": {
      "additionalProperties": false,
      "description": "Reveal the slide through an expanding circle.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "circle",
          "default": "circle",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Circle",
      "type": "object"
    },
    "Transition_Comb": {
      "additionalProperties": false,
      "description": "Reveal the slide through interleaving comb strips.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "comb",
          "default": "comb",
          "title": "Effect",
          "type": "string"
        },
        "orientation": {
          "default": "horizontal",
          "enum": [
            "horizontal",
            "vertical"
          ],
          "title": "Orientation",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Comb",
      "type": "object"
    },
    "Transition_Cover": {
      "additionalProperties": false,
      "description": "Slide the new slide in over the previous one.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "direction": {
          "default": "down",
          "enum": [
            "left",
            "right",
            "up",
            "down"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "cover",
          "default": "cover",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Cover",
      "type": "object"
    },
    "Transition_Cut": {
      "additionalProperties": false,
      "description": "Hard cut straight to the slide (no animation).",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "cut",
          "default": "cut",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Cut",
      "type": "object"
    },
    "Transition_Diamond": {
      "additionalProperties": false,
      "description": "Reveal the slide through an expanding diamond.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "diamond",
          "default": "diamond",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Diamond",
      "type": "object"
    },
    "Transition_Dissolve": {
      "additionalProperties": false,
      "description": "Dissolve into the slide through a speckled mask.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "dissolve",
          "default": "dissolve",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Dissolve",
      "type": "object"
    },
    "Transition_Fade": {
      "additionalProperties": false,
      "description": "Cross-fade into the slide.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "fade",
          "default": "fade",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Fade",
      "type": "object"
    },
    "Transition_Morph": {
      "additionalProperties": false,
      "description": "Move uniquely keyed layers between adjacent scenes.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "morph",
          "default": "morph",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Morph",
      "type": "object"
    },
    "Transition_Newsflash": {
      "additionalProperties": false,
      "description": "Spin the slide in like a newsreel flash.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "newsflash",
          "default": "newsflash",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Newsflash",
      "type": "object"
    },
    "Transition_Push": {
      "additionalProperties": false,
      "description": "Push the previous slide out while the new one slides in.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "direction": {
          "default": "left",
          "enum": [
            "left",
            "right",
            "up",
            "down"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "push",
          "default": "push",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Push",
      "type": "object"
    },
    "Transition_Random": {
      "additionalProperties": false,
      "description": "Let PowerPoint pick a random transition.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "random",
          "default": "random",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Random",
      "type": "object"
    },
    "Transition_Split": {
      "additionalProperties": false,
      "description": "Split the slide open or closed along an axis.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "direction": {
          "default": "out",
          "enum": [
            "in",
            "out"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "split",
          "default": "split",
          "title": "Effect",
          "type": "string"
        },
        "orientation": {
          "default": "horizontal",
          "enum": [
            "horizontal",
            "vertical"
          ],
          "title": "Orientation",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Split",
      "type": "object"
    },
    "Transition_Uncover": {
      "additionalProperties": false,
      "description": "Slide the previous slide away to reveal the new one.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "direction": {
          "default": "down",
          "enum": [
            "left",
            "right",
            "up",
            "down"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "uncover",
          "default": "uncover",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Uncover",
      "type": "object"
    },
    "Transition_Wedge": {
      "additionalProperties": false,
      "description": "Sweep the slide in with two clock hands.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "wedge",
          "default": "wedge",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Wedge",
      "type": "object"
    },
    "Transition_Wheel": {
      "additionalProperties": false,
      "description": "Sweep the slide in like a clock hand, using `spokes` arms.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "wheel",
          "default": "wheel",
          "title": "Effect",
          "type": "string"
        },
        "spokes": {
          "default": 1,
          "exclusiveMinimum": 0,
          "maximum": 64,
          "title": "Spokes",
          "type": "integer"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Wheel",
      "type": "object"
    },
    "Transition_Wipe": {
      "additionalProperties": false,
      "description": "Wipe the slide in from one edge.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "direction": {
          "default": "up",
          "enum": [
            "left",
            "right",
            "up",
            "down"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "wipe",
          "default": "wipe",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Wipe",
      "type": "object"
    },
    "Transition_Zoom": {
      "additionalProperties": false,
      "description": "Zoom the slide in or out.",
      "properties": {
        "advance_after": {
          "anyOf": [
            {
              "minimum": 0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Advance After"
        },
        "advance_on_click": {
          "default": true,
          "title": "Advance On Click",
          "type": "boolean"
        },
        "direction": {
          "default": "in",
          "enum": [
            "in",
            "out"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 1.0,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "effect": {
          "const": "zoom",
          "default": "zoom",
          "title": "Effect",
          "type": "string"
        }
      },
      "required": [
        "effect"
      ],
      "title": "Zoom",
      "type": "object"
    },
    "TrimEndTrack": {
      "additionalProperties": false,
      "description": "Absolute normalized stroke trim end along local SVG arc length.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "trim_end",
          "default": "trim_end",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "TrimEndTrack",
      "type": "object"
    },
    "TrimOffsetTrack": {
      "additionalProperties": false,
      "description": "Relative cyclic stroke trim offset, measured in normalized turns.",
      "properties": {
        "blend": {
          "default": "replace",
          "enum": [
            "replace",
            "add"
          ],
          "title": "Blend",
          "type": "string"
        },
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "trim_offset",
          "default": "trim_offset",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "TrimOffsetTrack",
      "type": "object"
    },
    "TrimStartTrack": {
      "additionalProperties": false,
      "description": "Absolute normalized stroke trim start along local SVG arc length.",
      "properties": {
        "keyframes": {
          "items": {
            "$ref": "#/$defs/KeyframeSpec"
          },
          "title": "Keyframes",
          "type": "array"
        },
        "type": {
          "const": "trim_start",
          "default": "trim_start",
          "title": "Type",
          "type": "string"
        },
        "wiggle": {
          "anyOf": [
            {
              "$ref": "#/$defs/Wiggle"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "required": [
        "type",
        "keyframes"
      ],
      "title": "TrimStartTrack",
      "type": "object"
    },
    "VideoCaption": {
      "additionalProperties": false,
      "description": "A deterministic caption cue rendered into video frames.",
      "properties": {
        "background": {
          "anyOf": [
            {
              "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Background"
        },
        "background_opacity": {
          "default": 0.65,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Background Opacity",
          "type": "number"
        },
        "border_radius": {
          "default": 0,
          "minimum": 0,
          "title": "Border Radius",
          "type": "integer"
        },
        "color": {
          "default": "#FFFFFF",
          "pattern": "^#[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?$",
          "title": "Color",
          "type": "string"
        },
        "end": {
          "exclusiveMinimum": 0.0,
          "title": "End",
          "type": "number"
        },
        "font": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Font"
        },
        "padding": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                }
              ],
              "type": "array"
            },
            {
              "maxItems": 4,
              "minItems": 4,
              "prefixItems": [
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                },
                {
                  "type": "integer"
                }
              ],
              "type": "array"
            }
          ],
          "default": 0,
          "title": "Padding"
        },
        "position": {
          "default": [
            "50%",
            "90%"
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "size": {
          "default": 24,
          "exclusiveMinimum": 0,
          "title": "Size",
          "type": "integer"
        },
        "start": {
          "minimum": 0.0,
          "title": "Start",
          "type": "number"
        },
        "text": {
          "title": "Text",
          "type": "string"
        },
        "vertical_align": {
          "default": "center",
          "enum": [
            "center",
            "optical-center"
          ],
          "title": "Vertical Align",
          "type": "string"
        }
      },
      "required": [
        "text",
        "start",
        "end"
      ],
      "title": "VideoCaption",
      "type": "object"
    },
    "VideoLayer": {
      "additionalProperties": false,
      "description": "A constrained single-clip video layer for animated export.",
      "properties": {
        "align": {
          "anyOf": [
            {
              "$ref": "#/$defs/Align"
            },
            {
              "maxItems": 2,
              "minItems": 2,
              "prefixItems": [
                {
                  "enum": [
                    "left",
                    "center",
                    "right"
                  ],
                  "type": "string"
                },
                {
                  "enum": [
                    "top",
                    "middle",
                    "bottom"
                  ],
                  "type": "string"
                }
              ],
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "anchor": {
          "default": [
            0.5,
            0.5
          ],
          "description": "Normalized 0\u20131 pivot for canonical motion; independent of layout position and align.",
          "examples": [
            [
              0.0,
              0.0
            ],
            [
              0.5,
              0.5
            ],
            [
              1.0,
              1.0
            ]
          ],
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            },
            {
              "maximum": 1.0,
              "minimum": 0.0,
              "type": "number"
            }
          ],
          "title": "Anchor",
          "type": "array"
        },
        "animation": {
          "anyOf": [
            {
              "discriminator": {
                "mapping": {
                  "appear": "#/$defs/Appear",
                  "blinds": "#/$defs/Blinds",
                  "box": "#/$defs/Box",
                  "checkerboard": "#/$defs/Checkerboard",
                  "circle": "#/$defs/Circle",
                  "diamond": "#/$defs/Diamond",
                  "dissolve": "#/$defs/Dissolve",
                  "fade": "#/$defs/Fade",
                  "wheel": "#/$defs/Wheel",
                  "wipe": "#/$defs/Wipe"
                },
                "propertyName": "effect"
              },
              "oneOf": [
                {
                  "$ref": "#/$defs/Appear"
                },
                {
                  "$ref": "#/$defs/Fade"
                },
                {
                  "$ref": "#/$defs/Wipe"
                },
                {
                  "$ref": "#/$defs/Box"
                },
                {
                  "$ref": "#/$defs/Blinds"
                },
                {
                  "$ref": "#/$defs/Checkerboard"
                },
                {
                  "$ref": "#/$defs/Circle"
                },
                {
                  "$ref": "#/$defs/Diamond"
                },
                {
                  "$ref": "#/$defs/Dissolve"
                },
                {
                  "$ref": "#/$defs/Wheel"
                }
              ]
            },
            {
              "$ref": "#/$defs/AnimationSpec"
            },
            {
              "items": {
                "anyOf": [
                  {
                    "discriminator": {
                      "mapping": {
                        "appear": "#/$defs/Appear",
                        "blinds": "#/$defs/Blinds",
                        "box": "#/$defs/Box",
                        "checkerboard": "#/$defs/Checkerboard",
                        "circle": "#/$defs/Circle",
                        "diamond": "#/$defs/Diamond",
                        "dissolve": "#/$defs/Dissolve",
                        "fade": "#/$defs/Fade",
                        "wheel": "#/$defs/Wheel",
                        "wipe": "#/$defs/Wipe"
                      },
                      "propertyName": "effect"
                    },
                    "oneOf": [
                      {
                        "$ref": "#/$defs/Appear"
                      },
                      {
                        "$ref": "#/$defs/Fade"
                      },
                      {
                        "$ref": "#/$defs/Wipe"
                      },
                      {
                        "$ref": "#/$defs/Box"
                      },
                      {
                        "$ref": "#/$defs/Blinds"
                      },
                      {
                        "$ref": "#/$defs/Checkerboard"
                      },
                      {
                        "$ref": "#/$defs/Circle"
                      },
                      {
                        "$ref": "#/$defs/Diamond"
                      },
                      {
                        "$ref": "#/$defs/Dissolve"
                      },
                      {
                        "$ref": "#/$defs/Wheel"
                      }
                    ]
                  },
                  {
                    "$ref": "#/$defs/AnimationSpec"
                  }
                ]
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Animation"
        },
        "blend_mode": {
          "anyOf": [
            {
              "$ref": "#/$defs/BlendMode"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "border_radius": {
          "default": 0,
          "minimum": 0,
          "title": "Border Radius",
          "type": "integer"
        },
        "captions": {
          "default": [],
          "items": {
            "$ref": "#/$defs/VideoCaption"
          },
          "title": "Captions",
          "type": "array"
        },
        "clip": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerClip"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "duration": {
          "anyOf": [
            {
              "exclusiveMinimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Duration"
        },
        "effects": {
          "default": [],
          "items": {
            "discriminator": {
              "mapping": {
                "backdrop_blur": "#/$defs/BackdropBlur",
                "duotone": "#/$defs/Duotone",
                "filter": "#/$defs/Filter",
                "glow": "#/$defs/Glow",
                "grain": "#/$defs/Grain",
                "inner_shadow": "#/$defs/InnerShadow",
                "shadow": "#/$defs/Shadow",
                "stroke": "#/$defs/Stroke"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/$defs/Stroke"
              },
              {
                "$ref": "#/$defs/Shadow"
              },
              {
                "$ref": "#/$defs/Glow"
              },
              {
                "$ref": "#/$defs/Filter"
              },
              {
                "$ref": "#/$defs/Grain"
              },
              {
                "$ref": "#/$defs/Duotone"
              },
              {
                "$ref": "#/$defs/InnerShadow"
              },
              {
                "$ref": "#/$defs/BackdropBlur"
              }
            ]
          },
          "title": "Effects",
          "type": "array"
        },
        "fit": {
          "$ref": "#/$defs/FitMode",
          "default": "contain"
        },
        "height": {
          "exclusiveMinimum": 0,
          "title": "Height",
          "type": "integer"
        },
        "id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Layer identifier unique within this Canvas scene, including group children.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Id"
        },
        "mask": {
          "anyOf": [
            {
              "$ref": "#/$defs/LayerMask"
            },
            {
              "$ref": "#/$defs/TrackMatte"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Mask"
        },
        "motion_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cross-scene matching key for Morph transitions; separate from scene-local id.",
          "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$(?![\\s\\S])",
          "title": "Motion Key"
        },
        "opacity": {
          "default": 1.0,
          "maximum": 1.0,
          "minimum": 0.0,
          "title": "Opacity",
          "type": "number"
        },
        "parent": {
          "anyOf": [
            {
              "pattern": "^[A-Za-z][A-Za-z0-9_.:-]*$",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ID of a top-level animatable transform parent in this scene.",
          "examples": [
            "controller"
          ],
          "title": "Parent"
        },
        "position": {
          "maxItems": 2,
          "minItems": 2,
          "prefixItems": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            },
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "pattern": "^-?(\\d+(\\.\\d+)?)%$",
                  "type": "string"
                }
              ]
            }
          ],
          "title": "Position",
          "type": "array"
        },
        "rotation": {
          "default": 0.0,
          "title": "Rotation",
          "type": "number"
        },
        "source": {
          "title": "Source",
          "type": "string"
        },
        "speed": {
          "default": 1.0,
          "exclusiveMinimum": 0.0,
          "title": "Speed",
          "type": "number"
        },
        "start": {
          "default": 0.0,
          "minimum": 0.0,
          "title": "Start",
          "type": "number"
        },
        "trim_end": {
          "anyOf": [
            {
              "exclusiveMinimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Trim End"
        },
        "trim_start": {
          "default": 0.0,
          "minimum": 0.0,
          "title": "Trim Start",
          "type": "number"
        },
        "type": {
          "const": "video",
          "title": "Type",
          "type": "string"
        },
        "volume": {
          "default": 1.0,
          "minimum": 0.0,
          "title": "Volume",
          "type": "number"
        },
        "width": {
          "exclusiveMinimum": 0,
          "title": "Width",
          "type": "integer"
        }
      },
      "required": [
        "type",
        "source",
        "position",
        "width",
        "height"
      ],
      "title": "VideoLayer",
      "type": "object"
    },
    "Wheel": {
      "additionalProperties": false,
      "description": "Sweep the layer in or out like a clock hand, using `spokes` arms.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "wheel",
          "default": "wheel",
          "title": "Effect",
          "type": "string"
        },
        "spokes": {
          "default": 1,
          "exclusiveMinimum": 0,
          "maximum": 64,
          "title": "Spokes",
          "type": "integer"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Wheel",
      "type": "object"
    },
    "Wiggle": {
      "additionalProperties": false,
      "description": "Seeded band-limited offsets added to a numeric track on its event clock.",
      "properties": {
        "amplitude": {
          "default": 1.0,
          "minimum": 0.0,
          "title": "Amplitude",
          "type": "number"
        },
        "frequency": {
          "default": 2.0,
          "exclusiveMinimum": 0.0,
          "title": "Frequency",
          "type": "number"
        },
        "seed": {
          "default": 0,
          "maximum": 4294967295,
          "minimum": 0,
          "title": "Seed",
          "type": "integer"
        }
      },
      "title": "Wiggle",
      "type": "object"
    },
    "Wipe": {
      "additionalProperties": false,
      "description": "Wipe the layer in or out from a given edge.",
      "properties": {
        "animate": {
          "default": "entrance",
          "enum": [
            "entrance",
            "exit"
          ],
          "title": "Animate",
          "type": "string"
        },
        "delay": {
          "default": 0.0,
          "minimum": 0,
          "title": "Delay",
          "type": "number"
        },
        "direction": {
          "default": "up",
          "enum": [
            "up",
            "down",
            "left",
            "right"
          ],
          "title": "Direction",
          "type": "string"
        },
        "duration": {
          "default": 0.5,
          "exclusiveMinimum": 0,
          "title": "Duration",
          "type": "number"
        },
        "easing": {
          "default": "ease",
          "enum": [
            "linear",
            "ease",
            "ease_in",
            "ease_out",
            "ease_in_out",
            "ease_in_quad",
            "ease_out_quad",
            "ease_in_out_quad",
            "ease_in_cubic",
            "ease_out_cubic",
            "ease_in_out_cubic",
            "ease_in_quart",
            "ease_out_quart",
            "ease_in_out_quart",
            "ease_in_quint",
            "ease_out_quint",
            "ease_in_out_quint",
            "ease_in_sine",
            "ease_out_sine",
            "ease_in_out_sine",
            "ease_in_back",
            "ease_out_back",
            "ease_in_out_back"
          ],
          "title": "Easing",
          "type": "string"
        },
        "effect": {
          "const": "wipe",
          "default": "wipe",
          "title": "Effect",
          "type": "string"
        },
        "start": {
          "anyOf": [
            {
              "minimum": 0.0,
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Start"
        },
        "trigger": {
          "default": "on_click",
          "enum": [
            "on_click",
            "with_previous",
            "after_previous"
          ],
          "title": "Trigger",
          "type": "string"
        }
      },
      "title": "Wipe",
      "type": "object"
    }
  },
  "$id": "https://quickthumb.solaqua.dev/document-schema.json",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "description": "A discriminated quickthumb Canvas or Deck JSON document.",
  "discriminator": {
    "mapping": {
      "canvas": "#/$defs/CanvasDocument",
      "deck": "#/$defs/DeckDocument"
    },
    "propertyName": "kind"
  },
  "oneOf": [
    {
      "$ref": "#/$defs/CanvasDocument"
    },
    {
      "$ref": "#/$defs/DeckDocument"
    }
  ],
  "title": "quickthumb JSON Document Spec"
}
