From 58ddb11bc5fafaf06e67357b6656eec8f380cbd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Tue, 14 Apr 2026 01:16:06 +0200 Subject: [PATCH] chore: release v0.3.0 (#249) ## Summary Coordinated minor bump across all published packages. No source changes in this PR itself; it is the version stamp for everything that landed on main since v0.2.5. ## Version bumps | Package | from | to | |---|---|---| | `@hyperframes/cli` | 0.2.5 | **0.3.0** | | `@hyperframes/core` | 0.2.5 | **0.3.0** | | `@hyperframes/engine` | 0.2.5 | **0.3.0** | | `@hyperframes/player` | 0.2.7 | **0.3.0** | | `@hyperframes/producer` | 0.2.5 | **0.3.0** | | `@hyperframes/studio` | 0.2.9 | **0.3.0** | Between 0.2.5 and this release, `player` and `studio` received several patch versions on npm as we iterated on the bundler, entry point, and SSR issues. 0.3.0 collapses that into a single coordinated minor so the ecosystem is aligned again. ## What is in v0.3.0 ### `@hyperframes/player` **Restored package entry points to the compiled `dist/` output.** 0.2.5 shipped with `"main": "./src/hyperframes-player.ts"` but the published tarball only included `dist/` via the `"files"` field. Every consumer trying to import the package failed with `Module not found: Can't resolve '@hyperframes/player'`. Entry points now point at the built JS/`.d.ts` files inside `dist/`. **DOM-based root timeline resolution in the ready probe.** In a bundled preview, `window.__timelines` contains the master composition alongside its sub-compositions, for example: ```js { main: GSAPTimeline(14s), intro: GSAPTimeline(1.5s), 'scene2-4-canvas': GSAPTimeline(12.6s), 'scene5-logo-outro': GSAPTimeline(3.2s), } ``` The probe used to select the adapter with `keys[keys.length - 1]`. Object key ordering meant the last-registered sub-composition would win, so the `ready` event reported a sub-composition's duration (e.g. 3.2s) instead of the master's 14s. The probe now looks up the root composition id from the outermost `[data-composition-id]` element in the iframe DOM and uses its key. Falls back to the last key when no element is present, so standalone sub-composition previews keep working. ### `@hyperframes/studio` **`useTimelinePlayer.getAdapter()` uses the same DOM-based root id lookup** as the player. Previously play, pause, seek, and duration readout were all driven by whichever sub-composition happened to register its timeline last. **`Player.tsx` loads `@hyperframes/player` lazily.** The component used to call `import "@hyperframes/player"` at module scope, which runs the package's `customElements.define(...)` side effect during module evaluation. `HTMLElement` does not exist in the Node runtime, so any consumer page that transitively imported the studio during server rendering threw: ``` ReferenceError: HTMLElement is not defined at module evaluation (@hyperframes/studio/src/player/components/Player.tsx) ``` The import now runs inside the mount effect via `import(...)` so it only evaluates in the browser. Added a cancellation flag and deferred cleanup so a fast unmount before the dynamic import resolves does not leak listeners or DOM nodes. **Captions module imports stripped of `.js` extensions.** Files under `src/captions/` imported siblings as `./types.js` and `./parser.js`. That is legal ESM TypeScript but Turbopack and several other bundlers refuse to resolve those specifiers against `.ts` files inside `node_modules`, breaking any consumer build that transitively pulled in the captions module. Captions now uses extensionless imports, matching the rest of the studio codebase. ### `@hyperframes/core`, `@hyperframes/cli`, `@hyperframes/engine`, `@hyperframes/producer` Version bump only, no source changes since 0.2.5. Kept on the same version so the ecosystem is easier to reason about. ## Impact for consumers If you use `@hyperframes/studio` in a Next.js app: - The play button in a bundled preview reports the correct composition duration and drives the master timeline. - The session page no longer 500s in dev mode when the studio barrel is imported (the SSR fix). - Turbopack builds that transitively load the captions module no longer fail on `Cannot resolve './types.js'`. If you use `@hyperframes/player` directly: - Consumer bundlers can resolve the package again (dist entry points restored). - The `ready` event duration reports the master, not a sub-composition. ## After merge Publish each package to npm with `pnpm publish` (workspace deps auto-resolve). --- packages/cli/package.json | 2 +- packages/core/package.json | 2 +- packages/engine/package.json | 2 +- packages/player/package.json | 2 +- packages/producer/package.json | 2 +- packages/studio/package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index cd3e510ae..d9cd64293 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@hyperframes/cli", - "version": "0.2.5", + "version": "0.3.0", "description": "HyperFrames CLI — create, preview, and render HTML video compositions", "repository": { "type": "git", diff --git a/packages/core/package.json b/packages/core/package.json index 2019cf7a9..c89cc8b81 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@hyperframes/core", - "version": "0.2.5", + "version": "0.3.0", "description": "", "repository": { "type": "git", diff --git a/packages/engine/package.json b/packages/engine/package.json index a5a9b976b..71619e805 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -1,6 +1,6 @@ { "name": "@hyperframes/engine", - "version": "0.2.5", + "version": "0.3.0", "description": "Seekable web page to video rendering engine (Puppeteer + FFmpeg)", "repository": { "type": "git", diff --git a/packages/player/package.json b/packages/player/package.json index bd0ed436b..eeeedeef9 100644 --- a/packages/player/package.json +++ b/packages/player/package.json @@ -1,6 +1,6 @@ { "name": "@hyperframes/player", - "version": "0.2.7", + "version": "0.3.0", "description": "Embeddable web component for HyperFrames compositions", "repository": { "type": "git", diff --git a/packages/producer/package.json b/packages/producer/package.json index 2aa125b2d..0d040fc19 100644 --- a/packages/producer/package.json +++ b/packages/producer/package.json @@ -1,6 +1,6 @@ { "name": "@hyperframes/producer", - "version": "0.2.5", + "version": "0.3.0", "description": "HTML-to-video rendering engine using Chrome's BeginFrame API", "repository": { "type": "git", diff --git a/packages/studio/package.json b/packages/studio/package.json index 3999ff720..9e58cdd09 100644 --- a/packages/studio/package.json +++ b/packages/studio/package.json @@ -1,6 +1,6 @@ { "name": "@hyperframes/studio", - "version": "0.2.9", + "version": "0.3.0", "description": "", "repository": { "type": "git",