Docs

Compatibility and Ignored Input

The parser is deliberately permissive so older files and forward-looking source load without failing. This page records what's accepted but not doing anything yet; read it before assuming that parsing a line means it renders.

Input Parser behavior Scene/runtime behavior
Unknown statement line Skipped. No effect.
Unknown leading @directive Skipped. No effect.
Unknown property: value Retained as a generic property. No guaranteed consumer.
for <count> block inside imagine Recognized replicator. Native vector and text copies evaluate and render with supported ordered modifiers; the structure is saved. See replication.
Legacy for index from ... block Recognized AST node. Not compiled into Scene.
when block Recognized AST node. Not compiled into Scene.
maskMode, maskInvert, blendMode Retained properties. Rendered in format 6; earlier releases ignored them. See compositing.
shadow, outline, displacement, custom effect Parsed effect node. No registered effect renderer.
Inline cubic bezier ease (x1, y1, x2, y2) after from ... to ... over Accepted. Dropped: the animation runs linear. Use the indented ease: option or a keyframe ease.
Text stroke, strokeWidth Retained properties. Text renderer ignores them.
Image fill on text Retained as the fill property. Text renderer ignores it; use a color fill.
Arrays Parsed and retained. Compiler does not preserve square-array syntax.
N% percent literals Parsed as a percent value. Previously parsed as a broken modulo expression and resolved to nothing. It now resolves against the parent on position, size, width, and height, or as a fraction of 1 on opacity.

Compatibility behavior is useful when inspecting imported files. New scenes should prefer the renderer-backed properties and effects in the generated references.

Multi-property animate blocks with matching from and to maps are fully retained, evaluated, and emitted by the compiler. They are additive syntax and do not change the behavior of existing single-property animations.

imagine card
  shape: rectangle
  maskMode: alpha
  blendMode: "screen"

create card

Finding ignored input

Use # for comments. A // line loads because it is skipped, not because it is a supported comment. Unknown properties can be saved without changing the scene. Prefer the properties and effects listed in the references.

Wrapped paragraph spacing

Text with wordWrap: true and a width constraint advances one line-height after every committed line, including the final line before a hard newline. Older builds could place consecutive paragraphs on the same baseline. This layout correction changes those overlapping captures without changing stored syntax or file-format version.

Animation interpolation and constant keys

interpolation: timing and interpolation: spatial are retained, evaluated, rendered and saved on single-property animations, including macro bodies. Omission preserves legacy 2D position paths. Non-position tuples never use spatial interpolation. Older readers ignore this new option, so a timing-only position path may curve when opened there. Old files need no migration and the file-format version is unchanged.

The compiler now writes supported bezier easing, speed, blend and weight in indented options, which the existing parser retains. It preserves full numeric key time precision with decimal spelling, including sub-microsecond keys. Inline from/to bezier easing remains the legacy ignored form documented above.

Constant key references now interpolate their resolved numeric/tuple values; older builds left them as strings. Aliases and tuple components use the existing root, immediate parent and local scope. Expressions in keys, expression-valued defines, unresolved names and cyclic references are not evaluated by this path. They remain authored values; parser acceptance alone does not imply meaningful interpolation, and validation does not yet diagnose every unresolved key name.

step(edge, x) and named expo/quint easing variants require this runtime. Older runtimes report an unknown expression function for step and use their legacy linear fallback for unrecognized easing names. Existing back variants, selector identity and stagger ordering are unchanged.

Stroke trim

Native stroke trim is retained, animated, rendered and saved. Omitted values preserve existing output. Unsupported SVG trim styles and invalid values have explicit diagnostics. Older readers ignore trim properties; see stroke trim for limits.

Tempo and musical clocks

Scene-root bpm and beatOffset are retained and saved; expressions using beat and beatPhase evaluate and render in both expression paths. Legacy artboard migration keeps tempo at the scene root. Omission preserves existing output. Older runtimes ignore tempo metadata and cannot evaluate these two built-ins. The names bpm and beatOffset are reserved for scene metadata; nonroot generic values remain retained but do not set tempo and produce validation errors. See expressions.

Named cameras

Format 5 camera instances, active keys and pose animation tracks are retained, evaluated, rendered and saved. Older readers reject format 5. Files from format 4 keep their host view; see cameras for targeting, depth and composition limits.

Text replication and text modifier blocks require this runtime. Older readers may retain loops without rendering text, and discard text modifier blocks when saving. Existing format-5 files require no migration.