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"
+ }
+]