The property vocabulary
How property addresses are built, and the fifteen families of patterns behind every animatable value in a document.
Every animatable property in a document has a stable address: the owning layer's id, a colon, then the property key - layer_2:transform.position. The key half comes from this vocabulary: 722 patterns across 15 families, generated straight from the engine's own registry, so this reference and the runtime can never disagree.
GENERATED - nubu-render --print-property-registry over the conformance fixtures; the Ring 0 conformance test pins this block to the generator byte for byte. Every addressable property key by family: prop("<layer_id>:") resolves every listed pattern; writable = the script drive set (a set() / returned value may drive it); a readable-but-not-writable target refuses typed type_mismatch; an unknown key is reference_missing.
Reading and writing
Scripts READ any pattern here through prop() or layer.prop() - keyframes sampled, other scripts' outputs resolved. Scripts WRITE every ANIMATABLE pattern: the drive set is 684 of the 722 patterns - wherever a keyframe could be set, a script may set() the value (or return it from a single-output script) once per frame, and the value overrides the keyframed one for that frame only (nothing is written to the document). Continuous tracks take continuous values; hold-only tracks - text, fonts, blend modes, asset references, a paint's mode and position - take a per-frame hold. Values travel in the wire shape of the row's kind: numbers, [x, y] points, colours as [r, g, b, a] in 0..1 or "#rrggbb", strings for the holds, whole lists for stops, curve points, subpaths, mask paths and width profiles, objects for corner radii, crop transforms and font or asset references. A value of the wrong shape, out of range, or written to a key that is not in the drive set refuses with the typed type_mismatch, and an id that resolves to nothing raises reference_missing.
Not in the drive set: 38 static patterns that change through commands rather than per frame - content: content.path; effects: 37 static slots (21 enum, 9 scalar, 4 boolean, 1 effect_ref, 2 integer) such as affects, aspect, collide_with, collision_detail - every row is on the family page. A write to any of them refuses type_mismatch with "the property is static". The registry, this page and the IDE's completions move together.
The families
- Animators - 42 patterns.
- Audio - 1 pattern.
- Content - 6 patterns.
- Contents - 9 patterns.
- Effects - 542 patterns.
- Expression controls - 1 pattern.
- Fills - 21 patterns.
- Instance controls - 1 pattern.
- Layer - 7 patterns.
- Layout - 11 patterns.
- Masks - 9 patterns.
- Strokes - 42 patterns.
- Text style - 20 patterns.
- Transform - 7 patterns.
- Trim path - 3 patterns.