Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@framv/core

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@framv/core - npm Package Compare versions

Comparing version
0.0.1
to
0.1.0
+19
dist/audio.d.ts
/** Lazily fetch + decode the audio file referenced by `el.src` into an AudioBuffer. */
export declare function decodeAudio(el: HTMLMediaElement): Promise<AudioBuffer | null>;
/**
* Extract interleaved stereo f32 PCM starting at `el.currentTime`
* for `duration` seconds. Returns silence if no audio is available.
*/
export declare function extractAudioPCM(el: HTMLMediaElement, duration: number, sampleRate: number): Promise<Float32Array>;
/**
* Mix PCM from every media element in `els` and yield AudioSample-sized
* chunks (≤ MAX_FLOATS floats each) for a single video frame.
*/
export declare function mixAudioFrame(els: HTMLMediaElement[], frameTime: number, duration: number, sampleRate: number): AsyncGenerator<{
data: Float32Array;
timestamp: number;
frames: number;
}>;
/** Returns true if a video element has an audio track. */
export declare function hasAudio(video: HTMLVideoElement): boolean;
//# sourceMappingURL=audio.d.ts.map
{"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAOA,uFAAuF;AACvF,wBAAsB,WAAW,CAAC,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAqBnF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA2BvH;AAED;;;GAGG;AACH,wBAAuB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,cAAc,CAAC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBhM;AAED,0DAA0D;AAC1D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAGzD"}
/** Stereo channels. */
const N_CH = 2;
/** Max float32 samples per AudioSample chunk (≈1 MB). */
const MAX_FLOATS = 1024 * 1024;
/** Lazily fetch + decode the audio file referenced by `el.src` into an AudioBuffer. */
export async function decodeAudio(el) {
const cached = el._audioBuffer;
if (cached !== undefined)
return cached;
if (!el.src) {
el._audioBuffer = null;
return null;
}
try {
const resp = await fetch(el.src);
const ab = await resp.arrayBuffer();
const ctx = new AudioContext();
const buf = await ctx.decodeAudioData(ab);
await ctx.close();
el._audioBuffer = buf;
return buf;
}
catch {
el._audioBuffer = null;
return null;
}
}
/**
* Extract interleaved stereo f32 PCM starting at `el.currentTime`
* for `duration` seconds. Returns silence if no audio is available.
*/
export async function extractAudioPCM(el, duration, sampleRate) {
const frameSamples = Math.floor(sampleRate * duration);
const out = new Float32Array(N_CH * frameSamples);
const buf = await decodeAudio(el);
if (!buf)
return out;
const t = el.currentTime;
if (t < 0 || t >= el.duration)
return out;
const startSample = Math.round(t * sampleRate);
const frames = Math.min(frameSamples, buf.length - startSample);
if (frames <= 0)
return out;
const tmp = new Float32Array(frames);
const srcCh = Math.min(N_CH, buf.numberOfChannels);
for (let ch = 0; ch < srcCh; ch++) {
buf.copyFromChannel(tmp, ch, startSample);
for (let j = 0; j < frames; j++)
out[j * N_CH + ch] = tmp[j] * el.volume;
}
// Mono → stereo
if (buf.numberOfChannels === 1) {
for (let j = 0; j < frames; j++)
out[j * N_CH + 1] = out[j * N_CH];
}
return out;
}
/**
* Mix PCM from every media element in `els` and yield AudioSample-sized
* chunks (≤ MAX_FLOATS floats each) for a single video frame.
*/
export async function* mixAudioFrame(els, frameTime, duration, sampleRate) {
const frameSamples = Math.floor(sampleRate * duration);
const combined = new Float32Array(N_CH * frameSamples);
for (const el of els) {
const pcm = await extractAudioPCM(el, duration, sampleRate);
for (let i = 0; i < pcm.length; i++)
combined[i] += pcm[i];
}
const maxPerChunk = Math.floor(MAX_FLOATS / N_CH);
let offset = 0;
let remaining = frameSamples;
while (remaining > 0) {
const n = Math.min(maxPerChunk, remaining);
yield {
data: new Float32Array(combined.subarray(offset * N_CH, (offset + n) * N_CH)),
timestamp: frameTime + offset / sampleRate,
frames: n,
};
offset += n;
remaining -= n;
}
}
/** Returns true if a video element has an audio track. */
export function hasAudio(video) {
const v = video;
return v.mozHasAudio === true || Boolean(v.webkitAudioDecodedByteCount) || Boolean(v.audioTracks);
}
//# sourceMappingURL=audio.js.map
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

