Files
Miguel Ángel 1630f7ce07 fix(studio): inject manual edits into preview and align color profile
The parity test was failing because the manualEditsRenderScript was only
applied to the render pipeline, not to the preview URL served by
/api/projects/:id/preview. This caused the X-position edit (+120px on
#title) to be absent from the preview screenshot, producing a large
white-text shift against the dark background — YAVG ~17 at full resolution.

- Inject createStudioManualEditsRenderBodyScript into the preview HTML
  via injectStudioPreviewAugmentations, mirroring the render pipeline.
  Manual position, box-size, and rotation edits now appear in the
  live preview URL, which is also the correct product behaviour.
- Add --force-color-profile=srgb to Playwright's Chromium launch args
  to match the flag the engine renderer already passes, eliminating any
  residual color-profile divergence between the two Chrome instances.
2026-05-13 19:04:05 -07:00
..
2026-05-13 13:40:37 -07:00
2026-03-21 22:43:56 -07:00
2026-03-21 22:43:56 -07:00

@hyperframes/core

Types, parsers, generators, compiler, linter, runtime, and frame adapters for the Hyperframes video framework.

Install

npm install @hyperframes/core

Most users don't need to install core directly — the CLI, producer, and studio packages depend on it internally.

What's inside

Module Description
Types TimelineElement, CompositionSpec, Asset, canvas dimensions, defaults
Parsers parseHtml — extract timeline elements from HTML; parseGsapScript — parse GSAP animations
Generators generateHyperframesHtml — produce valid Hyperframes HTML from a composition spec
Compiler compileTimingAttrs — resolve data-start / data-duration into absolute times
Linter lintHyperframeHtml — validate Hyperframes HTML (missing attributes, overlapping tracks, etc.)
Runtime IIFE script injected into the browser — manages seek, media playback, and the window.__hf protocol
Frame Adapters Pluggable animation drivers (GSAP, Lottie, CSS, or custom)

Frame Adapters

A frame adapter tells the engine how to seek your animation to a specific frame:

import { createGSAPFrameAdapter } from "@hyperframes/core";

const adapter = createGSAPFrameAdapter({
  getTimeline: () => gsap.timeline(),
  compositionId: "my-video",
});

Implement FrameAdapter for custom animation runtimes:

import type { FrameAdapter } from "@hyperframes/core";

const myAdapter: FrameAdapter = {
  id: "my-adapter",
  getDurationFrames: () => 300,
  seekFrame: (frame) => {
    /* seek your animation */
  },
};

Parsing and generating HTML

import { parseHtml, generateHyperframesHtml } from "@hyperframes/core";

const { elements, metadata } = parseHtml(htmlString);
const html = generateHyperframesHtml(spec);

Linting

import { lintHyperframeHtml } from "@hyperframes/core/lint";

const result = lintHyperframeHtml(htmlString);
// result.findings: { severity, message, elementId }[]

Documentation

Full documentation: hyperframes.heygen.com/packages/core