Skip to main content
Glama

pixoo_compose_scene

pixoo_compose_scene
Idempotent

Compose a layered scene on a Pixoo LED matrix by combining text, icons, shapes, images, and widgets with per-element effects or keyframes. Renders the result as an image and pushes it to the device.

Instructions

Compose a full scene: layered elements (text, icons, widgets, shapes, bitmaps, images, sprites) with per-element effects and keyframes, static or animated. Returns the rendered scene as an image content block for immediate inspection. Elements render back-to-front in array order. For text-only display use pixoo_display_text; run pixoo_design_brief with topic "scene" or "dashboard" for layout and palette guidance.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pushNoPush to device (default: true).
speedNoMilliseconds per frame for animations (default: 150ms).
framesNoNumber of animation frames (1–40, default: 1). 20 frames at 150ms ≈ 3s loop.
outputNoAbsolute, already-normalized path to save the first frame to as a PNG. Replaces the PIXOO_OUTPUT_DIR auto-save for this call, so outputFiles holds only this path.
elementsYesScene elements rendered back-to-front. Up to 50 elements. Each element takes either effect or animate, not both. An element's animate keyframes can drive dx, dy, and opacity (numbers or numeric strings, interpolated), visible (true or false, switching at the midpoint between keyframes), and color on any element with a color field (interpolated through RGB).
backgroundYesScene background: a solid color string, or an object holding exactly one of gradient or theme.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
framesNoNumber of frames in the rendered output (1 for static, 2–40 for animations).
layoutNoLayout report for each element.
noticeNoWarning or informational notice about the render or push.
pushedNoTrue when the device acknowledged the push. False when push: false or push failed.
deviceStateNoDevice state after the push. Absent when push: false.
outputFilesNoAbsolute paths to saved output files: the output path when set, otherwise the PIXOO_OUTPUT_DIR auto-save (PNG for static, GIF for animations). Absent when neither applies.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changedv1.3.0
    • changedInput schema / properties / background / anyOf
      Previous value: -[
      -  {
      -    "description": "Solid CSS hex color.",
      -    "type": "string"
      -  },
      -  {
      -    "description": "Gradient background: specify type and two colors.",
      -    "properties": {
      -      "gradient": {
      -        "description": "Gradient background.",
      -        "properties": {
      -          "from": {
      -            "description": "Gradient start color.",
      -            "type": "string"
      -          },
      -          "to": {
      -            "description": "Gradient end color.",
      -            "type": "string"
      -          },
      -          "type": {
      -            "description": "v = vertical, h = horizontal, r = radial.",
      -            "enum": [
      -              "v",
      -              "h",
      -              "r"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "type",
      -          "from",
      -          "to"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "gradient"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Named theme background: uses the theme's preset gradient.",
      -    "properties": {
      -      "theme": {
      -        "description": "Named theme.",
      -        "enum": [
      -          "midnight",
      -          "ember",
      -          "claude",
      -          "ice",
      -          "neon",
      -          "forest",
      -          "mono"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "theme"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "Solid CSS hex color.",
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Gradient or named-theme background: set exactly one of gradient or theme.",
      +    "properties": {
      +      "gradient": {
      +        "additionalProperties": false,
      +        "description": "Gradient background: type and two colors.",
      +        "properties": {
      +          "from": {
      +            "description": "Gradient start color.",
      +            "type": "string"
      +          },
      +          "to": {
      +            "description": "Gradient end color.",
      +            "type": "string"
      +          },
      +          "type": {
      +            "description": "v = vertical, h = horizontal, r = radial.",
      +            "enum": [
      +              "v",
      +              "h",
      +              "r"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "from",
      +          "to"
      +        ],
      +        "type": "object"
      +      },
      +      "theme": {
      +        "description": "Named theme: uses the theme's preset background.",
      +        "enum": [
      +          "midnight",
      +          "ember",
      +          "claude",
      +          "ice",
      +          "neon",
      +          "forest",
      +          "mono"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / background / description
      Previous value: -"Scene background: solid color, gradient, or named theme."New value: +"Scene background: a solid color string, or an object holding exactly one of gradient or theme."
    • changedInput schema / properties / elements / description
      Previous value: -"Scene elements rendered back-to-front. Up to 50 elements."New value: +"Scene elements rendered back-to-front. Up to 50 elements. Each element takes either effect or animate, not both. An element's animate keyframes can drive dx, dy, and opacity (numbers or numeric strings, interpolated), visible (true or false, switching at the midpoint between keyframes), and color on any element with a color field (interpolated through RGB)."
    • changedInput schema / properties / elements / items / oneOf
      Previous value: -[
      -  {
      -    "description": "Styled text element rendered at a position.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Flat text color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "font": {
      -        "description": "Font variant.",
      -        "enum": [
      -          "standard",
      -          "compact"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "style": {
      -        "description": "Text style options.",
      -        "properties": {
      -          "color": {
      -            "description": "Flat color override.",
      -            "type": "string"
      -          },
      -          "outline": {
      -            "description": "1px outline.",
      -            "type": "boolean"
      -          },
      -          "palette": {
      -            "anyOf": [
      -              {
      -                "description": "Named built-in color palette for the vertical ramp.",
      -                "enum": [
      -                  "ember",
      -                  "ice",
      -                  "neon",
      -                  "fire",
      -                  "lavender",
      -                  "claude",
      -                  "mono"
      -                ],
      -                "type": "string"
      -              },
      -              {
      -                "description": "Custom gradient stop: specify top and bottom colors directly.",
      -                "properties": {
      -                  "from": {
      -                    "description": "Top color.",
      -                    "type": "string"
      -                  },
      -                  "to": {
      -                    "description": "Bottom color.",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "from",
      -                  "to"
      -                ],
      -                "type": "object"
      -              }
      -            ],
      -            "description": "Palette name or custom gradient stop for vertical color ramp."
      -          },
      -          "scale": {
      -            "description": "Integer pixel scale multiplier.",
      -            "maximum": 8,
      -            "minimum": 1,
      -            "type": "integer"
      -          },
      -          "shadow": {
      -            "description": "Drop shadow.",
      -            "type": "boolean"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "text": {
      -        "description": "Text content to render.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "text",
      -        "description": "Text element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position (default: 0)."
      -      },
      -      "y": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel Y coordinate (0 = top edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic vertical alignment.",
      -            "enum": [
      -              "top",
      -              "center",
      -              "bottom"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Y position (default: 0)."
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Built-in or custom SVG icon element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Icon fill color.",
      -        "type": "string"
      -      },
      -      "d": {
      -        "description": "Custom SVG path d attribute.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Render height in pixels (default: 12).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "name": {
      -        "description": "Built-in icon name (see pixoo://reference/icons).",
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Named palette for colored icon.",
      -        "enum": [
      -          "ember",
      -          "ice",
      -          "neon",
      -          "fire",
      -          "lavender",
      -          "claude",
      -          "mono"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "icon",
      -        "description": "Icon element type.",
      -        "type": "string"
      -      },
      -      "viewBox": {
      -        "description": "SVG viewBox string (default: \"0 0 16 16\").",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Render width in pixels (default: 12).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position."
      -      },
      -      "y": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel Y coordinate (0 = top edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic vertical alignment.",
      -            "enum": [
      -              "top",
      -              "center",
      -              "bottom"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Y position."
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Filled or gradient rectangle element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "borderColor": {
      -        "description": "1px border color.",
      -        "type": "string"
      -      },
      -      "color": {
      -        "description": "Fill color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "gradient": {
      -        "description": "Gradient fill.",
      -        "properties": {
      -          "from": {
      -            "description": "Start color.",
      -            "type": "string"
      -          },
      -          "to": {
      -            "description": "End color.",
      -            "type": "string"
      -          },
      -          "type": {
      -            "description": "v = vertical, h = horizontal.",
      -            "enum": [
      -              "v",
      -              "h"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "type",
      -          "from",
      -          "to"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "rect",
      -        "description": "Rectangle element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Filled or outline circle element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Circle color.",
      -        "type": "string"
      -      },
      -      "cx": {
      -        "description": "Center X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "cy": {
      -        "description": "Center Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "fill": {
      -        "description": "Filled or outline only (default: true).",
      -        "type": "boolean"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "radius": {
      -        "description": "Radius in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "circle",
      -        "description": "Circle element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "cx",
      -      "cy",
      -      "radius"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Single-pixel line element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Line color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "line",
      -        "description": "Line element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x0": {
      -        "description": "Start X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x1": {
      -        "description": "End X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y0": {
      -        "description": "Start Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y1": {
      -        "description": "End Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x0",
      -      "y0",
      -      "x1",
      -      "y1"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Horizontal progress bar widget.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "label": {
      -        "description": "Optional label rendered on the bar.",
      -        "type": "string"
      -      },
      -      "max": {
      -        "description": "Maximum value.",
      -        "type": "number"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Named palette for gradient fill.",
      -        "enum": [
      -          "ember",
      -          "ice",
      -          "neon",
      -          "fire",
      -          "lavender",
      -          "claude",
      -          "mono"
      -        ],
      -        "type": "string"
      -      },
      -      "trackColor": {
      -        "description": "Background track color.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "progress",
      -        "description": "Progress bar widget type.",
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Current value.",
      -        "type": "number"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h",
      -      "value",
      -      "max"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sparkline chart widget (line or bar).",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Line or bar color.",
      -        "type": "string"
      -      },
      -      "data": {
      -        "description": "Data points for the chart.",
      -        "items": {
      -          "type": "number"
      -        },
      -        "minItems": 2,
      -        "type": "array"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "kind": {
      -        "description": "Chart style (default: line).",
      -        "enum": [
      -          "line",
      -          "bar"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "sparkline",
      -        "description": "Sparkline chart widget type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Bitmap element using explicit palette indices.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Color palette: array of hex colors indexed 0-F.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "rows": {
      -        "description": "Row strings of hex palette indices (0-F, space = transparent).",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "bitmap",
      -        "description": "Bitmap element using palette indices.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "rows",
      -      "palette"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sparse scatter of individually colored pixels.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "data": {
      -        "description": "Array of pixel positions and colors.",
      -        "items": {
      -          "description": "A single pixel: position and color.",
      -          "properties": {
      -            "color": {
      -              "description": "Pixel color.",
      -              "type": "string"
      -            },
      -            "x": {
      -              "description": "Pixel X coordinate.",
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            "y": {
      -              "description": "Pixel Y coordinate.",
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y",
      -            "color"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "pixels",
      -        "description": "Sparse pixel dots element.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "External image element (local path or https URL).",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "fit": {
      -        "description": "Resize fit mode (default: contain).",
      -        "enum": [
      -          "contain",
      -          "cover",
      -          "fill"
      -        ],
      -        "type": "string"
      -      },
      -      "h": {
      -        "description": "Target height (default: canvas height).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "kernel": {
      -        "description": "Resize kernel: nearest for pixel art, lanczos3 for photos (default: nearest).",
      -        "enum": [
      -          "nearest",
      -          "lanczos3",
      -          "mitchell"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "source": {
      -        "description": "Absolute local file path or https (not http) URL.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "image",
      -        "description": "Image element (local path or https URL).",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Target width (default: canvas width).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X offset on canvas (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y offset on canvas (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sprite sheet element for character or tile art.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": false,
      -            "maxItems": 2,
      -            "minItems": 2,
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "description": "Value at this frame.",
      -                "type": [
      -                  "number",
      -                  "string",
      -                  "boolean"
      -                ]
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "bodyColor": {
      -        "description": "Override body color.",
      -        "type": "string"
      -      },
      -      "cols": {
      -        "description": "Number of columns in the sprite grid.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "darkColor": {
      -        "description": "Override dark/eye color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "path": {
      -        "description": "Absolute local path to the sprite sheet image.",
      -        "type": "string"
      -      },
      -      "rows": {
      -        "description": "Number of rows in the sprite grid.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "scale": {
      -        "description": "Pixel scale factor.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "sprite",
      -        "description": "Sprite sheet element.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position (default: center)."
      -      },
      -      "y": {
      -        "description": "Y position (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "path",
      -      "cols",
      -      "rows"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "Styled text element rendered at a position.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "color": {
      +            "description": "Color keyframes (hex or named), interpolated through RGB; each frame's value stands in for the element's color (on pixels, every point's color).",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Color at this frame.",
      +                  "type": [
      +                    "number",
      +                    "string",
      +                    "boolean"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Flat text color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "font": {
      +        "description": "Font variant (default: standard): standard (5×7) or compact (3×5), each printable ASCII plus ° ← ↑ → ↓ ▲ ▼ ♥ · …; or numerals (11×18 digits for clocks and readouts), which draws only 0–9, space, and : . - + / % ° ?, so text holding any other character is rejected — put units and labels in a separate standard or compact text element.",
      +        "enum": [
      +          "standard",
      +          "compact",
      +          "numerals"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "style": {
      +        "additionalProperties": false,
      +        "description": "Text style options.",
      +        "properties": {
      +          "color": {
      +            "description": "Flat color override.",
      +            "type": "string"
      +          },
      +          "outline": {
      +            "description": "1px outline.",
      +            "type": "boolean"
      +          },
      +          "palette": {
      +            "anyOf": [
      +              {
      +                "description": "Named built-in color palette for the vertical ramp.",
      +                "enum": [
      +                  "ember",
      +                  "ice",
      +                  "neon",
      +                  "fire",
      +                  "lavender",
      +                  "claude",
      +                  "mono"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "additionalProperties": false,
      +                "description": "Custom gradient stop: specify top and bottom colors directly.",
      +                "properties": {
      +                  "from": {
      +                    "description": "Top color.",
      +                    "type": "string"
      +                  },
      +                  "to": {
      +                    "description": "Bottom color.",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "from",
      +                  "to"
      +                ],
      +                "type": "object"
      +              }
      +            ],
      +            "description": "Palette name or custom gradient stop for vertical color ramp."
      +          },
      +          "scale": {
      +            "description": "Integer pixel scale multiplier.",
      +            "maximum": 8,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "shadow": {
      +            "description": "Drop shadow.",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "Text content to render.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "text",
      +        "description": "Text element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position (default: 0)."
      +      },
      +      "y": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel Y coordinate (0 = top edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic vertical alignment.",
      +            "enum": [
      +              "top",
      +              "center",
      +              "bottom"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Y position (default: 0)."
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Built-in or custom SVG icon element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "color": {
      +            "description": "Color keyframes (hex or named), interpolated through RGB; each frame's value stands in for the element's color (on pixels, every point's color).",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Color at this frame.",
      +                  "type": [
      +                    "number",
      +                    "string",
      +                    "boolean"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Icon color (default: white).",
      +        "type": "string"
      +      },
      +      "d": {
      +        "description": "Custom SVG path d attribute.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Render height in pixels (default: 12).",
      +        "maximum": 256,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "name": {
      +        "description": "Built-in icon name (see pixoo://reference/icons).",
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Named palette painted as a top-to-bottom color ramp from the icon's top row to its bottom row. Takes precedence over color.",
      +        "enum": [
      +          "ember",
      +          "ice",
      +          "neon",
      +          "fire",
      +          "lavender",
      +          "claude",
      +          "mono"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "icon",
      +        "description": "Icon element type.",
      +        "type": "string"
      +      },
      +      "viewBox": {
      +        "description": "SVG viewBox string (default: \"0 0 16 16\").",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Render width in pixels (default: 12).",
      +        "maximum": 256,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position."
      +      },
      +      "y": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel Y coordinate (0 = top edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic vertical alignment.",
      +            "enum": [
      +              "top",
      +              "center",
      +              "bottom"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Y position."
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Filled, gradient, or bordered rectangle element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "color": {
      +            "description": "Color keyframes (hex or named), interpolated through RGB; each frame's value stands in for the element's color (on pixels, every point's color).",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Color at this frame.",
      +                  "type": [
      +                    "number",
      +                    "string",
      +                    "boolean"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "borderColor": {
      +        "description": "Border color. The border is drawn inside the rect, strokeWidth pixels thick.",
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Fill color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "gradient": {
      +        "additionalProperties": false,
      +        "description": "Gradient fill.",
      +        "properties": {
      +          "from": {
      +            "description": "Start color.",
      +            "type": "string"
      +          },
      +          "to": {
      +            "description": "End color.",
      +            "type": "string"
      +          },
      +          "type": {
      +            "description": "v = vertical, h = horizontal.",
      +            "enum": [
      +              "v",
      +              "h"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "from",
      +          "to"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "strokeWidth": {
      +        "description": "Border thickness in whole pixels, growing inward from the rect edge (default: 1). Requires borderColor.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "rect",
      +        "description": "Rectangle element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Filled or outline circle element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "color": {
      +            "description": "Color keyframes (hex or named), interpolated through RGB; each frame's value stands in for the element's color (on pixels, every point's color).",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Color at this frame.",
      +                  "type": [
      +                    "number",
      +                    "string",
      +                    "boolean"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "antialias": {
      +        "description": "Shade each outline pixel by how much of it the ring covers, for a smooth curve (default: false, hard pixel edges). Outline circles only (fill: false).",
      +        "type": "boolean"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Circle color.",
      +        "type": "string"
      +      },
      +      "cx": {
      +        "description": "Center X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "cy": {
      +        "description": "Center Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "fill": {
      +        "description": "Filled or outline only (default: true).",
      +        "type": "boolean"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "radius": {
      +        "description": "Radius in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "strokeWidth": {
      +        "description": "Outline thickness in whole pixels, centered on the circle (default: 1). Outline circles only (fill: false).",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "circle",
      +        "description": "Circle element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "cx",
      +      "cy",
      +      "radius"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Straight line element, 1px wide unless strokeWidth is set.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "color": {
      +            "description": "Color keyframes (hex or named), interpolated through RGB; each frame's value stands in for the element's color (on pixels, every point's color).",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Color at this frame.",
      +                  "type": [
      +                    "number",
      +                    "string",
      +                    "boolean"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "antialias": {
      +        "description": "Shade each pixel by how much of it the line covers, for smooth diagonals (default: false, hard pixel edges).",
      +        "type": "boolean"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Line color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "strokeWidth": {
      +        "description": "Line thickness in whole pixels, centered on the line (default: 1).",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "line",
      +        "description": "Line element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x0": {
      +        "description": "Start X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "x1": {
      +        "description": "End X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y0": {
      +        "description": "Start Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y1": {
      +        "description": "End Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x0",
      +      "y0",
      +      "x1",
      +      "y1"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Horizontal progress bar widget.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element (no color track). Set either effect or animate, not both.",
      +        "properties": {
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "label": {
      +        "description": "Optional label rendered on the bar.",
      +        "type": "string"
      +      },
      +      "max": {
      +        "description": "Maximum value.",
      +        "type": "number"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Named palette for gradient fill.",
      +        "enum": [
      +          "ember",
      +          "ice",
      +          "neon",
      +          "fire",
      +          "lavender",
      +          "claude",
      +          "mono"
      +        ],
      +        "type": "string"
      +      },
      +      "trackColor": {
      +        "description": "Background track color.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "progress",
      +        "description": "Progress bar widget type.",
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Current value.",
      +        "type": "number"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h",
      +      "value",
      +      "max"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Sparkline chart widget (line or bar).",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "color": {
      +            "description": "Color keyframes (hex or named), interpolated through RGB; each frame's value stands in for the element's color (on pixels, every point's color).",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Color at this frame.",
      +                  "type": [
      +                    "number",
      +                    "string",
      +                    "boolean"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Line or bar color.",
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Data points for the chart.",
      +        "items": {
      +          "type": "number"
      +        },
      +        "minItems": 2,
      +        "type": "array"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "description": "Chart style (default: line).",
      +        "enum": [
      +          "line",
      +          "bar"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "sparkline",
      +        "description": "Sparkline chart widget type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Bitmap element using explicit palette indices.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element (no color track). Set either effect or animate, not both.",
      +        "properties": {
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Color palette: array of hex colors indexed 0-F.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "rows": {
      +        "description": "Row strings of hex palette indices (0-F, space = transparent).",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "bitmap",
      +        "description": "Bitmap element using palette indices.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "rows",
      +      "palette"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Sparse scatter of individually colored pixels.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "color": {
      +            "description": "Color keyframes (hex or named), interpolated through RGB; each frame's value stands in for the element's color (on pixels, every point's color).",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Color at this frame.",
      +                  "type": [
      +                    "number",
      +                    "string",
      +                    "boolean"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Array of pixel positions and colors.",
      +        "items": {
      +          "additionalProperties": false,
      +          "description": "A single pixel: position and color.",
      +          "properties": {
      +            "color": {
      +              "description": "Pixel color.",
      +              "type": "string"
      +            },
      +            "x": {
      +              "description": "Pixel X coordinate.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "y": {
      +              "description": "Pixel Y coordinate.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y",
      +            "color"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "pixels",
      +        "description": "Sparse pixel dots element.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "External image element (absolute local path or https URL).",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element (no color track). Set either effect or animate, not both.",
      +        "properties": {
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "finish": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": false,
      +            "description": "Reduce to a palette built from the image.",
      +            "properties": {
      +              "colors": {
      +                "description": "Build a palette of at most this many colors (2–256) from the image itself.",
      +                "maximum": 256,
      +                "minimum": 2,
      +                "type": "integer"
      +              },
      +              "dither": {
      +                "default": "none",
      +                "description": "How palette colors are placed: none maps each pixel to its nearest color; bayer4 mixes the two nearest in an ordered 4×4 pattern; floyd-steinberg diffuses the difference to neighboring pixels, smoothest on photos.",
      +                "enum": [
      +                  "none",
      +                  "bayer4",
      +                  "floyd-steinberg"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "colors"
      +            ],
      +            "type": "object"
      +          },
      +          {
      +            "additionalProperties": false,
      +            "description": "Reduce to a fixed palette.",
      +            "properties": {
      +              "dither": {
      +                "default": "none",
      +                "description": "How palette colors are placed: none maps each pixel to its nearest color; bayer4 mixes the two nearest in an ordered 4×4 pattern; floyd-steinberg diffuses the difference to neighboring pixels, smoothest on photos.",
      +                "enum": [
      +                  "none",
      +                  "bayer4",
      +                  "floyd-steinberg"
      +                ],
      +                "type": "string"
      +              },
      +              "palette": {
      +                "description": "Map every pixel to these colors (1–256 entries).",
      +                "items": {
      +                  "description": "Hex color (#RRGGBB or #RGB) or a named color.",
      +                  "type": "string"
      +                },
      +                "maxItems": 256,
      +                "minItems": 1,
      +                "type": "array"
      +              }
      +            },
      +            "required": [
      +              "palette"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "Reduce the image to a palette before it reaches the panel: exactly one of colors (2–256, built from the image) or palette (1–256 hex or named colors), plus dither. Transparent pixels stay unlit and are not counted. The preview shows the finished frame."
      +      },
      +      "fit": {
      +        "description": "Resize fit mode (default: contain).",
      +        "enum": [
      +          "contain",
      +          "cover",
      +          "fill"
      +        ],
      +        "type": "string"
      +      },
      +      "h": {
      +        "description": "Target height (default: canvas height).",
      +        "maximum": 256,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "kernel": {
      +        "description": "Resize kernel: nearest for pixel art, lanczos3 for photos (default: nearest).",
      +        "enum": [
      +          "nearest",
      +          "lanczos3",
      +          "mitchell"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "source": {
      +        "description": "Absolute local file path or https (not http) URL; a relative path is rejected.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "image",
      +        "description": "Image element (absolute local path or https URL).",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Target width (default: canvas width).",
      +        "maximum": 256,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X offset on canvas (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y offset on canvas (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "Sprite sheet element for character or tile art.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": false,
      +        "description": "Raw keyframe animation map for this element (no color track). Set either effect or animate, not both.",
      +        "properties": {
      +          "dx": {
      +            "description": "X offset keyframes in pixels, added to dx and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "dy": {
      +            "description": "Y offset keyframes in pixels, added to dy and interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "opacity": {
      +            "description": "Opacity keyframes 0–100, interpolated between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Value at this frame: a number, or a numeric string such as \"40\" read as that number.",
      +                  "type": [
      +                    "number",
      +                    "string"
      +                  ]
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          },
      +          "visible": {
      +            "description": "Visibility keyframes: true or false, switching at the midpoint between keyframes.",
      +            "items": {
      +              "items": false,
      +              "maxItems": 2,
      +              "minItems": 2,
      +              "prefixItems": [
      +                {
      +                  "description": "Frame index.",
      +                  "type": "number"
      +                },
      +                {
      +                  "description": "Whether the element shows at this frame.",
      +                  "type": "boolean"
      +                }
      +              ],
      +              "type": "array"
      +            },
      +            "minItems": 1,
      +            "type": "array"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "blend": {
      +        "description": "How the element combines with what lies beneath it (default: normal, drawn over it). add sums the light of both, clamped at full brightness — for glows and light beams; screen brightens more gently; multiply darkens.",
      +        "enum": [
      +          "normal",
      +          "add",
      +          "screen",
      +          "multiply"
      +        ],
      +        "type": "string"
      +      },
      +      "bodyColor": {
      +        "description": "Override body color.",
      +        "type": "string"
      +      },
      +      "cols": {
      +        "description": "Number of columns in the sprite grid.",
      +        "maximum": 64,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "darkColor": {
      +        "description": "Override dark/eye color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "additionalProperties": false,
      +        "description": "Named animation preset for this element. Set either effect or animate, not both.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity. float, scroll-left, scroll-right, drift: movement in pixels (default 2). pulse, twinkle: 0–1 depth of the opacity dip below 100 (default 0.5 and 0.6). Other effects ignore it.",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "path": {
      +        "description": "Absolute local path to the sprite sheet image; a relative path is rejected.",
      +        "type": "string"
      +      },
      +      "rows": {
      +        "description": "Number of rows in the sprite grid.",
      +        "maximum": 64,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "scale": {
      +        "description": "Pixel scale factor: each sprite cell renders as a scale × scale block.",
      +        "maximum": 64,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "sprite",
      +        "description": "Sprite sheet element.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position (default: center)."
      +      },
      +      "y": {
      +        "description": "Y position (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "path",
      +      "cols",
      +      "rows"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `device_unreachable`: Device is not reachable over the network. `device_http_error`: The device answered with a non-2xx HTTP status (retryable for 408, 429, 500, and 502–504). `device_rejected`: Device firmware returned a non-zero error code. `no_device_configured`: PIXOO_IP is not set and push was requested. `asset_not_found`: An image or sprite path could not be read. `invalid_color`: A color value could not be resolved. `unknown_icon`: Icon name not found in the registry. `invalid_output_path`: The output path is relative or contains traversal segments. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `device_unreachable`: Device is not reachable over the network. `device_http_error`: The device answered with a non-2xx HTTP status (retryable for 408, 429, 500, and 502–504). `device_rejected`: Device firmware returned a non-zero error code. `no_device_configured`: PIXOO_IP is not set and push was requested. `asset_not_found`: An image source or sprite path could not be read, a sprite path was a URL, or an image URL could not be fetched. `invalid_image`: An image source or sprite path was read but did not decode as an image. `invalid_color`: A color value could not be resolved. `unknown_icon`: Icon name not found in the registry. `invalid_output_path`: The output path is relative or contains traversal segments. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "device_unreachable",
      -  "device_http_error",
      -  "device_rejected",
      -  "no_device_configured",
      -  "asset_not_found",
      -  "invalid_color",
      -  "unknown_icon",
      -  "invalid_output_path"
      -]New value: +[
      +  "device_unreachable",
      +  "device_http_error",
      +  "device_rejected",
      +  "no_device_configured",
      +  "asset_not_found",
      +  "invalid_image",
      +  "invalid_color",
      +  "unknown_icon",
      +  "invalid_output_path"
      +]
    • changedOutput schema / properties / layout / items / properties / action / description
      Previous value: -"Overflow action taken by the renderer."New value: +"Always none: scene elements are placed as given and never refit, shrunk, or scrolled. Read fits to learn whether an element runs off the panel."
    • changedOutput schema / properties / layout / items / properties / action / enum
      Previous value: -[
      -  "none",
      -  "shrunk-to-compact",
      -  "scrolling",
      -  "wrapped",
      -  "truncated",
      -  "clipped"
      -]New value: +[
      +  "none"
      +]
    • removedOutput schema / properties / layout / items / properties / element / anyOf
      Removed value: -[
      -  {
      -    "description": "Zero-based index of the element in the input array.",
      -    "type": "number"
      -  },
      -  {
      -    "const": "background",
      -    "type": "string"
      -  }
      -]
    • changedOutput schema / properties / layout / items / properties / element / description
      Previous value: -"Element index or \"background\" for the background layer."New value: +"Zero-based index of the element in the input array."
    • addedOutput schema / properties / layout / items / properties / element / type
      Added value: +"number"
    • changedOutput schema / properties / layout / items / properties / font / enum
      Previous value: -[
      -  "standard",
      -  "compact"
      -]New value: +[
      +  "standard",
      +  "compact",
      +  "numerals"
      +]
  2. Changed4 schema fields changedv1.2.0
    • changedInput schema / properties / output / description
      Previous value: -"Absolute, already-normalized path to save the first frame to, in addition to the PIXOO_OUTPUT_DIR auto-save when that is configured. Both paths are reported in outputFiles."New value: +"Absolute, already-normalized path to save the first frame to as a PNG. Replaces the PIXOO_OUTPUT_DIR auto-save for this call, so outputFiles holds only this path."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `device_unreachable`: Device is not reachable over the network. `device_rejected`: Device firmware returned a non-zero error code. `no_device_configured`: PIXOO_IP is not set and push was requested. `asset_not_found`: An image or sprite path could not be read. `invalid_color`: A color value could not be resolved. `unknown_icon`: Icon name not found in the registry. `invalid_output_path`: The output path is relative or contains traversal segments. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `device_unreachable`: Device is not reachable over the network. `device_http_error`: The device answered with a non-2xx HTTP status (retryable for 408, 429, 500, and 502–504). `device_rejected`: Device firmware returned a non-zero error code. `no_device_configured`: PIXOO_IP is not set and push was requested. `asset_not_found`: An image or sprite path could not be read. `invalid_color`: A color value could not be resolved. `unknown_icon`: Icon name not found in the registry. `invalid_output_path`: The output path is relative or contains traversal segments. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "device_unreachable",
      -  "device_rejected",
      -  "no_device_configured",
      -  "asset_not_found",
      -  "invalid_color",
      -  "unknown_icon",
      -  "invalid_output_path"
      -]New value: +[
      +  "device_unreachable",
      +  "device_http_error",
      +  "device_rejected",
      +  "no_device_configured",
      +  "asset_not_found",
      +  "invalid_color",
      +  "unknown_icon",
      +  "invalid_output_path"
      +]
    • changedOutput schema / properties / outputFiles / description
      Previous value: -"Absolute paths to saved output files (PNG for static, GIF for animations). Present only when PIXOO_OUTPUT_DIR is configured or output is set."New value: +"Absolute paths to saved output files: the output path when set, otherwise the PIXOO_OUTPUT_DIR auto-save (PNG for static, GIF for animations). Absent when neither applies."
  3. Changed1 schema field changedv1.1.2
    • changedInput schema / properties / elements / items / oneOf
      Previous value: -[
      -  {
      -    "description": "Styled text element rendered at a position.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Flat text color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "font": {
      -        "description": "Font variant.",
      -        "enum": [
      -          "standard",
      -          "compact"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "style": {
      -        "description": "Text style options.",
      -        "properties": {
      -          "color": {
      -            "description": "Flat color override.",
      -            "type": "string"
      -          },
      -          "outline": {
      -            "description": "1px outline.",
      -            "type": "boolean"
      -          },
      -          "palette": {
      -            "anyOf": [
      -              {
      -                "description": "Named built-in color palette for the vertical ramp.",
      -                "enum": [
      -                  "ember",
      -                  "ice",
      -                  "neon",
      -                  "fire",
      -                  "lavender",
      -                  "claude",
      -                  "mono"
      -                ],
      -                "type": "string"
      -              },
      -              {
      -                "description": "Custom gradient stop: specify top and bottom colors directly.",
      -                "properties": {
      -                  "from": {
      -                    "description": "Top color.",
      -                    "type": "string"
      -                  },
      -                  "to": {
      -                    "description": "Bottom color.",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "from",
      -                  "to"
      -                ],
      -                "type": "object"
      -              }
      -            ],
      -            "description": "Palette name or custom gradient stop for vertical color ramp."
      -          },
      -          "scale": {
      -            "description": "Integer pixel scale multiplier.",
      -            "maximum": 8,
      -            "minimum": 1,
      -            "type": "integer"
      -          },
      -          "shadow": {
      -            "description": "Drop shadow.",
      -            "type": "boolean"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "text": {
      -        "description": "Text content to render.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "text",
      -        "description": "Text element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position (default: 0)."
      -      },
      -      "y": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel Y coordinate (0 = top edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic vertical alignment.",
      -            "enum": [
      -              "top",
      -              "center",
      -              "bottom"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Y position (default: 0)."
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Built-in or custom SVG icon element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Icon fill color.",
      -        "type": "string"
      -      },
      -      "d": {
      -        "description": "Custom SVG path d attribute.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Render height in pixels (default: 12).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "name": {
      -        "description": "Built-in icon name (see pixoo://reference/icons).",
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Named palette for colored icon.",
      -        "enum": [
      -          "ember",
      -          "ice",
      -          "neon",
      -          "fire",
      -          "lavender",
      -          "claude",
      -          "mono"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "icon",
      -        "description": "Icon element type.",
      -        "type": "string"
      -      },
      -      "viewBox": {
      -        "description": "SVG viewBox string (default: \"0 0 16 16\").",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Render width in pixels (default: 12).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position."
      -      },
      -      "y": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel Y coordinate (0 = top edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic vertical alignment.",
      -            "enum": [
      -              "top",
      -              "center",
      -              "bottom"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Y position."
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Filled or gradient rectangle element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "borderColor": {
      -        "description": "1px border color.",
      -        "type": "string"
      -      },
      -      "color": {
      -        "description": "Fill color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "gradient": {
      -        "description": "Gradient fill.",
      -        "properties": {
      -          "from": {
      -            "description": "Start color.",
      -            "type": "string"
      -          },
      -          "to": {
      -            "description": "End color.",
      -            "type": "string"
      -          },
      -          "type": {
      -            "description": "v = vertical, h = horizontal.",
      -            "enum": [
      -              "v",
      -              "h"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "type",
      -          "from",
      -          "to"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "rect",
      -        "description": "Rectangle element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Filled or outline circle element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Circle color.",
      -        "type": "string"
      -      },
      -      "cx": {
      -        "description": "Center X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "cy": {
      -        "description": "Center Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "fill": {
      -        "description": "Filled or outline only (default: true).",
      -        "type": "boolean"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "radius": {
      -        "description": "Radius in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "circle",
      -        "description": "Circle element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "cx",
      -      "cy",
      -      "radius"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Single-pixel line element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Line color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "line",
      -        "description": "Line element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x0": {
      -        "description": "Start X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x1": {
      -        "description": "End X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y0": {
      -        "description": "Start Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y1": {
      -        "description": "End Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x0",
      -      "y0",
      -      "x1",
      -      "y1"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Horizontal progress bar widget.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "label": {
      -        "description": "Optional label rendered on the bar.",
      -        "type": "string"
      -      },
      -      "max": {
      -        "description": "Maximum value.",
      -        "type": "number"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Named palette for gradient fill.",
      -        "enum": [
      -          "ember",
      -          "ice",
      -          "neon",
      -          "fire",
      -          "lavender",
      -          "claude",
      -          "mono"
      -        ],
      -        "type": "string"
      -      },
      -      "trackColor": {
      -        "description": "Background track color.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "progress",
      -        "description": "Progress bar widget type.",
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Current value.",
      -        "type": "number"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h",
      -      "value",
      -      "max"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sparkline chart widget (line or bar).",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Line or bar color.",
      -        "type": "string"
      -      },
      -      "data": {
      -        "description": "Data points for the chart.",
      -        "items": {
      -          "type": "number"
      -        },
      -        "minItems": 2,
      -        "type": "array"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "kind": {
      -        "description": "Chart style (default: line).",
      -        "enum": [
      -          "line",
      -          "bar"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "sparkline",
      -        "description": "Sparkline chart widget type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Bitmap element using explicit palette indices.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Color palette: array of hex colors indexed 0-F.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "rows": {
      -        "description": "Row strings of hex palette indices (0-F, space = transparent).",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "bitmap",
      -        "description": "Bitmap element using palette indices.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "rows",
      -      "palette"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sparse scatter of individually colored pixels.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "data": {
      -        "description": "Array of pixel positions and colors.",
      -        "items": {
      -          "description": "A single pixel: position and color.",
      -          "properties": {
      -            "color": {
      -              "description": "Pixel color.",
      -              "type": "string"
      -            },
      -            "x": {
      -              "description": "Pixel X coordinate.",
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            "y": {
      -              "description": "Pixel Y coordinate.",
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y",
      -            "color"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "pixels",
      -        "description": "Sparse pixel dots element.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "External image element (local path or https URL).",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "fit": {
      -        "description": "Resize fit mode (default: contain).",
      -        "enum": [
      -          "contain",
      -          "cover",
      -          "fill"
      -        ],
      -        "type": "string"
      -      },
      -      "h": {
      -        "description": "Target height (default: canvas height).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "kernel": {
      -        "description": "Resize kernel: nearest for pixel art, lanczos3 for photos (default: nearest).",
      -        "enum": [
      -          "nearest",
      -          "lanczos3",
      -          "mitchell"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "source": {
      -        "description": "Absolute local file path or https (not http) URL.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "image",
      -        "description": "Image element (local path or https URL).",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Target width (default: canvas width).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X offset on canvas (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y offset on canvas (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sprite sheet element for character or tile art.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "prefixItems": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "bodyColor": {
      -        "description": "Override body color.",
      -        "type": "string"
      -      },
      -      "cols": {
      -        "description": "Number of columns in the sprite grid.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "darkColor": {
      -        "description": "Override dark/eye color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "path": {
      -        "description": "Absolute local path to the sprite sheet image.",
      -        "type": "string"
      -      },
      -      "rows": {
      -        "description": "Number of rows in the sprite grid.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "scale": {
      -        "description": "Pixel scale factor.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "sprite",
      -        "description": "Sprite sheet element.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position (default: center)."
      -      },
      -      "y": {
      -        "description": "Y position (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "path",
      -      "cols",
      -      "rows"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "Styled text element rendered at a position.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Flat text color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "font": {
      +        "description": "Font variant.",
      +        "enum": [
      +          "standard",
      +          "compact"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "style": {
      +        "description": "Text style options.",
      +        "properties": {
      +          "color": {
      +            "description": "Flat color override.",
      +            "type": "string"
      +          },
      +          "outline": {
      +            "description": "1px outline.",
      +            "type": "boolean"
      +          },
      +          "palette": {
      +            "anyOf": [
      +              {
      +                "description": "Named built-in color palette for the vertical ramp.",
      +                "enum": [
      +                  "ember",
      +                  "ice",
      +                  "neon",
      +                  "fire",
      +                  "lavender",
      +                  "claude",
      +                  "mono"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "description": "Custom gradient stop: specify top and bottom colors directly.",
      +                "properties": {
      +                  "from": {
      +                    "description": "Top color.",
      +                    "type": "string"
      +                  },
      +                  "to": {
      +                    "description": "Bottom color.",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "from",
      +                  "to"
      +                ],
      +                "type": "object"
      +              }
      +            ],
      +            "description": "Palette name or custom gradient stop for vertical color ramp."
      +          },
      +          "scale": {
      +            "description": "Integer pixel scale multiplier.",
      +            "maximum": 8,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "shadow": {
      +            "description": "Drop shadow.",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "Text content to render.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "text",
      +        "description": "Text element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position (default: 0)."
      +      },
      +      "y": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel Y coordinate (0 = top edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic vertical alignment.",
      +            "enum": [
      +              "top",
      +              "center",
      +              "bottom"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Y position (default: 0)."
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Built-in or custom SVG icon element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Icon fill color.",
      +        "type": "string"
      +      },
      +      "d": {
      +        "description": "Custom SVG path d attribute.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Render height in pixels (default: 12).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "name": {
      +        "description": "Built-in icon name (see pixoo://reference/icons).",
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Named palette for colored icon.",
      +        "enum": [
      +          "ember",
      +          "ice",
      +          "neon",
      +          "fire",
      +          "lavender",
      +          "claude",
      +          "mono"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "icon",
      +        "description": "Icon element type.",
      +        "type": "string"
      +      },
      +      "viewBox": {
      +        "description": "SVG viewBox string (default: \"0 0 16 16\").",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Render width in pixels (default: 12).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position."
      +      },
      +      "y": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel Y coordinate (0 = top edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic vertical alignment.",
      +            "enum": [
      +              "top",
      +              "center",
      +              "bottom"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Y position."
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Filled or gradient rectangle element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "borderColor": {
      +        "description": "1px border color.",
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Fill color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "gradient": {
      +        "description": "Gradient fill.",
      +        "properties": {
      +          "from": {
      +            "description": "Start color.",
      +            "type": "string"
      +          },
      +          "to": {
      +            "description": "End color.",
      +            "type": "string"
      +          },
      +          "type": {
      +            "description": "v = vertical, h = horizontal.",
      +            "enum": [
      +              "v",
      +              "h"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "from",
      +          "to"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "rect",
      +        "description": "Rectangle element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Filled or outline circle element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Circle color.",
      +        "type": "string"
      +      },
      +      "cx": {
      +        "description": "Center X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "cy": {
      +        "description": "Center Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "fill": {
      +        "description": "Filled or outline only (default: true).",
      +        "type": "boolean"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "radius": {
      +        "description": "Radius in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "circle",
      +        "description": "Circle element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "cx",
      +      "cy",
      +      "radius"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Single-pixel line element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Line color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "line",
      +        "description": "Line element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x0": {
      +        "description": "Start X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "x1": {
      +        "description": "End X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y0": {
      +        "description": "Start Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y1": {
      +        "description": "End Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x0",
      +      "y0",
      +      "x1",
      +      "y1"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Horizontal progress bar widget.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "label": {
      +        "description": "Optional label rendered on the bar.",
      +        "type": "string"
      +      },
      +      "max": {
      +        "description": "Maximum value.",
      +        "type": "number"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Named palette for gradient fill.",
      +        "enum": [
      +          "ember",
      +          "ice",
      +          "neon",
      +          "fire",
      +          "lavender",
      +          "claude",
      +          "mono"
      +        ],
      +        "type": "string"
      +      },
      +      "trackColor": {
      +        "description": "Background track color.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "progress",
      +        "description": "Progress bar widget type.",
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Current value.",
      +        "type": "number"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h",
      +      "value",
      +      "max"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Sparkline chart widget (line or bar).",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Line or bar color.",
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Data points for the chart.",
      +        "items": {
      +          "type": "number"
      +        },
      +        "minItems": 2,
      +        "type": "array"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "description": "Chart style (default: line).",
      +        "enum": [
      +          "line",
      +          "bar"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "sparkline",
      +        "description": "Sparkline chart widget type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Bitmap element using explicit palette indices.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Color palette: array of hex colors indexed 0-F.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "rows": {
      +        "description": "Row strings of hex palette indices (0-F, space = transparent).",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "bitmap",
      +        "description": "Bitmap element using palette indices.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "rows",
      +      "palette"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Sparse scatter of individually colored pixels.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "data": {
      +        "description": "Array of pixel positions and colors.",
      +        "items": {
      +          "description": "A single pixel: position and color.",
      +          "properties": {
      +            "color": {
      +              "description": "Pixel color.",
      +              "type": "string"
      +            },
      +            "x": {
      +              "description": "Pixel X coordinate.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "y": {
      +              "description": "Pixel Y coordinate.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y",
      +            "color"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "pixels",
      +        "description": "Sparse pixel dots element.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "External image element (local path or https URL).",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "fit": {
      +        "description": "Resize fit mode (default: contain).",
      +        "enum": [
      +          "contain",
      +          "cover",
      +          "fill"
      +        ],
      +        "type": "string"
      +      },
      +      "h": {
      +        "description": "Target height (default: canvas height).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "kernel": {
      +        "description": "Resize kernel: nearest for pixel art, lanczos3 for photos (default: nearest).",
      +        "enum": [
      +          "nearest",
      +          "lanczos3",
      +          "mitchell"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "source": {
      +        "description": "Absolute local file path or https (not http) URL.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "image",
      +        "description": "Image element (local path or https URL).",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Target width (default: canvas width).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X offset on canvas (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y offset on canvas (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Sprite sheet element for character or tile art.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "items": false,
      +            "maxItems": 2,
      +            "minItems": 2,
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "description": "Value at this frame.",
      +                "type": [
      +                  "number",
      +                  "string",
      +                  "boolean"
      +                ]
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "bodyColor": {
      +        "description": "Override body color.",
      +        "type": "string"
      +      },
      +      "cols": {
      +        "description": "Number of columns in the sprite grid.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "darkColor": {
      +        "description": "Override dark/eye color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "path": {
      +        "description": "Absolute local path to the sprite sheet image.",
      +        "type": "string"
      +      },
      +      "rows": {
      +        "description": "Number of rows in the sprite grid.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "scale": {
      +        "description": "Pixel scale factor.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "sprite",
      +        "description": "Sprite sheet element.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position (default: center)."
      +      },
      +      "y": {
      +        "description": "Y position (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "path",
      +      "cols",
      +      "rows"
      +    ],
      +    "type": "object"
      +  }
      +]
  4. Changed10 schema fields changedv1.1.1
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / elements / items / oneOf
      Previous value: -[
      -  {
      -    "description": "Styled text element rendered at a position.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Flat text color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "font": {
      -        "description": "Font variant.",
      -        "enum": [
      -          "standard",
      -          "compact"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "style": {
      -        "description": "Text style options.",
      -        "properties": {
      -          "color": {
      -            "description": "Flat color override.",
      -            "type": "string"
      -          },
      -          "outline": {
      -            "description": "1px outline.",
      -            "type": "boolean"
      -          },
      -          "palette": {
      -            "anyOf": [
      -              {
      -                "description": "Named built-in color palette for the vertical ramp.",
      -                "enum": [
      -                  "ember",
      -                  "ice",
      -                  "neon",
      -                  "fire",
      -                  "lavender",
      -                  "claude",
      -                  "mono"
      -                ],
      -                "type": "string"
      -              },
      -              {
      -                "description": "Custom gradient stop: specify top and bottom colors directly.",
      -                "properties": {
      -                  "from": {
      -                    "description": "Top color.",
      -                    "type": "string"
      -                  },
      -                  "to": {
      -                    "description": "Bottom color.",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "from",
      -                  "to"
      -                ],
      -                "type": "object"
      -              }
      -            ],
      -            "description": "Palette name or custom gradient stop for vertical color ramp."
      -          },
      -          "scale": {
      -            "description": "Integer pixel scale multiplier.",
      -            "maximum": 8,
      -            "minimum": 1,
      -            "type": "integer"
      -          },
      -          "shadow": {
      -            "description": "Drop shadow.",
      -            "type": "boolean"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "text": {
      -        "description": "Text content to render.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "text",
      -        "description": "Text element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position (default: 0)."
      -      },
      -      "y": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel Y coordinate (0 = top edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic vertical alignment.",
      -            "enum": [
      -              "top",
      -              "center",
      -              "bottom"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Y position (default: 0)."
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "text"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Built-in or custom SVG icon element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Icon fill color.",
      -        "type": "string"
      -      },
      -      "d": {
      -        "description": "Custom SVG path d attribute.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Render height in pixels (default: 12).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "name": {
      -        "description": "Built-in icon name (see pixoo://reference/icons).",
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Named palette for colored icon.",
      -        "enum": [
      -          "ember",
      -          "ice",
      -          "neon",
      -          "fire",
      -          "lavender",
      -          "claude",
      -          "mono"
      -        ],
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "icon",
      -        "description": "Icon element type.",
      -        "type": "string"
      -      },
      -      "viewBox": {
      -        "description": "SVG viewBox string (default: \"0 0 16 16\").",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Render width in pixels (default: 12).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position."
      -      },
      -      "y": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel Y coordinate (0 = top edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic vertical alignment.",
      -            "enum": [
      -              "top",
      -              "center",
      -              "bottom"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "Y position."
      -      }
      -    },
      -    "required": [
      -      "type"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Filled or gradient rectangle element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "borderColor": {
      -        "description": "1px border color.",
      -        "type": "string"
      -      },
      -      "color": {
      -        "description": "Fill color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "gradient": {
      -        "description": "Gradient fill.",
      -        "properties": {
      -          "from": {
      -            "description": "Start color.",
      -            "type": "string"
      -          },
      -          "to": {
      -            "description": "End color.",
      -            "type": "string"
      -          },
      -          "type": {
      -            "description": "v = vertical, h = horizontal.",
      -            "enum": [
      -              "v",
      -              "h"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "type",
      -          "from",
      -          "to"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "rect",
      -        "description": "Rectangle element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Filled or outline circle element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Circle color.",
      -        "type": "string"
      -      },
      -      "cx": {
      -        "description": "Center X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "cy": {
      -        "description": "Center Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "fill": {
      -        "description": "Filled or outline only (default: true).",
      -        "type": "boolean"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "radius": {
      -        "description": "Radius in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "circle",
      -        "description": "Circle element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "cx",
      -      "cy",
      -      "radius"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Single-pixel line element.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Line color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "line",
      -        "description": "Line element type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x0": {
      -        "description": "Start X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x1": {
      -        "description": "End X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y0": {
      -        "description": "Start Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y1": {
      -        "description": "End Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x0",
      -      "y0",
      -      "x1",
      -      "y1"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Horizontal progress bar widget.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "label": {
      -        "description": "Optional label rendered on the bar.",
      -        "type": "string"
      -      },
      -      "max": {
      -        "description": "Maximum value.",
      -        "type": "number"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Named palette for gradient fill.",
      -        "enum": [
      -          "ember",
      -          "ice",
      -          "neon",
      -          "fire",
      -          "lavender",
      -          "claude",
      -          "mono"
      -        ],
      -        "type": "string"
      -      },
      -      "trackColor": {
      -        "description": "Background track color.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "progress",
      -        "description": "Progress bar widget type.",
      -        "type": "string"
      -      },
      -      "value": {
      -        "description": "Current value.",
      -        "type": "number"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h",
      -      "value",
      -      "max"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sparkline chart widget (line or bar).",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "color": {
      -        "description": "Line or bar color.",
      -        "type": "string"
      -      },
      -      "data": {
      -        "description": "Data points for the chart.",
      -        "items": {
      -          "type": "number"
      -        },
      -        "minItems": 2,
      -        "type": "array"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "h": {
      -        "description": "Height in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "kind": {
      -        "description": "Chart style (default: line).",
      -        "enum": [
      -          "line",
      -          "bar"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "sparkline",
      -        "description": "Sparkline chart widget type.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Width in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": 2,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "w",
      -      "h",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Bitmap element using explicit palette indices.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "palette": {
      -        "description": "Color palette: array of hex colors indexed 0-F.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "rows": {
      -        "description": "Row strings of hex palette indices (0-F, space = transparent).",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "type": {
      -        "const": "bitmap",
      -        "description": "Bitmap element using palette indices.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "description": "X coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y coordinate.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "x",
      -      "y",
      -      "rows",
      -      "palette"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sparse scatter of individually colored pixels.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "data": {
      -        "description": "Array of pixel positions and colors.",
      -        "items": {
      -          "description": "A single pixel: position and color.",
      -          "properties": {
      -            "color": {
      -              "description": "Pixel color.",
      -              "type": "string"
      -            },
      -            "x": {
      -              "description": "Pixel X coordinate.",
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            },
      -            "y": {
      -              "description": "Pixel Y coordinate.",
      -              "maximum": 9007199254740991,
      -              "minimum": -9007199254740991,
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "x",
      -            "y",
      -            "color"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "pixels",
      -        "description": "Sparse pixel dots element.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "data"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "External image element (local path or https URL).",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "fit": {
      -        "description": "Resize fit mode (default: contain).",
      -        "enum": [
      -          "contain",
      -          "cover",
      -          "fill"
      -        ],
      -        "type": "string"
      -      },
      -      "h": {
      -        "description": "Target height (default: canvas height).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "kernel": {
      -        "description": "Resize kernel: nearest for pixel art, lanczos3 for photos (default: nearest).",
      -        "enum": [
      -          "nearest",
      -          "lanczos3",
      -          "mitchell"
      -        ],
      -        "type": "string"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "source": {
      -        "description": "Absolute local file path or https (not http) URL.",
      -        "type": "string"
      -      },
      -      "type": {
      -        "const": "image",
      -        "description": "Image element (local path or https URL).",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "w": {
      -        "description": "Target width (default: canvas width).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "x": {
      -        "description": "X offset on canvas (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "y": {
      -        "description": "Y offset on canvas (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "source"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "description": "Sprite sheet element for character or tile art.",
      -    "properties": {
      -      "animate": {
      -        "additionalProperties": {
      -          "description": "Keyframe entries: [[frame, value], ...].",
      -          "items": {
      -            "items": [
      -              {
      -                "description": "Frame index.",
      -                "type": "number"
      -              },
      -              {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "boolean"
      -                  }
      -                ],
      -                "description": "Value at this frame."
      -              }
      -            ],
      -            "type": "array"
      -          },
      -          "type": "array"
      -        },
      -        "description": "Raw keyframe animation map for this element.",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      },
      -      "bodyColor": {
      -        "description": "Override body color.",
      -        "type": "string"
      -      },
      -      "cols": {
      -        "description": "Number of columns in the sprite grid.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "darkColor": {
      -        "description": "Override dark/eye color.",
      -        "type": "string"
      -      },
      -      "dx": {
      -        "description": "X offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "dy": {
      -        "description": "Y offset nudge in pixels.",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      },
      -      "effect": {
      -        "description": "Named animation preset for this element.",
      -        "properties": {
      -          "amplitude": {
      -            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      -            "type": "number"
      -          },
      -          "name": {
      -            "description": "Named animation preset.",
      -            "enum": [
      -              "float",
      -              "scroll-left",
      -              "scroll-right",
      -              "pulse",
      -              "blink",
      -              "twinkle",
      -              "drift",
      -              "fade-in",
      -              "fade-out"
      -            ],
      -            "type": "string"
      -          },
      -          "period": {
      -            "description": "Effect period in frames. Defaults to total scene frame count.",
      -            "type": "number"
      -          },
      -          "phase": {
      -            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "name"
      -        ],
      -        "type": "object"
      -      },
      -      "opacity": {
      -        "description": "Opacity 0–100 (default: 100).",
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "path": {
      -        "description": "Absolute local path to the sprite sheet image.",
      -        "type": "string"
      -      },
      -      "rows": {
      -        "description": "Number of rows in the sprite grid.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "scale": {
      -        "description": "Pixel scale factor.",
      -        "maximum": 9007199254740991,
      -        "minimum": 1,
      -        "type": "integer"
      -      },
      -      "type": {
      -        "const": "sprite",
      -        "description": "Sprite sheet element.",
      -        "type": "string"
      -      },
      -      "visible": {
      -        "description": "Whether the element is visible (default: true).",
      -        "type": "boolean"
      -      },
      -      "x": {
      -        "anyOf": [
      -          {
      -            "description": "Absolute pixel X coordinate (0 = left edge).",
      -            "type": "number"
      -          },
      -          {
      -            "description": "Semantic horizontal alignment.",
      -            "enum": [
      -              "left",
      -              "center",
      -              "right"
      -            ],
      -            "type": "string"
      -          }
      -        ],
      -        "description": "X position (default: center)."
      -      },
      -      "y": {
      -        "description": "Y position (default: 0).",
      -        "maximum": 9007199254740991,
      -        "minimum": -9007199254740991,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "path",
      -      "cols",
      -      "rows"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "description": "Styled text element rendered at a position.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Flat text color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "font": {
      +        "description": "Font variant.",
      +        "enum": [
      +          "standard",
      +          "compact"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "style": {
      +        "description": "Text style options.",
      +        "properties": {
      +          "color": {
      +            "description": "Flat color override.",
      +            "type": "string"
      +          },
      +          "outline": {
      +            "description": "1px outline.",
      +            "type": "boolean"
      +          },
      +          "palette": {
      +            "anyOf": [
      +              {
      +                "description": "Named built-in color palette for the vertical ramp.",
      +                "enum": [
      +                  "ember",
      +                  "ice",
      +                  "neon",
      +                  "fire",
      +                  "lavender",
      +                  "claude",
      +                  "mono"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "description": "Custom gradient stop: specify top and bottom colors directly.",
      +                "properties": {
      +                  "from": {
      +                    "description": "Top color.",
      +                    "type": "string"
      +                  },
      +                  "to": {
      +                    "description": "Bottom color.",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "from",
      +                  "to"
      +                ],
      +                "type": "object"
      +              }
      +            ],
      +            "description": "Palette name or custom gradient stop for vertical color ramp."
      +          },
      +          "scale": {
      +            "description": "Integer pixel scale multiplier.",
      +            "maximum": 8,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "shadow": {
      +            "description": "Drop shadow.",
      +            "type": "boolean"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "text": {
      +        "description": "Text content to render.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "text",
      +        "description": "Text element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position (default: 0)."
      +      },
      +      "y": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel Y coordinate (0 = top edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic vertical alignment.",
      +            "enum": [
      +              "top",
      +              "center",
      +              "bottom"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Y position (default: 0)."
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Built-in or custom SVG icon element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Icon fill color.",
      +        "type": "string"
      +      },
      +      "d": {
      +        "description": "Custom SVG path d attribute.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Render height in pixels (default: 12).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "name": {
      +        "description": "Built-in icon name (see pixoo://reference/icons).",
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Named palette for colored icon.",
      +        "enum": [
      +          "ember",
      +          "ice",
      +          "neon",
      +          "fire",
      +          "lavender",
      +          "claude",
      +          "mono"
      +        ],
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "icon",
      +        "description": "Icon element type.",
      +        "type": "string"
      +      },
      +      "viewBox": {
      +        "description": "SVG viewBox string (default: \"0 0 16 16\").",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Render width in pixels (default: 12).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position."
      +      },
      +      "y": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel Y coordinate (0 = top edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic vertical alignment.",
      +            "enum": [
      +              "top",
      +              "center",
      +              "bottom"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "Y position."
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Filled or gradient rectangle element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "borderColor": {
      +        "description": "1px border color.",
      +        "type": "string"
      +      },
      +      "color": {
      +        "description": "Fill color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "gradient": {
      +        "description": "Gradient fill.",
      +        "properties": {
      +          "from": {
      +            "description": "Start color.",
      +            "type": "string"
      +          },
      +          "to": {
      +            "description": "End color.",
      +            "type": "string"
      +          },
      +          "type": {
      +            "description": "v = vertical, h = horizontal.",
      +            "enum": [
      +              "v",
      +              "h"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "type",
      +          "from",
      +          "to"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "rect",
      +        "description": "Rectangle element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Filled or outline circle element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Circle color.",
      +        "type": "string"
      +      },
      +      "cx": {
      +        "description": "Center X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "cy": {
      +        "description": "Center Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "fill": {
      +        "description": "Filled or outline only (default: true).",
      +        "type": "boolean"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "radius": {
      +        "description": "Radius in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "circle",
      +        "description": "Circle element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "cx",
      +      "cy",
      +      "radius"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Single-pixel line element.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Line color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "line",
      +        "description": "Line element type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x0": {
      +        "description": "Start X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "x1": {
      +        "description": "End X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y0": {
      +        "description": "Start Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y1": {
      +        "description": "End Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x0",
      +      "y0",
      +      "x1",
      +      "y1"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Horizontal progress bar widget.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "label": {
      +        "description": "Optional label rendered on the bar.",
      +        "type": "string"
      +      },
      +      "max": {
      +        "description": "Maximum value.",
      +        "type": "number"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Named palette for gradient fill.",
      +        "enum": [
      +          "ember",
      +          "ice",
      +          "neon",
      +          "fire",
      +          "lavender",
      +          "claude",
      +          "mono"
      +        ],
      +        "type": "string"
      +      },
      +      "trackColor": {
      +        "description": "Background track color.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "progress",
      +        "description": "Progress bar widget type.",
      +        "type": "string"
      +      },
      +      "value": {
      +        "description": "Current value.",
      +        "type": "number"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h",
      +      "value",
      +      "max"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Sparkline chart widget (line or bar).",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "color": {
      +        "description": "Line or bar color.",
      +        "type": "string"
      +      },
      +      "data": {
      +        "description": "Data points for the chart.",
      +        "items": {
      +          "type": "number"
      +        },
      +        "minItems": 2,
      +        "type": "array"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "h": {
      +        "description": "Height in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "kind": {
      +        "description": "Chart style (default: line).",
      +        "enum": [
      +          "line",
      +          "bar"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "sparkline",
      +        "description": "Sparkline chart widget type.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Width in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": 2,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "w",
      +      "h",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Bitmap element using explicit palette indices.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "palette": {
      +        "description": "Color palette: array of hex colors indexed 0-F.",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "rows": {
      +        "description": "Row strings of hex palette indices (0-F, space = transparent).",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "type": {
      +        "const": "bitmap",
      +        "description": "Bitmap element using palette indices.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "description": "X coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y coordinate.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "x",
      +      "y",
      +      "rows",
      +      "palette"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Sparse scatter of individually colored pixels.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "data": {
      +        "description": "Array of pixel positions and colors.",
      +        "items": {
      +          "description": "A single pixel: position and color.",
      +          "properties": {
      +            "color": {
      +              "description": "Pixel color.",
      +              "type": "string"
      +            },
      +            "x": {
      +              "description": "Pixel X coordinate.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            "y": {
      +              "description": "Pixel Y coordinate.",
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "x",
      +            "y",
      +            "color"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "pixels",
      +        "description": "Sparse pixel dots element.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "data"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "External image element (local path or https URL).",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "fit": {
      +        "description": "Resize fit mode (default: contain).",
      +        "enum": [
      +          "contain",
      +          "cover",
      +          "fill"
      +        ],
      +        "type": "string"
      +      },
      +      "h": {
      +        "description": "Target height (default: canvas height).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "kernel": {
      +        "description": "Resize kernel: nearest for pixel art, lanczos3 for photos (default: nearest).",
      +        "enum": [
      +          "nearest",
      +          "lanczos3",
      +          "mitchell"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "source": {
      +        "description": "Absolute local file path or https (not http) URL.",
      +        "type": "string"
      +      },
      +      "type": {
      +        "const": "image",
      +        "description": "Image element (local path or https URL).",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "w": {
      +        "description": "Target width (default: canvas width).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "description": "X offset on canvas (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "y": {
      +        "description": "Y offset on canvas (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "source"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "description": "Sprite sheet element for character or tile art.",
      +    "properties": {
      +      "animate": {
      +        "additionalProperties": {
      +          "description": "Keyframe entries: [[frame, value], ...].",
      +          "items": {
      +            "prefixItems": [
      +              {
      +                "description": "Frame index.",
      +                "type": "number"
      +              },
      +              {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "boolean"
      +                  }
      +                ],
      +                "description": "Value at this frame."
      +              }
      +            ],
      +            "type": "array"
      +          },
      +          "type": "array"
      +        },
      +        "description": "Raw keyframe animation map for this element.",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "bodyColor": {
      +        "description": "Override body color.",
      +        "type": "string"
      +      },
      +      "cols": {
      +        "description": "Number of columns in the sprite grid.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "darkColor": {
      +        "description": "Override dark/eye color.",
      +        "type": "string"
      +      },
      +      "dx": {
      +        "description": "X offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "dy": {
      +        "description": "Y offset nudge in pixels.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      },
      +      "effect": {
      +        "description": "Named animation preset for this element.",
      +        "properties": {
      +          "amplitude": {
      +            "description": "Effect intensity: pixels of movement for float/scroll/drift, 0–1 scale for fade/pulse. Default varies by effect (float: 2px).",
      +            "type": "number"
      +          },
      +          "name": {
      +            "description": "Named animation preset.",
      +            "enum": [
      +              "float",
      +              "scroll-left",
      +              "scroll-right",
      +              "pulse",
      +              "blink",
      +              "twinkle",
      +              "drift",
      +              "fade-in",
      +              "fade-out"
      +            ],
      +            "type": "string"
      +          },
      +          "period": {
      +            "description": "Effect period in frames. Defaults to total scene frame count.",
      +            "type": "number"
      +          },
      +          "phase": {
      +            "description": "Phase offset 0–1 to stagger this element relative to others (0.5 = half-cycle offset).",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "name"
      +        ],
      +        "type": "object"
      +      },
      +      "opacity": {
      +        "description": "Opacity 0–100 (default: 100).",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "path": {
      +        "description": "Absolute local path to the sprite sheet image.",
      +        "type": "string"
      +      },
      +      "rows": {
      +        "description": "Number of rows in the sprite grid.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "scale": {
      +        "description": "Pixel scale factor.",
      +        "maximum": 9007199254740991,
      +        "minimum": 1,
      +        "type": "integer"
      +      },
      +      "type": {
      +        "const": "sprite",
      +        "description": "Sprite sheet element.",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "Whether the element is visible (default: true).",
      +        "type": "boolean"
      +      },
      +      "x": {
      +        "anyOf": [
      +          {
      +            "description": "Absolute pixel X coordinate (0 = left edge).",
      +            "type": "number"
      +          },
      +          {
      +            "description": "Semantic horizontal alignment.",
      +            "enum": [
      +              "left",
      +              "center",
      +              "right"
      +            ],
      +            "type": "string"
      +          }
      +        ],
      +        "description": "X position (default: center)."
      +      },
      +      "y": {
      +        "description": "Y position (default: 0).",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "path",
      +      "cols",
      +      "rows"
      +    ],
      +    "type": "object"
      +  }
      +]
    • changedInput schema / properties / output / description
      Previous value: -"Explicit output file path for saving (overrides PIXOO_OUTPUT_DIR)."New value: +"Absolute, already-normalized path to save the first frame to, in addition to the PIXOO_OUTPUT_DIR auto-save when that is configured. Both paths are reported in outputFiles."
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "pushed",
      +      "frames",
      +      "layout"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `device_unreachable`: Device is not reachable over the network. `device_rejected`: Device firmware returned a non-zero error code. `no_device_configured`: PIXOO_IP is not set and push was requested. `asset_not_found`: An image or sprite path could not be read. `invalid_color`: A color value could not be resolved. `unknown_icon`: Icon name not found in the registry. `invalid_output_path`: The output path is relative or contains traversal segments. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "device_unreachable",
      +            "device_rejected",
      +            "no_device_configured",
      +            "asset_not_found",
      +            "invalid_color",
      +            "unknown_icon",
      +            "invalid_output_path"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / properties / previewData
      Removed value: -{
      -  "description": "Base64-encoded PNG preview of the rendered scene (8× upscaled, 512px). For animations: the middle frame.",
      -  "type": "string"
      -}
    • removedOutput schema / properties / previewMimeType
      Removed value: -{
      -  "description": "MIME type of the preview image.",
      -  "enum": [
      -    "image/png"
      -  ],
      -  "type": "string"
      -}
    • removedOutput schema / required
      Removed value: -[
      -  "pushed",
      -  "frames",
      -  "layout"
      -]
  5. First observedv1.0.0

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false. The description adds the back-to-front render order and the image-content-block return, but it omits the most consequential behavioral fact: the schema's push parameter defaults to true, meaning this writes to the physical device. With annotations covering the safety profile, the remaining disclosure is partial, so a 3 fits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with purpose before return format and routing. Every sentence carries information, though the ordering note slightly duplicates the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema and annotations present, the description needs to cover routing and side effects. Routing is excellent; the notable gap is not flagging that the default push=true sends the scene to the device, which matters for a tool that also writes output files.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter, including the elements array's back-to-front ordering. The description's ordering sentence duplicates the schema rather than adding new syntax or constraint detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Compose) and resource (full scene) and enumerates the layered element kinds it accepts (text, icons, widgets, shapes, bitmaps, images, sprites). It explicitly routes text-only work to pixoo_display_text, so an agent can distinguish it from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit alternatives and the conditions that select them: use pixoo_display_text for text-only display, and run pixoo_design_brief with topic "scene" or "dashboard" for layout/palette guidance. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.