### RenderRequest (top level)
- width: int | None — default None. Output width in pixels. Must be set together with `height` or both omitted.
- height: int | None — default None. Output height in pixels. Must be set together with `width` or both omitted.
- duration: float | None — default None. Total composition duration in seconds. Inferred from elements when omitted.
- frame_rate: int | None — default None. Frames per second. When set, the output encodes at exactly this rate. Defaults to 30 when omitted.
- output_format: OutputFormat — default 'mp4'. Container and codec for the output file.
- background_color: str — default '#000000ff'. RGBA background color in hex format (#RRGGBBAA).
- background_image_url: HttpUrl | None — default None. URL of an image to use as the composition background.
- alpha: bool — default False. When true, produce an alpha-channel (transparent background) output. Requires `output_format=webm` or `output_format=mov`.
- elements: list[VideoElement | AudioElement | TextElement | ImageElement | ShapeElement] — default []. Ordered list of timeline elements (video, image, text, audio, etc.).
- transitions: list[Transition] — default []. Transition effects applied between consecutive elements.
- groups: list[Group] — default []. Transform groups over member elements (compose member→group→parent; optional stack layout). §5.
- motion_blur: MotionBlur | None — default None. Shutter-based motion blur over the whole composition (§5c). Graphics motion smears; video holds its decoded frame within the shutter (as in AE). Opt-in and costly: accumulation is CPU-side, so the render falls back to software encoding — expect roughly `samples`× render time.
- background_gradient: Gradient | None — default None. Canvas-sized gradient fill behind every layer (§6). Rendered for the full output slice. Accepts a Gradient object or a CSS `linear-gradient(...)` string.
- watermark_url: HttpUrl | None — default None. Watermark image overlaid on the output (§6).
- custom_animations: CustomAnimationRegistry | None — default None. Inline custom-animation definitions (§3), registered with the engine before any element is built. Reference an `element` entry by name via `motion[].custom` on any video/image/shape element or group; reference a `text` entry via a text element's `animation_preset` or `motion[].custom`. The catalog stops being a ceiling — anything expressible as keyframes is expressible in the request.
### Transition
- type: TransitionType — REQUIRED. Transition effect applied between two video elements (transitions are video-only).
- duration: float — REQUIRED. Transition duration in seconds.
- from_id: str | None — default None. ID of the outgoing video element (omit for the very first transition).
- to_id: str | None — default None. ID of the incoming video element (omit for the very last transition).
- z_index: int | None — default None. **Deprecated — ignored by the renderer.** The transition draws at its linked videos' position; the engine reads no z key on a transition. Accepted for backward compatibility only.
### VideoElement (type: "video")
- lut_url: HttpUrl | None — default None.
- lut_intensity: float — default 100.
- brightness: float — default 0. Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.
- contrast: float — default 0.
- saturation: float — default 0.
- exposure: float — default 0.
- sharpness: float — default 0.
- blur: float — default 0.
- noise: float — default 0.
- vignette: float — default 0.
- hue_rotate: float — default 0.
- temperature: float — default 0. White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.
- tint: float — default 0. White balance magenta (+) / green (−), −1..1; 0 = no-op.
- vibrance: float — default 0. Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.
- highlights: float — default 0. Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.
- shadows: float — default 0. Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.
- crop_top: float — default 0.
- crop_bottom: float — default 0.
- crop_left: float — default 0.
- crop_right: float — default 0.
- border_radius: int | float | str | CornerRadiiPx — default 0. Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).
- border_color: str | None — default None.
- border_width: int | float | str — default 0. Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.
- shadow_color: str | None — default None.
- shadow_blur: int | float | str — default 0. Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.
- shadow_x: int | float | str — default 0. Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.
- shadow_y: int | float | str — default 0. Vertical shadow offset in pixels. See `shadow_x`.
- blend_mode: BlendMode — default 'none'.
- mask_shape: MaskShape | None — default None.
- mask: MaskConfig | None — default None.
- mask_keyframes: list[MaskKeyframe] | None — default None.
- matte: Matte | None — default None.
- backdrop_blur: int | float | str — default 0.
- x: int | float | str — default '50%'.
- y: int | float | str — default '50%'.
- width: int | float | str — default '100%'. Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.
- height: int | float | str — default '100%'. Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.
- aspect_ratio: float | None — default None. **Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.
- x_anchor: int | float | str — default '50%'. Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.
- y_anchor: int | float | str — default '50%'. Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.
- x_rotation: int | float | str — default '0°'.
- y_rotation: int | float | str — default '0°'.
- z_rotation: int | float | str — default '0°'.
- x_scale: int | float | str — default '100%'.
- y_scale: int | float | str — default '100%'.
- flip_horizontal: bool — default False.
- flip_vertical: bool — default False.
- opacity: float — default 100.
- z_index: int | None — default None. Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.
- clip: bool — default False.
- color_overlay: str | None — default None. **Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.
- type: Literal['video'] — default 'video'.
- id: str | None — default None. Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.
- name: str | None — default None. Optional human-readable label. Not used by the renderer.
- track: int | None — default None. Timeline track index (0–255). Informational only; not used by the renderer.
- time: float | None — default None. When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.
- visible: bool — default True. Set to `false` to skip this element without removing it from the request.
- source_url: HttpUrl — REQUIRED. URL of the video file — MP4, MOV or WebM only; any other extension is rejected at submit. Must be accessible by the renderer.
- in_point: float | None — default None. In point — seconds into the source file to start playing from. Defaults to `0`.
- out_point: float | None — default None. Out point — seconds into the source file to stop playing. Defaults to end of source when omitted. Controls clip length on the timeline.
- speed: float — default 1.0. Playback speed. `1.0` = normal speed, `2.0` = 2× (half duration), `0.5` = half speed (double duration).
- playback_rate_keyframes: list[RateKeyframe] | None — default None. Speed ramp (§5c): piecewise-linear playback-rate keyframes (absolute timeline seconds; rate 0 = freeze; at most 512 keyframes — the renderer truncates beyond that). Audio keeps the static rate — mute or detach it on ramped clips.
- volume: float — default 100. Embedded audio volume as a percentage (0–100). Affects only the audio track inside this video clip.
- fade_in_duration: float — default 0. Duration in seconds of a linear audio fade-in at the clip's start.
- fade_out_duration: float — default 0. Duration in seconds of a linear audio fade-out at the clip's end.
- effects: list[Effect] — default [].
- motion: list[Motion] — default [].
### AudioElement (type: "audio")
- type: Literal['audio'] — default 'audio'.
- id: str | None — default None. Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.
- name: str | None — default None. Optional human-readable label. Not used by the renderer.
- track: int | None — default None. Timeline track index (0–255). Informational only; not used by the renderer.
- time: float | None — default None. When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.
- visible: bool — default True. Set to `false` to skip this element. Audio has no picture — `false` drops the whole track from the render, it does not mute or hide it (the linter reports that as `AUDIO_HIDDEN`). There is no keep-but-silence value: `volume` must be > 0.
- source_url: HttpUrl — REQUIRED. URL of the audio file. Must be accessible by the renderer.
- in_point: float | None — default None. In point — seconds into the source file to start from. Defaults to `0`.
- out_point: float | None — default None. Out point — seconds into the source file to stop. Defaults to end of source when omitted. Controls clip length on the timeline.
- speed: float — default 1.0. Playback speed. `1.0` = normal speed, `2.0` = 2× speed.
- volume: float — default 100. Audio volume as a percentage (1–100). **Must be greater than 0** — the renderer silently drops audio streams with `volume <= 0`.
- fade_in_duration: float — default 0. Duration in seconds of a linear audio fade-in at the clip's start.
- fade_out_duration: float — default 0. Duration in seconds of a linear audio fade-out at the clip's end.
### TextElement (type: "text")
- border_radius: int | float | str | CornerRadiiPx — default 0. Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).
- border_color: str | None — default None.
- border_width: int | float | str — default 0. Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.
- shadow_color: str | None — default None.
- shadow_blur: int | float | str — default 0. Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.
- shadow_x: int | float | str — default 0. Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.
- shadow_y: int | float | str — default 0. Vertical shadow offset in pixels. See `shadow_x`.
- x: int | float | str — default '50%'.
- y: int | float | str — default '50%'.
- width: int | float | str — default '100%'. Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.
- height: int | float | str — default '100%'. Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.
- aspect_ratio: float | None — default None. **Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.
- x_anchor: int | float | str — default '50%'. Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.
- y_anchor: int | float | str — default '50%'. Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.
- x_rotation: int | float | str — default '0°'.
- y_rotation: int | float | str — default '0°'.
- z_rotation: int | float | str — default '0°'.
- x_scale: int | float | str — default '100%'.
- y_scale: int | float | str — default '100%'.
- flip_horizontal: bool — default False.
- flip_vertical: bool — default False.
- opacity: float — default 100.
- z_index: int | None — default None. Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.
- clip: bool — default False.
- color_overlay: str | None — default None. **Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.
- type: Literal['text'] — default 'text'.
- id: str | None — default None. Unique identifier for this element. **Required on image elements** — an empty or missing ID causes the image to be silently skipped by the renderer. Recommended on all elements that are referenced by a transition.
- name: str | None — default None. Optional human-readable label. Not used by the renderer.
- track: int | None — default None. Timeline track index (0–255). Informational only; not used by the renderer.
- time: float | None — default None. When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.
- visible: bool — default True. Set to `false` to skip this element without removing it from the request.
- duration: float — REQUIRED. **Required.** Duration in seconds the text is visible. Omitting this field produces a zero-length window and the element will not appear in the render.
- text: str — REQUIRED. The text content to render.
- font_family: str — default 'Inter'. Font family name. Must be available to the renderer.
- font_size: float — default 16. Font size in pixels.
- font_weight: int — default 400. Font weight (100–900). The renderer has no variable weights: `600` and above render **bold**, everything below renders regular. Composes with `font_style` (italic + ≥600 = bold italic).
- font_style: Literal['normal', 'italic', 'bold', 'bolditalic'] — default 'normal'. Font style variant.
- text_color: str — default '#ffffff'. Text fill color as a hex string.
- text_align: Literal['left', 'center', 'right'] — default 'center'. Horizontal text alignment.
- text_direction: Literal['ltr', 'rtl'] — default 'ltr'. Text direction. `rtl` for right-to-left scripts (§4).
- text_decoration: Literal['none', 'underline', 'strikethrough'] — default 'none'. Text decoration. Only `none` renders. `underline` is reachable only per word — `words[].style.underline` — and `strikethrough` has no renderer path at all; both are rejected here (422) rather than silently dropped. Draw a strike-through as a thin `shape` rectangle over the text.
- tracking: float — default 0. Letter spacing (tracking) in pixels (converted to the renderer's width-relative unit on the wire). Positive values add space between characters.
- leading: float — default 1.2. Line height (leading) as a multiplier of font size. `1.2` = 20% taller than the font size.
- stroke_color: str | None — default None. Outline color. Set together with `stroke_width` to enable text outlines.
- stroke_width: float — default 0. Outline width, em-relative (fraction of `font_size` — e.g. `0.05` = 5% of the font size). Has no effect unless `stroke_color` is also set.
- background_color: str | None — default None. Secondary colour. Fills the box behind the text when `background` is `true`, **and** is the highlight colour for `word_animation.style` `color` (the active word) and `box` (the box) — those two styles require it.
- background_opacity: float — default 100.
- x_padding: int | float | str — default 0.
- y_padding: int | float | str — default 0.
- background: bool — default False. Solid color box behind the full text block. Set `background_color` to choose the color.
- stroke: bool — default False. Outline-only mode — draws the glyph stroke with no fill. Requires `stroke_color` and `stroke_width`. When `false`, setting `stroke_color` + `stroke_width` gives fill + stroke (outlined).
- shadow: bool — default False. Built-in drop shadow.
- motion: list[Motion] — default [].
- word_animation: WordAnimation | None — default None. Word-level animation style with per-word timestamps. When provided, this takes precedence over the `animation_preset` field.
- words: list[WordSpec] | None — default None. Per-word timing and optional per-word style overrides (§4). Emitted as a top-level `words[]` array; use alongside `motion`/`animation_preset` for the animation. Editorial-emphasis captions = word timings + a styled keyword.
- counter: ValueCounter | None — default None. Rewrite this text from an eased numeric sweep (§4). Takes precedence over countdown on the same element.
- glow: TextGlow | None — default None. Soft glow around the glyphs (§4).
- text_wrap: Literal['wrap', 'nowrap'] — default 'wrap'.
- animation_preset: str | None — default None. Renderer text-animation name (e.g. `'typewriter'`) — a catalog text animation or a `custom_animations.text` entry. Runs for the whole element window with per-glyph timings computed by the renderer. Use `motion[]` (with `type` or `custom`) for structured timing control — but not both. Ignored when `word_animation` is set.
### ImageElement (type: "image")
- lut_url: HttpUrl | None — default None.
- lut_intensity: float — default 100.
- brightness: float — default 0. Brightness, -100..100, applied as a 0..2 colour multiplier (0 = no change). `-100` multiplies by 0: the element renders pure black while keeping its alpha — a silhouette of the artwork. Combine a `brightness: -100` copy of an image with `blur`, reduced `opacity` and a small offset, stacked beneath the real one, to fake the content-shaped drop shadow `shadow_x`/`shadow_y` cannot produce.
- contrast: float — default 0.
- saturation: float — default 0.
- exposure: float — default 0.
- sharpness: float — default 0.
- blur: float — default 0.
- noise: float — default 0.
- vignette: float — default 0.
- hue_rotate: float — default 0.
- temperature: float — default 0. White balance warm (+) / cool (−), −1..1; 0 = no-op. Applied as a channel matrix, after the classic brightness/contrast chain.
- tint: float — default 0. White balance magenta (+) / green (−), −1..1; 0 = no-op.
- vibrance: float — default 0. Saturation boost weighted toward muted colours, −1..1; 0 = no-op. Boosts flat colour without wrecking skin tones.
- highlights: float — default 0. Luma-masked tone lift of the brightest range, −1..1; 0 = no-op.
- shadows: float — default 0. Luma-masked tone lift of the darkest range, −1..1; 0 = no-op.
- crop_top: float — default 0.
- crop_bottom: float — default 0.
- crop_left: float — default 0.
- crop_right: float — default 0.
- border_radius: int | float | str | CornerRadiiPx — default 0. Corner radius in pixels — a single value, or per-corner `{top_left, top_right, bottom_right, bottom_left}` for asymmetric corners (e.g. a card rounded only on top). The renderer normalizes px to a 0–1 fraction of the element's shorter side (≈ half the shorter side is fully rounded) and clamps to that range. For shape elements use `corner_radius` (already 0–1).
- border_color: str | None — default None.
- border_width: int | float | str — default 0. Border thickness in pixels (converted to the renderer's relative border scale against the element's shorter side, so it survives resizes). The border outlines the element's border_radius-rounded quad — not the image's alpha silhouette.
- shadow_color: str | None — default None.
- shadow_blur: int | float | str — default 0. Shadow softness, 0–100 (renderer blur-strength scale, not pixels): 0 = hard edge, 100 = maximum blur. Values are clamped to that range.
- shadow_x: int | float | str — default 0. Horizontal shadow offset in pixels (converted to the renderer's relative offset scale). The shadow silhouette is the element's border_radius-rounded quad, not the content alpha — a cut-out PNG gets a card shadow, not an outline-shaped one. On a cut-out that reads as a floating rectangle (rotated with the element, which is the tell). For a shadow that follows the artwork, drop these fields and stack a second copy of the same image underneath at `brightness: -100` (a black silhouette, alpha preserved) with `blur` and reduced `opacity`, offset a few percent — see `brightness`.
- shadow_y: int | float | str — default 0. Vertical shadow offset in pixels. See `shadow_x`.
- blend_mode: BlendMode — default 'none'.
- mask_shape: MaskShape | None — default None.
- mask: MaskConfig | None — default None.
- mask_keyframes: list[MaskKeyframe] | None — default None.
- matte: Matte | None — default None.
- backdrop_blur: int | float | str — default 0.
- x: int | float | str — default '50%'.
- y: int | float | str — default '50%'.
- width: int | float | str — default '100%'. Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.
- height: int | float | str — default '100%'. Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.
- aspect_ratio: float | None — default None. **Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.
- x_anchor: int | float | str — default '50%'. Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.
- y_anchor: int | float | str — default '50%'. Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.
- x_rotation: int | float | str — default '0°'.
- y_rotation: int | float | str — default '0°'.
- z_rotation: int | float | str — default '0°'.
- x_scale: int | float | str — default '100%'.
- y_scale: int | float | str — default '100%'.
- flip_horizontal: bool — default False.
- flip_vertical: bool — default False.
- opacity: float — default 100.
- z_index: int | None — default None. Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.
- clip: bool — default False.
- color_overlay: str | None — default None. **Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.
- type: Literal['image'] — default 'image'.
- id: str — REQUIRED. **Required.** Unique identifier for this image. An empty or missing ID causes the image to be silently skipped by the renderer.
- name: str | None — default None. Optional human-readable label. Not used by the renderer.
- track: int | None — default None. Timeline track index (0–255). Informational only; not used by the renderer.
- time: float | None — default None. When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.
- visible: bool — default True. Set to `false` to skip this element without removing it from the request.
- duration: float — REQUIRED. **Required.** Duration in seconds the image is visible. Omitting this field produces a zero-length window and the image will not appear in the render.
- source_url: HttpUrl — REQUIRED. URL of the image file (PNG, JPG, WebP, GIF, SVG). `.svg` assets rasterize in-process on the renderer — flat fills and stroke icons (Lucide/Feather-style) work; gradients, text and filters inside the SVG do not (pre-rasterize those to PNG).
- effects: list[Effect] — default [].
- motion: list[Motion] — default [].
### ShapeElement (type: "shape")
- blend_mode: BlendMode — default 'none'.
- mask_shape: MaskShape | None — default None.
- mask: MaskConfig | None — default None.
- mask_keyframes: list[MaskKeyframe] | None — default None.
- matte: Matte | None — default None.
- backdrop_blur: int | float | str — default 0.
- x: int | float | str — default '50%'.
- y: int | float | str — default '50%'.
- width: int | float | str — default '100%'. Box width. Together with `height` this is a **cover** box, not a fit box: sized media (video, image) scales to fill it and the overflow is **cropped** — it is never letterboxed. A box whose aspect ratio differs from the source's therefore silently cuts the source's edges. To show a source whole, match the box aspect to it: on a `W`x`H` canvas, for a source of aspect `a`, `width% = a * height% * (H/W)` — e.g. a 1024x1536 asset (a=0.667) on 1920x1080 needs `width% = 0.375 * height%`. Percentages are of the canvas, not the parent.
- height: int | float | str — default '100%'. Box height. See `width` — the pair is a cover box and crops rather than letterboxes. Percentages are of the canvas.
- aspect_ratio: float | None — default None. **Accepted but ignored — the renderer never receives this field.** It does NOT constrain or correct the `width`/`height` box, so it cannot be used to stop a mismatched box from cropping the source; size the box per `width` instead. Kept for backward compatibility.
- x_anchor: int | float | str — default '50%'. Horizontal pivot the element **rotates** about, measured across its own box (`0%` = left edge, `50%` = centre, `100%` = right edge; px values are an offset from the left edge). This is a pivot, not an alignment — `x` always places the element's centre, so the anchor changes nothing on an unrotated element. Honored on video, image and shape; text and the generator elements rotate about their centre and reject a non-default anchor.
- y_anchor: int | float | str — default '50%'. Vertical pivot the element **rotates** about, measured across its own box (`0%` = top edge, `50%` = centre, `100%` = bottom edge). Same rules as `x_anchor`: a pivot, not an alignment.
- x_rotation: int | float | str — default '0°'.
- y_rotation: int | float | str — default '0°'.
- z_rotation: int | float | str — default '0°'.
- x_scale: int | float | str — default '100%'.
- y_scale: int | float | str — default '100%'.
- flip_horizontal: bool — default False.
- flip_vertical: bool — default False.
- opacity: float — default 100.
- z_index: int | None — default None. Stacking order (higher = on top). When omitted, elements stack in array order — later elements render above earlier ones (painter's rule); text defaults one layer above non-text. Set explicit values only when array order isn't the order you want.
- clip: bool — default False.
- color_overlay: str | None — default None. **Not supported by the renderer — setting this is rejected.** A strict submit returns `unsupported_feature` (422) and a dry-run reports it as a blocking violation; there is no native tint field to map it onto. To darken an element use `brightness` (`-100` is a black silhouette); to lay a colour over one, stack a `shape` with a flat or gradient `fill` above it.
- type: Literal['shape'] — default 'shape'.
- id: str — REQUIRED. **Required.** Unique identifier.
- name: str | None — default None. Optional human-readable label. Not used by the renderer.
- track: int | None — default None. Timeline track index (0–255). Informational only; not used by the renderer.
- time: float | None — default None. When this element starts on the output timeline, in seconds. Defaults to `0` when omitted.
- visible: bool — default True. Set to `false` to skip this element without removing it from the request.
- duration: float — REQUIRED. **Required.** Seconds the shape is visible.
- path: str — REQUIRED. SVG path `d` (M L H V C S Q T Z; arcs straighten).
- view_box: list[float] — default [0.0, 0.0, 100.0, 100.0]. `[x, y, width, height]` path coordinate space.
- fill: str | Literal['none'] | Gradient — default '#000000'. Fill: a hex colour (alpha ok), `"none"` for outline-only, a Gradient object (`{kind, angle_degrees, center, stops}`, ≥2 stops), or a CSS `linear-gradient(...)` / `radial-gradient(...)` string, which is normalised to the Gradient object at validation — read back, the composition holds the object. A gradient fill on a rectangular path is how you draw a gradient card, bar or pill — there is no separate `gradient` element. The gradient paints the shape's own path, so it fills any silhouette — a triangle, a blob, an icon outline, a morphing path — and layers on the same element with `stroke` / `stroke_width` / `stroke_dash`, `path_keyframes` (morph), `trim` / `trim_keyframes` (draw-on), `blend_mode`, `mask_shape` / `mask` / `mask_keyframes`, `matte` and `backdrop_blur`. `fill_rule`, `corner_radius` and `opacity` behave with a gradient exactly as they do with a flat colour.
- fill_rule: Literal['nonzero', 'evenodd'] — default 'nonzero'.
- stroke: str | None — default None. Stroke colour.
- stroke_width: float | None — default None. Stroke width in viewBox units (absent = SVG 1.0; 0 disables).
- stroke_dash: list[float] | None — default None. `[on, off]` dash lengths in viewBox units. Trim applies before dash, so a dashed path can draw itself on without the pattern re-flowing.
- corner_radius: float | CornerRadii — default 0. Corner radius, normalized 0–1 — a single value or per-corner `{top_left, top_right, bottom_right, bottom_left}`.
- shadow: DropShadow | None — default None. Optional drop shadow. `distance`/`blur` are the renderer's 0–100 strength scale, not pixels — see DropShadow.
- path_keyframes: list[PathKeyframe] | None — default None. Morph the path between keyframes (timeline seconds).
- trim: TrimPath | None — default None. Static trim window: keep only this arc-length fraction of each subpath.
- trim_keyframes: list[TrimKeyframe] | None — default None. Animate the trim window (timeline seconds) — the draw-on: animate `end` 0→1 on a stroked path to draw a signature, underline or chart line. Absent `start`/`end` inherit the static `trim`.
- effects: list[Effect] — default []. Shader effect chain (§6 W3).
- motion: list[Motion] — default [].
### AnimationKeyframe
- time: float — REQUIRED. Fraction of the animation (0–1).
- easing: str | None — default None. Easing into this keyframe — any `easings` catalog name (`quad_out`, `expo_in_out`, `hold`, …). Unknown names are rejected. A `bezier`/`spring`/`back`/`elastic` sub-object overrides it.
- bezier: BezierEasing | None — default None.
- spring: SpringEasing | None — default None.
- back: BackEasing | None — default None.
- elastic: ElasticEasing | None — default None.
- translate: Point | None — default None.
- path: SpatialPath | None — default None. Curve the translate into this keyframe along a cubic bezier (`c1`/`c2` control points).
- scale: float | ScaleXY | None — default None. Uniform scale factor, or `{x, y}` for non-uniform scale.
- rotate: float | None — default None. In-plane (z) rotation, degrees.
- rotation: RotationXYZ | None — default None. Full 3D rotation `{x, y, z}` (degrees); overrides `rotate`. Non-zero x/y = animated perspective tilt.
- opacity: float | None — default None.
- color: str | None — default None. Colour tint at this keyframe (multiplied with the element). An 8-digit hex alpha composes with `opacity` — when both are set, `opacity` wins for the alpha channel.
- blur: float | None — default None. Per-glyph blur amount (fraction of the em). Text registries only.
### AudioGenerator
- feature: Literal['amplitude', 'bass', 'mid', 'high', 'beat'] — default 'amplitude'.
- scale: float — default 0. Scale offset per unit feature.
- opacity: float — default 0. Opacity offset per unit feature.
- translate: Point | None — default None. Translate offset per unit feature.
- rotate: float — default 0. Rotation offset (degrees) per unit feature.
### BackEasing
- overshoot: float — default 1.70158. Overshoot amount; AE default 1.70158.
- dir: Literal['in', 'out'] — default 'out'. 'in' anticipates, 'out' overshoots.
### BezierEasing
- x1: float — default 0.0.
- y1: float — default 0.0.
- x2: float — default 1.0.
- y2: float — default 1.0.
### ChromaKeyProps
- key_color: str — default '#00FF00'. The colour to key out. Green-screen green by default.
- threshold: float — default 0.1. Chroma distance from `key_color` below which a pixel is fully transparent. Raise it if fringes of the screen survive.
- smoothness: float — default 0.15. Width of the ramp from transparent to opaque, starting at `threshold`. Raise it to soften hard edges; 0 gives a hard cut.
- spill_suppress: float — default 0.5. How strongly surviving pixels near the key colour are pulled toward their own luma, removing green spill on hair and edges. 0 disables.
### CornerRadii
- top_left: float — default 0.
- top_right: float — default 0.
- bottom_right: float — default 0.
- bottom_left: float — default 0.
### CornerRadiiPx
- top_left: int | float | str — default 0.
- top_right: int | float | str — default 0.
- bottom_right: int | float | str — default 0.
- bottom_left: int | float | str — default 0.
### CustomAnimation
- name: str — REQUIRED. Reference name (reserved/catalog-shadowing names are rejected).
- keyframes: list[AnimationKeyframe] — REQUIRED.
- group: Literal['block', 'word', 'glyph'] — default 'block'. What the animation repeats over: the whole text block, each word, or each glyph. Required for `selector` to shape anything — a selector over a single block has nothing to range across. Text registries only.
- selector: RangeSelector | None — default None. AE-style range selector: shape this animation's amount by position along the text (§4, W2). Set `group` to `word` or `glyph` alongside it. Text registries only.
### CustomAnimationRegistry
- element: list[CustomAnimation] — default [].
- text: list[CustomAnimation] — default [].
### DropShadow
- color: str — REQUIRED.
- distance: float — default 0. Shadow offset **strength**, 0–100 on the renderer's own scale — **not pixels**. The rendered offset is `distance × 0.0005 × the element's shorter side`, so on a 400px-tall card `60` drops the shadow 12px while a px-looking `8` drops it 1.6px, and on a 200px chip that same `8` is 0.8px — invisible. Author 60–70 (what the reference scenes use) and it scales with the element; for a specific N px offset use `distance = N ÷ (0.0005 × shorter_side_px)`. Must be > 0: distance 0 is skipped by the renderer entirely. For pixel-unit shadows use `shadow_x`/`shadow_y` on video/image elements.
- direction: float — default 90. Shadow direction in degrees (polar; 90 = down).
- blur: float — default 0. Shadow softness, 0–100 on the renderer's blur-strength scale — **not** a pixel radius, and unlike `distance` it does not scale with the element. `0` is a hard-edged offset copy (a legitimate poster look); 60–70 is the soft card shadow the reference scenes author. A px-looking `8` is a near-hard edge, not an 8px feather.
### Effect
- type: EffectType — REQUIRED.
- intensity: float — default 50.
- intensity_keyframes: list[IntensityKeyframe] | None — default None. Animate intensity over time (§2): piecewise-linear `[{time, value}]` in timeline seconds. Overrides the static `intensity` when set.
- props: dict[str, float] | None — default None. Per-shader scalar props (§2), bound as `u_prop_<key>` (e.g. `{"speed": 0.6}` for aurora). Ignored for chroma_key (use `chroma_settings`).
- chroma_settings: ChromaKeyProps | None — default None.
### ElasticEasing
- amplitude: float — default 1.0. Ring amplitude.
- period: float — default 0.3. Ring period as a fraction of the segment.
- dir: Literal['in', 'out'] — default 'out'. 'in' rings before, 'out' after.
### Gradient
- kind: Literal['linear', 'radial'] — default 'linear'.
- angle_degrees: float — default 0. Linear gradient angle in degrees, measured counterclockwise with y up (mathematical convention): 0 = left→right (offset 0 at the left), 45 = bottom-left→top-right, 315 = top-left→bottom-right, and the same convention governs a shape's gradient `fill`. A numeric CSS angle is box-relative: `135deg` behaves as `to bottom right` whatever the card's shape; only 0/90/180/270 are pixel-exact.
- center: Point | None — default None. Radial focus point as fractions of the fill's box — the element box for a shape's gradient fill, the canvas for the background. `y` runs bottom-up (`{x: 0.5, y: 0}` is the bottom edge), the opposite of CSS `at 50% 100%`. Defaults to the centre; ignored for linear gradients. The renderer's radial is an ellipse inscribed in the box, reaching the last stop at the corners: it keeps that centred radius when the focus moves, rather than re-deriving it from the focus the way CSS `farthest-corner` does, so an off-centre focus imported from CSS completes its ramp earlier than a browser shows it. A CSS `circle` is drawn as that same ellipse, so it only comes out round on a square box.
- stops: list[GradientStop] — REQUIRED. Two or more colour stops.
### GradientStop
- offset: float — REQUIRED. Position along the gradient, 0–1.
- color: str — REQUIRED. Stop colour (hex, alpha supported).
### Group
- id: str — REQUIRED. **Required.** Unique group id.
- parent: str | None — default None. Parent group id for nesting.
- pivot: Point — default Point(x=0.5, y=0.5). Rotation/scale pivot.
- translate: Point | None — default None. Group translation (normalized).
- scale: float — default 1.0. Group scale.
- rotation_degrees: float — default 0.0. In-plane (z) rotation of the group.
- x_rotation: int | float | str — default '0°'. Perspective tilt (X axis) applied to each member's orientation about its own centre — the tilted card-gallery look.
- y_rotation: int | float | str — default '0°'. Perspective tilt (Y axis). See `x_rotation`.
- opacity: float — default 1.0. Group opacity.
- members: list[str] — default []. Member element uuids.
- animations: list[Motion] — default []. Animations driving the whole group about `pivot`. Translate, scale, rotation and colour all compose — that is how you move or resize a whole scene as one unit. Two channels do NOT: a preset that animates **clip** (`wipe_left/right/up/down`) or **crop** (`ken_burns_*`) is a silent no-op on a group, doing nothing at all rather than erroring — put those on a member element instead. Non-uniform scale is also flattened here: only the x component of a `custom_animations` `scale` keyframe is used, so `{x:2,y:1}` scales uniformly. Note `zoom_out` barely moves (scale 1.0->0.9 under a full fade), so it reads as a pure fade; for a real shrink use a `custom` entry with the scale travel you want, or the group's static `scale`.
- layout: StackLayout | None — default None. Optional stack layout.
### IntensityKeyframe
- time: float — REQUIRED. Absolute timeline seconds.
- value: float — REQUIRED. Effect intensity 0–1 at this time.
### MaskConfig
- feather: float — default 0. Soften the mask's SDF edge.
- scale: float — default 1.0. Mask scale (iris reveals).
- center: Point | None — default None. Mask centre (wipes).
### MaskKeyframe
- time: float — REQUIRED. Timeline seconds.
- feather: float | None — default None.
- scale: float | None — default None.
- center: Point | None — default None.
- easing: str | None — default None. Easing curve name — any `easings` catalog value (`linear`, `hold`, `ease_in_out`, `quad_out`, `expo_in_out`, `square_in_out` = step, …). Unknown names are rejected: the engine would silently fall back to linear. For spring/back/elastic/bezier use the sub-objects instead.
- spring: SpringEasing | None — default None.
- back: BackEasing | None — default None.
- elastic: ElasticEasing | None — default None.
- bezier: BezierEasing | None — default None.
### Matte
- source: str — REQUIRED. uuid of the source layer (auto-hidden). Text sources supported.
- mode: Literal['alpha', 'luma'] — default 'alpha'.
- invert: bool — default False.
### Motion
- type: MotionType | None — default None. Catalog preset. Exactly one of `type` or `custom` must be set.
- custom: str | None — default None. Name of a `custom_animations` entry to run instead of a catalog preset — the `element` registry for video/image/shape/group animations, the `text` registry for text. Exactly one of `type` or `custom` must be set.
- time: float — REQUIRED. Absolute start time on the output timeline in seconds. For entrances and loops set this to the element's `time`. For exits set this to element `time + duration − motion duration`. An entrance timed later than the element's own `time` leaves it fully rendered on screen until the entrance fires; the linter reports that as `ENTRANCE_AFTER_ELEMENT_START`.
- duration: float — REQUIRED. How long the animation runs in seconds.
- easing: Easing — default 'ease_in_out'. **Ignored by the renderer** — animation curves are baked into the preset's keyframes (or your `custom_animations` keyframes' `easing`). Kept for backward compatibility only.
- reversed: bool — default False. Run the preset's exit form instead of its entrance. Only presets that ship both forms accept it — `fade`, `slide_*`, `wipe_*`, `rotate_*`, `bounce`. Entrance-only presets have a separate exit-only type instead: use `zoom_out` (not `zoom_in` reversed), `evaporate` (not `blur`), `whip_down`, `drift_out`, `swing_out`, `elastic_drop` — those six set this flag for you. See `GET /v1/capabilities` `motion[].element_exit` for the per-preset truth.
- scope: MotionScope — default 'element'.
- delay: float — default 0. Seconds to wait before the animation starts (folded into the animation's start time on the wire — the engine has no standalone pre-start delay). On loop presets it spaces the repeats instead.
- spacing: float | None — default None. Stagger multiplier between per-glyph/word windows on text animations (engine default 1 = fully sequential; smaller values overlap the windows). Ignored by block animations.
- loop: bool — default False.
- audio: AudioGenerator | None — default None. Audio-reactive offsets (§3). Element animations only (video/image/shape/group) — the engine does not run the generator on text animations; put the text in an audio-reactive group instead. For a pure generator with no visible motion, use `type: "identity"`, the engine's no-op carrier.
### MotionBlur
- samples: int — REQUIRED. Temporal samples per frame (2–32).
- shutter: float — default 0.5. Shutter fraction of the frame interval, (0–1]. (Exactly 0 is rejected: it renders N identical samples — full cost, zero blur.)
### PathKeyframe
- time: float — REQUIRED. Timeline seconds for this path.
- d: str — REQUIRED. SVG path `d` at this time.
- easing: Easing | None — default None. Ease into this keyframe. A spring/back/elastic/bezier sub-object overrides it — overshooting eases visibly overshoot the *geometry* and settle back.
- spring: SpringEasing | None — default None.
- back: BackEasing | None — default None.
- elastic: ElasticEasing | None — default None.
- bezier: BezierEasing | None — default None.
### Point
- x: float — default 0.5.
- y: float — default 0.5.
### RangeSelector
- based_on: Literal['glyph', 'word'] — default 'glyph'.
- start: float — default 0.0. Range start, fraction along the text.
- end: float — default 1.0. Range end, fraction along the text.
- falloff: float — default 0.0. Ease to zero over this fraction beyond each edge.
- ease: str | None — default None. Easing curve name for the falloff.
- invert: bool — default False.
### RateKeyframe
- time: float — REQUIRED. Timeline seconds.
- rate: float — REQUIRED. Playback rate (0 = freeze-frame).
### RotationXYZ
- x: float — default 0.0.
- y: float — default 0.0.
- z: float — default 0.0.
### ScaleXY
- x: float — default 1.0.
- y: float — default 1.0.
### SpatialPath
- c1: Point — REQUIRED.
- c2: Point — REQUIRED.
### SpringEasing
- stiffness: float — default 100.0. Spring stiffness.
- damping: float — default 10.0. Damping; lower rings longer.
- mass: float — default 1.0. Mass; higher swings slower.
### StackLayout
- type: Literal['stack'] — default 'stack'.
- direction: Literal['row', 'column'] — default 'row'.
- gap: float — default 0. Gap between members, normalized along the main axis.
- align: Literal['start', 'center', 'end'] — default 'center'.
- origin: Point | None — default None. Centre of the whole stack.
### TextGlow
- color: str — REQUIRED.
- size: float — default 0.15. Glow size, em-relative.
- intensity: float — default 1.0. Glow intensity.
### TrimKeyframe
- time: float — REQUIRED. Timeline seconds.
- start: float | None — default None.
- end: float | None — default None.
- easing: Easing | None — default None. Ease into this keyframe.
- spring: SpringEasing | None — default None.
- back: BackEasing | None — default None.
- elastic: ElasticEasing | None — default None.
- bezier: BezierEasing | None — default None.
### TrimPath
- start: float — default 0. Trim start, 0–1 along the path.
- end: float — default 1. Trim end, 0–1 along the path.
### ValueCounter
- from_value: float — default 0. Start value.
- to_value: float — default 100. End value.
- decimals: int — default 0. Decimal places (0–6).
- prefix: str — default ''. Text prepended to the number.
- suffix: str — default ''. Text appended to the number, e.g. '%'.
- easing: str | None — default None. Easing curve name from the `easings` catalog (e.g. 'quad_out', 'expo_out'). Only named curves apply here — the parameterized spring/back/elastic families are not available on the counter.
- start_time: float — default 0. Seconds into the element to start the sweep.
- length: float | None — default None. Sweep duration; defaults to the element's remaining life.
### Word
- text: str — REQUIRED.
- start: float — REQUIRED. ABSOLUTE output-timeline seconds (not element-relative).
- end: float — REQUIRED. ABSOLUTE output-timeline seconds (not element-relative).
### WordAnimation
- style: WordAnimationStyle — REQUIRED.
- words: list[Word] — REQUIRED.
### WordSpec
- word: str — REQUIRED. The word (whole-word match; UTF-8).
- start: float — REQUIRED. Word reveal start, seconds — drives a word-group animation; ignored without one.
- end: float — REQUIRED. Word reveal end, seconds — drives a word-group animation; ignored without one.
- style: WordStyle | None — default None. Optional per-word style override (static for the element's life).
### WordStyle
- color: str | None — default None.
- bold: bool | None — default None.
- italic: bool | None — default None.
- underline: bool | None — default None.
### Enums
- BlendMode: none, multiply, screen, overlay, darken, lighten, color_dodge, color_burn, hard_light, soft_light, difference, add, exclusion, hue, saturation, color, luminosity
- Easing: linear, hold, ease_in, ease_out, ease_in_out, sin_in, sin_out, sin_in_out, square_in, square_out, square_in_out, expo_in, expo_out, expo_in_out, quad_in, quad_out, quad_in_out, cubic_in, cubic_out, cubic_in_out, quart_in, quart_out, quart_in_out, quint_in, quint_out, quint_in_out
- EffectType: vintage, polaroid, portra, super8, filmic, add_grain, rgb_split, ghosting, displacement_map, posterize, mosaic, mosaic_blur, mosaic_posterize, cc_halftone, cc_halftone_blue, cc_halftone_green, cc_halftone_red, invert, optics_compensation, viewfinder, night_vision, thermal, camera_lens_blur, camera_lens_blur_bg, box_blur, lens_flare, strobe_light, snow, glow, sepia, echo, chromatic_aberration, vhs, vhs_overlay, crt, television, glitch, compression_glitch, scanlines, prism, light_leaks, film_burn, duotone, cross_process, bleach_bypass, chroma_key, aurora
- MaskShape: circle, diamond, hexagon, star, heart, triangle
- MotionScope: element, character
- MotionType: identity, fade, slide_up, slide_down, slide_left, slide_right, zoom_in, zoom_out, rotate_cw, rotate_ccw, bounce, wipe_left, wipe_right, wipe_up, wipe_down, ken_burns_in, ken_burns_out, ken_burns_in_out, loop_wiggle, loop_rotate, loop_rotate_smooth, loop_3d_spin, loop_3d_sway, blur, evaporate, overlay, difference, rubber_in, whip_up, whip_down, glitch_pop, drift_in, drift_out, loop_breathe, loop_shimmer, swing_in, swing_out, elastic_rise, elastic_drop, tilt_zoom, loop_orbit, smooth_pop
- OutputFormat: mp4, webm, mov, gif, png, jpg
- TransitionType: cross_dissolve, dip_to_black, dip_to_white, wipe_left, wipe_right, wipe_up, wipe_down, diagonal_wipe, barn_doors_horizontal, barn_doors_vertical, iris, page_turn, cross_zoom, gradient_wipe, band_wipe, box_wipe, swirl, glitch_memories, window_slice, cube, doorway, pinwheel, water_drop, crosshatch, dreamy, angular, burn, heart, circle_open, color_phase, squares_wire, whip_pan, cinematic_zoom, burn_edge, shatter, domain_warp, circle_crop, cross_warp, fold_horizontal, fold_vertical, linear_blur, minimise_bottom_left, minimise_bottom_right, minimise_top_left, minimise_top_right, ripple, rotate, splice, three_stripes
- WordAnimationStyle: glow, box, scale_pop, slide_up, fly_in, color