import * as all from "./index.js";
export declare const decodeAudio: typeof all.decodeAudio, extractAudioPCM: typeof all.extractAudioPCM, hasAudio: typeof all.hasAudio, mixAudioFrame: typeof all.mixAudioFrame, ElementExporter: typeof all.ElementExporter, registerExporter: typeof all.registerExporter, exportElement: typeof all.exportElement, settings: typeof all.settings, ElementFreezer: typeof all.ElementFreezer, seekElement: typeof all.seekElement, seekMedia: typeof all.seekMedia, waitMedia: typeof all.waitMedia, ElementRenderer: typeof all.ElementRenderer, ElementStreamer: typeof all.ElementStreamer;
export type { ExportSettings, FreezeOptions } from "./types.js";
export type { ExportOptions } from "./factory.js";
//# sourceMappingURL=cdn.d.ts.map
{"version":3,"file":"cdn.d.ts","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAElC,eAAO,MAAQ,WAAW,0BAAE,eAAe,8BAAE,QAAQ,uBAAE,aAAa,4BAAE,eAAe,8BAAE,gBAAgB,+BAAE,aAAa,4BAAE,QAAQ,uBAAE,cAAc,6BAAE,WAAW,0BAAE,SAAS,wBAAE,SAAS,wBAAE,eAAe,8BAAE,eAAe,4BAAQ,CAAC;AAE9N,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
import * as all from "./index.js";
export const { decodeAudio, extractAudioPCM, hasAudio, mixAudioFrame, ElementExporter, registerExporter, exportElement, settings, ElementFreezer, seekElement, seekMedia, waitMedia, ElementRenderer, ElementStreamer } = all;
if (typeof window !== "undefined") {
window.Framv = all;
}
//# sourceMappingURL=cdn.js.map
{"version":3,"file":"cdn.js","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAElC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,GAAG,CAAC;AAK9N,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IACjC,MAA6C,CAAC,KAAK,GAAG,GAAG,CAAC;AAC7D,CAAC"}
/** Wait for a media element to have enough data to seek. */
export declare function waitMedia(el: HTMLMediaElement): Promise<void>;
/** Seek a media element to `time`, clamped to [0, duration]. */
export declare function seekMedia(el: HTMLMediaElement, time: number): Promise<void>;
/** Seek an SVG or HTML element to `time` in seconds (SMIL + Web Animations). */
export declare function seekElement(element: HTMLElement | SVGSVGElement, time: number): void;
//# sourceMappingURL=media.d.ts.map
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,wBAAsB,SAAS,CAAC,EAAE,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQnE;AAED,gEAAgE;AAChE,wBAAsB,SAAS,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjF;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGpF"}
/** Wait for a media element to have enough data to seek. */
export async function waitMedia(el) {
el.load();
if (el.readyState < 2) {
await new Promise((r) => el.addEventListener("loadedmetadata", () => r(), { once: true }));
}
if (el.readyState < 4) {
await new Promise((r) => el.addEventListener("loadeddata", () => r(), { once: true }));
}
}
/** Seek a media element to `time`, clamped to [0, duration]. */
export async function seekMedia(el, time) {
const clamped = Math.max(0, Math.min(el.duration || 0, time));
if (Math.abs(el.currentTime - clamped) < 0.001)
return;
el.currentTime = clamped;
if (el.readyState < 2) {
await new Promise((r) => el.addEventListener("seeked", () => r(), { once: true }));
}
}
/** Seek an SVG or HTML element to `time` in seconds (SMIL + Web Animations). */
export function seekElement(element, time) {
if ("setCurrentTime" in element)
element.setCurrentTime(time);
for (const a of element.getAnimations({ subtree: true }))
a.currentTime = time * 1000;
}
//# sourceMappingURL=media.js.map
{"version":3,"file":"media.js","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAoB;IAClD,EAAE,CAAC,IAAI,EAAE,CAAC;IACV,IAAI,EAAE,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnG,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAoB,EAAE,IAAY;IAChE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,KAAK;QAAE,OAAO;IACvD,EAAE,CAAC,WAAW,GAAG,OAAO,CAAC;IACzB,IAAI,EAAE,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,OAAoC,EAAE,IAAY;IAC5E,IAAI,gBAAgB,IAAI,OAAO;QAAG,OAAyB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACjF,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAAE,CAAC,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;AACxF,CAAC"}
/**
* Renders an SVG/HTML element at a specific point in time to an OffscreenCanvas.
* Used as the inner streaming primitive by the exporter and the player.
*/
export declare class ElementStreamer {
private freezer;
private renderer;
/** Seek to `time` seconds, freeze, and render to an OffscreenCanvas. */
renderFrame(element: HTMLElement | SVGSVGElement, time: number, width?: number, height?: number): Promise<OffscreenCanvas>;
}
//# sourceMappingURL=streamer.d.ts.map
{"version":3,"file":"streamer.d.ts","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAyB;IAEzC,wEAAwE;IAClE,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAKjI"}
import { ElementFreezer } from "./freezer.js";
import { seekElement } from "./media.js";
import { ElementRenderer } from "./renderer.js";
/**
* Renders an SVG/HTML element at a specific point in time to an OffscreenCanvas.
* Used as the inner streaming primitive by the exporter and the player.
*/
export class ElementStreamer {
freezer = new ElementFreezer();
renderer = new ElementRenderer();
/** Seek to `time` seconds, freeze, and render to an OffscreenCanvas. */
async renderFrame(element, time, width, height) {
seekElement(element, time);
const frozen = await this.freezer.freezeAll(element);
return this.renderer.renderToCanvas(frozen, width, height);
}
}
//# sourceMappingURL=streamer.js.map
{"version":3,"file":"streamer.js","sourceRoot":"","sources":["../src/streamer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;IAC/B,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,wEAAwE;IACxE,KAAK,CAAC,WAAW,CAAC,OAAoC,EAAE,IAAY,EAAE,KAAc,EAAE,MAAe;QACnG,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;CACF"}
MIT License
Copyright (c) 2025 Mens Reversa
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# CORE\n\nPart of the Framv framework.\n
+10
-3

@@ -1,2 +0,10 @@

import { ExportSettings } from './types';
import { ElementFreezer } from "./freezer.js";
import { ElementRenderer } from "./renderer.js";
import { ExportSettings } from "./types.js";
export type TypedExporter = (element: HTMLElement | SVGSVGElement, settings: ExportSettings, core: {
freezer: ElementFreezer;
renderer: ElementRenderer;
}) => Promise<Blob>;
export declare const exporters: Map<string, TypedExporter>;
export declare function registerExporter(format: string, exporter: TypedExporter): void;
export declare class ElementExporter {

@@ -8,5 +16,4 @@ private freezer;

private exportImage;
private exportVideo;
private exportAudio;
private exportMedia;
}
//# sourceMappingURL=exporter.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAyB;IAEnC,MAAM,CACV,OAAO,EAAE,WAAW,GAAG,aAAa,EACpC,QAAQ,EAAE,cAAc,EACxB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC;IAgChB,OAAO,CAAC,SAAS;YAMH,WAAW;YAoBX,WAAW;YAuGX,WAAW;CAa1B"}
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAS5C,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAI5K,eAAO,MAAM,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAA2G,CAAC;AAM7J,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,QAEvE;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAyB;IAEnC,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB1J,OAAO,CAAC,SAAS;YAKH,WAAW;YAOX,WAAW;CAiF1B"}

@@ -1,64 +0,69 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElementExporter = void 0;
const mediabunny_1 = require("mediabunny");
const freezer_1 = require("./freezer");
const renderer_1 = require("./renderer");
class ElementExporter {
constructor() {
this.freezer = new freezer_1.ElementFreezer();
this.renderer = new renderer_1.ElementRenderer();
}
import { AudioSample, AudioSampleSource, getFirstEncodableAudioCodec, Mp4OutputFormat, Output, QUALITY_HIGH, QUALITY_LOW, QUALITY_MEDIUM, QUALITY_VERY_HIGH, StreamTarget, VideoSample, VideoSampleSource, WebMOutputFormat } from "mediabunny";
import { hasAudio, mixAudioFrame } from "./audio.js";
import { ElementFreezer } from "./freezer.js";
import { seekElement, seekMedia, waitMedia } from "./media.js";
import { ElementRenderer } from "./renderer.js";
const MIME = {
mp4: "video/mp4",
webm: "video/webm",
m4a: "audio/mp4",
ogg: "audio/ogg",
};
// Support sharing the registry across module boundaries or multiple evaluations.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const exporters = (typeof window !== "undefined" && window.__framvExporters) || new Map();
if (typeof window !== "undefined") {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
window.__framvExporters = exporters;
}
export function registerExporter(format, exporter) {
exporters.set(format, exporter);
}
export class ElementExporter {
freezer = new ElementFreezer();
renderer = new ElementRenderer();
async export(element, settings, onProgress) {
const { format, quality = 1, fps = 30, time, start = 0, end = 5, width, height } = settings;
const { format, quality = 1, fps = 30, start = 0, end = 5, width, height } = settings;
switch (format) {
case 'svg':
case "svg":
return this.exportSvg(element);
case 'png':
case 'jpg':
case 'webp':
return this.exportImage(element, format, time || 0, quality, width, height);
case 'webm':
case 'mp4':
return this.exportVideo(element, format, quality, fps, start, end, true, onProgress, width, height);
case 'm4a':
case 'ogg':
return this.exportAudio(element, format, quality, fps, start, end, onProgress);
default:
case "png":
case "jpg":
case "webp":
return this.exportImage(element, format, quality, width, height);
case "webm":
case "mp4":
return this.exportMedia(element, format, quality, fps, start, end, true, onProgress, width, height);
case "m4a":
case "ogg":
return this.exportMedia(element, format, quality, fps, start, end, false, onProgress);
default: {
const custom = exporters.get(format);
if (custom)
return custom(element, settings, { freezer: this.freezer, renderer: this.renderer });
throw new Error(`Unsupported format: ${format}`);
}
}
}
exportSvg(element) {
const serializer = new XMLSerializer();
const svgString = serializer.serializeToString(element);
return Promise.resolve(new Blob([svgString], { type: 'image/svg+xml' }));
const svgString = new XMLSerializer().serializeToString(element);
return Promise.resolve(new Blob([svgString], { type: "image/svg+xml" }));
}
async exportImage(element, format, time, quality, width, height) {
async exportImage(element, format, quality, width, height) {
const frozen = await this.freezer.freezeAll(element);
const canvas = await this.renderer.renderToCanvas(frozen, width, height);
const mimeTypes = {
png: 'image/png',
jpg: 'image/jpeg',
webp: 'image/webp',
};
return canvas.convertToBlob({ type: mimeTypes[format], quality });
const mime = { png: "image/png", jpg: "image/jpeg", webp: "image/webp" };
return canvas.convertToBlob({ type: mime[format], quality });
}
async exportVideo(element, format, quality, fps, start, end, includeVideo, onProgress, width, height) {
const isWebM = format === 'webm';
const isMP4 = format === 'mp4';
const totalDuration = end - start;
const totalFrames = Math.ceil(totalDuration * fps);
const mediabunnyQuality = quality >= 0.95
? mediabunny_1.QUALITY_VERY_HIGH
: quality >= 0.8
? mediabunny_1.QUALITY_HIGH
: quality >= 0.5
? mediabunny_1.QUALITY_MEDIUM
: mediabunny_1.QUALITY_LOW;
async exportMedia(element, format, quality, fps, start, end, includeVideo, onProgress, width, height) {
const isMP4 = format === "mp4" || format === "m4a";
const totalFrames = Math.ceil((end - start) * fps);
const frameDuration = 1 / fps;
const mbQuality = quality >= 0.95 ? QUALITY_VERY_HIGH : quality >= 0.8 ? QUALITY_HIGH : quality >= 0.5 ? QUALITY_MEDIUM : QUALITY_LOW;
const chunks = [];
const output = new mediabunny_1.Output({
format: isMP4 ? new mediabunny_1.Mp4OutputFormat({ fastStart: 'fragmented' }) : new mediabunny_1.WebMOutputFormat(),
target: new mediabunny_1.StreamTarget(new WritableStream({
write: (chunk) => {
chunks.push(chunk.data);
const output = new Output({
format: isMP4 ? new Mp4OutputFormat({ fastStart: "fragmented" }) : new WebMOutputFormat(),
target: new StreamTarget(new WritableStream({
write: (c) => {
chunks.push(c.data);
},

@@ -68,17 +73,14 @@ })),

let videoSource;
let audioSource;
if (includeVideo) {
videoSource = new mediabunny_1.VideoSampleSource({
codec: isWebM ? 'vp9' : 'avc',
bitrate: mediabunnyQuality,
keyFrameInterval: 2.0,
latencyMode: 'realtime',
});
videoSource = new VideoSampleSource({ codec: isMP4 ? "avc" : "vp9", bitrate: mbQuality, keyFrameInterval: 2.0, latencyMode: "realtime" });
output.addVideoTrack(videoSource, { frameRate: fps });
}
const hasAudio = element.querySelectorAll('audio, video').length > 0;
if (hasAudio) {
audioSource = new mediabunny_1.AudioSampleSource({
codec: isWebM ? 'opus' : (await (0, mediabunny_1.getFirstEncodableAudioCodec)(['aac', 'opus', 'pcm-s16'])),
bitrate: mediabunnyQuality,
const mediaEls = Array.from(element.querySelectorAll("audio, video")).filter((m) => m.src && (m.tagName === "AUDIO" || hasAudio(m)));
let audioSource;
let audioCtx;
if (mediaEls.length > 0) {
audioCtx = new AudioContext();
audioSource = new AudioSampleSource({
codec: isMP4 ? ((await getFirstEncodableAudioCodec(["aac", "opus", "pcm-s16"])) ?? "aac") : "opus",
bitrate: mbQuality,
});

@@ -88,36 +90,45 @@ output.addAudioTrack(audioSource);

await output.start();
for (const m of mediaEls)
await waitMedia(m);
for (const m of mediaEls)
await seekMedia(m, m.duration);
for (const m of mediaEls)
await seekMedia(m, 0);
for (let i = 0; i < totalFrames; i++) {
if (onProgress) {
const shouldContinue = await onProgress((i + 1) / totalFrames);
if (!shouldContinue)
throw new Error('Export cancelled');
const ok = await onProgress((i + 1) / totalFrames);
if (!ok)
throw new Error("Export cancelled");
}
const frameTime = start + i * frameDuration;
seekElement(element, frameTime);
for (const m of mediaEls)
await seekMedia(m, frameTime - (parseFloat(m.dataset.mediaStart ?? "0") || 0));
if (includeVideo && videoSource) {
const frozen = await this.freezer.freezeAll(element);
const canvas = await this.renderer.renderToCanvas(frozen, width, height);
const ctx = canvas.getContext('2d');
if (!ctx)
continue;
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const videoFrame = new VideoFrame(imageData.data.buffer, {
format: 'RGBA',
codedWidth: canvas.width,
codedHeight: canvas.height,
timestamp: (i / fps) * 1000000,
});
await videoSource.add(new mediabunny_1.VideoSample(videoFrame));
videoFrame.close();
const ctx = canvas.getContext("2d");
if (ctx) {
const vf = new VideoFrame(ctx.getImageData(0, 0, canvas.width, canvas.height).data.buffer, {
format: "RGBA",
codedWidth: canvas.width,
codedHeight: canvas.height,
timestamp: Math.round((i / fps) * 1_000_000),
});
await videoSource.add(new VideoSample(vf));
vf.close();
}
}
if (hasAudio && audioSource) {
if (audioSource && audioCtx) {
for await (const chunk of mixAudioFrame(mediaEls, frameTime, frameDuration, audioCtx.sampleRate)) {
await audioSource.add(new AudioSample({ format: "f32", sampleRate: audioCtx.sampleRate, numberOfChannels: 2, ...chunk }));
}
}
}
await output.finalize();
const mimeType = isMP4 ? 'video/mp4' : 'video/webm';
return new Blob(chunks, { type: mimeType });
if (audioCtx)
await audioCtx.close();
return new Blob(chunks, { type: MIME[format] });
}
async exportAudio(_element, _format, _quality, _fps, _start, _end, _onProgress) {
throw new Error('Audio export not yet implemented');
}
}
exports.ElementExporter = ElementExporter;
//# sourceMappingURL=exporter.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"exporter.js","sourceRoot":"","sources":["../src/exporter.ts"],"names":[],"mappings":"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"}

@@ -1,2 +0,2 @@

import { ExportSettings } from './types';
import { ExportSettings } from "./types.js";
export interface ExportOptions {

@@ -8,3 +8,3 @@ element: HTMLElement | SVGSVGElement;

export declare function exportElement(options: ExportOptions): Promise<Blob>;
export declare function settings(format: ExportSettings['format'], config: Omit<ExportSettings, 'format'>): ExportSettings;
export declare function settings(format: ExportSettings["format"], config: Omit<ExportSettings, "format">): ExportSettings;
//# sourceMappingURL=factory.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAED,wBAAgB,QAAQ,CACtB,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,EAChC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GACrC,cAAc,CAKhB"}
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC;IACrC,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/D;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAIzE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,cAAc,CAKjH"}

@@ -1,12 +0,8 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.exportElement = exportElement;
exports.settings = settings;
const exporter_1 = require("./exporter");
async function exportElement(options) {
import { ElementExporter } from "./exporter.js";
export async function exportElement(options) {
const { element, settings, onProgress } = options;
const exporter = new exporter_1.ElementExporter();
const exporter = new ElementExporter();
return exporter.export(element, settings, onProgress);
}
function settings(format, config) {
export function settings(format, config) {
return {

@@ -13,0 +9,0 @@ format,

@@ -1,1 +0,1 @@

{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":";;AASA,sCAIC;AAED,4BAQC;AAvBD,yCAA6C;AAStC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,0BAAe,EAAE,CAAC;IACvC,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,QAAQ,CACtB,MAAgC,EAChC,MAAsC;IAEtC,OAAO;QACL,MAAM;QACN,GAAG,MAAM;KACV,CAAC;AACJ,CAAC"}
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAShD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAgC,EAAE,MAAsC;IAC/F,OAAO;QACL,MAAM;QACN,GAAG,MAAM;KACV,CAAC;AACJ,CAAC"}

@@ -1,4 +0,7 @@

import { FreezeOptions } from './types';
import { FreezeOptions } from "./types.js";
export declare class ElementFreezer {
freezeAll(element: HTMLElement | SVGSVGElement, options?: FreezeOptions): Promise<HTMLElement | SVGSVGElement>;
/** Commit all Web/CSS animation styles to inline style attributes on the source elements.
* Returns a cleanup function that restores the original styles. */
private _commitWebAnimations;
private freezeWebAnimation;

@@ -5,0 +8,0 @@ private freezeSmilAnimation;

@@ -1,1 +0,1 @@

{"version":3,"file":"freezer.d.ts","sourceRoot":"","sources":["../src/freezer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,qBAAa,cAAc;IACnB,SAAS,CACb,OAAO,EAAE,WAAW,GAAG,aAAa,EACpC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC;IAoFvC,OAAO,CAAC,kBAAkB;YAiBZ,mBAAmB;YA2BnB,YAAY;YA0BZ,WAAW;YA4BX,WAAW;IAiCzB,OAAO,CAAC,SAAS;CAelB"}
{"version":3,"file":"freezer.d.ts","sourceRoot":"","sources":["../src/freezer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,cAAc;IACnB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC;IA6DxH;wEACoE;IACpE,OAAO,CAAC,oBAAoB;IAiC5B,OAAO,CAAC,kBAAkB;YAiBZ,mBAAmB;YAyFnB,YAAY;YAoBZ,WAAW;YA4BX,WAAW;IA8BzB,OAAO,CAAC,SAAS;CAelB"}

@@ -1,34 +0,41 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElementFreezer = void 0;
class ElementFreezer {
export class ElementFreezer {
async freezeAll(element, options = {}) {
const { freezeAnimations = true, freezeCanvas = true, freezeVideo = true, freezeImages = true, removeScripts = true, removeAudio = true, } = options;
const { freezeAnimations = true, freezeCanvas = true, freezeVideo = true, freezeImages = true, removeScripts = true, removeAudio = true } = options;
// For CSS/Web Animations: commit styles to source BEFORE cloning.
// This writes the current animated state into inline styles so the clone inherits them.
let restoreStyles;
if (freezeAnimations) {
restoreStyles = this._commitWebAnimations(element);
}
const frozenElement = element.cloneNode(true);
// Restore source styles immediately after clone (don't pollute subsequent frames)
if (restoreStyles)
restoreStyles();
const promises = [];
if (freezeAnimations) {
const sourceAnimated = element
.getAnimations({ subtree: true })
.map((a) => a.effect.target);
const destAnimated = frozenElement
.getAnimations({ subtree: true })
.map((a) => a.effect.target);
promises.push(...sourceAnimated.map((src, i) => Promise.resolve(this.freezeWebAnimation(src, destAnimated[i]))));
const sourceSmil = element.querySelectorAll('animate, animateTransform, animateMotion, set');
const destSmil = frozenElement.querySelectorAll('animate, animateTransform, animateMotion, set');
// Remove animation from the clone (committed styles are already in inline style)
frozenElement.querySelectorAll("*").forEach((el) => {
if (el.style?.animation)
el.style.animation = "none";
});
if (frozenElement.style?.animation)
frozenElement.style.animation = "none";
// SMIL animations: freeze animVal from source into clone static attributes
const sourceSmil = element.querySelectorAll("animate, animateTransform, animateMotion, set");
const destSmil = frozenElement.querySelectorAll("animate, animateTransform, animateMotion, set");
promises.push(...Array.from(sourceSmil).map((src, i) => this.freezeSmilAnimation(src, destSmil[i])));
}
if (freezeCanvas) {
const sourceCanvases = element.querySelectorAll('canvas');
const destCanvases = frozenElement.querySelectorAll('canvas');
const sourceCanvases = element.querySelectorAll("canvas");
const destCanvases = frozenElement.querySelectorAll("canvas");
promises.push(...Array.from(sourceCanvases).map((src, i) => this.freezeCanvas(src, destCanvases[i])));
}
if (freezeVideo) {
const sourceVideos = element.querySelectorAll('video');
const destVideos = frozenElement.querySelectorAll('video');
const sourceVideos = element.querySelectorAll("video");
const destVideos = frozenElement.querySelectorAll("video");
promises.push(...Array.from(sourceVideos).map((src, i) => this.freezeVideo(src, destVideos[i])));
}
if (freezeImages) {
const sourceImages = element.querySelectorAll('image, img');
const destImages = frozenElement.querySelectorAll('image, img');
const sourceImages = element.querySelectorAll("image, img");
const destImages = frozenElement.querySelectorAll("image, img");
promises.push(...Array.from(sourceImages).map((src, i) => this.freezeImage(src, destImages[i])));

@@ -38,44 +45,146 @@ }

if (removeScripts) {
frozenElement.querySelectorAll('script').forEach((script) => script.remove());
frozenElement.querySelectorAll("script").forEach((script) => script.remove());
}
if (removeAudio) {
frozenElement.querySelectorAll('audio').forEach((audio) => audio.remove());
frozenElement.querySelectorAll("audio").forEach((audio) => audio.remove());
}
return frozenElement;
}
/** Commit all Web/CSS animation styles to inline style attributes on the source elements.
* Returns a cleanup function that restores the original styles. */
_commitWebAnimations(element) {
const animations = element.getAnimations({ subtree: true });
const targets = new Map();
for (const a of animations) {
const target = a.effect?.target;
if (target && !targets.has(target)) {
targets.set(target, target.getAttribute("style"));
}
}
for (const [target] of targets) {
const targetAnims = target.getAnimations();
for (const anim of targetAnims) {
try {
anim.commitStyles();
}
catch {
/* ignore */
}
}
}
return () => {
for (const [target, original] of targets) {
if (original !== null) {
target.setAttribute("style", original);
}
else {
target.removeAttribute("style");
}
}
};
}
freezeWebAnimation(source, dest) {
const animations = source.getAnimations();
for (const animation of animations) {
const originalStyle = source.getAttribute('style');
const originalStyle = source.getAttribute("style");
animation.commitStyles();
dest.setAttribute('style', source.getAttribute('style') || '');
dest.setAttribute("style", source.getAttribute("style") || "");
if (originalStyle) {
source.setAttribute('style', originalStyle);
source.setAttribute("style", originalStyle);
}
else {
source.removeAttribute('style');
source.removeAttribute("style");
}
}
if (animations.length > 0) {
dest.style.animation = 'none';
dest.style.animation = "none";
}
}
async freezeSmilAnimation(source, dest) {
const sourceTarget = source.parentElement;
const destTarget = dest.parentElement;
if (!destTarget || !sourceTarget)
// Support href/xlink:href target references
const sourceHref = source.getAttribute("href") || source.getAttribute("xlink:href");
const sourceTarget = sourceHref ? (source.ownerSVGElement?.querySelector(sourceHref) ?? source.parentElement) : source.parentElement;
const destHref = dest.getAttribute("href") || dest.getAttribute("xlink:href");
const destTarget = destHref ? (dest.ownerSVGElement?.querySelector(destHref) ?? dest.parentElement) : dest.parentElement;
if (!destTarget || !sourceTarget) {
dest.remove();
return;
const attrName = source.getAttribute('attributeName');
if (attrName === 'transform' && sourceTarget instanceof SVGGraphicsElement) {
const matrix = sourceTarget.getCTM();
if (matrix) {
destTarget.setAttribute('transform', `matrix(${matrix.a},${matrix.b},${matrix.c},${matrix.d},${matrix.e},${matrix.f})`);
}
const attrName = source.getAttribute("attributeName");
// Handle animateMotion and animateTransform via CTM
if (source.tagName === "animateMotion" || source.tagName === "animateTransform" || attrName === "transform") {
if (sourceTarget instanceof SVGGraphicsElement) {
const matrix = sourceTarget.getCTM();
if (matrix) {
destTarget.setAttribute("transform", `matrix(${matrix.a},${matrix.b},${matrix.c},${matrix.d},${matrix.e},${matrix.f})`);
}
}
dest.remove();
return;
}
else if (attrName) {
const animated = sourceTarget[attrName];
if (animated?.animVal !== undefined) {
destTarget.setAttribute(attrName, String(animated.animVal));
if (!attrName) {
dest.remove();
return;
}
// Try to resolve the animated value
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const animatedProperty = sourceTarget[attrName];
if (animatedProperty && animatedProperty.animVal !== undefined) {
const animVal = animatedProperty.animVal;
if (typeof animVal === "boolean" || typeof animVal === "number" || typeof animVal === "string") {
// Primitive SVGAnimated types: SVGAnimatedNumber, SVGAnimatedString, SVGAnimatedBoolean, SVGAnimatedEnumeration
destTarget.setAttribute(attrName, String(animVal));
}
else if (typeof animVal === "object" && animVal !== null) {
if (animVal.value !== undefined) {
// SVGAnimatedLength, SVGAnimatedAngle, SVGAnimatedNumber (legacy)
destTarget.setAttribute(attrName, String(animVal.value));
}
else if (animVal.x !== undefined && animVal.y !== undefined) {
// SVGAnimatedRect, SVGAnimatedPoint
if (animVal.width !== undefined && animVal.height !== undefined) {
destTarget.setAttribute(attrName, `${animVal.x} ${animVal.y} ${animVal.width} ${animVal.height}`);
}
else {
destTarget.setAttribute(attrName, `${animVal.x} ${animVal.y}`);
}
}
else if (animVal.numberOfItems !== undefined) {
// SVGAnimatedTransformList, SVGAnimatedLengthList, SVGAnimatedNumberList, SVGAnimatedPointList
const items = [];
for (let i = 0; i < animVal.numberOfItems; i++) {
const item = animVal.getItem(i);
if (item.matrix) {
const m = item.matrix;
items.push(`matrix(${m.a},${m.b},${m.c},${m.d},${m.e},${m.f})`);
}
else if (item.value !== undefined) {
items.push(String(item.value));
}
}
if (items.length > 0)
destTarget.setAttribute(attrName, items.join(" "));
}
else if (animVal.align !== undefined) {
// SVGAnimatedPreserveAspectRatio
destTarget.setAttribute(attrName, `${animVal.align} ${animVal.meetOrSlice}`);
}
}
}
else {
// CSS presentation attributes or custom attributes:
// Use computed style to get the current animated value
try {
const computedValue = window.getComputedStyle(sourceTarget).getPropertyValue(attrName);
if (computedValue) {
destTarget.style.setProperty(attrName, computedValue);
}
}
catch {
// If computed style fails, try reading the attribute directly
const attrVal = sourceTarget.getAttribute(attrName);
if (attrVal !== null)
destTarget.setAttribute(attrName, attrVal);
}
}
dest.remove();

@@ -85,3 +194,3 @@ }

if (!this.isVisible(dest)) {
const div = document.createElement('div');
const div = document.createElement("div");
Array.from(dest.attributes).forEach((attr) => div.setAttribute(attr.name, attr.value));

@@ -91,19 +200,18 @@ dest.parentNode?.replaceChild(div, dest);

}
const img = document.createElement('img');
img.crossOrigin = 'anonymous';
source.toBlob((blob) => {
if (blob) {
const url = URL.createObjectURL(blob);
img.src = url;
Array.from(dest.attributes).forEach((attr) => img.setAttribute(attr.name, attr.value));
dest.parentNode?.replaceChild(img, dest);
URL.revokeObjectURL(url);
}
}, 'image/webp', 1);
const img = document.createElement("img");
img.crossOrigin = "anonymous";
const blob = await new Promise((res) => source.toBlob(res, "image/webp", 1));
if (!blob)
return;
const url = URL.createObjectURL(blob);
img.src = url;
Array.from(dest.attributes).forEach((attr) => img.setAttribute(attr.name, attr.value));
dest.parentNode?.replaceChild(img, dest);
URL.revokeObjectURL(url);
}
async freezeVideo(source, dest) {
if (!this.isVisible(dest)) {
const div = document.createElement('div');
const div = document.createElement("div");
Array.from(dest.attributes).forEach((attr) => {
if (attr.name !== 'src')
if (attr.name !== "src")
div.setAttribute(attr.name, attr.value);

@@ -115,13 +223,13 @@ });

const canvas = new OffscreenCanvas(source.videoWidth || 640, source.videoHeight || 480);
const ctx = canvas.getContext('2d');
const ctx = canvas.getContext("2d");
if (!ctx)
return;
ctx.drawImage(source, 0, 0);
const blob = await canvas.convertToBlob({ type: 'image/webp', quality: 1 });
const blob = await canvas.convertToBlob({ type: "image/webp", quality: 1 });
const url = URL.createObjectURL(blob);
const img = document.createElement('img');
img.crossOrigin = 'anonymous';
const img = document.createElement("img");
img.crossOrigin = "anonymous";
img.src = url;
Array.from(dest.attributes).forEach((attr) => {
if (attr.name !== 'src')
if (attr.name !== "src")
img.setAttribute(attr.name, attr.value);

@@ -135,8 +243,8 @@ });

if (dest instanceof SVGImageElement) {
dest.setAttribute('href', '');
dest.setAttribute("href", "");
}
else {
const div = document.createElement('div');
const div = document.createElement("div");
Array.from(dest.attributes).forEach((attr) => {
if (attr.name !== 'src')
if (attr.name !== "src")
div.setAttribute(attr.name, attr.value);

@@ -148,16 +256,16 @@ });

}
const src = source.getAttribute('src') || source.getAttribute('href');
const src = source.getAttribute("src") || source.getAttribute("href");
if (!src)
return;
const img = new Image();
img.crossOrigin = 'anonymous';
img.crossOrigin = "anonymous";
img.src = src;
await img.decode();
if (dest instanceof SVGImageElement) {
dest.setAttribute('href', src);
dest.setAttribute("href", src);
}
else {
dest.setAttribute('src', src);
dest.setAttribute("src", src);
}
dest.crossOrigin = 'anonymous';
dest.crossOrigin = "anonymous";
}

@@ -168,6 +276,6 @@ isVisible(element) {

if (current instanceof SVGElement) {
const display = current.getAttribute('display');
const visibility = current.getAttribute('visibility');
const opacity = current.getAttribute('opacity');
if (display === 'none' || visibility === 'hidden' || opacity === '0') {
const display = current.getAttribute("display");
const visibility = current.getAttribute("visibility");
const opacity = current.getAttribute("opacity");
if (display === "none" || visibility === "hidden" || opacity === "0") {
return false;

@@ -181,3 +289,2 @@ }

}
exports.ElementFreezer = ElementFreezer;
//# sourceMappingURL=freezer.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"freezer.js","sourceRoot":"","sources":["../src/freezer.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"freezer.js","sourceRoot":"","sources":["../src/freezer.ts"],"names":[],"mappings":"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"}

@@ -1,6 +0,9 @@

export { ElementExporter } from './exporter';
export { ExportOptions, exportElement, settings } from './factory';
export { ElementFreezer } from './freezer';
export { ElementRenderer } from './renderer';
export { ExportProgress, ExportSettings, FreezeOptions } from './types';
export { decodeAudio, extractAudioPCM, hasAudio, mixAudioFrame } from "./audio.js";
export { ElementExporter, registerExporter } from "./exporter.js";
export { ExportOptions, exportElement, settings } from "./factory.js";
export { ElementFreezer } from "./freezer.js";
export { seekElement, seekMedia, waitMedia } from "./media.js";
export { ElementRenderer } from "./renderer.js";
export { ElementStreamer } from "./streamer.js";
export { ExportSettings, FreezeOptions } from "./types.js";
//# sourceMappingURL=index.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}

@@ -1,13 +0,8 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElementRenderer = exports.ElementFreezer = exports.settings = exports.exportElement = exports.ElementExporter = void 0;
var exporter_1 = require("./exporter");
Object.defineProperty(exports, "ElementExporter", { enumerable: true, get: function () { return exporter_1.ElementExporter; } });
var factory_1 = require("./factory");
Object.defineProperty(exports, "exportElement", { enumerable: true, get: function () { return factory_1.exportElement; } });
Object.defineProperty(exports, "settings", { enumerable: true, get: function () { return factory_1.settings; } });
var freezer_1 = require("./freezer");
Object.defineProperty(exports, "ElementFreezer", { enumerable: true, get: function () { return freezer_1.ElementFreezer; } });
var renderer_1 = require("./renderer");
Object.defineProperty(exports, "ElementRenderer", { enumerable: true, get: function () { return renderer_1.ElementRenderer; } });
export { decodeAudio, extractAudioPCM, hasAudio, mixAudioFrame } from "./audio.js";
export { ElementExporter, registerExporter } from "./exporter.js";
export { exportElement, settings } from "./factory.js";
export { ElementFreezer } from "./freezer.js";
export { seekElement, seekMedia, waitMedia } from "./media.js";
export { ElementRenderer } from "./renderer.js";
export { ElementStreamer } from "./streamer.js";
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAA6C;AAApC,2GAAA,eAAe,OAAA;AACxB,qCAAmE;AAA3C,wGAAA,aAAa,OAAA;AAAE,mGAAA,QAAQ,OAAA;AAC/C,qCAA2C;AAAlC,yGAAA,cAAc,OAAA;AACvB,uCAA6C;AAApC,2GAAA,eAAe,OAAA"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAiB,aAAa,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
export declare class ElementRenderer {
renderToImage(element: HTMLElement | SVGSVGElement): Promise<HTMLImageElement>;
/**
* Render any HTML or SVG element to an OffscreenCanvas.
* HTML elements use html2canvas for native HTML→Canvas rendering.
* SVG elements use XMLSerializer → dataURL → Image.
*/
renderToCanvas(element: HTMLElement | SVGSVGElement, width?: number, height?: number): Promise<OffscreenCanvas>;
private renderSvgToImage;
private renderHtmlToImage;
private renderHtmlToCanvas;
private renderHtmlViaForeignObject;
}
//# sourceMappingURL=renderer.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IACpB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAO9E,cAAc,CAClB,OAAO,EAAE,WAAW,GAAG,aAAa,EACpC,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC;YAkBb,gBAAgB;YAoBhB,iBAAiB;CAkBhC"}
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,qBAAa,eAAe;IAC1B;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAkCvG,gBAAgB;YAoBhB,kBAAkB;YA0BlB,0BAA0B;CAmBzC"}

@@ -1,28 +0,43 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ElementRenderer = void 0;
class ElementRenderer {
async renderToImage(element) {
export class ElementRenderer {
/**
* Render any HTML or SVG element to an OffscreenCanvas.
* HTML elements use html2canvas for native HTML→Canvas rendering.
* SVG elements use XMLSerializer → dataURL → Image.
*/
async renderToCanvas(element, width, height) {
let w;
let h;
if (width && height) {
w = width;
h = height;
}
else if (element instanceof SVGSVGElement) {
const img = await this.renderSvgToImage(element);
w = width ?? (element.width.baseVal.value || img.width);
h = height ?? (element.height.baseVal.value || img.height);
}
else {
const rect = element.getBoundingClientRect();
w = width ?? (rect.width > 0 ? rect.width : element.scrollWidth || 800);
h = height ?? (rect.height > 0 ? rect.height : element.scrollHeight || 600);
}
w = Math.max(1, Math.round(w));
h = Math.max(1, Math.round(h));
if (element instanceof SVGSVGElement) {
return this.renderSvgToImage(element);
// SVG: serialize to string, load as image, draw to canvas
const img = await this.renderSvgToImage(element);
const canvas = new OffscreenCanvas(w, h);
const ctx = canvas.getContext("2d");
if (!ctx)
throw new Error("Failed to get canvas context");
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
return canvas;
}
return this.renderHtmlToImage(element);
// HTML: use html2canvas for native rendering
return this.renderHtmlToCanvas(element, w, h);
}
async renderToCanvas(element, width, height) {
const img = await this.renderToImage(element);
const w = width ||
(element instanceof SVGSVGElement ? element.width.baseVal.value : element.clientWidth);
const h = height ||
(element instanceof SVGSVGElement ? element.height.baseVal.value : element.clientHeight);
const canvas = new OffscreenCanvas(Math.round(w), Math.round(h));
const ctx = canvas.getContext('2d');
if (!ctx)
throw new Error('Failed to get canvas context');
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
return canvas;
}
async renderSvgToImage(element) {
const serializer = new XMLSerializer();
const svgString = serializer.serializeToString(element);
const blob = new Blob([svgString], { type: 'image/svg+xml' });
const blob = new Blob([svgString], { type: "image/svg+xml" });
const dataURL = await new Promise((resolve, reject) => {

@@ -35,3 +50,3 @@ const reader = new FileReader();

const img = new Image();
img.crossOrigin = 'anonymous';
img.crossOrigin = "anonymous";
img.src = dataURL;

@@ -41,19 +56,46 @@ await img.decode();

}
async renderHtmlToImage(element) {
const canvas = new OffscreenCanvas(element.clientWidth, element.clientHeight);
const ctx = canvas.getContext('2d');
if (!ctx)
throw new Error('Failed to get canvas context');
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
svg.setAttribute('width', String(element.clientWidth));
svg.setAttribute('height', String(element.clientHeight));
const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
foreignObject.setAttribute('width', '100%');
foreignObject.setAttribute('height', '100%');
async renderHtmlToCanvas(element, width, height) {
// Use html2canvas for accurate HTML rendering
try {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const html2canvas = (await import("html2canvas")).default;
const canvas = await html2canvas(element, {
width,
height,
scale: 1,
useCORS: true,
allowTaint: true,
backgroundColor: null,
logging: false,
});
const offscreen = new OffscreenCanvas(width, height);
const ctx = offscreen.getContext("2d");
if (!ctx)
throw new Error("Failed to get canvas context");
ctx.drawImage(canvas, 0, 0, width, height, 0, 0, width, height);
return offscreen;
}
catch {
// Fallback: SVG foreignObject approach
return this.renderHtmlViaForeignObject(element, width, height);
}
}
async renderHtmlViaForeignObject(element, width, height) {
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("width", String(width));
svg.setAttribute("height", String(height));
const foreignObject = document.createElementNS("http://www.w3.org/2000/svg", "foreignObject");
foreignObject.setAttribute("width", "100%");
foreignObject.setAttribute("height", "100%");
foreignObject.appendChild(element.cloneNode(true));
svg.appendChild(foreignObject);
return this.renderSvgToImage(svg);
const img = await this.renderSvgToImage(svg);
const canvas = new OffscreenCanvas(width, height);
const ctx = canvas.getContext("2d");
if (!ctx)
throw new Error("Failed to get canvas context");
ctx.drawImage(img, 0, 0);
return canvas;
}
}
exports.ElementRenderer = ElementRenderer;
//# sourceMappingURL=renderer.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
export interface ExportSettings {
format: 'svg' | 'png' | 'jpg' | 'webp' | 'webm' | 'mp4' | 'm4a' | 'ogg';
format: "svg" | "png" | "jpg" | "webp" | "webm" | "mp4" | "m4a" | "ogg" | "pdf";
quality?: number;

@@ -11,7 +11,2 @@ fps?: number;

}
export interface ExportProgress {
progress: number;
status: 'pending' | 'exporting' | 'completed' | 'failed' | 'cancelled';
blob?: Blob;
}
export interface FreezeOptions {

@@ -18,0 +13,0 @@ freezeAnimations?: boolean;

@@ -1,1 +0,1 @@

{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACvE,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAChF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}

@@ -1,3 +0,2 @@

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
export {};
//# sourceMappingURL=types.js.map
{
"name": "@framv/core",
"version": "0.0.1",
"description": "Core library for freezing HTML elements into video frames",
"version": "0.1.0",
"private": false,
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"scripts": {
"build": "tsc",
"lint": "eslint src/**/*.ts",
"format": "prettier --write \"src/**/*.{ts,js,json}\"",
"format:check": "prettier --check \"src/**/*.{ts,js,json}\"",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage"
"exports": {
".": {
"types": "./dist/index.d.ts",
"import": "./dist/index.js",
"default": "./dist/index.js"
}
},
"files": [
"dist"
],
"description": "Core rendering primitives for framv — freeze HTML/SVG elements into canvas frames, images, and video",
"keywords": [

@@ -21,33 +24,42 @@ "video",

"mediabunny",
"animation"
"animation",
"html",
"svg",
"canvas"
],
"license": "MIT",
"scripts": {
"build": "tsc -b && npm run bundle",
"prepublishOnly": "npm run build",
"bundle": "esbuild src/index.ts --bundle --format=esm --outfile=dist/bundle.esm.js && esbuild src/cdn.ts --bundle --format=iife --global-name=Framv --outfile=dist/bundle.iife.js",
"format": "prettier --write \"src/**/*.ts\"",
"lint": "eslint \"src/**/*.ts\" --fix",
"test": "vitest run",
"test:watch": "vitest",
"test:ui": "vitest --ui"
},
"dependencies": {
"mediabunny": "^1.24.5"
"file-saver": "^2.0.5",
"html2canvas": "^1.4.1",
"mediabunny": "^1.35.1"
},
"devDependencies": {
"@types/jest": "^30.0.0",
"@types/node": "^24.10.0",
"jest": "^30.2.0",
"jest-environment-jsdom": "^30.2.0",
"ts-jest": "^29.4.5",
"typescript": "^5.9.3"
"@vitest/ui": "^4.0.18",
"eslint": "^10.0.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.5",
"jsdom": "^28.1.0",
"prettier": "^3.8.1",
"typescript": "^5.9.3",
"vitest": "^4.0.18"
},
"jest": {
"preset": "ts-jest",
"testEnvironment": "jsdom",
"setupFilesAfterEnv": [
"<rootDir>/jest.setup.js"
],
"roots": [
"<rootDir>/test"
],
"testMatch": [
"**/*.test.ts"
],
"collectCoverageFrom": [
"src/**/*.ts",
"!src/**/*.d.ts"
]
"author": "Mens Reversa",
"repository": {
"type": "git",
"url": "https://github.com/mensreversa/framv.git",
"directory": "packages/core"
},
"bugs": {
"url": "https://github.com/mensreversa/framv/issues"
}
}
// Polyfill for TextDecoder/TextEncoder in Jest environment
if (typeof globalThis.TextDecoder === 'undefined') {
const { TextDecoder, TextEncoder } = require('util');
globalThis.TextDecoder = TextDecoder;
globalThis.TextEncoder = TextEncoder;
}