mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
First time any of this stack has been looked at rather than reasoned about. Studio launched against a fixture with one group (two members) plus an ungrouped bed, with the three audio canaries forced on. The group element drew a phantom CLIP row. `<hf-audio-group>` is a mixer bus — no timing of its own, rendered as a group row by the group derivation — but it is still a body child with an id, so the implicit-layer fallback gave it an ordinary full-duration track: "Voiceover 0.0s-12.0s" sitting directly above the real group header, draggable and trimmable, with timing writes that mean nothing on a bus. Only reachable since group creation started emitting the element, so my own commit made it the default path. Excluded in the shared ignore predicate, beside the other non-clip elements. Group writes never reached the store. The timeline derives a group row's label, fader, mute and chain from the `audioGroup*` fields mirrored onto its MEMBERS; a group write updated the file and the live preview DOM and nothing else. Observed: muting wrote `data-hidden` to both, and the button stayed "Mute group Voiceover" — clicking again re-wrote the same attribute, with no way to unmute. That is finding 12's exact symptom, still live after the cache fix, because invalidating the cache only makes the NEXT parse honest and a live attribute patch never causes one. Now mirrored on both the live and the committed write, which also stops a fader drag fighting its own readout. Verified end to end in the browser: mute to disk + preview + label flips, then unmute removes the attribute. The bus fader offered 0..2 while every consumer clamps to [0,1]. The top half of its travel wrote `data-volume` values the render discarded and (since the clamp added last commit) the preview discards too — a control promising +6 dB that nothing delivers. Ceiling lowered to unity. Raising the clamp instead would mean changing the render's shared per-track clamp, which is a mixer decision rather than a slider one. Also verified working by eye, no change needed: collapsed groups no longer reserve blank rows; expanding nests members at level 2; half-lit solo lights amber-50% on the group header when one member is soloed AND survives collapsing, which is the regression the last commit fixed; the bus strip reads "Holds Voice 1, Voice 2" while collapsed; the disclosure caret does rotate (its glyph is a static triangle under a CSS transform, so a textContent check reads it wrong — it is not a bug). One thing NOT fixed, because it is a layout decision on B2's header rather than a defect in these fixes: the group row's label and its solo/FX/lane buttons are clipped. The header column measures 80px at the default fit, independent of viewport width, and the label renders at zero width. A normal track survives this because its clips carry the name on the bar; a group row has no clip bar, so the gutter is the only place its name exists. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@hyperframes/studio
Browser-based composition editor UI for Hyperframes. Provides a visual timeline, code editor, and live preview for building video compositions.
Install
npm install @hyperframes/studio
What it does
The studio is a React application with:
- Visual timeline — drag, resize, and arrange elements on tracks
- Code editor — edit HTML and GSAP scripts with CodeMirror (syntax highlighting, autocomplete)
- Live preview — see changes in real time as you edit
- Composition inspector — view and modify element properties
Development
The studio is embedded in the hyperframes preview command. To develop the studio UI itself:
cd packages/studio
bun run dev # Start Vite dev server
bun run build # Build for production
bun run typecheck # Type-check
Tech stack
- React 18/19, Zustand (state management)
- CodeMirror 6 (editor)
- Tailwind CSS (styling)
- Vite (bundler)
- Phosphor Icons
Documentation
Full documentation: hyperframes.heygen.com/packages/studio
Related packages
@hyperframes/core— types and parsers used by the editorhyperframes— CLI that serves the studio viahyperframes preview