{
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "$id": "https://www.yuzool.com/quick-design/design-format.schema.json",
 "title": "Quick Design design",
 "description": "Quick Design's design format, version 1: https://www.yuzool.com/quick-design/design-format/. Open a design with https://www.yuzool.com/quick-design/#j=<URL-encoded JSON>. Unknown fields are dropped and out-of-range numbers clamped when a design is opened.",
 "type": "object",
 "properties": {
  "v": {
   "const": 1,
   "description": "Format version"
  },
  "name": {
   "type": "string",
   "maxLength": 120
  },
  "size": {
   "enum": [
    "ig",
    "carousel",
    "story",
    "poster",
    "flyer",
    "yt",
    "slides",
    "card",
    "a4",
    "logo"
   ],
   "description": "A preset size (sets w and h when they are left out): ig Instagram post 1080×1080, carousel Carousel post 1080×1350, story Instagram story 1080×1920, poster Poster 1800×2400, flyer Flyer 1275×1650, yt YouTube thumbnail 1280×720, slides Presentation 1920×1080, card Business card 1050×600, a4 A4 document 1240×1754, logo Logo 500×500"
  },
  "w": {
   "type": "number",
   "minimum": 16,
   "maximum": 8000,
   "description": "Page width in pixels"
  },
  "h": {
   "type": "number",
   "minimum": 16,
   "maximum": 8000,
   "description": "Page height in pixels"
  },
  "pages": {
   "type": "array",
   "minItems": 1,
   "maxItems": 30,
   "items": {
    "$ref": "#/$defs/page"
   }
  }
 },
 "required": [
  "pages"
 ],
 "anyOf": [
  {
   "required": [
    "w",
    "h"
   ]
  },
  {
   "required": [
    "size"
   ]
  }
 ],
 "$defs": {
  "color": {
   "type": "string",
   "maxLength": 60,
   "description": "A CSS colour: #rgb, #rrggbb, #rrggbbaa, rgb(), rgba(), hsl(), hsla() or a colour name"
  },
  "gradient": {
   "type": "object",
   "properties": {
    "g": {
     "type": "array",
     "items": {
      "$ref": "#/$defs/color"
     },
     "minItems": 2,
     "maxItems": 2,
     "description": "From and to colours"
    },
    "a": {
     "type": "number",
     "minimum": -360,
     "maximum": 360,
     "description": "Angle in degrees (0 = bottom to top, 90 = left to right, 180 = top to bottom)"
    }
   },
   "required": [
    "g"
   ],
   "additionalProperties": false
  },
  "fill": {
   "oneOf": [
    {
     "$ref": "#/$defs/color"
    },
    {
     "$ref": "#/$defs/gradient"
    }
   ]
  },
  "page": {
   "type": "object",
   "properties": {
    "bg": {
     "$ref": "#/$defs/fill",
     "description": "Background colour or gradient"
    },
    "tr": {
     "enum": [
      "fade",
      "slide",
      "zoom",
      "none"
     ],
     "description": "Transition into this page in Present"
    },
    "els": {
     "type": "array",
     "maxItems": 200,
     "items": {
      "$ref": "#/$defs/element"
     },
     "description": "Elements, drawn in order (later ones on top)"
    }
   },
   "additionalProperties": false
  },
  "element": {
   "oneOf": [
    {
     "type": "object",
     "description": "Text that wraps inside its width",
     "properties": {
      "t": {
       "const": "text"
      },
      "x": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Left edge in pixels from the page's left"
      },
      "y": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Top edge in pixels from the page's top"
      },
      "w": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Width in pixels"
      },
      "h": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Height in pixels (text: worked out from the text, so it can be left out)"
      },
      "r": {
       "type": "number",
       "minimum": -3600,
       "maximum": 3600,
       "description": "Rotation in degrees, clockwise"
      },
      "o": {
       "type": "number",
       "minimum": 0,
       "maximum": 1,
       "description": "Opacity"
      },
      "an": {
       "enum": [
        "rise",
        "fade",
        "pop",
        "slide",
        "wipe",
        "spin",
        "type"
       ],
       "description": "Entrance animation in Present and animated exports (\"type\" for text only)"
      },
      "fx": {
       "type": "boolean",
       "description": "Flip horizontally"
      },
      "fy": {
       "type": "boolean",
       "description": "Flip vertically"
      },
      "lk": {
       "type": "boolean",
       "description": "Locked"
      },
      "hid": {
       "type": "boolean",
       "description": "Hidden"
      },
      "g": {
       "type": "string",
       "pattern": "^[A-Za-z0-9]{1,12}$",
       "description": "Group id: elements with the same id move together"
      },
      "txt": {
       "type": "string",
       "maxLength": 2000,
       "description": "The text; \\n for a new line"
      },
      "fs": {
       "type": "number",
       "minimum": 4,
       "maximum": 2000,
       "description": "Font size in pixels"
      },
      "ff": {
       "enum": [
        "Inter",
        "Poppins",
        "Montserrat",
        "Playfair Display",
        "Bebas Neue",
        "Anton",
        "Pacifico",
        "Lobster",
        "Dancing Script",
        "Abril Fatface",
        "Oswald",
        "Raleway",
        "Lora",
        "DM Serif Display",
        "Space Grotesk",
        "Archivo Black",
        "Righteous",
        "Caveat",
        "Shrikhand",
        "Syne",
        "Fraunces",
        "Bricolage Grotesque",
        "Josefin Sans",
        "Permanent Marker",
        "Great Vibes",
        "Cormorant Garamond",
        "Rubik",
        "Bungee",
        "Unbounded",
        "Libre Baskerville"
       ],
       "description": "Font: Inter (400/700/900), Poppins (400/600/800), Montserrat (400/700/900), Playfair Display (400/700/900), Bebas Neue (400), Anton (400), Pacifico (400), Lobster (400), Dancing Script (400/700), Abril Fatface (400), Oswald (400/700), Raleway (400/800), Lora (400/700), DM Serif Display (400), Space Grotesk (400/700), Archivo Black (400), Righteous (400), Caveat (400/700), Shrikhand (400), Syne (400/800), Fraunces (400/900), Bricolage Grotesque (400/800), Josefin Sans (400/700), Permanent Marker (400), Great Vibes (400), Cormorant Garamond (400/700), Rubik (400/800), Bungee (400), Unbounded (400/800), Libre Baskerville (400/700)"
      },
      "fw": {
       "type": "number",
       "minimum": 100,
       "maximum": 900,
       "description": "Weight; the nearest the font has is used"
      },
      "fi": {
       "type": "boolean",
       "description": "Italic"
      },
      "c": {
       "$ref": "#/$defs/fill",
       "description": "Text colour or gradient"
      },
      "al": {
       "enum": [
        "left",
        "center",
        "right"
       ]
      },
      "ls": {
       "type": "number",
       "minimum": -20,
       "maximum": 100,
       "description": "Letter spacing, in hundredths of the font size"
      },
      "lh": {
       "type": "number",
       "minimum": 0.6,
       "maximum": 3,
       "description": "Line height, times the font size"
      },
      "up": {
       "type": "boolean",
       "description": "All capitals"
      },
      "cv": {
       "type": "number",
       "minimum": -360,
       "maximum": 360,
       "description": "Curve the text into an arc of this many degrees (one line)"
      },
      "ef": {
       "enum": [
        "none",
        "shadow",
        "lift",
        "hollow",
        "outline",
        "splice",
        "echo",
        "glitch",
        "neon"
       ],
       "description": "Text effect"
      },
      "efc": {
       "$ref": "#/$defs/color",
       "description": "Effect colour"
      },
      "efi": {
       "type": "number",
       "minimum": 0,
       "maximum": 100,
       "description": "Effect strength (50 normal)"
      },
      "hl": {
       "$ref": "#/$defs/color",
       "description": "Highlight behind each line"
      },
      "st": {
       "type": "object",
       "description": "Outline",
       "properties": {
        "w": {
         "type": "number",
         "minimum": 0,
         "maximum": 200,
         "description": "Width"
        },
        "c": {
         "$ref": "#/$defs/color"
        },
        "d": {
         "type": "boolean",
         "description": "Dashed"
        }
       },
       "required": [
        "w"
       ],
       "additionalProperties": false
      }
     },
     "required": [
      "t",
      "txt"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "description": "A filled shape",
     "properties": {
      "t": {
       "const": "shape"
      },
      "x": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Left edge in pixels from the page's left"
      },
      "y": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Top edge in pixels from the page's top"
      },
      "w": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Width in pixels"
      },
      "h": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Height in pixels (text: worked out from the text, so it can be left out)"
      },
      "r": {
       "type": "number",
       "minimum": -3600,
       "maximum": 3600,
       "description": "Rotation in degrees, clockwise"
      },
      "o": {
       "type": "number",
       "minimum": 0,
       "maximum": 1,
       "description": "Opacity"
      },
      "an": {
       "enum": [
        "rise",
        "fade",
        "pop",
        "slide",
        "wipe",
        "spin",
        "type"
       ],
       "description": "Entrance animation in Present and animated exports (\"type\" for text only)"
      },
      "fx": {
       "type": "boolean",
       "description": "Flip horizontally"
      },
      "fy": {
       "type": "boolean",
       "description": "Flip vertically"
      },
      "lk": {
       "type": "boolean",
       "description": "Locked"
      },
      "hid": {
       "type": "boolean",
       "description": "Hidden"
      },
      "g": {
       "type": "string",
       "pattern": "^[A-Za-z0-9]{1,12}$",
       "description": "Group id: elements with the same id move together"
      },
      "sh": {
       "enum": [
        "rect",
        "rounded",
        "circle",
        "tri",
        "rtri",
        "diamond",
        "pent",
        "hex",
        "oct",
        "star",
        "burst",
        "heart",
        "arrow",
        "pill",
        "blob",
        "arch",
        "plus",
        "bubble",
        "ring",
        "halfcircle"
       ]
      },
      "fill": {
       "$ref": "#/$defs/fill",
       "description": "Colour or gradient"
      },
      "rad": {
       "type": "number",
       "minimum": 0,
       "maximum": 32000,
       "description": "Corner radius (rounded)"
      },
      "sw2": {
       "type": "number",
       "minimum": 0,
       "maximum": 32000,
       "description": "Ring thickness"
      },
      "st": {
       "type": "object",
       "description": "Outline",
       "properties": {
        "w": {
         "type": "number",
         "minimum": 0,
         "maximum": 200,
         "description": "Width"
        },
        "c": {
         "$ref": "#/$defs/color"
        },
        "d": {
         "type": "boolean",
         "description": "Dashed"
        }
       },
       "required": [
        "w"
       ],
       "additionalProperties": false
      },
      "sh2": {
       "type": "object",
       "description": "Drop shadow",
       "properties": {
        "c": {
         "$ref": "#/$defs/color"
        },
        "b": {
         "type": "number",
         "minimum": 0,
         "maximum": 400,
         "description": "Blur"
        },
        "x": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        },
        "y": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        }
       },
       "additionalProperties": false
      }
     },
     "required": [
      "t",
      "sh"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "description": "A straight line along its width (rotate it with r)",
     "properties": {
      "t": {
       "const": "line"
      },
      "x": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Left edge in pixels from the page's left"
      },
      "y": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Top edge in pixels from the page's top"
      },
      "w": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Width in pixels"
      },
      "h": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Height in pixels (text: worked out from the text, so it can be left out)"
      },
      "r": {
       "type": "number",
       "minimum": -3600,
       "maximum": 3600,
       "description": "Rotation in degrees, clockwise"
      },
      "o": {
       "type": "number",
       "minimum": 0,
       "maximum": 1,
       "description": "Opacity"
      },
      "an": {
       "enum": [
        "rise",
        "fade",
        "pop",
        "slide",
        "wipe",
        "spin",
        "type"
       ],
       "description": "Entrance animation in Present and animated exports (\"type\" for text only)"
      },
      "fx": {
       "type": "boolean",
       "description": "Flip horizontally"
      },
      "fy": {
       "type": "boolean",
       "description": "Flip vertically"
      },
      "lk": {
       "type": "boolean",
       "description": "Locked"
      },
      "hid": {
       "type": "boolean",
       "description": "Hidden"
      },
      "g": {
       "type": "string",
       "pattern": "^[A-Za-z0-9]{1,12}$",
       "description": "Group id: elements with the same id move together"
      },
      "c": {
       "$ref": "#/$defs/color"
      },
      "sw": {
       "type": "number",
       "minimum": 0.5,
       "maximum": 400,
       "description": "Thickness"
      },
      "dash": {
       "enum": [
        0,
        1,
        2
       ],
       "description": "0 solid, 1 dashed, 2 dotted"
      },
      "cap": {
       "enum": [
        "none",
        "arrow",
        "dot"
       ]
      }
     },
     "required": [
      "t"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "description": "A line icon",
     "properties": {
      "t": {
       "const": "icon"
      },
      "x": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Left edge in pixels from the page's left"
      },
      "y": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Top edge in pixels from the page's top"
      },
      "w": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Width in pixels"
      },
      "h": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Height in pixels (text: worked out from the text, so it can be left out)"
      },
      "r": {
       "type": "number",
       "minimum": -3600,
       "maximum": 3600,
       "description": "Rotation in degrees, clockwise"
      },
      "o": {
       "type": "number",
       "minimum": 0,
       "maximum": 1,
       "description": "Opacity"
      },
      "an": {
       "enum": [
        "rise",
        "fade",
        "pop",
        "slide",
        "wipe",
        "spin",
        "type"
       ],
       "description": "Entrance animation in Present and animated exports (\"type\" for text only)"
      },
      "fx": {
       "type": "boolean",
       "description": "Flip horizontally"
      },
      "fy": {
       "type": "boolean",
       "description": "Flip vertically"
      },
      "lk": {
       "type": "boolean",
       "description": "Locked"
      },
      "hid": {
       "type": "boolean",
       "description": "Hidden"
      },
      "g": {
       "type": "string",
       "pattern": "^[A-Za-z0-9]{1,12}$",
       "description": "Group id: elements with the same id move together"
      },
      "ic": {
       "enum": [
        "heart",
        "star",
        "check",
        "x",
        "plus",
        "minus",
        "arrow-right",
        "arrow-left",
        "arrow-up",
        "arrow-down",
        "chevron",
        "circle",
        "square",
        "triangle",
        "home",
        "user",
        "users",
        "mail",
        "phone",
        "camera",
        "music",
        "sun",
        "moon",
        "cloud",
        "rain",
        "bolt",
        "leaf",
        "flower",
        "tree",
        "coffee",
        "cake",
        "gift",
        "bell",
        "calendar",
        "clock",
        "pin",
        "globe",
        "search",
        "sliders",
        "lock",
        "key",
        "cart",
        "bag",
        "tag",
        "dollar",
        "chart",
        "trend",
        "pie",
        "trophy",
        "crown",
        "flag",
        "bookmark",
        "book",
        "pen",
        "brush",
        "scissors",
        "wifi",
        "battery",
        "play",
        "pause",
        "mic",
        "headphones",
        "video",
        "image",
        "smile",
        "thumbs",
        "chat",
        "send",
        "link",
        "share",
        "download",
        "upload",
        "trash",
        "eye",
        "fire",
        "drop",
        "snow",
        "anchor",
        "plane",
        "car",
        "bike",
        "rocket",
        "diamond",
        "sparkle",
        "award",
        "target",
        "paw",
        "pizza",
        "apple",
        "wine",
        "building",
        "briefcase",
        "graduation",
        "bulb",
        "code",
        "quote",
        "infinity",
        "compass",
        "map",
        "mountain",
        "wave",
        "palette",
        "dumbbell",
        "pulse",
        "shield",
        "info",
        "alert",
        "question",
        "grid",
        "menu",
        "at",
        "hash",
        "percent",
        "gem",
        "ticket",
        "film",
        "gamepad",
        "dna",
        "feather"
       ]
      },
      "c": {
       "$ref": "#/$defs/fill",
       "description": "Colour"
      },
      "sw": {
       "type": "number",
       "minimum": 0.2,
       "maximum": 12,
       "description": "Stroke width on a 24-unit icon (2 normal)"
      },
      "fillI": {
       "type": "boolean",
       "description": "Filled instead of outlined"
      },
      "sh2": {
       "type": "object",
       "description": "Drop shadow",
       "properties": {
        "c": {
         "$ref": "#/$defs/color"
        },
        "b": {
         "type": "number",
         "minimum": 0,
         "maximum": 400,
         "description": "Blur"
        },
        "x": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        },
        "y": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        }
       },
       "additionalProperties": false
      }
     },
     "required": [
      "t",
      "ic"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "description": "An emoji, sized by the smaller of w and h",
     "properties": {
      "t": {
       "const": "emoji"
      },
      "x": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Left edge in pixels from the page's left"
      },
      "y": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Top edge in pixels from the page's top"
      },
      "w": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Width in pixels"
      },
      "h": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Height in pixels (text: worked out from the text, so it can be left out)"
      },
      "r": {
       "type": "number",
       "minimum": -3600,
       "maximum": 3600,
       "description": "Rotation in degrees, clockwise"
      },
      "o": {
       "type": "number",
       "minimum": 0,
       "maximum": 1,
       "description": "Opacity"
      },
      "an": {
       "enum": [
        "rise",
        "fade",
        "pop",
        "slide",
        "wipe",
        "spin",
        "type"
       ],
       "description": "Entrance animation in Present and animated exports (\"type\" for text only)"
      },
      "fx": {
       "type": "boolean",
       "description": "Flip horizontally"
      },
      "fy": {
       "type": "boolean",
       "description": "Flip vertically"
      },
      "lk": {
       "type": "boolean",
       "description": "Locked"
      },
      "hid": {
       "type": "boolean",
       "description": "Hidden"
      },
      "g": {
       "type": "string",
       "pattern": "^[A-Za-z0-9]{1,12}$",
       "description": "Group id: elements with the same id move together"
      },
      "e": {
       "type": "string",
       "maxLength": 16,
       "description": "One emoji"
      },
      "sh2": {
       "type": "object",
       "description": "Drop shadow",
       "properties": {
        "c": {
         "$ref": "#/$defs/color"
        },
        "b": {
         "type": "number",
         "minimum": 0,
         "maximum": 400,
         "description": "Blur"
        },
        "x": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        },
        "y": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        }
       },
       "additionalProperties": false
      }
     },
     "required": [
      "t",
      "e"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "description": "A photo frame; it arrives empty for the person to drop their photo in (links never carry photos)",
     "properties": {
      "t": {
       "const": "img"
      },
      "x": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Left edge in pixels from the page's left"
      },
      "y": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Top edge in pixels from the page's top"
      },
      "w": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Width in pixels"
      },
      "h": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Height in pixels (text: worked out from the text, so it can be left out)"
      },
      "r": {
       "type": "number",
       "minimum": -3600,
       "maximum": 3600,
       "description": "Rotation in degrees, clockwise"
      },
      "o": {
       "type": "number",
       "minimum": 0,
       "maximum": 1,
       "description": "Opacity"
      },
      "an": {
       "enum": [
        "rise",
        "fade",
        "pop",
        "slide",
        "wipe",
        "spin",
        "type"
       ],
       "description": "Entrance animation in Present and animated exports (\"type\" for text only)"
      },
      "fx": {
       "type": "boolean",
       "description": "Flip horizontally"
      },
      "fy": {
       "type": "boolean",
       "description": "Flip vertically"
      },
      "lk": {
       "type": "boolean",
       "description": "Locked"
      },
      "hid": {
       "type": "boolean",
       "description": "Hidden"
      },
      "g": {
       "type": "string",
       "pattern": "^[A-Za-z0-9]{1,12}$",
       "description": "Group id: elements with the same id move together"
      },
      "mask": {
       "enum": [
        "rect",
        "rounded",
        "circle",
        "arch",
        "blob",
        "heart",
        "star",
        "hex",
        "diamond",
        "pill",
        "tri",
        "burst"
       ],
       "description": "Frame shape"
      },
      "src": {
       "type": "string",
       "pattern": "^ph-[a-z0-9-]{1,40}$",
       "description": "One of Quick Design's own sample photos, \"ph-<id>\" (the ids are listed on the format page); anything else arrives empty"
      },
      "crop": {
       "type": "object",
       "properties": {
        "z": {
         "type": "number",
         "minimum": 1,
         "maximum": 10,
         "description": "Zoom"
        },
        "x": {
         "type": "number",
         "minimum": 0,
         "maximum": 1,
         "description": "Horizontal focus"
        },
        "y": {
         "type": "number",
         "minimum": 0,
         "maximum": 1,
         "description": "Vertical focus"
        }
       },
       "additionalProperties": false
      },
      "flt": {
       "enum": [
        "none",
        "mono",
        "noir",
        "warm",
        "cool",
        "vivid",
        "fade",
        "retro",
        "dusk",
        "bloom"
       ]
      },
      "adj": {
       "type": "object",
       "properties": {
        "b": {
         "type": "number",
         "minimum": -100,
         "maximum": 100,
         "description": "Brightness"
        },
        "c": {
         "type": "number",
         "minimum": -100,
         "maximum": 100,
         "description": "Contrast"
        },
        "s": {
         "type": "number",
         "minimum": -100,
         "maximum": 100,
         "description": "Saturation"
        },
        "w": {
         "type": "number",
         "minimum": -100,
         "maximum": 100,
         "description": "Warmth"
        }
       },
       "additionalProperties": false
      },
      "rad": {
       "type": "number",
       "minimum": 0,
       "maximum": 32000
      },
      "st": {
       "type": "object",
       "description": "Outline",
       "properties": {
        "w": {
         "type": "number",
         "minimum": 0,
         "maximum": 200,
         "description": "Width"
        },
        "c": {
         "$ref": "#/$defs/color"
        },
        "d": {
         "type": "boolean",
         "description": "Dashed"
        }
       },
       "required": [
        "w"
       ],
       "additionalProperties": false
      },
      "sh2": {
       "type": "object",
       "description": "Drop shadow",
       "properties": {
        "c": {
         "$ref": "#/$defs/color"
        },
        "b": {
         "type": "number",
         "minimum": 0,
         "maximum": 400,
         "description": "Blur"
        },
        "x": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        },
        "y": {
         "type": "number",
         "minimum": -400,
         "maximum": 400
        }
       },
       "additionalProperties": false
      }
     },
     "required": [
      "t"
     ],
     "additionalProperties": false
    },
    {
     "type": "object",
     "description": "A freehand stroke",
     "properties": {
      "t": {
       "const": "draw"
      },
      "x": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Left edge in pixels from the page's left"
      },
      "y": {
       "type": "number",
       "minimum": -20000,
       "maximum": 20000,
       "description": "Top edge in pixels from the page's top"
      },
      "w": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Width in pixels"
      },
      "h": {
       "type": "number",
       "minimum": 1,
       "maximum": 32000,
       "description": "Height in pixels (text: worked out from the text, so it can be left out)"
      },
      "r": {
       "type": "number",
       "minimum": -3600,
       "maximum": 3600,
       "description": "Rotation in degrees, clockwise"
      },
      "o": {
       "type": "number",
       "minimum": 0,
       "maximum": 1,
       "description": "Opacity"
      },
      "an": {
       "enum": [
        "rise",
        "fade",
        "pop",
        "slide",
        "wipe",
        "spin",
        "type"
       ],
       "description": "Entrance animation in Present and animated exports (\"type\" for text only)"
      },
      "fx": {
       "type": "boolean",
       "description": "Flip horizontally"
      },
      "fy": {
       "type": "boolean",
       "description": "Flip vertically"
      },
      "lk": {
       "type": "boolean",
       "description": "Locked"
      },
      "hid": {
       "type": "boolean",
       "description": "Hidden"
      },
      "g": {
       "type": "string",
       "pattern": "^[A-Za-z0-9]{1,12}$",
       "description": "Group id: elements with the same id move together"
      },
      "pts": {
       "type": "array",
       "items": {
        "type": "number",
        "minimum": 0,
        "maximum": 1
       },
       "minItems": 4,
       "maxItems": 4000,
       "description": "x, y pairs from 0 to 1 across the element's box"
      },
      "c": {
       "$ref": "#/$defs/color"
      },
      "sw": {
       "type": "number",
       "minimum": 0.5,
       "maximum": 200,
       "description": "Pen width"
      },
      "hi": {
       "type": "boolean",
       "description": "Highlighter (see-through)"
      }
     },
     "required": [
      "t",
      "pts"
     ],
     "additionalProperties": false
    }
   ]
  }
 }
}
