@hyperframes/inspector 0.8.185 → 0.8.188

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ export declare const AUDIBLE_VIDEO_QUALIFIER = ":not([muted]):is(:not([data-has-audio]),[data-has-audio=\"true\"])";
2
+ export declare const AUDIBLE_MEDIA_SELECTOR = "audio[data-start], video[data-start]:not([muted]):is(:not([data-has-audio]),[data-has-audio=\"true\"])";
3
+ export declare function isAudibleVideoElement(el: {
4
+ tagName: string;
5
+ hasAttribute(name: string): boolean;
6
+ getAttribute(name: string): string | null;
7
+ }): boolean;
8
+ export declare function audibleVideoNeedsWebAudio(fields: {
9
+ volume?: number | null;
10
+ fxChain?: string | null;
11
+ automation?: string | null;
12
+ audioGroup?: string | null;
13
+ masterChain?: string | null;
14
+ }): boolean;
@@ -120,6 +120,12 @@ export interface AutomationRange {
120
120
  * disables the fader while a lane owns it, so there was no way back.
121
121
  */
122
122
  export declare const VOLUME_RANGE: AutomationRange;
123
+ /** Bounded sampling for volume curves drawn as straight pieces by the PCM baker. */
124
+ export declare function volumeSegmentSampleCount(duration: number): number;
125
+ /** Whether the segment leaving `point` bends: by `curve`, or through a `viaX`/`viaY` point. */
126
+ export declare function isBentSegment(point: Pick<HfAutomationPoint, "curve" | "viaX" | "viaY">): boolean;
127
+ export declare function gainedVolume(v: number, gain: number, gainAhead?: boolean): number;
128
+ export declare function gainedVolumePoints(lane: HfAutomationLane, gain: number, gainAhead?: boolean): HfAutomationPoint[];
123
129
  export declare const RATE_RANGE: AutomationRange;
124
130
  /**
125
131
  * Resolve a lane's target against a chain. Returns null when the target names
@@ -15,6 +15,10 @@ export declare const MAX_AUDIO_GAIN: number;
15
15
  export declare const AUDIO_GAIN_FADER_MIN = -100;
16
16
  export declare const AUDIO_GAIN_FADER_MAX = 100;
17
17
  export declare function clampAudioGain(value: number): number;
18
+ /** `data-volume` is a gain on the volume lane, as clip gain offsets the keyframes in an NLE. */
19
+ export declare function gainTimesLane(gain: number, lane: number): number;
20
+ /** `data-volume` as clip gain, ahead of the FX chain; unity when a GSAP tween's absolute values own the level. */
21
+ export declare function clipGain(volume: number, tweened: boolean): number;
18
22
  export declare function clampNativeMediaVolume(value: number): number;
19
23
  /**
20
24
  * Serialize an authored gain for `data-volume`.
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Document-unique identity for media elements in a compiled render document.
3
+ *
4
+ * Element `id`s are only unique within one composition FILE. The render
5
+ * document is the inlined union of every file, so ids collide there in two
6
+ * ways an author cannot avoid:
7
+ *
8
+ * 1. Two scenes each declare `<video id="clip">` — legal per file, duplicated
9
+ * once inlined.
10
+ * 2. Two scenes each declare a bare `<video>` — the timing compiler numbers
11
+ * auto-ids per file, so both become `hf-video-0`.
12
+ *
13
+ * The render pipeline keys media on that id (extract, inject, visibility,
14
+ * bounds), so a collision collapses N elements into one entry and every
15
+ * lookup resolves to whichever element happens to come first in the document.
16
+ * The surviving clip's frames land on the wrong element and the visible scene
17
+ * paints without footage.
18
+ *
19
+ * This module is the single owner of the fix: after inlining, every media
20
+ * element gets a document-unique `data-hf-render-id`. It equals the element's
21
+ * own id whenever that id is already unique, so uncolliding documents keep
22
+ * byte-identical pipeline keys and log output. Author-visible `id` attributes
23
+ * are never rewritten — 158 of the 161 registry blocks reference their own ids
24
+ * from `#id` CSS or `getElementById`, so renaming would break scene styling to
25
+ * fix scene footage.
26
+ */
27
+ export declare const MEDIA_RENDER_ID_ATTR = "data-hf-render-id";
28
+ /**
29
+ * The bus a member belongs to, as a DOCUMENT-unique key.
30
+ *
31
+ * `data-audio-group` names a bus by author id, unique only per composition FILE
32
+ * — so a sub-composition that declares a bus AND its members, used twice, put
33
+ * both instances' members under one key and let the second bus element
34
+ * overwrite the first. The mixer then sub-mixed two independent buses as one,
35
+ * applied instance B's fader, chain and label to instance A's audio, and — with
36
+ * only B muted — dropped BOTH instances from the export. This attribute is that
37
+ * collision resolved at the same boundary the media ids are.
38
+ */
39
+ export declare const AUDIO_GROUP_RENDER_ID_ATTR = "data-hf-group-render-id";
40
+ interface MediaElementLike {
41
+ readonly tagName?: string;
42
+ getAttribute(name: string): string | null;
43
+ setAttribute(name: string, value: string): void;
44
+ }
45
+ interface DocumentLike {
46
+ querySelectorAll(selector: string): Iterable<MediaElementLike>;
47
+ }
48
+ /**
49
+ * Stamp `data-hf-render-id` on every media element in a compiled document.
50
+ *
51
+ * Preserve unique existing stamps on recompilation. Repair stamps that collide
52
+ * after independently compiled scenes are merged.
53
+ */
54
+ export declare function assignMediaRenderIds(document: DocumentLike): void;
55
+ export {};
@@ -0,0 +1,8 @@
1
+ /** Chrome <=155 marks a capture canvas with `layoutsubtree`; 157+ with `content="drawable"` and `drawable` on each captured child. */
2
+ export type HtmlInCanvasForm = "layoutsubtree" | "drawable";
3
+ export declare const CAPTURE_CANVAS_SELECTOR = "canvas[layoutsubtree], canvas[content=\"drawable\"]";
4
+ /** The form this browser's html-in-canvas takes, or null when it has no usable one. */
5
+ export declare function htmlInCanvasForm(win?: Window): HtmlInCanvasForm | null;
6
+ export declare function markCaptureCanvas(canvas: HTMLCanvasElement, form: HtmlInCanvasForm): void;
7
+ export declare function markCaptured(el: Element, form: HtmlInCanvasForm): void;
8
+ export declare function unmarkCaptured(el: Element, form: HtmlInCanvasForm): void;
@@ -0,0 +1,11 @@
1
+ export declare const PAGE_MOTION_BLUR_OFF_GLOBAL = "__HF_PAGE_MOTION_BLUR_OFF__";
2
+ export declare const PAGE_DEVICE_SCALE_GLOBAL = "__HF_DEVICE_SCALE_FACTOR__";
3
+ export declare function supportsCaptureMotionBlur(win?: Window): boolean;
4
+ /**
5
+ * Remember canvases html-in-canvas cannot capture: WebGL, WebGPU, or handed to an OffscreenCanvas.
6
+ * Self-contained: the engine and the preview run its source ahead of every author script.
7
+ */
8
+ export declare function installAcceleratedCanvasTracker(): void;
9
+ export declare function isAcceleratedCanvas(canvas: HTMLCanvasElement): boolean;
10
+ /** The tracker as a script body, for `evaluateOnNewDocument` and inline `<script>` injection. */
11
+ export declare function acceleratedCanvasTrackerSource(): string;
@@ -1,11 +1,9 @@
1
1
  /**
2
2
  * The volume lane's gain for an element at a moment in its clip.
3
3
  *
4
- * Volume is not scheduled onto the gain AudioParam the way FX parameters are.
5
- * The runtime rewrites that gain every tick from `data-volume` and the GSAP
6
- * seeked value, which would erase a scheduled envelope within a frame — so the
7
- * lane feeds the same per-tick path the probed `volumeKeyframes` already use,
8
- * and the render still bakes it into the samples.
4
+ * Read per tick for a clip that sounds through `el.volume`. A clip the Web Audio
5
+ * transport routes plays its lane scheduled on a gain of its own
6
+ * (`attachClipStages`), out of reach of the per-tick gain write.
9
7
  */
10
8
  import { type HfAutomationLane } from "../audioAutomation.js";
11
9
  /** The lane for `target` inside a `data-automation` value, or null when absent or unreadable. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperframes/inspector",
3
- "version": "0.8.185",
3
+ "version": "0.8.188",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/heygen-com/hyperframes",
@@ -43,8 +43,8 @@
43
43
  "htmlparser2": "^10.1.0",
44
44
  "postcss": "^8.5.8",
45
45
  "puppeteer-core": "^25.8.0",
46
- "@hyperframes/core": "0.8.185",
47
- "@hyperframes/parsers": "0.8.185"
46
+ "@hyperframes/core": "0.8.188",
47
+ "@hyperframes/parsers": "0.8.188"
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/node": "^25.0.10",