Files
hyperframes/packages/core
Miguel Angel Simon Sierra fac9bb8f44 feat(core): warn when a registered timeline has children but no duration
Backstop for the same defect the unpause fixes. A timeline that owns children
yet reports a duration of 0 cannot be correct, and the symptom is an entirely
black render that lint, check and validate all pass, because none of them looks
at pixels.

There is no legitimate composition where children span time and the total is
zero, so the check has no false-positive case. Anything that reaches it has a
cause the unpause did not cover, which is exactly the case worth hearing about
rather than capturing frozen frames in silence.

Emitted to the console because the capture session forwards browser console
output into the producer's diagnostics, which is the channel a render actually
surfaces.

Verified by disabling the unpause and rendering the reported composition: the
warning fires through the real pipeline, naming the composition id and the
child count.
2026-08-22 11:55:26 -04:00
..
2026-08-22 11:16:32 -04: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