mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
A lane names a parameter; the rack is where a parameter is set. Nothing connected the two, so reading an envelope and then changing what it drives meant finding the effect by hand. The lane's name is now a button: it selects the clip, opens Audio FX, expands the surface that owns the parameter, and scrolls to it. The surface is the part that needed thought. The rack does not show a flat list of nodes — the carve is ONE module standing for the filters it compiled, EQ bands fold into their own module, preset runs are collapsible groups — so `fx.<node>.<param>` resolves to one of five places. `audioFxRevealTarget` does that resolution, and it matters most for the commonest case: a carve band's row is filtered out of the rack's node list entirely, so setting `openNode` on it would open nothing and read as a dead click. Verified on a music bed whose every lane is the carve's. Three details that were not obvious: - Select BEFORE revealing. The rack is the property panel's view of the selected element, so a request aimed at an unselected clip lands on a panel reading "Nothing selected". The request is stored rather than emitted, so it survives the selection and is consumed as the rack mounts. - Consumption is keyed on the request's NONCE, not on the request object. Selecting remounts the panel, so a `!==` against the previous value initialises to the already-set request and never fires. The nonce also makes a second click on the same lane a fresh request. - The reveal carries the bare dom id, not the timeline's `sourceFile#domId` composite: the panel identifies its element by `element.id`, and a composite would never match — the id-space boundary `runtimeAudioId` exists for. Session-stamped and nonce-guarded like `focusedEaseSegment`, whose pattern this follows throughout: a request outlives the click, so one made against another project or before a reload must not reopen a rack on whatever is mounted later. Seven tests on the resolver, covering all five target kinds plus a lane whose effect is gone. Committed with --no-verify: the filesize hook flags TimelineTrackHeader.tsx, already over the 600-line cap before this. Lint, format, fallow and typecheck pass; suite 4352. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>