From 7ae8359a3aedc6faaf509881fa577f46483ce1b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Fri, 3 Apr 2026 17:29:06 +0200 Subject: [PATCH] feat: allow clip animation + ship web component --- CLAUDE.md | 28 ++ Dockerfile.test | 1 + bun.lock | 21 +- docs/docs.json | 1 + docs/packages/player.mdx | 175 ++++++++ packages/cli/src/cli.ts | 1 + packages/cli/src/commands/play.ts | 230 ++++++++++ packages/cli/src/templates/blank/index.html | 11 +- packages/core/src/lint/rules/gsap.test.ts | 124 +++++- packages/core/src/lint/rules/gsap.ts | 11 +- packages/player/.gitignore | 2 + packages/player/package.json | 33 ++ packages/player/src/controls.ts | 150 +++++++ .../player/src/hyperframes-player.test.ts | 32 ++ packages/player/src/hyperframes-player.ts | 395 ++++++++++++++++++ packages/player/src/styles.ts | 114 +++++ packages/player/tsconfig.json | 17 + packages/player/tsup.config.ts | 11 + 18 files changed, 1332 insertions(+), 25 deletions(-) create mode 100644 docs/packages/player.mdx create mode 100644 packages/cli/src/commands/play.ts create mode 100644 packages/player/.gitignore create mode 100644 packages/player/package.json create mode 100644 packages/player/src/controls.ts create mode 100644 packages/player/src/hyperframes-player.test.ts create mode 100644 packages/player/src/hyperframes-player.ts create mode 100644 packages/player/src/styles.ts create mode 100644 packages/player/tsconfig.json create mode 100644 packages/player/tsup.config.ts diff --git a/CLAUDE.md b/CLAUDE.md index d7305e066..6243bab06 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -58,6 +58,7 @@ packages/ cli/ → hyperframes CLI (create, preview, lint, render) core/ → Types, parsers, generators, linter, runtime, frame adapters engine/ → Seekable page-to-video capture engine (Puppeteer + FFmpeg) + player/ → Embeddable web component producer/ → Full rendering pipeline (capture + encode + audio mix) studio/ → Browser-based composition editor UI ``` @@ -94,6 +95,7 @@ When adding a new CLI command: ## Key Concepts - **Compositions** are HTML files with `data-*` attributes defining timeline, tracks, and media +- **Clips** can be animated directly with GSAP. The only restriction: don't animate `visibility` or `display` on clip elements — the runtime manages those. - **Frame Adapters** bridge animation runtimes (GSAP, Lottie, CSS) to the capture engine - **Producer** orchestrates capture → encode → audio mix into final MP4 - **BeginFrame rendering** uses `HeadlessExperimental.beginFrame` for deterministic frame capture @@ -185,3 +187,29 @@ Use `npx hyperframes tts --list` for the full set, or pass any valid Kokoro voic - Python 3.8+ (auto-installs `kokoro-onnx` package on first run) - Model downloads automatically on first use (~311 MB model + ~27 MB voices, cached in `~/.cache/hyperframes/tts/`) + +## Embeddable Player + +The `@hyperframes/player` package provides a `` web component for embedding +compositions in any web page. Zero dependencies, works with any framework. + +### Quick reference + +```html + + + + + +``` + +### JavaScript API + +```js +const player = document.querySelector("hyperframes-player"); +player.play(); +player.pause(); +player.seek(2.5); +console.log(player.currentTime, player.duration, player.paused); +player.addEventListener("ready", (e) => console.log("Duration:", e.detail.duration)); +``` diff --git a/Dockerfile.test b/Dockerfile.test index 6f040dd7c..dc20a5465 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -68,6 +68,7 @@ ENV PATH="/root/.bun/bin:$PATH" COPY package.json bun.lock ./ COPY packages/core/package.json packages/core/package.json COPY packages/engine/package.json packages/engine/package.json +COPY packages/player/package.json packages/player/package.json COPY packages/producer/package.json packages/producer/package.json COPY packages/cli/package.json packages/cli/package.json COPY packages/studio/package.json packages/studio/package.json diff --git a/bun.lock b/bun.lock index 668387d0f..dacf27f93 100644 --- a/bun.lock +++ b/bun.lock @@ -19,7 +19,7 @@ }, "packages/cli": { "name": "@hyperframes/cli", - "version": "0.2.1", + "version": "0.2.2", "bin": { "hyperframes": "./dist/cli.js", }, @@ -59,7 +59,7 @@ }, "packages/core": { "name": "@hyperframes/core", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@chenglou/pretext": "^0.0.3", }, @@ -85,7 +85,7 @@ }, "packages/engine": { "name": "@hyperframes/engine", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@hono/node-server": "^1.13.0", "@hyperframes/core": "workspace:^", @@ -100,9 +100,18 @@ "vitest": "^3.2.4", }, }, + "packages/player": { + "name": "@hyperframes/player", + "version": "0.2.2", + "devDependencies": { + "tsup": "^8.0.0", + "typescript": "^5.0.0", + "vitest": "^3.2.4", + }, + }, "packages/producer": { "name": "@hyperframes/producer", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@fontsource/archivo-black": "^5.2.8", "@fontsource/eb-garamond": "^5.2.7", @@ -140,7 +149,7 @@ }, "packages/studio": { "name": "@hyperframes/studio", - "version": "0.2.1", + "version": "0.2.2", "dependencies": { "@codemirror/autocomplete": "^6.20.1", "@codemirror/commands": "^6.10.3", @@ -412,6 +421,8 @@ "@hyperframes/engine": ["@hyperframes/engine@workspace:packages/engine"], + "@hyperframes/player": ["@hyperframes/player@workspace:packages/player"], + "@hyperframes/producer": ["@hyperframes/producer@workspace:packages/producer"], "@hyperframes/studio": ["@hyperframes/studio@workspace:packages/studio"], diff --git a/docs/docs.json b/docs/docs.json index c8a1633b0..adf90ff28 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -66,6 +66,7 @@ "pages": [ "packages/core", "packages/engine", + "packages/player", "packages/producer", "packages/studio", "packages/cli" diff --git a/docs/packages/player.mdx b/docs/packages/player.mdx new file mode 100644 index 000000000..b76c50d90 --- /dev/null +++ b/docs/packages/player.mdx @@ -0,0 +1,175 @@ +--- +title: "@hyperframes/player" +description: "Embeddable web component for playing HyperFrames compositions in any web page." +--- + +The player package provides a `` custom element that embeds a HyperFrames composition anywhere — in any framework or plain HTML. Zero dependencies, 3KB gzipped. + +```bash +npm install @hyperframes/player +``` + +## When to Use + +**Use `@hyperframes/player` when you need to:** +- Embed a rendered composition in a website, dashboard, or app +- Add a video-like player to a landing page or product demo +- Show compositions in documentation or blog posts + +**Use a different package if you want to:** +- Edit compositions interactively — use the [studio](/packages/studio) +- Preview during development — use the [CLI](/packages/cli) (`npx hyperframes preview`) +- Render to MP4 — use the [CLI](/packages/cli) or [producer](/packages/producer) + +## Quick Start + +### Via CDN + +```html + + + +``` + +### Via npm + +```js +import '@hyperframes/player'; +``` + +```html + +``` + +## HTML Attributes + +| Attribute | Type | Default | Description | +|-----------|------|---------|-------------| +| `src` | string | required | URL or relative path to composition HTML | +| `width` | number | 1920 | Composition width in pixels | +| `height` | number | 1080 | Composition height in pixels | +| `controls` | boolean | false | Show playback controls overlay | +| `autoplay` | boolean | false | Start playing on load | +| `loop` | boolean | false | Loop playback | +| `muted` | boolean | true | Mute audio (required for autoplay in most browsers) | +| `poster` | string | — | Image URL to show before first play | +| `playback-rate` | number | 1 | Playback speed multiplier | + +## JavaScript API + +The player mirrors the native `