dispatch()) for making changes. Every query and every edit operates on stable hf-id strings — there is no cursor, no “current selection required” invariant, and no DOM reference that can go stale.
Query API
getElements()
Returns a flat array of ElementSnapshot objects representing every element in the composition — including elements nested inside sub-compositions — in document order.
ElementSnapshot (aliased from HyperFramesElement) carries:
| Field | Type | Notes |
|---|---|---|
id | string | Leaf hf-id — unique within its sub-composition scope |
scopedId | string | Canonical dispatch target (see below) |
tag | string | Lowercase HTML tag name |
text | string | null | Direct text content of the element |
inlineStyles | Record<string, string> | camelCase property names |
attributes | Record<string, string> | All attributes except style, class, and data-hf-* |
classNames | string[] | |
start | number | null | Seconds — null when data-start is absent |
duration | number | null | Seconds — null when neither data-duration nor data-end is present |
trackIndex | number | null | |
animationIds | string[] | GSAP tween IDs targeting this element |
getElement(id)
Fetches a single element snapshot by id or scopedId. Returns null when no element matches.
null even if its id is unique in the document — use find() to discover its scoped form ("hf-HOST/hf-LEAF"), then pass that to getElement.
find(query)
Returns an array of scopedId strings for every element that matches all supplied FindQuery fields. All fields are optional; an empty query matches everything (equivalent to getElements().map(el => el.scopedId)).
FindQuery fields:
| Field | Type | Matches |
|---|---|---|
tag | string | Exact tag name |
text | string | Substring of el.text |
name | string | Exact value of the data-name attribute |
track | number | Exact trackIndex |
composition | string | Elements whose scopedId starts with "<host-id>/" |
scopedId for sub-composition elements
When a composition embeds another composition as a sub-clip, the inner elements are addressable with a scoped id of the form "hf-HOST/hf-LEAF" (arbitrary depth: "hf-A/hf-B/hf-C"). Always use the scopedId as the dispatch target for sub-composition elements — passing a bare leaf id to setText or setStyle will not resolve correctly when the same leaf id appears in multiple nested scopes.
Editing with typed methods
Typed methods are the primary editing surface. Each one dispatches a singleEditOp and returns immediately. The change is visible in the next getElements() call.
setText(id, value)
Sets the direct text content of an element.
setStyle(id, styles)
Merges inline styles. Property names are camelCase. Pass null for a property to remove it.
setAttribute(id, name, value)
Sets an HTML attribute. Pass null to remove it.
removeElement(id)
Removes an element and all its children from the composition.
addElement(parent, index, html)
Inserts an HTML fragment as a child of parent at zero-based sibling position index. Pass null for parent to insert at the document body root. Returns the minted hf-id of the inserted root element.
<script> tags.
setVariableValue(id, value)
Sets a composition variable by its variable id.
batch() — group edits into one step
Wrap related mutations in batch() to coalesce them into a single undo entry, a single persist write, and a single change event. This is the right tool any time two or more edits are logically inseparable.
Ergonomic handles
comp.element(id) → ElementHandle
Returns a curried handle that holds the id string and exposes the same mutation methods as the top-level comp.* methods. Useful when you are making several edits to the same element.
id string — there is no stale DOM reference hazard. Calling methods on it after dispose() will silently no-op via the underlying dispatch path.
comp.selection() → SelectionProxy
Returns a proxy that resolves the current selection at call time and applies mutations to every selected id in one batch.
getSelection() to read the current selection, and setSelection(ids) to change it programmatically. Pass an empty array to clear.
SelectionProxy and ElementHandle expose the same five methods: setStyle, setText, setAttribute, setTiming, and removeElement. They are intentionally symmetric — switch between them freely without rethinking your call site.Related
Composition reference
Full method signatures for every Composition method.
Types reference
HyperFramesElement, FindQuery, ElementHandle, SelectionProxy, and more.
Edit Operations reference
Every EditOp variant — for the dispatch() and can() layers.