@it-compiles/anima 0.1.2 → 0.1.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"video-renderer-Buv1c43x.js","sources":["../src/core/types.ts","../src/core/math.ts","../src/core/context.ts","../src/core/player.ts","../../../node_modules/mp4-muxer/build/mp4-muxer.mjs","../src/core/video-renderer.ts"],"sourcesContent":["export type Vec2 = readonly [number, number];\n\n/** Lazy expression that evaluates to Vec2 using resolved context */\nexport type Vec2Expr = Vec2 | ((ctx: ResolvedCtx) => Vec2);\n\n/** Lazy expression that evaluates to Rect using resolved context */\nexport type RectExpr = Rect | ((ctx: ResolvedCtx) => Rect);\n\n/** Lazy expression that evaluates to number using resolved context */\nexport type NumExpr = number | ((ctx: ResolvedCtx) => number);\n\n/** Helper to check if value is an expression (function) */\nexport function isExpr<T>(v: T | ((ctx: ResolvedCtx) => T)): v is (ctx: ResolvedCtx) => T {\n return typeof v === 'function';\n}\n\nexport type Anchor =\n | \"origin\" // (0, 0) - the transform origin point\n | \"topLeft\"\n | \"top\"\n | \"topRight\"\n | \"left\"\n | \"center\"\n | \"right\"\n | \"bottomLeft\"\n | \"bottom\"\n | \"bottomRight\"\n | \"baselineLeft\"\n | \"baseline\";\n\nexport interface SceneObject {\n readonly id: symbol;\n}\n\nexport interface GroupObject extends SceneObject {\n readonly members: SceneObject[];\n readonly isGroup: true;\n}\n\nexport type ObjRef = SceneObject | GroupObject;\n\nexport function isGroup(obj: SceneObject): obj is GroupObject {\n return 'isGroup' in obj && (obj as GroupObject).isGroup === true;\n}\n\nexport interface Transform {\n translate: Vec2;\n rotate: number; // radians\n scale: number;\n scaleX?: number; // optional non-uniform scale\n scaleY?: number;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface TextOpts {\n at?: Vec2;\n pin?: Anchor;\n font?: string;\n size?: number;\n color?: string;\n}\n\nexport interface ImageOpts {\n at?: Vec2;\n pin?: Anchor;\n width?: number;\n height?: number;\n}\n\nexport interface RectOpts {\n at?: Vec2;\n pin?: Anchor;\n width: number;\n height: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n cornerRadius?: number;\n}\n\nexport interface ResolvedCtx {\n getTransform(obj: SceneObject): Transform;\n getOpacity(obj: SceneObject): number;\n}\n\nexport type ImageSource =\n | { kind: \"url\"; src: string }\n | { kind: \"image\"; image: HTMLImageElement }\n | { kind: \"bitmap\"; bitmap: ImageBitmap }\n | { kind: \"canvas\"; canvas: HTMLCanvasElement };\n\nexport interface Scene {\n text(content: string, opts?: TextOpts): SceneObject;\n rect(opts: RectOpts): SceneObject;\n bg(color: string): SceneObject;\n image(src: string | HTMLImageElement | ImageBitmap | HTMLCanvasElement | ImageSource, opts: ImageOpts): SceneObject;\n objects(): Iterable<SceneObject>;\n getBounds(obj: SceneObject): Rect;\n getBaseline(obj: SceneObject): number | null;\n resolveAnchor(obj: SceneObject, anchor: Anchor): Vec2;\n getInitialTransform(obj: SceneObject): Transform;\n render(ctx: ResolvedCtx, canvas: HTMLCanvasElement, dpr?: number): void;\n}\n\nexport type EaseFn = (u: number) => number;\nexport type BodyFn<TCtx> = (ctx: TCtx, u: number) => void;\nexport type InstantBodyFn<TCtx> = (ctx: TCtx) => void;\n\nexport interface Segment<TCtx> {\n start: number;\n end: number;\n ease: EaseFn;\n body: BodyFn<TCtx>;\n}\n\nexport interface TimelineAPI<TCtx> {\n seq(fn: () => void): void;\n mark(name: string): void;\n tween(dur: number, ease: EaseFn | null | undefined, body: BodyFn<TCtx>): void;\n instant(body: InstantBodyFn<TCtx>): void;\n /** Wait/pause for a duration (sugar for tween with no-op body) */\n wait(dur: number): void;\n with(name: string, offsetMs: number, fn: () => void): void;\n overlap(offsetMs: number, fn: () => void): void;\n par(fn: () => void): void;\n}\n\nexport interface Timeline<TCtx> {\n duration: number;\n segs: Segment<TCtx>[];\n evaluate(tMs: number, ctx: TCtx): void;\n}\n\nexport interface TransformMethods {\n to(v: NumExpr, u: number): void;\n by(delta: NumExpr, u: number): void;\n}\n\n/** Target for resize - can be a number (width-based uniform) or an object */\nexport type ResizeTarget =\n | number // width-based uniform (default)\n | { width: number } // width-based uniform (explicit)\n | { height: number } // height-based uniform\n | { width: number; height: number } // non-uniform\n | { fit: number }; // fit within a box\n\n/** Resize target that supports expressions */\nexport type ResizeTargetExpr =\n | NumExpr // width-based uniform\n | { width: NumExpr } // width-based uniform (explicit)\n | { height: NumExpr } // height-based uniform\n | { width: NumExpr; height: NumExpr } // non-uniform\n | { fit: NumExpr }; // fit within a box\n\n/** Methods for pixel-based resizing */\nexport interface ResizeMethods {\n to(target: ResizeTargetExpr, u: number): void;\n by(delta: ResizeTargetExpr, u: number): void;\n}\n\n/** Options for toBBox */\nexport interface FitToBBoxOpts {\n pad?: Padding;\n}\n\n/** Methods for fitting an object to a bounding box (resize + center pin) */\nexport interface FitMethods {\n /** Fit to an existing BBoxHandle */\n to(bbox: BBoxHandle, u: number): void;\n /** Measure a group/object and fit to it */\n toBBox(target: SceneObject | GroupObject, u: number, opts?: FitToBBoxOpts): void;\n}\n\n/** Padding specification - uniform number or per-side values */\nexport type Padding = number | {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n};\n\n/** Handle for measured bounding box - returns lazy expressions */\nexport interface BBoxHandle {\n /** Add uniform or per-side padding */\n pad(p: Padding): BBoxHandle;\n /** Get size as [width, height] */\n size(): Vec2Expr;\n /** Get width in pixels */\n width(): NumExpr;\n /** Get height in pixels */\n height(): NumExpr;\n /** Get { width, height } for use with resize().to() */\n whSize(): { width: NumExpr; height: NumExpr };\n /** Get center point */\n center(): Vec2Expr;\n /** Get position of any anchor on the bbox */\n anchor(a: Anchor): Vec2Expr;\n /** Get the raw rect */\n toRect(): RectExpr;\n}\n\nexport interface PinMethods {\n to(pos: Vec2Expr, u: number): void;\n by(delta: Vec2Expr, u: number): void;\n}\n\nexport interface GroupBuilder extends GroupObject {\n pin(anchor: Anchor): PinMethods;\n scale(): TransformMethods;\n rotate(): TransformMethods;\n opacity(): TransformMethods;\n}\n\nexport interface LayoutOpts {\n axis?: \"x\" | \"y\";\n align?: Anchor;\n gap?: number;\n}\n\nexport interface AlignOpts {\n anchor?: Anchor;\n}\n\nexport interface LayoutBuilder {\n to(u: number): GroupBuilder;\n}\n\nexport interface AnimCtx {\n pin(obj: SceneObject | GroupObject, anchor: Anchor): PinMethods;\n scale(obj: SceneObject | GroupObject): TransformMethods;\n scaleX(obj: SceneObject): TransformMethods;\n scaleY(obj: SceneObject): TransformMethods;\n rotate(obj: SceneObject | GroupObject): TransformMethods;\n opacity(obj: SceneObject | GroupObject): TransformMethods;\n /** Set width in pixels (converts to scaleX internally) */\n width(obj: SceneObject): TransformMethods;\n /** Set height in pixels (converts to scaleY internally) */\n height(obj: SceneObject): TransformMethods;\n /** Resize in pixels - uniform or non-uniform */\n resize(obj: SceneObject): ResizeMethods;\n /** Fit object to a bounding box (resize + center pin) */\n fit(obj: SceneObject): FitMethods;\n /** Measure the bounding box of an object or group */\n bbox(obj: SceneObject | GroupObject): BBoxHandle;\n group(...objects: SceneObject[]): GroupBuilder;\n layout(...args: (ObjRef | LayoutOpts)[]): LayoutBuilder;\n inline(...objects: ObjRef[]): LayoutBuilder;\n stack(...objects: ObjRef[]): LayoutBuilder;\n paragraph(...objects: ObjRef[]): LayoutBuilder;\n align(...args: (ObjRef | AlignOpts)[]): LayoutBuilder;\n center(...objects: ObjRef[]): LayoutBuilder;\n}\n\nexport interface PinConstraint {\n anchor: Anchor;\n world: Vec2;\n weight?: number;\n priority?: number;\n source?: string;\n}\n\nexport interface ChannelState {\n scale?: number;\n scaleX?: number;\n scaleY?: number;\n rotate?: number;\n opacity?: number;\n}\n","import type { Vec2 } from './types';\n\n// Screen dimensions (logical size, not affected by retina scaling)\nexport const Screen = {\n width: 1280,\n height: 720,\n center: (): Vec2 => [640, 360],\n centerX: (): number => 640,\n centerY: (): number => 360,\n topLeft: (): Vec2 => [0, 0],\n topRight: (): Vec2 => [1280, 0],\n bottomLeft: (): Vec2 => [0, 720],\n bottomRight: (): Vec2 => [1280, 720],\n};\n\nexport const vec = {\n add: ([x1, y1]: Vec2, [x2, y2]: Vec2): Vec2 => [x1 + x2, y1 + y2],\n sub: ([x1, y1]: Vec2, [x2, y2]: Vec2): Vec2 => [x1 - x2, y1 - y2],\n lerp: ([x1, y1]: Vec2, [x2, y2]: Vec2, u: number): Vec2 =>\n [x1 + (x2 - x1) * u, y1 + (y2 - y1) * u],\n};\n\nexport const Vec = (x: number, y: number): Vec2 => [x, y];\n\nexport const lerp = (a: number, b: number, u: number): number => a + (b - a) * u;\n\nexport const angle = (deg: number): number => {\n return deg * (Math.PI / 180);\n};\n\nexport function applySR(\n [x, y]: Vec2,\n scale: number,\n rotate: number, // radians\n scaleX: number = 1,\n scaleY: number = 1\n): Vec2 {\n // scale (uniform * non-uniform)\n const sx = x * scale * scaleX;\n const sy = y * scale * scaleY;\n\n // rotate\n const c = Math.cos(rotate);\n const s = Math.sin(rotate);\n\n return [\n sx * c - sy * s,\n sx * s + sy * c,\n ];\n}\n","import type {\n AlignOpts,\n Anchor,\n AnimCtx,\n BBoxHandle,\n ChannelState,\n FitMethods,\n FitToBBoxOpts,\n GroupBuilder,\n GroupObject,\n LayoutBuilder,\n LayoutOpts,\n NumExpr,\n ObjRef,\n Padding,\n PinConstraint,\n PinMethods,\n Rect,\n RectExpr,\n ResizeMethods,\n ResizeTarget,\n ResizeTargetExpr,\n ResolvedCtx,\n Scene,\n SceneObject,\n Transform,\n TransformMethods,\n Vec2,\n Vec2Expr,\n} from './types';\nimport { isGroup, isExpr } from './types';\nimport { applySR, lerp, vec } from './math';\n\nexport interface DebugGroupInfo {\n members: SceneObject[];\n kind: 'group' | 'layout';\n pin?: {\n anchor: Anchor;\n target: Vec2;\n };\n}\n\nclass BBoxHandleImpl implements BBoxHandle {\n private paddingValues = { top: 0, right: 0, bottom: 0, left: 0 };\n // Store a function that computes the rect lazily\n private computeRect: () => Rect;\n\n constructor(computeRect: () => Rect) {\n this.computeRect = computeRect;\n }\n\n pad(p: Padding): BBoxHandle {\n const parentCompute = this.computeRect;\n const parentPadding = this.paddingValues;\n\n let newPadding: typeof this.paddingValues;\n if (typeof p === 'number') {\n newPadding = {\n top: parentPadding.top + p,\n right: parentPadding.right + p,\n bottom: parentPadding.bottom + p,\n left: parentPadding.left + p,\n };\n } else {\n newPadding = {\n top: parentPadding.top + (p.top ?? 0),\n right: parentPadding.right + (p.right ?? 0),\n bottom: parentPadding.bottom + (p.bottom ?? 0),\n left: parentPadding.left + (p.left ?? 0),\n };\n }\n\n const result = new BBoxHandleImpl(parentCompute);\n result.paddingValues = newPadding;\n return result;\n }\n\n private getRect(): Rect {\n const baseRect = this.computeRect();\n return {\n x: baseRect.x - this.paddingValues.left,\n y: baseRect.y - this.paddingValues.top,\n w: baseRect.w + this.paddingValues.left + this.paddingValues.right,\n h: baseRect.h + this.paddingValues.top + this.paddingValues.bottom,\n };\n }\n\n size(): Vec2Expr {\n return (_ctx: ResolvedCtx): Vec2 => {\n const r = this.getRect();\n return [r.w, r.h];\n };\n }\n\n width(): NumExpr {\n return (_ctx: ResolvedCtx): number => {\n return this.getRect().w;\n };\n }\n\n height(): NumExpr {\n return (_ctx: ResolvedCtx): number => {\n return this.getRect().h;\n };\n }\n\n whSize(): { width: NumExpr; height: NumExpr } {\n return {\n width: this.width(),\n height: this.height(),\n };\n }\n\n center(): Vec2Expr {\n return (_ctx: ResolvedCtx): Vec2 => {\n const r = this.getRect();\n return [r.x + r.w / 2, r.y + r.h / 2];\n };\n }\n\n anchor(a: Anchor): Vec2Expr {\n return (_ctx: ResolvedCtx): Vec2 => {\n const r = this.getRect();\n let x = r.x, y = r.y;\n\n // Horizontal position\n if (a === 'top' || a === 'center' || a === 'bottom' || a === 'baseline') {\n x = r.x + r.w / 2;\n } else if (a === 'topRight' || a === 'right' || a === 'bottomRight') {\n x = r.x + r.w;\n }\n\n // Vertical position\n if (a === 'left' || a === 'center' || a === 'right') {\n y = r.y + r.h / 2;\n } else if (a === 'bottomLeft' || a === 'bottom' || a === 'bottomRight' || a === 'baselineLeft' || a === 'baseline') {\n y = r.y + r.h;\n }\n\n return [x, y];\n };\n }\n\n toRect(): RectExpr {\n return (_ctx: ResolvedCtx): Rect => {\n return this.getRect();\n };\n }\n}\n\nexport class AnimCtxImpl implements AnimCtx {\n private base = new Map<SceneObject, Transform>();\n private channels = new Map<SceneObject, ChannelState>();\n private pins = new Map<SceneObject, PinConstraint>();\n private scene: Scene | null = null;\n private debugGroups: DebugGroupInfo[] = [];\n\n /** Resolve a Vec2 expression to a concrete Vec2 */\n private resolveVec2(expr: Vec2Expr): Vec2 {\n if (isExpr(expr)) {\n // Create a minimal ResolvedCtx for expression evaluation\n const ctx = this.createResolvedCtx();\n return expr(ctx);\n }\n return expr;\n }\n\n /** Resolve a number expression to a concrete number */\n private resolveNum(expr: NumExpr): number {\n if (isExpr(expr)) {\n const ctx = this.createResolvedCtx();\n return expr(ctx);\n }\n return expr;\n }\n\n /** Create a ResolvedCtx based on current state */\n private createResolvedCtx(): ResolvedCtx {\n if (!this.scene) throw new Error('Scene not set');\n // Use solve() to get the current resolved state\n return this.solve(this.scene);\n }\n\n reset(scene: Scene) {\n this.base.clear();\n this.channels.clear();\n this.pins.clear();\n this.debugGroups = [];\n this.scene = scene;\n\n for (const obj of scene.objects()) {\n this.base.set(obj, scene.getInitialTransform(obj));\n }\n }\n\n getDebugGroups(): DebugGroupInfo[] {\n return this.debugGroups;\n }\n\n getDebugPins(): Map<SceneObject, PinConstraint> {\n return this.pins;\n }\n\n /** Get the current world position of a specific anchor on an object */\n private getCurrentAnchorPosition(obj: SceneObject, anchor: Anchor): Vec2 {\n if (!this.scene) throw new Error('Scene not set');\n\n // If there's an existing pin with this anchor, return its world position\n const existingPin = this.pins.get(obj);\n if (existingPin && existingPin.anchor === anchor) {\n return existingPin.world;\n }\n\n // Otherwise, compute where this anchor currently is in world space\n const base = this.base.get(obj)!;\n const ch = this.channels.get(obj);\n\n // Get current transform values\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n const rotate = ch?.rotate ?? base.rotate;\n\n // Get current origin position\n let originPos: Vec2;\n if (existingPin) {\n // If pinned by a different anchor, compute origin from that pin\n const pinnedLocal = this.scene.resolveAnchor(obj, existingPin.anchor);\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = pinnedLocal[0] * scaleX * cos - pinnedLocal[1] * scaleY * sin;\n const transformedY = pinnedLocal[0] * scaleX * sin + pinnedLocal[1] * scaleY * cos;\n originPos = [existingPin.world[0] - transformedX, existingPin.world[1] - transformedY];\n } else {\n originPos = base.translate;\n }\n\n // Get local anchor offset and transform it\n const local = this.scene.resolveAnchor(obj, anchor);\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = local[0] * scaleX * cos - local[1] * scaleY * sin;\n const transformedY = local[0] * scaleX * sin + local[1] * scaleY * cos;\n\n return [originPos[0] + transformedX, originPos[1] + transformedY];\n }\n\n private getGroupBounds(group: GroupObject): Rect {\n // Delegate to computeGroupWorldBounds which correctly handles non-origin pins\n return this.computeGroupWorldBounds(group);\n }\n\n /** Get the origin position of an object in world space, accounting for any existing pin */\n private getOriginPosition(obj: SceneObject): Vec2 {\n if (!this.scene) throw new Error('Scene not set');\n\n const pin = this.pins.get(obj);\n if (!pin) {\n return this.base.get(obj)!.translate;\n }\n\n // Compute origin from pin: origin = pinWorld - transformed(localAnchor)\n const base = this.base.get(obj)!;\n const ch = this.channels.get(obj);\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n const rotate = ch?.rotate ?? base.rotate;\n\n const localAnchor = this.scene.resolveAnchor(obj, pin.anchor);\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = localAnchor[0] * scaleX * cos - localAnchor[1] * scaleY * sin;\n const transformedY = localAnchor[0] * scaleX * sin + localAnchor[1] * scaleY * cos;\n\n return [pin.world[0] - transformedX, pin.world[1] - transformedY];\n }\n\n private resolveGroupAnchor(group: GroupObject, anchor: Anchor): Vec2 {\n const bounds = this.getGroupBounds(group);\n\n // Map anchor to position within bounds\n const anchorMap: Record<Anchor, Vec2> = {\n origin: [bounds.x, bounds.y], // For groups, origin is same as topLeft\n topLeft: [bounds.x, bounds.y],\n top: [bounds.x + bounds.w / 2, bounds.y],\n topRight: [bounds.x + bounds.w, bounds.y],\n left: [bounds.x, bounds.y + bounds.h / 2],\n center: [bounds.x + bounds.w / 2, bounds.y + bounds.h / 2],\n right: [bounds.x + bounds.w, bounds.y + bounds.h / 2],\n bottomLeft: [bounds.x, bounds.y + bounds.h],\n bottom: [bounds.x + bounds.w / 2, bounds.y + bounds.h],\n bottomRight: [bounds.x + bounds.w, bounds.y + bounds.h],\n baselineLeft: [bounds.x, bounds.y + bounds.h], // baseline defaults to bottom\n baseline: [bounds.x + bounds.w / 2, bounds.y + bounds.h],\n };\n\n return anchorMap[anchor];\n }\n\n private getGroupCenter(group: GroupObject): Vec2 {\n const bounds = this.getGroupBounds(group);\n return [bounds.x + bounds.w / 2, bounds.y + bounds.h / 2];\n }\n\n scale(obj: SceneObject | GroupObject): TransformMethods {\n if (isGroup(obj)) {\n // For groups, scale() is RELATIVE - it multiplies each member's scale by the factor\n // This preserves relative sizes within the group\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const groupCenter = this.getGroupCenter(obj);\n // Interpolated scale factor: 1 -> v\n const scaleFactor = lerp(1, v, u);\n\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentScale = ch.scale ?? base.scale;\n // Multiply by scale factor to preserve relative sizes\n ch.scale = currentScale * scaleFactor;\n\n // Scale origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const scaledOffset: Vec2 = [offsetFromCenter[0] * scaleFactor, offsetFromCenter[1] * scaleFactor];\n const newOriginPos = vec.add(groupCenter, scaledOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const groupCenter = this.getGroupCenter(obj);\n const scaleFactor = lerp(1, 1 + delta, u);\n\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentScale = ch.scale ?? base.scale;\n ch.scale = currentScale * scaleFactor;\n\n // Scale origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const scaledOffset: Vec2 = [offsetFromCenter[0] * scaleFactor, offsetFromCenter[1] * scaleFactor];\n const newOriginPos = vec.add(groupCenter, scaledOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n }\n };\n }\n\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n // Use current scale for continuity between tweens\n const current = ch.scale ?? this.base.get(obj)!.scale;\n ch.scale = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scale ?? this.base.get(obj)!.scale;\n ch.scale = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n scaleX(obj: SceneObject): TransformMethods {\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleX ?? 1;\n ch.scaleX = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleX ?? 1;\n ch.scaleX = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n scaleY(obj: SceneObject): TransformMethods {\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleY ?? 1;\n ch.scaleY = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleY ?? 1;\n ch.scaleY = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n width(obj: SceneObject): TransformMethods {\n if (!this.scene) throw new Error('Scene not set');\n const bounds = this.scene.getBounds(obj);\n const originalWidth = bounds.w;\n\n return {\n to: (targetPxExpr: NumExpr, u: number) => {\n const targetPx = this.resolveNum(targetPxExpr);\n const targetScaleX = targetPx / originalWidth;\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleX ?? 1;\n ch.scaleX = lerp(current, targetScaleX, u);\n this.channels.set(obj, ch);\n },\n by: (deltaPxExpr: NumExpr, u: number) => {\n const deltaPx = this.resolveNum(deltaPxExpr);\n const ch = this.channels.get(obj) ?? {};\n const currentScaleX = ch.scaleX ?? 1;\n const currentWidth = originalWidth * currentScaleX;\n const targetWidth = currentWidth + deltaPx;\n const targetScaleX = targetWidth / originalWidth;\n ch.scaleX = lerp(currentScaleX, targetScaleX, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n height(obj: SceneObject): TransformMethods {\n if (!this.scene) throw new Error('Scene not set');\n const bounds = this.scene.getBounds(obj);\n const originalHeight = bounds.h;\n\n return {\n to: (targetPxExpr: NumExpr, u: number) => {\n const targetPx = this.resolveNum(targetPxExpr);\n const targetScaleY = targetPx / originalHeight;\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleY ?? 1;\n ch.scaleY = lerp(current, targetScaleY, u);\n this.channels.set(obj, ch);\n },\n by: (deltaPxExpr: NumExpr, u: number) => {\n const deltaPx = this.resolveNum(deltaPxExpr);\n const ch = this.channels.get(obj) ?? {};\n const currentScaleY = ch.scaleY ?? 1;\n const currentHeight = originalHeight * currentScaleY;\n const targetHeight = currentHeight + deltaPx;\n const targetScaleY = targetHeight / originalHeight;\n ch.scaleY = lerp(currentScaleY, targetScaleY, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n resize(obj: SceneObject): ResizeMethods {\n if (!this.scene) throw new Error('Scene not set');\n const bounds = this.scene.getBounds(obj);\n const originalWidth = bounds.w;\n const originalHeight = bounds.h;\n\n // Resolve any expressions in the resize target\n const resolveTarget = (target: ResizeTargetExpr): ResizeTarget => {\n if (typeof target === 'number') return target;\n if (typeof target === 'function') return this.resolveNum(target);\n if ('fit' in target) return { fit: this.resolveNum(target.fit) };\n if ('width' in target && 'height' in target) {\n return { width: this.resolveNum(target.width), height: this.resolveNum(target.height) };\n }\n if ('width' in target) return { width: this.resolveNum(target.width) };\n if ('height' in target) return { height: this.resolveNum(target.height) };\n return target as ResizeTarget;\n };\n\n const parseTarget = (target: ResizeTarget): { scaleX?: number; scaleY?: number; scale?: number } => {\n if (typeof target === 'number') {\n // Width-based uniform scaling\n return { scale: target / originalWidth };\n }\n if ('fit' in target) {\n // Fit within box - use the smaller scale to fit both dimensions\n const scaleW = target.fit / originalWidth;\n const scaleH = target.fit / originalHeight;\n return { scale: Math.min(scaleW, scaleH) };\n }\n if ('width' in target && 'height' in target) {\n // Non-uniform scaling\n return {\n scaleX: target.width / originalWidth,\n scaleY: target.height / originalHeight\n };\n }\n if ('width' in target) {\n // Width-based uniform scaling (explicit)\n return { scale: target.width / originalWidth };\n }\n if ('height' in target) {\n // Height-based uniform scaling\n return { scale: target.height / originalHeight };\n }\n return {};\n };\n\n return {\n to: (targetExpr: ResizeTargetExpr, u: number) => {\n const target = resolveTarget(targetExpr);\n const { scaleX, scaleY, scale } = parseTarget(target);\n const ch = this.channels.get(obj) ?? {};\n\n if (scale !== undefined) {\n // Uniform scaling - use current scale for continuity\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n ch.scale = lerp(currentScale, scale, u);\n } else {\n // Non-uniform scaling\n if (scaleX !== undefined) {\n const current = ch.scaleX ?? 1;\n ch.scaleX = lerp(current, scaleX, u);\n }\n if (scaleY !== undefined) {\n const current = ch.scaleY ?? 1;\n ch.scaleY = lerp(current, scaleY, u);\n }\n }\n\n this.channels.set(obj, ch);\n },\n by: (deltaExpr: ResizeTargetExpr, u: number) => {\n const delta = resolveTarget(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n\n if (typeof delta === 'number') {\n // Width-based: add delta to current width, scale uniformly\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentWidth = originalWidth * currentScale;\n const targetWidth = currentWidth + delta;\n const targetScale = targetWidth / originalWidth;\n ch.scale = lerp(currentScale, targetScale, u);\n } else if ('fit' in delta) {\n // Fit: add delta to current fit box\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentFit = Math.max(originalWidth, originalHeight) * currentScale;\n const targetFit = currentFit + delta.fit;\n const scaleW = targetFit / originalWidth;\n const scaleH = targetFit / originalHeight;\n const targetScale = Math.min(scaleW, scaleH);\n ch.scale = lerp(currentScale, targetScale, u);\n } else if ('width' in delta && 'height' in delta) {\n // Non-uniform: add deltas to current dimensions\n const currentScaleX = ch.scaleX ?? 1;\n const currentScaleY = ch.scaleY ?? 1;\n const currentWidth = originalWidth * currentScaleX;\n const currentHeight = originalHeight * currentScaleY;\n const targetScaleX = (currentWidth + delta.width) / originalWidth;\n const targetScaleY = (currentHeight + delta.height) / originalHeight;\n ch.scaleX = lerp(currentScaleX, targetScaleX, u);\n ch.scaleY = lerp(currentScaleY, targetScaleY, u);\n } else if ('width' in delta) {\n // Width-based uniform: add delta to current width\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentWidth = originalWidth * currentScale;\n const targetScale = (currentWidth + delta.width) / originalWidth;\n ch.scale = lerp(currentScale, targetScale, u);\n } else if ('height' in delta) {\n // Height-based uniform: add delta to current height\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentHeight = originalHeight * currentScale;\n const targetScale = (currentHeight + delta.height) / originalHeight;\n ch.scale = lerp(currentScale, targetScale, u);\n }\n\n this.channels.set(obj, ch);\n }\n };\n }\n\n fit(obj: SceneObject): FitMethods {\n return {\n to: (bbox: BBoxHandle, u: number) => {\n // Resize to match bbox dimensions\n this.resize(obj).to(bbox.whSize(), u);\n // Pin center to bbox center\n this.pin(obj, 'center').to(bbox.center(), u);\n },\n toBBox: (target: SceneObject | GroupObject, u: number, opts?: FitToBBoxOpts) => {\n // Measure the target\n let bbox = this.bbox(target);\n // Apply padding if specified\n if (opts?.pad !== undefined) {\n bbox = bbox.pad(opts.pad);\n }\n // Resize and pin\n this.resize(obj).to(bbox.whSize(), u);\n this.pin(obj, 'center').to(bbox.center(), u);\n }\n };\n }\n\n private computeWorldBounds(obj: SceneObject): Rect {\n if (!this.scene) throw new Error('Scene not set');\n\n const bounds = this.scene.getBounds(obj);\n const ch = this.channels.get(obj);\n const base = this.base.get(obj)!;\n\n // Get current position from pin or base\n const pin = this.pins.get(obj);\n let translate: Vec2;\n if (pin) {\n // Pin stores where anchor goes - need to compute actual translate\n const local = this.scene.resolveAnchor(obj, pin.anchor);\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n const rotate = ch?.rotate ?? base.rotate;\n\n // Transform local anchor to get offset\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = local[0] * scaleX * cos - local[1] * scaleY * sin;\n const transformedY = local[0] * scaleX * sin + local[1] * scaleY * cos;\n\n translate = [pin.world[0] - transformedX, pin.world[1] - transformedY];\n } else {\n translate = base.translate;\n }\n\n // Get scale factors\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n\n // Compute world bounds (axis-aligned, ignoring rotation for simplicity)\n return {\n x: translate[0] + bounds.x * scaleX,\n y: translate[1] + bounds.y * scaleY,\n w: bounds.w * scaleX,\n h: bounds.h * scaleY,\n };\n }\n\n private computeGroupWorldBounds(group: GroupObject): Rect {\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n for (const member of group.members) {\n const b = this.computeWorldBounds(member);\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.w);\n maxY = Math.max(maxY, b.y + b.h);\n }\n\n if (!isFinite(minX)) {\n return { x: 0, y: 0, w: 0, h: 0 };\n }\n\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n }\n\n bbox(obj: SceneObject | GroupObject): BBoxHandle {\n if (!this.scene) throw new Error('Scene not set');\n\n // Return a lazy bbox handle that computes rect on demand\n const computeRect = (): Rect => {\n return isGroup(obj)\n ? this.computeGroupWorldBounds(obj)\n : this.computeWorldBounds(obj);\n };\n\n return new BBoxHandleImpl(computeRect);\n }\n\n rotate(obj: SceneObject | GroupObject): TransformMethods {\n if (isGroup(obj)) {\n return {\n to: (radExpr: NumExpr, u: number) => {\n const rad = this.resolveNum(radExpr);\n const groupCenter = this.getGroupCenter(obj);\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentRot = ch.rotate ?? base.rotate;\n ch.rotate = lerp(currentRot, rad, u);\n\n // Rotate origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const angle = lerp(0, rad, u);\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const rotatedOffset: Vec2 = [\n offsetFromCenter[0] * cos - offsetFromCenter[1] * sin,\n offsetFromCenter[0] * sin + offsetFromCenter[1] * cos\n ];\n const newOriginPos = vec.add(groupCenter, rotatedOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const groupCenter = this.getGroupCenter(obj);\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentRot = ch.rotate ?? base.rotate;\n ch.rotate = currentRot + delta * u;\n\n // Rotate origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const angle = delta * u;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const rotatedOffset: Vec2 = [\n offsetFromCenter[0] * cos - offsetFromCenter[1] * sin,\n offsetFromCenter[0] * sin + offsetFromCenter[1] * cos\n ];\n const newOriginPos = vec.add(groupCenter, rotatedOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n }\n };\n }\n\n return {\n to: (radExpr: NumExpr, u: number) => {\n const rad = this.resolveNum(radExpr);\n const ch = this.channels.get(obj) ?? {};\n // Use current rotation for continuity between tweens\n const current = ch.rotate ?? this.base.get(obj)!.rotate;\n ch.rotate = lerp(current, rad, u);\n this.channels.set(obj, ch);\n },\n\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.rotate ?? this.base.get(obj)!.rotate;\n ch.rotate = current + delta * u;\n this.channels.set(obj, ch);\n }\n };\n }\n\n pin(obj: SceneObject | GroupObject, anchor: Anchor): PinMethods {\n if (isGroup(obj)) {\n return {\n to: (posExpr: Vec2Expr, u: number) => {\n const pos = this.resolveVec2(posExpr);\n // Get current group anchor position\n const currentAnchor = this.resolveGroupAnchor(obj, anchor);\n // Calculate interpolated target\n const targetAnchor = vec.lerp(currentAnchor, pos, u);\n // Calculate delta needed to move anchor to target\n const delta = vec.sub(targetAnchor, currentAnchor);\n\n // Apply delta to all members, preserving their individual pin anchors\n for (const member of obj.members) {\n const existingPin = this.pins.get(member);\n const memberAnchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(member, memberAnchor);\n const newPos = vec.add(currentAnchorPos, delta);\n this.pins.set(member, {\n anchor: memberAnchor,\n world: newPos,\n });\n }\n },\n by: (deltaExpr: Vec2Expr, u: number) => {\n const delta = this.resolveVec2(deltaExpr);\n const interpolatedDelta = vec.lerp([0, 0], delta, u);\n\n // Apply delta to all members, preserving their individual pin anchors\n for (const member of obj.members) {\n const existingPin = this.pins.get(member);\n const memberAnchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(member, memberAnchor);\n const newPos = vec.add(currentAnchorPos, interpolatedDelta);\n this.pins.set(member, {\n anchor: memberAnchor,\n world: newPos,\n });\n }\n }\n };\n }\n\n return {\n to: (posExpr: Vec2Expr, u: number) => {\n const pos = this.resolveVec2(posExpr);\n // Get current world position of this specific anchor for smooth interpolation\n const current = this.getCurrentAnchorPosition(obj, anchor);\n const world = vec.lerp(current, pos, u);\n\n this.pins.set(obj, {\n anchor,\n world,\n });\n },\n\n by: (deltaExpr: Vec2Expr, u: number) => {\n const delta = this.resolveVec2(deltaExpr);\n // Get current world position of this specific anchor\n const current = this.getCurrentAnchorPosition(obj, anchor);\n const world = vec.add(current, vec.lerp([0, 0], delta, u));\n\n this.pins.set(obj, {\n anchor,\n world,\n });\n }\n };\n }\n\n opacity(obj: SceneObject | GroupObject): TransformMethods {\n if (isGroup(obj)) {\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n for (const member of obj.members) {\n const ch = this.channels.get(member) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = lerp(current, v, u);\n this.channels.set(member, ch);\n }\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n for (const member of obj.members) {\n const ch = this.channels.get(member) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = current * lerp(1, 1 + delta, u);\n this.channels.set(member, ch);\n }\n }\n };\n }\n\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n group(...objects: SceneObject[]): GroupBuilder {\n const groupObj: GroupObject = {\n id: Symbol('group'),\n members: objects,\n isGroup: true as const,\n };\n\n // Create builder with fluent methods that call back to this context\n // Debug tracking for groups is deferred - we track when animated via trackGroupDebug\n const self = this;\n const builder: GroupBuilder = {\n ...groupObj,\n pin: (anchor: Anchor) => {\n const methods = self.pin(groupObj, anchor);\n return {\n to: (pos: Vec2, u: number) => {\n methods.to(pos, u);\n self.trackGroupDebug(groupObj, u, { anchor, target: pos });\n },\n by: (delta: Vec2, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n scale: () => {\n const methods = self.scale(groupObj);\n return {\n to: (v: number, u: number) => {\n methods.to(v, u);\n self.trackGroupDebug(groupObj, u);\n },\n by: (delta: number, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n rotate: () => {\n const methods = self.rotate(groupObj);\n return {\n to: (v: number, u: number) => {\n methods.to(v, u);\n self.trackGroupDebug(groupObj, u);\n },\n by: (delta: number, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n opacity: () => {\n const methods = self.opacity(groupObj);\n return {\n to: (v: number, u: number) => {\n methods.to(v, u);\n self.trackGroupDebug(groupObj, u);\n },\n by: (delta: number, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n };\n\n return builder;\n }\n\n private trackGroupDebug(groupObj: GroupObject, u: number, pin?: { anchor: Anchor; target: Vec2 }): DebugGroupInfo | null {\n // Only track during active animation, not at completion\n if (u < 1) {\n // Find existing or create new\n let entry = this.debugGroups.find(\n g => g.kind === 'group' && g.members === groupObj.members\n );\n if (!entry) {\n entry = {\n members: groupObj.members,\n kind: 'group',\n };\n this.debugGroups.push(entry);\n }\n if (pin) {\n entry.pin = pin;\n }\n return entry;\n }\n return null;\n }\n\n /** Flatten objects for final result (extracts all SceneObjects from groups) */\n private flattenToSceneObjects(objects: ObjRef[]): SceneObject[] {\n const result: SceneObject[] = [];\n for (const obj of objects) {\n if (isGroup(obj)) {\n result.push(...obj.members);\n } else {\n result.push(obj);\n }\n }\n return result;\n }\n\n /** Get bounds for an ObjRef (single object or group) */\n private getObjRefBounds(obj: ObjRef): Rect {\n if (isGroup(obj)) {\n return this.computeGroupWorldBounds(obj);\n }\n return this.computeWorldBounds(obj);\n }\n\n /** Get the top-left position of an ObjRef (bounds position, not pin position) */\n private getObjRefPosition(obj: ObjRef): Vec2 {\n const bounds = this.getObjRefBounds(obj);\n return [bounds.x, bounds.y];\n }\n\n /** Move an ObjRef by a delta (moves all members of a group together, preserving pin anchors) */\n private moveObjRef(obj: ObjRef, fromPos: Vec2, toPos: Vec2, u: number): void {\n const delta = vec.sub(toPos, fromPos);\n const interpolatedDelta = vec.lerp([0, 0], delta, u);\n\n if (isGroup(obj)) {\n for (const member of obj.members) {\n // Preserve existing pin anchor, or default to 'origin'\n const existingPin = this.pins.get(member);\n const anchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(member, anchor);\n const newPos = vec.add(currentAnchorPos, interpolatedDelta);\n this.pins.set(member, {\n anchor,\n world: newPos,\n });\n }\n } else {\n // Preserve existing pin anchor, or default to 'origin'\n const existingPin = this.pins.get(obj);\n const anchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(obj, anchor);\n const newPos = vec.add(currentAnchorPos, interpolatedDelta);\n this.pins.set(obj, {\n anchor,\n world: newPos,\n });\n }\n }\n\n private alignOnCrossAxis(\n start: number,\n size: number,\n maxSize: number,\n align: Anchor\n ): number {\n if (align === \"center\") {\n return start + (maxSize - size) / 2;\n }\n if (align === \"topLeft\" || align === \"left\" || align === \"top\") {\n return start;\n }\n if (align === \"bottomRight\" || align === \"right\" || align === \"bottom\") {\n return start + maxSize - size;\n }\n // Baseline alignment (for text) - treat as bottom for now\n if (align === \"baselineLeft\" || align === \"baseline\") {\n return start + maxSize - size;\n }\n return start;\n }\n\n private calculateLayoutPositions(\n objects: ObjRef[],\n axis: \"x\" | \"y\",\n align: Anchor,\n gap: number\n ): Vec2[] {\n if (!this.scene) throw new Error('Scene not set');\n\n // Get current bounds for each object (groups use their combined bounds)\n const boundsList = objects.map(obj => this.getObjRefBounds(obj));\n\n // Find the starting position (leftmost/topmost of current positions)\n const startX = Math.min(...boundsList.map(b => b.x));\n const startY = Math.min(...boundsList.map(b => b.y));\n\n // Calculate cross-axis alignment reference\n const maxH = Math.max(...boundsList.map(b => b.h));\n const maxW = Math.max(...boundsList.map(b => b.w));\n\n const targets: Vec2[] = [];\n let cursor = axis === \"x\" ? startX : startY;\n\n for (let i = 0; i < objects.length; i++) {\n const b = boundsList[i];\n let x: number, y: number;\n\n if (axis === \"x\") {\n x = cursor;\n y = this.alignOnCrossAxis(startY, b.h, maxH, align);\n cursor += b.w + gap;\n } else {\n x = this.alignOnCrossAxis(startX, b.w, maxW, align);\n y = cursor;\n cursor += b.h + gap;\n }\n\n targets.push([x, y]);\n }\n\n return targets;\n }\n\n layout(...args: (ObjRef | LayoutOpts)[]): LayoutBuilder {\n // Parse args - last arg may be LayoutOpts\n let opts: LayoutOpts = {};\n let objects: ObjRef[];\n\n const last = args[args.length - 1];\n if (last && typeof last === 'object' && !('id' in last)) {\n opts = last as LayoutOpts;\n objects = args.slice(0, -1) as ObjRef[];\n } else {\n objects = args as ObjRef[];\n }\n\n const axis = opts.axis ?? \"x\";\n const align = opts.align ?? \"center\";\n const gap = opts.gap ?? 0;\n\n return {\n to: (u: number): GroupBuilder => {\n // Calculate target positions for each ObjRef (groups stay as units)\n const targets = this.calculateLayoutPositions(objects, axis, align, gap);\n\n // Move each object/group to its target position\n for (let i = 0; i < objects.length; i++) {\n const obj = objects[i];\n const currentPos = this.getObjRefPosition(obj);\n const targetPos = targets[i];\n this.moveObjRef(obj, currentPos, targetPos, u);\n }\n\n // Flatten to get all scene objects for the result group\n const allMembers = this.flattenToSceneObjects(objects);\n\n // Create group for chaining\n const groupObj: GroupObject = {\n id: Symbol('layout-group'),\n members: allMembers,\n isGroup: true as const,\n };\n\n // Track for debug overlay as layout (only during active animation, not at completion)\n let debugEntry: DebugGroupInfo | null = null;\n if (u < 1) {\n debugEntry = {\n members: allMembers,\n kind: 'layout',\n };\n this.debugGroups.push(debugEntry);\n }\n\n // Return GroupBuilder for chaining with debug tracking\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const builder: GroupBuilder = {\n ...groupObj,\n pin: (anchor: Anchor) => {\n const methods = self.pin(groupObj, anchor);\n return {\n to: (pos: Vec2, pinU: number) => {\n methods.to(pos, pinU);\n if (debugEntry) {\n debugEntry.pin = { anchor, target: pos };\n }\n },\n by: (delta: Vec2, pinU: number) => {\n methods.by(delta, pinU);\n },\n };\n },\n scale: () => self.scale(groupObj),\n rotate: () => self.rotate(groupObj),\n opacity: () => self.opacity(groupObj),\n };\n\n return builder;\n }\n };\n }\n\n inline(...args: (ObjRef | number)[]): LayoutBuilder {\n const { objects, gap } = this.parseLayoutArgs(args);\n return this.layout(...objects, { axis: \"x\", align: \"baselineLeft\", gap });\n }\n\n stack(...args: (ObjRef | number)[]): LayoutBuilder {\n const { objects, gap } = this.parseLayoutArgs(args);\n return this.layout(...objects, { axis: \"y\", align: \"center\", gap });\n }\n\n paragraph(...args: (ObjRef | number)[]): LayoutBuilder {\n const { objects, gap } = this.parseLayoutArgs(args);\n return this.layout(...objects, { axis: \"y\", align: \"left\", gap });\n }\n\n /** Parse layout args - last arg may be a gap number */\n private parseLayoutArgs(args: (ObjRef | number)[]): { objects: ObjRef[], gap: number } {\n const last = args[args.length - 1];\n if (typeof last === 'number') {\n return { objects: args.slice(0, -1) as ObjRef[], gap: last };\n }\n return { objects: args as ObjRef[], gap: 0 };\n }\n\n /** Get anchor offset within bounds */\n private getAnchorOffsetFromRect(bounds: Rect, anchor: Anchor): Vec2 {\n let ox = 0, oy = 0;\n\n if (anchor === 'top' || anchor === 'center' || anchor === 'bottom' || anchor === 'baseline') {\n ox = bounds.w / 2;\n } else if (anchor === 'topRight' || anchor === 'right' || anchor === 'bottomRight') {\n ox = bounds.w;\n }\n\n if (anchor === 'left' || anchor === 'center' || anchor === 'right') {\n oy = bounds.h / 2;\n } else if (anchor === 'bottomLeft' || anchor === 'bottom' || anchor === 'bottomRight' || anchor === 'baselineLeft' || anchor === 'baseline') {\n oy = bounds.h;\n }\n\n return [ox, oy];\n }\n\n /** Get anchor position in world space for an ObjRef */\n private getObjRefAnchorPosition(obj: ObjRef, anchor: Anchor): Vec2 {\n const bounds = this.getObjRefBounds(obj);\n const offset = this.getAnchorOffsetFromRect(bounds, anchor);\n return [bounds.x + offset[0], bounds.y + offset[1]];\n }\n\n align(...args: (ObjRef | AlignOpts)[]): LayoutBuilder {\n // Parse args - last arg may be AlignOpts\n let opts: AlignOpts = {};\n let objects: ObjRef[];\n\n const last = args[args.length - 1];\n if (last && typeof last === 'object' && !('id' in last)) {\n opts = last as AlignOpts;\n objects = args.slice(0, -1) as ObjRef[];\n } else {\n objects = args as ObjRef[];\n }\n\n const anchor = opts.anchor ?? \"center\";\n\n return {\n to: (u: number): GroupBuilder => {\n if (!this.scene || objects.length === 0) {\n const allMembers = this.flattenToSceneObjects(objects);\n return this.group(...allMembers);\n }\n\n // Get the first object's anchor position as the reference\n const targetAnchorPos = this.getObjRefAnchorPosition(objects[0], anchor);\n\n // Move all other objects so their anchor aligns with the first object's anchor\n for (let i = 1; i < objects.length; i++) {\n const obj = objects[i];\n const bounds = this.getObjRefBounds(obj);\n const anchorOffset = this.getAnchorOffsetFromRect(bounds, anchor);\n\n // Target top-left position = target anchor position - anchor offset within bounds\n const targetPos: Vec2 = [\n targetAnchorPos[0] - anchorOffset[0],\n targetAnchorPos[1] - anchorOffset[1]\n ];\n\n const currentPos = this.getObjRefPosition(obj);\n this.moveObjRef(obj, currentPos, targetPos, u);\n }\n\n // Flatten to get all scene objects for the result group\n const allMembers = this.flattenToSceneObjects(objects);\n\n // Create group for chaining\n const groupObj: GroupObject = {\n id: Symbol('align-group'),\n members: allMembers,\n isGroup: true as const,\n };\n\n // Track for debug overlay\n let debugEntry: DebugGroupInfo | null = null;\n if (u < 1) {\n debugEntry = {\n members: allMembers,\n kind: 'layout',\n };\n this.debugGroups.push(debugEntry);\n }\n\n // Return GroupBuilder for chaining\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n return {\n ...groupObj,\n pin: (pinAnchor: Anchor) => {\n const methods = self.pin(groupObj, pinAnchor);\n return {\n to: (pos: Vec2, pinU: number) => {\n methods.to(pos, pinU);\n if (debugEntry) {\n debugEntry.pin = { anchor: pinAnchor, target: pos };\n }\n },\n by: (delta: Vec2, pinU: number) => {\n methods.by(delta, pinU);\n },\n };\n },\n scale: () => self.scale(groupObj),\n rotate: () => self.rotate(groupObj),\n opacity: () => self.opacity(groupObj),\n };\n }\n };\n }\n\n center(...objects: ObjRef[]): LayoutBuilder {\n return this.align(...objects, { anchor: \"center\" });\n }\n\n solve(scene: Scene): ResolvedCtx {\n const resolved = new Map<SceneObject, Transform>();\n const opacity = new Map<SceneObject, number>();\n\n for (const obj of scene.objects()) {\n const base = scene.getInitialTransform(obj);\n\n const ch = this.channels.get(obj);\n const scale = ch?.scale ?? base.scale;\n const scaleX = ch?.scaleX;\n const scaleY = ch?.scaleY;\n const rotate = ch?.rotate ?? base.rotate;\n\n let translate = base.translate ?? [0, 0] as const;\n const pin = this.pins.get(obj);\n if (pin) {\n const local = scene.resolveAnchor(obj, pin.anchor);\n const transformed = applySR(local, scale, rotate, scaleX ?? 1, scaleY ?? 1);\n translate = vec.sub(pin.world, transformed);\n }\n\n resolved.set(obj, {\n translate,\n rotate: rotate ?? 0,\n scale: scale ?? 1,\n scaleX,\n scaleY,\n });\n opacity.set(obj, ch?.opacity ?? 1);\n }\n\n return {\n getTransform: (o) => resolved.get(o)!,\n getOpacity: (o) => opacity.get(o) ?? 1,\n };\n }\n}\n","import type { Anchor, AnimCtx, PinConstraint, ResolvedCtx, Scene, SceneObject, Timeline, Transform } from './types';\nimport type { DebugGroupInfo } from './context';\nimport { AnimCtxImpl } from './context';\n\nexport interface Player {\n play(): void;\n pause(): void;\n stop(): void;\n seek(timeMs: number): void;\n renderAt(timeMs: number): void;\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n debug: boolean;\n onTimeUpdate: ((time: number) => void) | null;\n onError: ((error: Error) => void) | null;\n dispose(): void;\n}\n\nexport interface PlayerOptions {\n scene: Scene;\n timeline: Timeline<AnimCtx>;\n}\n\ninterface DebugInfo {\n obj: SceneObject;\n transform: Transform;\n bounds: { x: number; y: number; w: number; h: number };\n opacity: number;\n}\n\nfunction getAnchorOffset(anchor: Anchor, bounds: { x: number; y: number; w: number; h: number }): [number, number] {\n const { x, y, w, h } = bounds;\n const left = x;\n const right = x + w;\n const top = y;\n const bottom = y + h;\n const centerX = x + w / 2;\n const centerY = y + h / 2;\n\n switch (anchor) {\n case 'origin': return [0, 0];\n case 'topLeft': return [left, top];\n case 'top': return [centerX, top];\n case 'topRight': return [right, top];\n case 'left': return [left, centerY];\n case 'center': return [centerX, centerY];\n case 'right': return [right, centerY];\n case 'bottomLeft': return [left, bottom];\n case 'bottom': return [centerX, bottom];\n case 'bottomRight': return [right, bottom];\n case 'baselineLeft': return [left, bottom];\n case 'baseline': return [centerX, bottom];\n default: return [0, 0];\n }\n}\n\nfunction renderDebugOverlay(\n g: CanvasRenderingContext2D,\n scene: Scene,\n solved: ResolvedCtx,\n debugGroups: DebugGroupInfo[],\n pins: Map<SceneObject, PinConstraint>,\n dpr: number\n) {\n g.save();\n g.scale(dpr, dpr);\n\n const debugInfos: DebugInfo[] = [];\n\n // Collect debug info for all objects\n for (const obj of scene.objects()) {\n const transform = solved.getTransform(obj);\n if (!transform || !transform.translate) continue;\n\n const bounds = scene.getBounds(obj);\n const opacity = solved.getOpacity(obj);\n\n debugInfos.push({ obj, transform, bounds, opacity });\n }\n\n // Draw group/layout bounds first (behind individual objects)\n for (const groupInfo of debugGroups) {\n const { members, kind, pin } = groupInfo;\n\n // Calculate bounds from current member positions\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n for (const member of members) {\n const transform = solved.getTransform(member);\n if (!transform || !transform.translate) continue;\n\n const memberBounds = scene.getBounds(member);\n const x = transform.translate[0] + memberBounds.x;\n const y = transform.translate[1] + memberBounds.y;\n\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + memberBounds.w * transform.scale);\n maxY = Math.max(maxY, y + memberBounds.h * transform.scale);\n }\n\n if (!isFinite(minX)) continue;\n\n const bounds = { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n\n // Yellow for groups, magenta for layouts\n const color = kind === 'group' ? 'rgba(255, 200, 0' : 'rgba(255, 0, 255';\n g.strokeStyle = color + ', 0.7)';\n\n g.lineWidth = 2;\n g.setLineDash([6, 4]);\n g.strokeRect(bounds.x, bounds.y, bounds.w, bounds.h);\n\n // Draw small label\n g.font = '10px monospace';\n g.fillStyle = color + ', 0.9)';\n g.fillText(kind, bounds.x + 2, bounds.y - 3);\n\n // Draw pin anchor if present\n if (pin) {\n // Calculate anchor position from bounds\n let anchorX = bounds.x, anchorY = bounds.y;\n const anchor = pin.anchor;\n\n if (anchor === 'top' || anchor === 'center' || anchor === 'bottom' || anchor === 'baseline') {\n anchorX = bounds.x + bounds.w / 2;\n } else if (anchor === 'topRight' || anchor === 'right' || anchor === 'bottomRight') {\n anchorX = bounds.x + bounds.w;\n }\n\n if (anchor === 'left' || anchor === 'center' || anchor === 'right') {\n anchorY = bounds.y + bounds.h / 2;\n } else if (anchor === 'bottomLeft' || anchor === 'bottom' || anchor === 'bottomRight' || anchor === 'baselineLeft' || anchor === 'baseline') {\n anchorY = bounds.y + bounds.h;\n }\n\n // Draw anchor point (diamond shape)\n g.fillStyle = color + ', 0.9)';\n g.beginPath();\n g.moveTo(anchorX, anchorY - 5);\n g.lineTo(anchorX + 5, anchorY);\n g.lineTo(anchorX, anchorY + 5);\n g.lineTo(anchorX - 5, anchorY);\n g.closePath();\n g.fill();\n\n // Draw target position (X marker)\n const [tx, ty] = pin.target;\n g.strokeStyle = color + ', 0.9)';\n g.lineWidth = 2;\n g.setLineDash([]);\n g.beginPath();\n g.moveTo(tx - 6, ty - 6);\n g.lineTo(tx + 6, ty + 6);\n g.moveTo(tx + 6, ty - 6);\n g.lineTo(tx - 6, ty + 6);\n g.stroke();\n\n // Draw line from anchor to target\n g.strokeStyle = color + ', 0.4)';\n g.lineWidth = 1;\n g.setLineDash([3, 3]);\n g.beginPath();\n g.moveTo(anchorX, anchorY);\n g.lineTo(tx, ty);\n g.stroke();\n\n // Label the anchor\n g.font = '9px monospace';\n g.fillStyle = color + ', 0.9)';\n g.fillText(anchor, anchorX + 7, anchorY - 2);\n }\n }\n\n // Draw bounding boxes for individual objects\n for (const { transform, bounds } of debugInfos) {\n g.save();\n g.translate(transform.translate[0], transform.translate[1]);\n g.rotate(transform.rotate);\n const sx = (transform.scaleX ?? 1) * transform.scale;\n const sy = (transform.scaleY ?? 1) * transform.scale;\n g.scale(sx, sy);\n\n // Bounding box\n const avgScale = (sx + sy) / 2;\n g.strokeStyle = 'rgba(0, 200, 255, 0.8)';\n g.lineWidth = 1 / avgScale;\n g.setLineDash([4 / avgScale, 4 / avgScale]);\n g.strokeRect(bounds.x, bounds.y, bounds.w, bounds.h);\n\n g.restore();\n }\n\n // Draw anchor points, centers, pins, and baselines\n for (const { obj, transform, bounds } of debugInfos) {\n const x = transform.translate[0];\n const y = transform.translate[1];\n const sx = (transform.scaleX ?? 1) * transform.scale;\n const sy = (transform.scaleY ?? 1) * transform.scale;\n const cos = Math.cos(transform.rotate);\n const sin = Math.sin(transform.rotate);\n\n // Object origin (transform origin point)\n g.fillStyle = 'rgba(255, 100, 100, 0.9)';\n g.beginPath();\n g.arc(x, y, 4, 0, Math.PI * 2);\n g.fill();\n\n // Object center (accounting for bounds offset and scale)\n const centerOffX = (bounds.x + bounds.w / 2) * sx;\n const centerOffY = (bounds.y + bounds.h / 2) * sy;\n const centerX = x + centerOffX * cos - centerOffY * sin;\n const centerY = y + centerOffX * sin + centerOffY * cos;\n\n g.fillStyle = 'rgba(100, 255, 100, 0.9)';\n g.beginPath();\n g.arc(centerX, centerY, 3, 0, Math.PI * 2);\n g.fill();\n\n // Crosshair at origin\n g.strokeStyle = 'rgba(255, 100, 100, 0.6)';\n g.lineWidth = 1;\n g.setLineDash([]);\n g.beginPath();\n g.moveTo(x - 8, y);\n g.lineTo(x + 8, y);\n g.moveTo(x, y - 8);\n g.lineTo(x, y + 8);\n g.stroke();\n\n // Draw baseline if text object\n const baseline = scene.getBaseline(obj);\n if (baseline !== null) {\n g.save();\n g.translate(x, y);\n g.rotate(transform.rotate);\n g.scale(transform.scale, transform.scale);\n\n // Baseline line\n g.strokeStyle = 'rgba(255, 165, 0, 0.8)';\n g.lineWidth = 1 / transform.scale;\n g.setLineDash([2 / transform.scale, 2 / transform.scale]);\n g.beginPath();\n g.moveTo(bounds.x - 5, baseline);\n g.lineTo(bounds.x + bounds.w + 5, baseline);\n g.stroke();\n\n g.restore();\n }\n\n // Draw pin target and path for individual objects\n const pin = pins.get(obj);\n if (pin) {\n // Calculate anchor position on the object (using full bounds info)\n const [anchorOffX, anchorOffY] = getAnchorOffset(pin.anchor, bounds);\n\n // Transform anchor offset to world space\n const scaledOffX = anchorOffX * sx;\n const scaledOffY = anchorOffY * sy;\n const anchorX = x + scaledOffX * cos - scaledOffY * sin;\n const anchorY = y + scaledOffX * sin + scaledOffY * cos;\n\n // Target position\n const [tx, ty] = pin.world;\n\n // Draw anchor point (small diamond)\n g.fillStyle = 'rgba(0, 200, 255, 0.9)';\n g.beginPath();\n g.moveTo(anchorX, anchorY - 4);\n g.lineTo(anchorX + 4, anchorY);\n g.lineTo(anchorX, anchorY + 4);\n g.lineTo(anchorX - 4, anchorY);\n g.closePath();\n g.fill();\n\n // Draw target (X marker)\n g.strokeStyle = 'rgba(0, 200, 255, 0.9)';\n g.lineWidth = 2;\n g.setLineDash([]);\n g.beginPath();\n g.moveTo(tx - 5, ty - 5);\n g.lineTo(tx + 5, ty + 5);\n g.moveTo(tx + 5, ty - 5);\n g.lineTo(tx - 5, ty + 5);\n g.stroke();\n\n // Draw line from anchor to target\n g.strokeStyle = 'rgba(0, 200, 255, 0.4)';\n g.lineWidth = 1;\n g.setLineDash([3, 3]);\n g.beginPath();\n g.moveTo(anchorX, anchorY);\n g.lineTo(tx, ty);\n g.stroke();\n\n // Label the anchor\n g.font = '9px monospace';\n g.fillStyle = 'rgba(0, 200, 255, 0.9)';\n g.fillText(pin.anchor, anchorX + 6, anchorY - 4);\n }\n }\n\n g.restore();\n}\n\nexport function makePlayer(canvas: HTMLCanvasElement, opts: PlayerOptions): Player {\n const ctx = new AnimCtxImpl();\n const { scene, timeline } = opts;\n const duration = timeline.duration;\n\n let isPlaying = false;\n let currentTime = 0;\n let startTime = 0;\n let animationFrameId: number | null = null;\n let onTimeUpdate: ((time: number) => void) | null = null;\n let onError: ((error: Error) => void) | null = null;\n let hasError = false;\n let debugMode = false;\n\n function render(timeMs: number, throwOnError = false): boolean {\n try {\n ctx.reset(scene);\n timeline.evaluate(timeMs, ctx);\n const solved = ctx.solve(scene);\n scene.render(solved, canvas);\n\n // Draw debug overlay if enabled\n if (debugMode) {\n const g = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n renderDebugOverlay(g, scene, solved, ctx.getDebugGroups(), ctx.getDebugPins(), dpr);\n }\n\n return true;\n } catch (e) {\n hasError = true;\n isPlaying = false;\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId);\n animationFrameId = null;\n }\n const error = e instanceof Error ? e : new Error(String(e));\n if (throwOnError || !onError) {\n throw error;\n }\n onError(error);\n return false;\n }\n }\n\n function frame(now: number) {\n if (!isPlaying || hasError) return;\n\n currentTime = now - startTime;\n\n // Loop or stop at end\n if (currentTime >= duration) {\n currentTime = duration;\n isPlaying = false;\n render(currentTime);\n onTimeUpdate?.(currentTime);\n return;\n }\n\n if (render(currentTime)) {\n onTimeUpdate?.(currentTime);\n animationFrameId = requestAnimationFrame(frame);\n }\n }\n\n // Initial render at time 0 (throw errors since onError isn't set yet)\n render(0, true);\n\n return {\n get isPlaying() {\n return isPlaying;\n },\n\n get currentTime() {\n return currentTime;\n },\n\n get duration() {\n return duration;\n },\n\n get onTimeUpdate() {\n return onTimeUpdate;\n },\n\n set onTimeUpdate(callback: ((time: number) => void) | null) {\n onTimeUpdate = callback;\n },\n\n get onError() {\n return onError;\n },\n\n set onError(callback: ((error: Error) => void) | null) {\n onError = callback;\n },\n\n get debug() {\n return debugMode;\n },\n\n set debug(value: boolean) {\n debugMode = value;\n // Re-render to show/hide debug overlay\n if (!isPlaying) {\n render(currentTime);\n }\n },\n\n play() {\n if (isPlaying || hasError) return;\n\n // If at end, restart from beginning\n if (currentTime >= duration) {\n currentTime = 0;\n }\n\n isPlaying = true;\n startTime = performance.now() - currentTime;\n animationFrameId = requestAnimationFrame(frame);\n },\n\n pause() {\n isPlaying = false;\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId);\n animationFrameId = null;\n }\n },\n\n stop() {\n this.pause();\n currentTime = 0;\n render(0);\n onTimeUpdate?.(0);\n },\n\n seek(timeMs: number) {\n if (hasError) return;\n currentTime = Math.max(0, Math.min(duration, timeMs));\n startTime = performance.now() - currentTime;\n render(currentTime);\n onTimeUpdate?.(currentTime);\n },\n\n renderAt(timeMs: number) {\n if (hasError) return;\n render(Math.max(0, Math.min(duration, timeMs)));\n },\n\n dispose() {\n this.pause();\n },\n };\n}\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateWrapper = (obj, member, setter, getter) => ({\n set _(value) {\n __privateSet(obj, member, value, setter);\n },\n get _() {\n return __privateGet(obj, member, getter);\n }\n});\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/misc.ts\nvar bytes = new Uint8Array(8);\nvar view = new DataView(bytes.buffer);\nvar u8 = (value) => {\n return [(value % 256 + 256) % 256];\n};\nvar u16 = (value) => {\n view.setUint16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar i16 = (value) => {\n view.setInt16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar u24 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[1], bytes[2], bytes[3]];\n};\nvar u32 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar i32 = (value) => {\n view.setInt32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar u64 = (value) => {\n view.setUint32(0, Math.floor(value / 2 ** 32), false);\n view.setUint32(4, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nvar fixed_8_8 = (value) => {\n view.setInt16(0, 2 ** 8 * value, false);\n return [bytes[0], bytes[1]];\n};\nvar fixed_16_16 = (value) => {\n view.setInt32(0, 2 ** 16 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar fixed_2_30 = (value) => {\n view.setInt32(0, 2 ** 30 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar ascii = (text, nullTerminated = false) => {\n let bytes2 = Array(text.length).fill(null).map((_, i) => text.charCodeAt(i));\n if (nullTerminated)\n bytes2.push(0);\n return bytes2;\n};\nvar last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nvar lastPresentedSample = (samples) => {\n let result = void 0;\n for (let sample of samples) {\n if (!result || sample.presentationTimestamp > result.presentationTimestamp) {\n result = sample;\n }\n }\n return result;\n};\nvar intoTimescale = (timeInSeconds, timescale, round = true) => {\n let value = timeInSeconds * timescale;\n return round ? Math.round(value) : value;\n};\nvar rotationMatrix = (rotationInDegrees) => {\n let theta = rotationInDegrees * (Math.PI / 180);\n let cosTheta = Math.cos(theta);\n let sinTheta = Math.sin(theta);\n return [\n cosTheta,\n sinTheta,\n 0,\n -sinTheta,\n cosTheta,\n 0,\n 0,\n 0,\n 1\n ];\n};\nvar IDENTITY_MATRIX = rotationMatrix(0);\nvar matrixToBytes = (matrix) => {\n return [\n fixed_16_16(matrix[0]),\n fixed_16_16(matrix[1]),\n fixed_2_30(matrix[2]),\n fixed_16_16(matrix[3]),\n fixed_16_16(matrix[4]),\n fixed_2_30(matrix[5]),\n fixed_16_16(matrix[6]),\n fixed_16_16(matrix[7]),\n fixed_2_30(matrix[8])\n ];\n};\nvar deepClone = (x) => {\n if (!x)\n return x;\n if (typeof x !== \"object\")\n return x;\n if (Array.isArray(x))\n return x.map(deepClone);\n return Object.fromEntries(Object.entries(x).map(([key, value]) => [key, deepClone(value)]));\n};\nvar isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\n\n// src/box.ts\nvar box = (type, contents, children) => ({\n type,\n contents: contents && new Uint8Array(contents.flat(10)),\n children\n});\nvar fullBox = (type, version, flags, contents, children) => box(\n type,\n [u8(version), u24(flags), contents ?? []],\n children\n);\nvar ftyp = (details) => {\n let minorVersion = 512;\n if (details.fragmented)\n return box(\"ftyp\", [\n ascii(\"iso5\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"iso5\"),\n ascii(\"iso6\"),\n ascii(\"mp41\")\n ]);\n return box(\"ftyp\", [\n ascii(\"isom\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"isom\"),\n details.holdsAvc ? ascii(\"avc1\") : [],\n ascii(\"mp41\")\n ]);\n};\nvar mdat = (reserveLargeSize) => ({ type: \"mdat\", largeSize: reserveLargeSize });\nvar free = (size) => ({ type: \"free\", size });\nvar moov = (tracks, creationTime, fragmented = false) => box(\"moov\", null, [\n mvhd(creationTime, tracks),\n ...tracks.map((x) => trak(x, creationTime)),\n fragmented ? mvex(tracks) : null\n]);\nvar mvhd = (creationTime, tracks) => {\n let duration = intoTimescale(Math.max(\n 0,\n ...tracks.filter((x) => x.samples.length > 0).map((x) => {\n const lastSample = lastPresentedSample(x.samples);\n return lastSample.presentationTimestamp + lastSample.duration;\n })\n ), GLOBAL_TIMESCALE);\n let nextTrackId = Math.max(...tracks.map((x) => x.id)) + 1;\n let needsU64 = !isU32(creationTime) || !isU32(duration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mvhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(GLOBAL_TIMESCALE),\n // Timescale\n u32OrU64(duration),\n // Duration\n fixed_16_16(1),\n // Preferred rate\n fixed_8_8(1),\n // Preferred volume\n Array(10).fill(0),\n // Reserved\n matrixToBytes(IDENTITY_MATRIX),\n // Matrix\n Array(24).fill(0),\n // Pre-defined\n u32(nextTrackId)\n // Next track ID\n ]);\n};\nvar trak = (track, creationTime) => box(\"trak\", null, [\n tkhd(track, creationTime),\n mdia(track, creationTime)\n]);\nvar tkhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let durationInGlobalTimescale = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n GLOBAL_TIMESCALE\n );\n let needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale);\n let u32OrU64 = needsU64 ? u64 : u32;\n let matrix;\n if (track.info.type === \"video\") {\n matrix = typeof track.info.rotation === \"number\" ? rotationMatrix(track.info.rotation) : track.info.rotation;\n } else {\n matrix = IDENTITY_MATRIX;\n }\n return fullBox(\"tkhd\", +needsU64, 3, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.id),\n // Track ID\n u32(0),\n // Reserved\n u32OrU64(durationInGlobalTimescale),\n // Duration\n Array(8).fill(0),\n // Reserved\n u16(0),\n // Layer\n u16(0),\n // Alternate group\n fixed_8_8(track.info.type === \"audio\" ? 1 : 0),\n // Volume\n u16(0),\n // Reserved\n matrixToBytes(matrix),\n // Matrix\n fixed_16_16(track.info.type === \"video\" ? track.info.width : 0),\n // Track width\n fixed_16_16(track.info.type === \"video\" ? track.info.height : 0)\n // Track height\n ]);\n};\nvar mdia = (track, creationTime) => box(\"mdia\", null, [\n mdhd(track, creationTime),\n hdlr(track.info.type === \"video\" ? \"vide\" : \"soun\"),\n minf(track)\n]);\nvar mdhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let localDuration = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n track.timescale\n );\n let needsU64 = !isU32(creationTime) || !isU32(localDuration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mdhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.timescale),\n // Timescale\n u32OrU64(localDuration),\n // Duration\n u16(21956),\n // Language (\"und\", undetermined)\n u16(0)\n // Quality\n ]);\n};\nvar hdlr = (componentSubtype) => fullBox(\"hdlr\", 0, 0, [\n ascii(\"mhlr\"),\n // Component type\n ascii(componentSubtype),\n // Component subtype\n u32(0),\n // Component manufacturer\n u32(0),\n // Component flags\n u32(0),\n // Component flags mask\n ascii(\"mp4-muxer-hdlr\", true)\n // Component name\n]);\nvar minf = (track) => box(\"minf\", null, [\n track.info.type === \"video\" ? vmhd() : smhd(),\n dinf(),\n stbl(track)\n]);\nvar vmhd = () => fullBox(\"vmhd\", 0, 1, [\n u16(0),\n // Graphics mode\n u16(0),\n // Opcolor R\n u16(0),\n // Opcolor G\n u16(0)\n // Opcolor B\n]);\nvar smhd = () => fullBox(\"smhd\", 0, 0, [\n u16(0),\n // Balance\n u16(0)\n // Reserved\n]);\nvar dinf = () => box(\"dinf\", null, [\n dref()\n]);\nvar dref = () => fullBox(\"dref\", 0, 0, [\n u32(1)\n // Entry count\n], [\n url()\n]);\nvar url = () => fullBox(\"url \", 0, 1);\nvar stbl = (track) => {\n const needsCtts = track.compositionTimeOffsetTable.length > 1 || track.compositionTimeOffsetTable.some((x) => x.sampleCompositionTimeOffset !== 0);\n return box(\"stbl\", null, [\n stsd(track),\n stts(track),\n stss(track),\n stsc(track),\n stsz(track),\n stco(track),\n needsCtts ? ctts(track) : null\n ]);\n};\nvar stsd = (track) => fullBox(\"stsd\", 0, 0, [\n u32(1)\n // Entry count\n], [\n track.info.type === \"video\" ? videoSampleDescription(\n VIDEO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n ) : soundSampleDescription(\n AUDIO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n )\n]);\nvar videoSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Pre-defined\n u16(0),\n // Reserved\n Array(12).fill(0),\n // Pre-defined\n u16(track.info.width),\n // Width\n u16(track.info.height),\n // Height\n u32(4718592),\n // Horizontal resolution\n u32(4718592),\n // Vertical resolution\n u32(0),\n // Reserved\n u16(1),\n // Frame count\n Array(32).fill(0),\n // Compressor name\n u16(24),\n // Depth\n i16(65535)\n // Pre-defined\n], [\n VIDEO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track),\n track.info.decoderConfig.colorSpace ? colr(track) : null\n]);\nvar COLOR_PRIMARIES_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // ITU-R BT.601 525 - SMPTE 170M\n};\nvar TRANSFER_CHARACTERISTICS_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"smpte170m\": 6,\n // SMPTE 170M\n \"iec61966-2-1\": 13\n // IEC 61966-2-1\n};\nvar MATRIX_COEFFICIENTS_MAP = {\n \"rgb\": 0,\n // Identity\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // SMPTE 170M\n};\nvar colr = (track) => box(\"colr\", [\n ascii(\"nclx\"),\n // Colour type\n u16(COLOR_PRIMARIES_MAP[track.info.decoderConfig.colorSpace.primaries]),\n // Colour primaries\n u16(TRANSFER_CHARACTERISTICS_MAP[track.info.decoderConfig.colorSpace.transfer]),\n // Transfer characteristics\n u16(MATRIX_COEFFICIENTS_MAP[track.info.decoderConfig.colorSpace.matrix]),\n // Matrix coefficients\n u8((track.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)\n // Full range flag\n]);\nvar avcC = (track) => track.info.decoderConfig && box(\"avcC\", [\n // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar hvcC = (track) => track.info.decoderConfig && box(\"hvcC\", [\n // For HEVC, description is a HEVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar vpcC = (track) => {\n if (!track.info.decoderConfig) {\n return null;\n }\n let decoderConfig = track.info.decoderConfig;\n if (!decoderConfig.colorSpace) {\n throw new Error(`'colorSpace' is required in the decoder config for VP9.`);\n }\n let parts = decoderConfig.codec.split(\".\");\n let profile = Number(parts[1]);\n let level = Number(parts[2]);\n let bitDepth = Number(parts[3]);\n let chromaSubsampling = 0;\n let thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + Number(decoderConfig.colorSpace.fullRange);\n let colourPrimaries = 2;\n let transferCharacteristics = 2;\n let matrixCoefficients = 2;\n return fullBox(\"vpcC\", 1, 0, [\n u8(profile),\n // Profile\n u8(level),\n // Level\n u8(thirdByte),\n // Bit depth, chroma subsampling, full range\n u8(colourPrimaries),\n // Colour primaries\n u8(transferCharacteristics),\n // Transfer characteristics\n u8(matrixCoefficients),\n // Matrix coefficients\n u16(0)\n // Codec initialization data size\n ]);\n};\nvar av1C = () => {\n let marker = 1;\n let version = 1;\n let firstByte = (marker << 7) + version;\n return box(\"av1C\", [\n firstByte,\n 0,\n 0,\n 0\n ]);\n};\nvar soundSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Version\n u16(0),\n // Revision level\n u32(0),\n // Vendor\n u16(track.info.numberOfChannels),\n // Number of channels\n u16(16),\n // Sample size (bits)\n u16(0),\n // Compression ID\n u16(0),\n // Packet size\n fixed_16_16(track.info.sampleRate)\n // Sample rate\n], [\n AUDIO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track)\n]);\nvar esds = (track) => {\n let description = new Uint8Array(track.info.decoderConfig.description);\n return fullBox(\"esds\", 0, 0, [\n // https://stackoverflow.com/a/54803118\n u32(58753152),\n // TAG(3) = Object Descriptor ([2])\n u8(32 + description.byteLength),\n // length of this OD (which includes the next 2 tags)\n u16(1),\n // ES_ID = 1\n u8(0),\n // flags etc = 0\n u32(75530368),\n // TAG(4) = ES Descriptor ([2]) embedded in above OD\n u8(18 + description.byteLength),\n // length of this ESD\n u8(64),\n // MPEG-4 Audio\n u8(21),\n // stream type(6bits)=5 audio, flags(2bits)=1\n u24(0),\n // 24bit buffer size\n u32(130071),\n // max bitrate\n u32(130071),\n // avg bitrate\n u32(92307584),\n // TAG(5) = ASC ([2],[3]) embedded in above OD\n u8(description.byteLength),\n // length\n ...description,\n u32(109084800),\n // TAG(6)\n u8(1),\n // length\n u8(2)\n // data\n ]);\n};\nvar dOps = (track) => {\n let preskip = 3840;\n let gain = 0;\n const description = track.info.decoderConfig?.description;\n if (description) {\n if (description.byteLength < 18) {\n throw new TypeError(\"Invalid decoder description provided for Opus; must be at least 18 bytes long.\");\n }\n const view2 = ArrayBuffer.isView(description) ? new DataView(description.buffer, description.byteOffset, description.byteLength) : new DataView(description);\n preskip = view2.getUint16(10, true);\n gain = view2.getInt16(14, true);\n }\n return box(\"dOps\", [\n u8(0),\n // Version\n u8(track.info.numberOfChannels),\n // OutputChannelCount\n u16(preskip),\n u32(track.info.sampleRate),\n // InputSampleRate\n fixed_8_8(gain),\n // OutputGain\n u8(0)\n // ChannelMappingFamily\n ]);\n};\nvar stts = (track) => {\n return fullBox(\"stts\", 0, 0, [\n u32(track.timeToSampleTable.length),\n // Number of entries\n track.timeToSampleTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleDelta)\n // Sample duration\n ])\n ]);\n};\nvar stss = (track) => {\n if (track.samples.every((x) => x.type === \"key\"))\n return null;\n let keySamples = [...track.samples.entries()].filter(([, sample]) => sample.type === \"key\");\n return fullBox(\"stss\", 0, 0, [\n u32(keySamples.length),\n // Number of entries\n keySamples.map(([index]) => u32(index + 1))\n // Sync sample table\n ]);\n};\nvar stsc = (track) => {\n return fullBox(\"stsc\", 0, 0, [\n u32(track.compactlyCodedChunkTable.length),\n // Number of entries\n track.compactlyCodedChunkTable.map((x) => [\n // Sample-to-chunk table\n u32(x.firstChunk),\n // First chunk\n u32(x.samplesPerChunk),\n // Samples per chunk\n u32(1)\n // Sample description index\n ])\n ]);\n};\nvar stsz = (track) => fullBox(\"stsz\", 0, 0, [\n u32(0),\n // Sample size (0 means non-constant size)\n u32(track.samples.length),\n // Number of entries\n track.samples.map((x) => u32(x.size))\n // Sample size table\n]);\nvar stco = (track) => {\n if (track.finalizedChunks.length > 0 && last(track.finalizedChunks).offset >= 2 ** 32) {\n return fullBox(\"co64\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u64(x.offset))\n // Chunk offset table\n ]);\n }\n return fullBox(\"stco\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u32(x.offset))\n // Chunk offset table\n ]);\n};\nvar ctts = (track) => {\n return fullBox(\"ctts\", 0, 0, [\n u32(track.compositionTimeOffsetTable.length),\n // Number of entries\n track.compositionTimeOffsetTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleCompositionTimeOffset)\n // Sample offset\n ])\n ]);\n};\nvar mvex = (tracks) => {\n return box(\"mvex\", null, tracks.map(trex));\n};\nvar trex = (track) => {\n return fullBox(\"trex\", 0, 0, [\n u32(track.id),\n // Track ID\n u32(1),\n // Default sample description index\n u32(0),\n // Default sample duration\n u32(0),\n // Default sample size\n u32(0)\n // Default sample flags\n ]);\n};\nvar moof = (sequenceNumber, tracks) => {\n return box(\"moof\", null, [\n mfhd(sequenceNumber),\n ...tracks.map(traf)\n ]);\n};\nvar mfhd = (sequenceNumber) => {\n return fullBox(\"mfhd\", 0, 0, [\n u32(sequenceNumber)\n // Sequence number\n ]);\n};\nvar fragmentSampleFlags = (sample) => {\n let byte1 = 0;\n let byte2 = 0;\n let byte3 = 0;\n let byte4 = 0;\n let sampleIsDifferenceSample = sample.type === \"delta\";\n byte2 |= +sampleIsDifferenceSample;\n if (sampleIsDifferenceSample) {\n byte1 |= 1;\n } else {\n byte1 |= 2;\n }\n return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;\n};\nvar traf = (track) => {\n return box(\"traf\", null, [\n tfhd(track),\n tfdt(track),\n trun(track)\n ]);\n};\nvar tfhd = (track) => {\n let tfFlags = 0;\n tfFlags |= 8;\n tfFlags |= 16;\n tfFlags |= 32;\n tfFlags |= 131072;\n let referenceSample = track.currentChunk.samples[1] ?? track.currentChunk.samples[0];\n let referenceSampleInfo = {\n duration: referenceSample.timescaleUnitsToNextSample,\n size: referenceSample.size,\n flags: fragmentSampleFlags(referenceSample)\n };\n return fullBox(\"tfhd\", 0, tfFlags, [\n u32(track.id),\n // Track ID\n u32(referenceSampleInfo.duration),\n // Default sample duration\n u32(referenceSampleInfo.size),\n // Default sample size\n u32(referenceSampleInfo.flags)\n // Default sample flags\n ]);\n};\nvar tfdt = (track) => {\n return fullBox(\"tfdt\", 1, 0, [\n u64(intoTimescale(track.currentChunk.startTimestamp, track.timescale))\n // Base Media Decode Time\n ]);\n};\nvar trun = (track) => {\n let allSampleDurations = track.currentChunk.samples.map((x) => x.timescaleUnitsToNextSample);\n let allSampleSizes = track.currentChunk.samples.map((x) => x.size);\n let allSampleFlags = track.currentChunk.samples.map(fragmentSampleFlags);\n let allSampleCompositionTimeOffsets = track.currentChunk.samples.map((x) => intoTimescale(x.presentationTimestamp - x.decodeTimestamp, track.timescale));\n let uniqueSampleDurations = new Set(allSampleDurations);\n let uniqueSampleSizes = new Set(allSampleSizes);\n let uniqueSampleFlags = new Set(allSampleFlags);\n let uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets);\n let firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1];\n let sampleDurationPresent = uniqueSampleDurations.size > 1;\n let sampleSizePresent = uniqueSampleSizes.size > 1;\n let sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1;\n let sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some((x) => x !== 0);\n let flags = 0;\n flags |= 1;\n flags |= 4 * +firstSampleFlagsPresent;\n flags |= 256 * +sampleDurationPresent;\n flags |= 512 * +sampleSizePresent;\n flags |= 1024 * +sampleFlagsPresent;\n flags |= 2048 * +sampleCompositionTimeOffsetsPresent;\n return fullBox(\"trun\", 1, flags, [\n u32(track.currentChunk.samples.length),\n // Sample count\n u32(track.currentChunk.offset - track.currentChunk.moofOffset || 0),\n // Data offset\n firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [],\n track.currentChunk.samples.map((_, i) => [\n sampleDurationPresent ? u32(allSampleDurations[i]) : [],\n // Sample duration\n sampleSizePresent ? u32(allSampleSizes[i]) : [],\n // Sample size\n sampleFlagsPresent ? u32(allSampleFlags[i]) : [],\n // Sample flags\n // Sample composition time offsets\n sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : []\n ])\n ]);\n};\nvar mfra = (tracks) => {\n return box(\"mfra\", null, [\n ...tracks.map(tfra),\n mfro()\n ]);\n};\nvar tfra = (track, trackIndex) => {\n let version = 1;\n return fullBox(\"tfra\", version, 0, [\n u32(track.id),\n // Track ID\n u32(63),\n // This specifies that traf number, trun number and sample number are 32-bit ints\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((chunk) => [\n u64(intoTimescale(chunk.startTimestamp, track.timescale)),\n // Time\n u64(chunk.moofOffset),\n // moof offset\n u32(trackIndex + 1),\n // traf number\n u32(1),\n // trun number\n u32(1)\n // Sample number\n ])\n ]);\n};\nvar mfro = () => {\n return fullBox(\"mfro\", 0, 0, [\n // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box\n // is known\n u32(0)\n // Size\n ]);\n};\nvar VIDEO_CODEC_TO_BOX_NAME = {\n \"avc\": \"avc1\",\n \"hevc\": \"hvc1\",\n \"vp9\": \"vp09\",\n \"av1\": \"av01\"\n};\nvar VIDEO_CODEC_TO_CONFIGURATION_BOX = {\n \"avc\": avcC,\n \"hevc\": hvcC,\n \"vp9\": vpcC,\n \"av1\": av1C\n};\nvar AUDIO_CODEC_TO_BOX_NAME = {\n \"aac\": \"mp4a\",\n \"opus\": \"Opus\"\n};\nvar AUDIO_CODEC_TO_CONFIGURATION_BOX = {\n \"aac\": esds,\n \"opus\": dOps\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView;\nvar Writer = class {\n constructor() {\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n /**\n * Stores the position from the start of the file to where boxes elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = /* @__PURE__ */ new WeakMap();\n }\n /** Sets the current position for future writes to a new one. */\n seek(newPos) {\n this.pos = newPos;\n }\n writeU32(value) {\n __privateGet(this, _helperView).setUint32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n }\n writeU64(value) {\n __privateGet(this, _helperView).setUint32(0, Math.floor(value / 2 ** 32), false);\n __privateGet(this, _helperView).setUint32(4, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 8));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n __privateGet(this, _helperView).setUint8(i % 8, text.charCodeAt(i));\n if (i % 8 === 7)\n this.write(__privateGet(this, _helper));\n }\n if (text.length % 8 !== 0) {\n this.write(__privateGet(this, _helper).subarray(0, text.length % 8));\n }\n }\n writeBox(box2) {\n this.offsets.set(box2, this.pos);\n if (box2.contents && !box2.children) {\n this.writeBoxHeader(box2, box2.size ?? box2.contents.byteLength + 8);\n this.write(box2.contents);\n } else {\n let startPos = this.pos;\n this.writeBoxHeader(box2, 0);\n if (box2.contents)\n this.write(box2.contents);\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n this.writeBox(child);\n }\n let endPos = this.pos;\n let size = box2.size ?? endPos - startPos;\n this.seek(startPos);\n this.writeBoxHeader(box2, size);\n this.seek(endPos);\n }\n }\n writeBoxHeader(box2, size) {\n this.writeU32(box2.largeSize ? 1 : size);\n this.writeAscii(box2.type);\n if (box2.largeSize)\n this.writeU64(size);\n }\n measureBoxHeader(box2) {\n return 8 + (box2.largeSize ? 8 : 0);\n }\n patchBox(box2) {\n let endPos = this.pos;\n this.seek(this.offsets.get(box2));\n this.writeBox(box2);\n this.seek(endPos);\n }\n measureBox(box2) {\n if (box2.contents && !box2.children) {\n let headerSize = this.measureBoxHeader(box2);\n return headerSize + box2.contents.byteLength;\n } else {\n let result = this.measureBoxHeader(box2);\n if (box2.contents)\n result += box2.contents.byteLength;\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n result += this.measureBox(child);\n }\n return result;\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\nvar _target, _buffer, _bytes, _maxPos, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateAdd(this, _maxPos, 0);\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n __privateSet(this, _maxPos, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_maxPos = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _target2, _sections, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _target2, void 0);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n /**\n * The data is divided up into fixed-size chunks, whose contents are first filled in RAM and then flushed out.\n * A chunk is flushed if all of its contents have been written.\n */\n __privateAdd(this, _chunks, []);\n __privateSet(this, _target2, target);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n __privateGet(this, _target2).options.onData?.(chunk.data, chunk.start);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_target2 = new WeakMap();\n_sections = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n __privateGet(this, _target2).options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }));\n }\n};\n\n// src/muxer.ts\nvar GLOBAL_TIMESCALE = 1e3;\nvar SUPPORTED_VIDEO_CODECS = [\"avc\", \"hevc\", \"vp9\", \"av1\"];\nvar SUPPORTED_AUDIO_CODECS = [\"aac\", \"opus\"];\nvar TIMESTAMP_OFFSET = 2082844800;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"cross-track-offset\"];\nvar _options, _writer, _ftypSize, _mdat, _videoTrack, _audioTrack, _creationTime, _finalizedChunks, _nextFragmentNumber, _videoSampleQueue, _audioSampleQueue, _finalized, _validateOptions, validateOptions_fn, _writeHeader, writeHeader_fn, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn, _prepareTracks, prepareTracks_fn, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn, _createSampleForTrack, createSampleForTrack_fn, _addSampleToTrack, addSampleToTrack_fn, _validateTimestamp, validateTimestamp_fn, _finalizeCurrentChunk, finalizeCurrentChunk_fn, _finalizeFragment, finalizeFragment_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _writeHeader);\n __privateAdd(this, _computeMoovSizeUpperBound);\n __privateAdd(this, _prepareTracks);\n // https://wiki.multimedia.cx/index.php/MPEG-4_Audio\n __privateAdd(this, _generateMpeg4AudioSpecificConfig);\n __privateAdd(this, _createSampleForTrack);\n __privateAdd(this, _addSampleToTrack);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _finalizeCurrentChunk);\n __privateAdd(this, _finalizeFragment);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _ftypSize, void 0);\n __privateAdd(this, _mdat, void 0);\n __privateAdd(this, _videoTrack, null);\n __privateAdd(this, _audioTrack, null);\n __privateAdd(this, _creationTime, Math.floor(Date.now() / 1e3) + TIMESTAMP_OFFSET);\n __privateAdd(this, _finalizedChunks, []);\n // Fields for fragmented MP4:\n __privateAdd(this, _nextFragmentNumber, 1);\n __privateAdd(this, _videoSampleQueue, []);\n __privateAdd(this, _audioSampleQueue, []);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n options.video = deepClone(options.video);\n options.audio = deepClone(options.audio);\n options.fastStart = deepClone(options.fastStart);\n this.target = options.target;\n __privateSet(this, _options, {\n firstTimestampBehavior: \"strict\",\n ...options\n });\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _prepareTracks, prepareTracks_fn).call(this);\n __privateMethod(this, _writeHeader, writeHeader_fn).call(this);\n }\n addVideoChunk(sample, meta, timestamp, compositionTimeOffset) {\n if (!(sample instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (sample) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunk's fourth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addVideoChunkRaw(\n data,\n sample.type,\n timestamp ?? sample.timestamp,\n sample.duration,\n meta,\n compositionTimeOffset\n );\n }\n addVideoChunkRaw(data, type, timestamp, duration, meta, compositionTimeOffset) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunkRaw's sixth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _videoTrack).samples.length === __privateGet(this, _options).fastStart.expectedVideoChunks) {\n throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedVideoChunks}).`);\n }\n let videoSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _videoTrack), data, type, timestamp, duration, meta, compositionTimeOffset);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _audioTrack)) {\n while (__privateGet(this, _audioSampleQueue).length > 0 && __privateGet(this, _audioSampleQueue)[0].decodeTimestamp <= videoSample.decodeTimestamp) {\n let audioSample = __privateGet(this, _audioSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n if (videoSample.decodeTimestamp <= __privateGet(this, _audioTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n } else {\n __privateGet(this, _videoSampleQueue).push(videoSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n }\n addAudioChunk(sample, meta, timestamp) {\n if (!(sample instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (sample) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addAudioChunkRaw(data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta);\n }\n addAudioChunkRaw(data, type, timestamp, duration, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _audioTrack).samples.length === __privateGet(this, _options).fastStart.expectedAudioChunks) {\n throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedAudioChunks}).`);\n }\n let audioSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _audioTrack), data, type, timestamp, duration, meta);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _videoTrack)) {\n while (__privateGet(this, _videoSampleQueue).length > 0 && __privateGet(this, _videoSampleQueue)[0].decodeTimestamp <= audioSample.decodeTimestamp) {\n let videoSample = __privateGet(this, _videoSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n if (audioSample.decodeTimestamp <= __privateGet(this, _videoTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n } else {\n __privateGet(this, _audioSampleQueue).push(audioSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n }\n /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n for (let videoSample of __privateGet(this, _videoSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n for (let audioSample of __privateGet(this, _audioSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this, false);\n } else {\n if (__privateGet(this, _videoTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _videoTrack));\n if (__privateGet(this, _audioTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _audioTrack));\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter(Boolean);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n let mdatSize;\n for (let i = 0; i < 2; i++) {\n let movieBox2 = moov(tracks, __privateGet(this, _creationTime));\n let movieBoxSize = __privateGet(this, _writer).measureBox(movieBox2);\n mdatSize = __privateGet(this, _writer).measureBox(__privateGet(this, _mdat));\n let currentChunkPos = __privateGet(this, _writer).pos + movieBoxSize + mdatSize;\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n chunk.offset = currentChunkPos;\n for (let { data } of chunk.samples) {\n currentChunkPos += data.byteLength;\n mdatSize += data.byteLength;\n }\n }\n if (currentChunkPos < 2 ** 32)\n break;\n if (mdatSize >= 2 ** 32)\n __privateGet(this, _mdat).largeSize = true;\n }\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n __privateGet(this, _writer).writeBox(movieBox);\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n for (let sample of chunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let startPos = __privateGet(this, _writer).pos;\n let mfraBox = mfra(tracks);\n __privateGet(this, _writer).writeBox(mfraBox);\n let mfraBoxSize = __privateGet(this, _writer).pos - startPos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos - 4);\n __privateGet(this, _writer).writeU32(mfraBoxSize);\n } else {\n let mdatPos = __privateGet(this, _writer).offsets.get(__privateGet(this, _mdat));\n let mdatSize = __privateGet(this, _writer).pos - mdatPos;\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _mdat).largeSize = mdatSize >= 2 ** 32;\n __privateGet(this, _writer).patchBox(__privateGet(this, _mdat));\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n __privateGet(this, _writer).seek(__privateGet(this, _ftypSize));\n __privateGet(this, _writer).writeBox(movieBox);\n let remainingBytes = mdatPos - __privateGet(this, _writer).pos;\n __privateGet(this, _writer).writeBox(free(remainingBytes));\n } else {\n __privateGet(this, _writer).writeBox(movieBox);\n }\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_ftypSize = new WeakMap();\n_mdat = new WeakMap();\n_videoTrack = new WeakMap();\n_audioTrack = new WeakMap();\n_creationTime = new WeakMap();\n_finalizedChunks = new WeakMap();\n_nextFragmentNumber = new WeakMap();\n_videoSampleQueue = new WeakMap();\n_audioSampleQueue = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (!SUPPORTED_VIDEO_CODECS.includes(options.video.codec)) {\n throw new TypeError(`Unsupported video codec: ${options.video.codec}`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n const videoRotation = options.video.rotation;\n if (typeof videoRotation === \"number\" && ![0, 90, 180, 270].includes(videoRotation)) {\n throw new TypeError(`Invalid video rotation: ${videoRotation}. Has to be 0, 90, 180 or 270.`);\n } else if (Array.isArray(videoRotation) && (videoRotation.length !== 9 || videoRotation.some((value) => typeof value !== \"number\"))) {\n throw new TypeError(`Invalid video transformation matrix: ${videoRotation.join()}`);\n }\n if (options.video.frameRate !== void 0 && (!Number.isInteger(options.video.frameRate) || options.video.frameRate <= 0)) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive integer.`\n );\n }\n }\n if (options.audio) {\n if (!SUPPORTED_AUDIO_CODECS.includes(options.audio.codec)) {\n throw new TypeError(`Unsupported audio codec: ${options.audio.codec}`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (typeof options.fastStart === \"object\") {\n if (options.video) {\n if (options.fastStart.expectedVideoChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedVideoChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedVideoChunks) || options.fastStart.expectedVideoChunks < 0) {\n throw new TypeError(`'expectedVideoChunks' must be a non-negative integer.`);\n }\n }\n if (options.audio) {\n if (options.fastStart.expectedAudioChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedAudioChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedAudioChunks) || options.fastStart.expectedAudioChunks < 0) {\n throw new TypeError(`'expectedAudioChunks' must be a non-negative integer.`);\n }\n }\n } else if (![false, \"in-memory\", \"fragmented\"].includes(options.fastStart)) {\n throw new TypeError(`'fastStart' option must be false, 'in-memory', 'fragmented' or an object.`);\n }\n if (options.minFragmentDuration !== void 0 && (!Number.isFinite(options.minFragmentDuration) || options.minFragmentDuration < 0)) {\n throw new TypeError(`'minFragmentDuration' must be a non-negative number.`);\n }\n};\n_writeHeader = new WeakSet();\nwriteHeader_fn = function() {\n __privateGet(this, _writer).writeBox(ftyp({\n holdsAvc: __privateGet(this, _options).video?.codec === \"avc\",\n fragmented: __privateGet(this, _options).fastStart === \"fragmented\"\n }));\n __privateSet(this, _ftypSize, __privateGet(this, _writer).pos);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n __privateSet(this, _mdat, mdat(false));\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n } else {\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n let moovSizeUpperBound = __privateMethod(this, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn).call(this);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos + moovSizeUpperBound);\n }\n __privateSet(this, _mdat, mdat(true));\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_computeMoovSizeUpperBound = new WeakSet();\ncomputeMoovSizeUpperBound_fn = function() {\n if (typeof __privateGet(this, _options).fastStart !== \"object\")\n return;\n let upperBound = 0;\n let sampleCounts = [\n __privateGet(this, _options).fastStart.expectedVideoChunks,\n __privateGet(this, _options).fastStart.expectedAudioChunks\n ];\n for (let n of sampleCounts) {\n if (!n)\n continue;\n upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += 8 * n;\n }\n upperBound += 4096;\n return upperBound;\n};\n_prepareTracks = new WeakSet();\nprepareTracks_fn = function() {\n if (__privateGet(this, _options).video) {\n __privateSet(this, _videoTrack, {\n id: 1,\n info: {\n type: \"video\",\n codec: __privateGet(this, _options).video.codec,\n width: __privateGet(this, _options).video.width,\n height: __privateGet(this, _options).video.height,\n rotation: __privateGet(this, _options).video.rotation ?? 0,\n decoderConfig: null\n },\n // The fallback contains many common frame rates as factors\n timescale: __privateGet(this, _options).video.frameRate ?? 57600,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioTrack, {\n id: __privateGet(this, _options).video ? 2 : 1,\n info: {\n type: \"audio\",\n codec: __privateGet(this, _options).audio.codec,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate,\n decoderConfig: null\n },\n timescale: __privateGet(this, _options).audio.sampleRate,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n if (__privateGet(this, _options).audio.codec === \"aac\") {\n let guessedCodecPrivate = __privateMethod(this, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn).call(\n this,\n 2,\n // Object type for AAC-LC, since it's the most common\n __privateGet(this, _options).audio.sampleRate,\n __privateGet(this, _options).audio.numberOfChannels\n );\n __privateGet(this, _audioTrack).info.decoderConfig = {\n codec: __privateGet(this, _options).audio.codec,\n description: guessedCodecPrivate,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate\n };\n }\n }\n};\n_generateMpeg4AudioSpecificConfig = new WeakSet();\ngenerateMpeg4AudioSpecificConfig_fn = function(objectType, sampleRate, numberOfChannels) {\n let frequencyIndices = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n let frequencyIndex = frequencyIndices.indexOf(sampleRate);\n let channelConfig = numberOfChannels;\n let configBits = \"\";\n configBits += objectType.toString(2).padStart(5, \"0\");\n configBits += frequencyIndex.toString(2).padStart(4, \"0\");\n if (frequencyIndex === 15)\n configBits += sampleRate.toString(2).padStart(24, \"0\");\n configBits += channelConfig.toString(2).padStart(4, \"0\");\n let paddingLength = Math.ceil(configBits.length / 8) * 8;\n configBits = configBits.padEnd(paddingLength, \"0\");\n let configBytes = new Uint8Array(configBits.length / 8);\n for (let i = 0; i < configBits.length; i += 8) {\n configBytes[i / 8] = parseInt(configBits.slice(i, i + 8), 2);\n }\n return configBytes;\n};\n_createSampleForTrack = new WeakSet();\ncreateSampleForTrack_fn = function(track, data, type, timestamp, duration, meta, compositionTimeOffset) {\n let presentationTimestampInSeconds = timestamp / 1e6;\n let decodeTimestampInSeconds = (timestamp - (compositionTimeOffset ?? 0)) / 1e6;\n let durationInSeconds = duration / 1e6;\n let adjusted = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, presentationTimestampInSeconds, decodeTimestampInSeconds, track);\n presentationTimestampInSeconds = adjusted.presentationTimestamp;\n decodeTimestampInSeconds = adjusted.decodeTimestamp;\n if (meta?.decoderConfig) {\n if (track.info.decoderConfig === null) {\n track.info.decoderConfig = meta.decoderConfig;\n } else {\n Object.assign(track.info.decoderConfig, meta.decoderConfig);\n }\n }\n let sample = {\n presentationTimestamp: presentationTimestampInSeconds,\n decodeTimestamp: decodeTimestampInSeconds,\n duration: durationInSeconds,\n data,\n size: data.byteLength,\n type,\n // Will be refined once the next sample comes in\n timescaleUnitsToNextSample: intoTimescale(durationInSeconds, track.timescale)\n };\n return sample;\n};\n_addSampleToTrack = new WeakSet();\naddSampleToTrack_fn = function(track, sample) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.samples.push(sample);\n }\n const sampleCompositionTimeOffset = intoTimescale(sample.presentationTimestamp - sample.decodeTimestamp, track.timescale);\n if (track.lastTimescaleUnits !== null) {\n let timescaleUnits = intoTimescale(sample.decodeTimestamp, track.timescale, false);\n let delta = Math.round(timescaleUnits - track.lastTimescaleUnits);\n track.lastTimescaleUnits += delta;\n track.lastSample.timescaleUnitsToNextSample = delta;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n let lastTableEntry = last(track.timeToSampleTable);\n if (lastTableEntry.sampleCount === 1) {\n lastTableEntry.sampleDelta = delta;\n lastTableEntry.sampleCount++;\n } else if (lastTableEntry.sampleDelta === delta) {\n lastTableEntry.sampleCount++;\n } else {\n lastTableEntry.sampleCount--;\n track.timeToSampleTable.push({\n sampleCount: 2,\n sampleDelta: delta\n });\n }\n const lastCompositionTimeOffsetTableEntry = last(track.compositionTimeOffsetTable);\n if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) {\n lastCompositionTimeOffsetTableEntry.sampleCount++;\n } else {\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n } else {\n track.lastTimescaleUnits = 0;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.timeToSampleTable.push({\n sampleCount: 1,\n sampleDelta: intoTimescale(sample.duration, track.timescale)\n });\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n track.lastSample = sample;\n let beginNewChunk = false;\n if (!track.currentChunk) {\n beginNewChunk = true;\n } else {\n let currentChunkDuration = sample.presentationTimestamp - track.currentChunk.startTimestamp;\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let mostImportantTrack = __privateGet(this, _videoTrack) ?? __privateGet(this, _audioTrack);\n const chunkDuration = __privateGet(this, _options).minFragmentDuration ?? 1;\n if (track === mostImportantTrack && sample.type === \"key\" && currentChunkDuration >= chunkDuration) {\n beginNewChunk = true;\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this);\n }\n } else {\n beginNewChunk = currentChunkDuration >= 0.5;\n }\n }\n if (beginNewChunk) {\n if (track.currentChunk) {\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, track);\n }\n track.currentChunk = {\n startTimestamp: sample.presentationTimestamp,\n samples: []\n };\n }\n track.currentChunk.samples.push(sample);\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(presentationTimestamp, decodeTimestamp, track) {\n const strictTimestampBehavior = __privateGet(this, _options).firstTimestampBehavior === \"strict\";\n const noLastDecodeTimestamp = track.lastDecodeTimestamp === -1;\n const timestampNonZero = decodeTimestamp !== 0;\n if (strictTimestampBehavior && noLastDecodeTimestamp && timestampNonZero) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received DTS=${decodeTimestamp}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\" || __privateGet(this, _options).firstTimestampBehavior === \"cross-track-offset\") {\n if (track.firstDecodeTimestamp === void 0) {\n track.firstDecodeTimestamp = decodeTimestamp;\n }\n let baseDecodeTimestamp;\n if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n baseDecodeTimestamp = track.firstDecodeTimestamp;\n } else {\n baseDecodeTimestamp = Math.min(\n __privateGet(this, _videoTrack)?.firstDecodeTimestamp ?? Infinity,\n __privateGet(this, _audioTrack)?.firstDecodeTimestamp ?? Infinity\n );\n }\n decodeTimestamp -= baseDecodeTimestamp;\n presentationTimestamp -= baseDecodeTimestamp;\n }\n if (decodeTimestamp < track.lastDecodeTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (DTS went from ${track.lastDecodeTimestamp * 1e6} to ${decodeTimestamp * 1e6}).`\n );\n }\n track.lastDecodeTimestamp = decodeTimestamp;\n return { presentationTimestamp, decodeTimestamp };\n};\n_finalizeCurrentChunk = new WeakSet();\nfinalizeCurrentChunk_fn = function(track) {\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n throw new Error(\"Can't finalize individual chunks if 'fastStart' is set to 'fragmented'.\");\n }\n if (!track.currentChunk)\n return;\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n if (track.compactlyCodedChunkTable.length === 0 || last(track.compactlyCodedChunkTable).samplesPerChunk !== track.currentChunk.samples.length) {\n track.compactlyCodedChunkTable.push({\n firstChunk: track.finalizedChunks.length,\n // 1-indexed\n samplesPerChunk: track.currentChunk.samples.length\n });\n }\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n track.currentChunk.offset = 0;\n return;\n }\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_finalizeFragment = new WeakSet();\nfinalizeFragment_fn = function(flushStreamingWriter = true) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n throw new Error(\"Can't finalize a fragment unless 'fastStart' is set to 'fragmented'.\");\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter((track) => track && track.currentChunk);\n if (tracks.length === 0)\n return;\n let fragmentNumber = __privateWrapper(this, _nextFragmentNumber)._++;\n if (fragmentNumber === 1) {\n let movieBox = moov(tracks, __privateGet(this, _creationTime), true);\n __privateGet(this, _writer).writeBox(movieBox);\n }\n let moofOffset = __privateGet(this, _writer).pos;\n let moofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(moofBox);\n {\n let mdatBox = mdat(false);\n let totalTrackSampleSize = 0;\n for (let track of tracks) {\n for (let sample of track.currentChunk.samples) {\n totalTrackSampleSize += sample.size;\n }\n }\n let mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n if (mdatSize >= 2 ** 32) {\n mdatBox.largeSize = true;\n mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n }\n mdatBox.size = mdatSize;\n __privateGet(this, _writer).writeBox(mdatBox);\n }\n for (let track of tracks) {\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n track.currentChunk.moofOffset = moofOffset;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(moofBox));\n let newMoofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(newMoofBox);\n __privateGet(this, _writer).seek(endPos);\n for (let track of tracks) {\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n track.currentChunk = null;\n }\n if (flushStreamingWriter) {\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget\n};\n","import { Muxer, ArrayBufferTarget } from 'mp4-muxer';\nimport type { Scene, Timeline, AnimCtx } from './types';\nimport { AnimCtxImpl } from './context';\n\nexport interface RenderOptions {\n scene: Scene;\n timeline: Timeline<AnimCtx>;\n fps: number;\n bitrate: number;\n scale: number; // 1 = 720p, 2 = 1440p, etc.\n onProgress: (progress: number, frame: number, totalFrames: number) => void;\n}\n\nexport interface RenderResult {\n blob: Blob;\n duration: number;\n frames: number;\n}\n\nexport interface RenderController {\n start(): Promise<RenderResult>;\n cancel(): void;\n}\n\nconst CANVAS_WIDTH = 1280;\nconst CANVAS_HEIGHT = 720;\n\nexport function isWebCodecsSupported(): boolean {\n return typeof VideoEncoder !== 'undefined' && typeof VideoFrame !== 'undefined';\n}\n\nexport function createVideoRenderer(options: RenderOptions): RenderController {\n const { scene, timeline, fps, bitrate, scale, onProgress } = options;\n\n let cancelled = false;\n let encoder: VideoEncoder | null = null;\n let muxer: Muxer<ArrayBufferTarget> | null = null;\n let encoderError: Error | null = null;\n\n return {\n async start(): Promise<RenderResult> {\n if (!isWebCodecsSupported()) {\n throw new Error('WebCodecs is not supported in this browser. Please use Chrome, Edge, or Opera.');\n }\n\n const duration = timeline.duration;\n const totalFrames = Math.ceil((duration / 1000) * fps);\n const frameDurationUs = 1_000_000 / fps;\n\n // Canvas at scaled resolution\n const videoWidth = CANVAS_WIDTH * scale;\n const videoHeight = CANVAS_HEIGHT * scale;\n const canvas = document.createElement('canvas');\n canvas.width = videoWidth;\n canvas.height = videoHeight;\n const ctx = canvas.getContext('2d')!;\n\n // Create animation context\n const animCtx = new AnimCtxImpl();\n\n // Set up MP4 muxer\n muxer = new Muxer({\n target: new ArrayBufferTarget(),\n video: {\n codec: 'avc',\n width: videoWidth,\n height: videoHeight,\n },\n fastStart: 'in-memory',\n });\n\n // Set up VideoEncoder\n encoder = new VideoEncoder({\n output: (chunk, meta) => {\n if (cancelled || !muxer) return;\n muxer.addVideoChunk(chunk, meta);\n },\n error: (e) => {\n console.error('VideoEncoder error:', e);\n encoderError = e;\n },\n });\n\n encoder.configure({\n codec: 'avc1.640032', // H.264 High Profile Level 5.1 (supports up to 4K)\n width: videoWidth,\n height: videoHeight,\n bitrate: bitrate,\n framerate: fps,\n });\n\n // Render frames\n for (let frame = 0; frame < totalFrames && !cancelled && !encoderError; frame++) {\n const timeMs = (frame / fps) * 1000;\n\n // Render frame\n animCtx.reset(scene);\n timeline.evaluate(timeMs, animCtx);\n const solved = animCtx.solve(scene);\n\n // Clear canvas and render scene at specified scale\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n scene.render(solved, canvas, scale);\n\n // Create VideoFrame from canvas\n const videoFrame = new VideoFrame(canvas, {\n timestamp: frame * frameDurationUs,\n });\n\n // Encode frame (keyframe every 1 second)\n const keyFrame = frame % fps === 0;\n encoder.encode(videoFrame, { keyFrame });\n videoFrame.close();\n\n // Report progress\n onProgress((frame + 1) / totalFrames, frame + 1, totalFrames);\n\n // Yield to UI thread periodically\n if (frame % 5 === 0) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n\n if (encoderError) {\n throw encoderError;\n }\n\n if (cancelled) {\n encoder.close();\n throw new Error('Rendering cancelled');\n }\n\n // Flush encoder and finalize muxer\n await encoder.flush();\n encoder.close();\n encoder = null;\n\n if (cancelled || !muxer) {\n throw new Error('Rendering cancelled');\n }\n\n muxer.finalize();\n const buffer = muxer.target.buffer;\n muxer = null;\n\n const blob = new Blob([buffer], { type: 'video/mp4' });\n\n return {\n blob,\n duration: duration,\n frames: totalFrames,\n };\n },\n\n cancel() {\n cancelled = true;\n if (encoder && encoder.state !== 'closed') {\n encoder.close();\n }\n },\n };\n}\n\nexport function downloadBlob(blob: Blob, filename: string) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n"],"names":["cos","sin","transformedX","transformedY","scale","scaleX","scaleY","angle","last","allMembers","url"],"mappings":"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","x_google_ignoreList":[4]}
1
+ {"version":3,"file":"video-renderer-Buv1c43x.js","sources":["../src/core/types.ts","../src/core/math.ts","../src/core/context.ts","../src/core/player.ts","../../../node_modules/mp4-muxer/build/mp4-muxer.mjs","../src/core/video-renderer.ts"],"sourcesContent":["export type Vec2 = readonly [number, number];\n\n/** Lazy expression that evaluates to Vec2 using resolved context */\nexport type Vec2Expr = Vec2 | ((ctx: ResolvedCtx) => Vec2);\n\n/** Lazy expression that evaluates to Rect using resolved context */\nexport type RectExpr = Rect | ((ctx: ResolvedCtx) => Rect);\n\n/** Lazy expression that evaluates to number using resolved context */\nexport type NumExpr = number | ((ctx: ResolvedCtx) => number);\n\n/** Helper to check if value is an expression (function) */\nexport function isExpr<T>(v: T | ((ctx: ResolvedCtx) => T)): v is (ctx: ResolvedCtx) => T {\n return typeof v === 'function';\n}\n\nexport type Anchor =\n | \"origin\" // (0, 0) - the transform origin point\n | \"topLeft\"\n | \"top\"\n | \"topRight\"\n | \"left\"\n | \"center\"\n | \"right\"\n | \"bottomLeft\"\n | \"bottom\"\n | \"bottomRight\"\n | \"baselineLeft\"\n | \"baseline\";\n\nexport interface SceneObject {\n readonly id: symbol;\n}\n\nexport interface GroupObject extends SceneObject {\n readonly members: SceneObject[];\n readonly isGroup: true;\n}\n\nexport type ObjRef = SceneObject | GroupObject;\n\nexport function isGroup(obj: SceneObject): obj is GroupObject {\n return 'isGroup' in obj && (obj as GroupObject).isGroup === true;\n}\n\nexport interface Transform {\n translate: Vec2;\n rotate: number; // radians\n scale: number;\n scaleX?: number; // optional non-uniform scale\n scaleY?: number;\n}\n\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface TextOpts {\n at?: Vec2;\n pin?: Anchor;\n font?: string;\n size?: number;\n color?: string;\n}\n\nexport interface ImageOpts {\n at?: Vec2;\n pin?: Anchor;\n width?: number;\n height?: number;\n}\n\nexport interface RectOpts {\n at?: Vec2;\n pin?: Anchor;\n width: number;\n height: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n cornerRadius?: number;\n}\n\nexport interface ResolvedCtx {\n getTransform(obj: SceneObject): Transform;\n getOpacity(obj: SceneObject): number;\n}\n\nexport type ImageSource =\n | { kind: \"url\"; src: string }\n | { kind: \"image\"; image: HTMLImageElement }\n | { kind: \"bitmap\"; bitmap: ImageBitmap }\n | { kind: \"canvas\"; canvas: HTMLCanvasElement };\n\nexport interface Scene {\n text(content: string, opts?: TextOpts): SceneObject;\n rect(opts: RectOpts): SceneObject;\n bg(color: string): SceneObject;\n image(src: string | HTMLImageElement | ImageBitmap | HTMLCanvasElement | ImageSource, opts: ImageOpts): SceneObject;\n objects(): Iterable<SceneObject>;\n getBounds(obj: SceneObject): Rect;\n getBaseline(obj: SceneObject): number | null;\n resolveAnchor(obj: SceneObject, anchor: Anchor): Vec2;\n getInitialTransform(obj: SceneObject): Transform;\n render(ctx: ResolvedCtx, canvas: HTMLCanvasElement, dpr?: number): void;\n}\n\nexport type EaseFn = (u: number) => number;\nexport type BodyFn<TCtx> = (ctx: TCtx, u: number) => void;\nexport type InstantBodyFn<TCtx> = (ctx: TCtx) => void;\n\nexport interface Segment<TCtx> {\n start: number;\n end: number;\n ease: EaseFn;\n body: BodyFn<TCtx>;\n}\n\nexport interface TimelineAPI<TCtx> {\n seq(fn: () => void): void;\n mark(name: string): void;\n tween(dur: number, ease: EaseFn | null | undefined, body: BodyFn<TCtx>): void;\n instant(body: InstantBodyFn<TCtx>): void;\n /** Wait/pause for a duration (sugar for tween with no-op body) */\n wait(dur: number): void;\n with(name: string, offsetMs: number, fn: () => void): void;\n overlap(offsetMs: number, fn: () => void): void;\n par(fn: () => void): void;\n}\n\nexport interface Timeline<TCtx> {\n duration: number;\n segs: Segment<TCtx>[];\n evaluate(tMs: number, ctx: TCtx): void;\n}\n\nexport interface TransformMethods {\n to(v: NumExpr, u: number): void;\n by(delta: NumExpr, u: number): void;\n}\n\n/** Target for resize - can be a number (width-based uniform) or an object */\nexport type ResizeTarget =\n | number // width-based uniform (default)\n | { width: number } // width-based uniform (explicit)\n | { height: number } // height-based uniform\n | { width: number; height: number } // non-uniform\n | { fit: number }; // fit within a box\n\n/** Resize target that supports expressions */\nexport type ResizeTargetExpr =\n | NumExpr // width-based uniform\n | { width: NumExpr } // width-based uniform (explicit)\n | { height: NumExpr } // height-based uniform\n | { width: NumExpr; height: NumExpr } // non-uniform\n | { fit: NumExpr }; // fit within a box\n\n/** Methods for pixel-based resizing */\nexport interface ResizeMethods {\n to(target: ResizeTargetExpr, u: number): void;\n by(delta: ResizeTargetExpr, u: number): void;\n}\n\n/** Options for toBBox */\nexport interface FitToBBoxOpts {\n pad?: Padding;\n}\n\n/** Methods for fitting an object to a bounding box (resize + center pin) */\nexport interface FitMethods {\n /** Fit to an existing BBoxHandle */\n to(bbox: BBoxHandle, u: number): void;\n /** Measure a group/object and fit to it */\n toBBox(target: SceneObject | GroupObject, u: number, opts?: FitToBBoxOpts): void;\n}\n\n/** Padding specification - uniform number or per-side values */\nexport type Padding = number | {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n};\n\n/** Lazy function that evaluates Vec2 from resolved context (always callable) */\nexport type Vec2Fn = (ctx: ResolvedCtx) => Vec2;\n\n/** Lazy function that evaluates number from resolved context (always callable) */\nexport type NumFn = (ctx: ResolvedCtx) => number;\n\n/** Lazy function that evaluates Rect from resolved context (always callable) */\nexport type RectFn = (ctx: ResolvedCtx) => Rect;\n\n/** Handle for measured bounding box - returns lazy expressions that are always callable */\nexport interface BBoxHandle {\n /** Add uniform or per-side padding */\n pad(p: Padding): BBoxHandle;\n /** Get size as [width, height] - always returns a callable function */\n size(): Vec2Fn;\n /** Get width in pixels - always returns a callable function */\n width(): NumFn;\n /** Get height in pixels - always returns a callable function */\n height(): NumFn;\n /** Get { width, height } for use with resize().to() */\n whSize(): { width: NumFn; height: NumFn };\n /** Get center point - always returns a callable function */\n center(): Vec2Fn;\n /** Get position of any anchor on the bbox - always returns a callable function */\n anchor(a: Anchor): Vec2Fn;\n /** Get the raw rect - always returns a callable function */\n toRect(): RectFn;\n}\n\nexport interface PinMethods {\n to(pos: Vec2Expr, u: number): void;\n by(delta: Vec2Expr, u: number): void;\n}\n\nexport interface GroupBuilder extends GroupObject {\n pin(anchor: Anchor): PinMethods;\n scale(): TransformMethods;\n rotate(): TransformMethods;\n opacity(): TransformMethods;\n}\n\nexport interface LayoutOpts {\n axis?: \"x\" | \"y\";\n align?: Anchor;\n gap?: number;\n}\n\nexport interface AlignOpts {\n anchor?: Anchor;\n}\n\nexport interface LayoutBuilder {\n to(u: number): GroupBuilder;\n}\n\nexport interface AnimCtx {\n pin(obj: SceneObject | GroupObject, anchor: Anchor): PinMethods;\n scale(obj: SceneObject | GroupObject): TransformMethods;\n scaleX(obj: SceneObject): TransformMethods;\n scaleY(obj: SceneObject): TransformMethods;\n rotate(obj: SceneObject | GroupObject): TransformMethods;\n opacity(obj: SceneObject | GroupObject): TransformMethods;\n /** Set width in pixels (converts to scaleX internally) */\n width(obj: SceneObject): TransformMethods;\n /** Set height in pixels (converts to scaleY internally) */\n height(obj: SceneObject): TransformMethods;\n /** Resize in pixels - uniform or non-uniform */\n resize(obj: SceneObject): ResizeMethods;\n /** Fit object to a bounding box (resize + center pin) */\n fit(obj: SceneObject): FitMethods;\n /** Measure the bounding box of an object or group */\n bbox(obj: SceneObject | GroupObject): BBoxHandle;\n group(...objects: SceneObject[]): GroupBuilder;\n layout(...args: (ObjRef | LayoutOpts)[]): LayoutBuilder;\n inline(...objects: ObjRef[]): LayoutBuilder;\n stack(...objects: ObjRef[]): LayoutBuilder;\n paragraph(...objects: ObjRef[]): LayoutBuilder;\n align(...args: (ObjRef | AlignOpts)[]): LayoutBuilder;\n center(...objects: ObjRef[]): LayoutBuilder;\n}\n\nexport interface PinConstraint {\n anchor: Anchor;\n world: Vec2;\n weight?: number;\n priority?: number;\n source?: string;\n}\n\nexport interface ChannelState {\n scale?: number;\n scaleX?: number;\n scaleY?: number;\n rotate?: number;\n opacity?: number;\n}\n","import type { Vec2 } from './types';\n\n// Screen dimensions (logical size, not affected by retina scaling)\nexport const Screen = {\n width: 1280,\n height: 720,\n center: (): Vec2 => [640, 360],\n centerX: (): number => 640,\n centerY: (): number => 360,\n topLeft: (): Vec2 => [0, 0],\n topRight: (): Vec2 => [1280, 0],\n bottomLeft: (): Vec2 => [0, 720],\n bottomRight: (): Vec2 => [1280, 720],\n};\n\nexport const vec = {\n add: ([x1, y1]: Vec2, [x2, y2]: Vec2): Vec2 => [x1 + x2, y1 + y2],\n sub: ([x1, y1]: Vec2, [x2, y2]: Vec2): Vec2 => [x1 - x2, y1 - y2],\n lerp: ([x1, y1]: Vec2, [x2, y2]: Vec2, u: number): Vec2 =>\n [x1 + (x2 - x1) * u, y1 + (y2 - y1) * u],\n};\n\nexport const Vec = (x: number, y: number): Vec2 => [x, y];\n\nexport const lerp = (a: number, b: number, u: number): number => a + (b - a) * u;\n\nexport const angle = (deg: number): number => {\n return deg * (Math.PI / 180);\n};\n\nexport function applySR(\n [x, y]: Vec2,\n scale: number,\n rotate: number, // radians\n scaleX: number = 1,\n scaleY: number = 1\n): Vec2 {\n // scale (uniform * non-uniform)\n const sx = x * scale * scaleX;\n const sy = y * scale * scaleY;\n\n // rotate\n const c = Math.cos(rotate);\n const s = Math.sin(rotate);\n\n return [\n sx * c - sy * s,\n sx * s + sy * c,\n ];\n}\n","import type {\n AlignOpts,\n Anchor,\n AnimCtx,\n BBoxHandle,\n ChannelState,\n FitMethods,\n FitToBBoxOpts,\n GroupBuilder,\n GroupObject,\n LayoutBuilder,\n LayoutOpts,\n NumExpr,\n NumFn,\n ObjRef,\n Padding,\n PinConstraint,\n PinMethods,\n Rect,\n RectFn,\n ResizeMethods,\n ResizeTarget,\n ResizeTargetExpr,\n ResolvedCtx,\n Scene,\n SceneObject,\n Transform,\n TransformMethods,\n Vec2,\n Vec2Expr,\n Vec2Fn,\n} from './types';\nimport { isGroup, isExpr } from './types';\nimport { applySR, lerp, vec } from './math';\n\nexport interface DebugGroupInfo {\n members: SceneObject[];\n kind: 'group' | 'layout';\n pin?: {\n anchor: Anchor;\n target: Vec2;\n };\n}\n\nclass BBoxHandleImpl implements BBoxHandle {\n private paddingValues = { top: 0, right: 0, bottom: 0, left: 0 };\n // Store a function that computes the rect lazily\n private computeRect: () => Rect;\n\n constructor(computeRect: () => Rect) {\n this.computeRect = computeRect;\n }\n\n pad(p: Padding): BBoxHandle {\n const parentCompute = this.computeRect;\n const parentPadding = this.paddingValues;\n\n let newPadding: typeof this.paddingValues;\n if (typeof p === 'number') {\n newPadding = {\n top: parentPadding.top + p,\n right: parentPadding.right + p,\n bottom: parentPadding.bottom + p,\n left: parentPadding.left + p,\n };\n } else {\n newPadding = {\n top: parentPadding.top + (p.top ?? 0),\n right: parentPadding.right + (p.right ?? 0),\n bottom: parentPadding.bottom + (p.bottom ?? 0),\n left: parentPadding.left + (p.left ?? 0),\n };\n }\n\n const result = new BBoxHandleImpl(parentCompute);\n result.paddingValues = newPadding;\n return result;\n }\n\n private getRect(): Rect {\n const baseRect = this.computeRect();\n return {\n x: baseRect.x - this.paddingValues.left,\n y: baseRect.y - this.paddingValues.top,\n w: baseRect.w + this.paddingValues.left + this.paddingValues.right,\n h: baseRect.h + this.paddingValues.top + this.paddingValues.bottom,\n };\n }\n\n size(): Vec2Fn {\n return (_ctx: ResolvedCtx): Vec2 => {\n const r = this.getRect();\n return [r.w, r.h];\n };\n }\n\n width(): NumFn {\n return (_ctx: ResolvedCtx): number => {\n return this.getRect().w;\n };\n }\n\n height(): NumFn {\n return (_ctx: ResolvedCtx): number => {\n return this.getRect().h;\n };\n }\n\n whSize(): { width: NumFn; height: NumFn } {\n return {\n width: this.width(),\n height: this.height(),\n };\n }\n\n center(): Vec2Fn {\n return (_ctx: ResolvedCtx): Vec2 => {\n const r = this.getRect();\n return [r.x + r.w / 2, r.y + r.h / 2];\n };\n }\n\n anchor(a: Anchor): Vec2Fn {\n return (_ctx: ResolvedCtx): Vec2 => {\n const r = this.getRect();\n let x = r.x, y = r.y;\n\n // Horizontal position\n if (a === 'top' || a === 'center' || a === 'bottom' || a === 'baseline') {\n x = r.x + r.w / 2;\n } else if (a === 'topRight' || a === 'right' || a === 'bottomRight') {\n x = r.x + r.w;\n }\n\n // Vertical position\n if (a === 'left' || a === 'center' || a === 'right') {\n y = r.y + r.h / 2;\n } else if (a === 'bottomLeft' || a === 'bottom' || a === 'bottomRight' || a === 'baselineLeft' || a === 'baseline') {\n y = r.y + r.h;\n }\n\n return [x, y];\n };\n }\n\n toRect(): RectFn {\n return (_ctx: ResolvedCtx): Rect => {\n return this.getRect();\n };\n }\n}\n\nexport class AnimCtxImpl implements AnimCtx {\n private base = new Map<SceneObject, Transform>();\n private channels = new Map<SceneObject, ChannelState>();\n private pins = new Map<SceneObject, PinConstraint>();\n private scene: Scene | null = null;\n private debugGroups: DebugGroupInfo[] = [];\n\n /** Resolve a Vec2 expression to a concrete Vec2 */\n private resolveVec2(expr: Vec2Expr): Vec2 {\n if (isExpr(expr)) {\n // Create a minimal ResolvedCtx for expression evaluation\n const ctx = this.createResolvedCtx();\n return expr(ctx);\n }\n return expr;\n }\n\n /** Resolve a number expression to a concrete number */\n private resolveNum(expr: NumExpr): number {\n if (isExpr(expr)) {\n const ctx = this.createResolvedCtx();\n return expr(ctx);\n }\n return expr;\n }\n\n /** Create a ResolvedCtx based on current state */\n private createResolvedCtx(): ResolvedCtx {\n if (!this.scene) throw new Error('Scene not set');\n // Use solve() to get the current resolved state\n return this.solve(this.scene);\n }\n\n reset(scene: Scene) {\n this.base.clear();\n this.channels.clear();\n this.pins.clear();\n this.debugGroups = [];\n this.scene = scene;\n\n for (const obj of scene.objects()) {\n this.base.set(obj, scene.getInitialTransform(obj));\n }\n }\n\n getDebugGroups(): DebugGroupInfo[] {\n return this.debugGroups;\n }\n\n getDebugPins(): Map<SceneObject, PinConstraint> {\n return this.pins;\n }\n\n /** Get the current world position of a specific anchor on an object */\n private getCurrentAnchorPosition(obj: SceneObject, anchor: Anchor): Vec2 {\n if (!this.scene) throw new Error('Scene not set');\n\n // If there's an existing pin with this anchor, return its world position\n const existingPin = this.pins.get(obj);\n if (existingPin && existingPin.anchor === anchor) {\n return existingPin.world;\n }\n\n // Otherwise, compute where this anchor currently is in world space\n const base = this.base.get(obj)!;\n const ch = this.channels.get(obj);\n\n // Get current transform values\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n const rotate = ch?.rotate ?? base.rotate;\n\n // Get current origin position\n let originPos: Vec2;\n if (existingPin) {\n // If pinned by a different anchor, compute origin from that pin\n const pinnedLocal = this.scene.resolveAnchor(obj, existingPin.anchor);\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = pinnedLocal[0] * scaleX * cos - pinnedLocal[1] * scaleY * sin;\n const transformedY = pinnedLocal[0] * scaleX * sin + pinnedLocal[1] * scaleY * cos;\n originPos = [existingPin.world[0] - transformedX, existingPin.world[1] - transformedY];\n } else {\n originPos = base.translate;\n }\n\n // Get local anchor offset and transform it\n const local = this.scene.resolveAnchor(obj, anchor);\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = local[0] * scaleX * cos - local[1] * scaleY * sin;\n const transformedY = local[0] * scaleX * sin + local[1] * scaleY * cos;\n\n return [originPos[0] + transformedX, originPos[1] + transformedY];\n }\n\n private getGroupBounds(group: GroupObject): Rect {\n // Delegate to computeGroupWorldBounds which correctly handles non-origin pins\n return this.computeGroupWorldBounds(group);\n }\n\n /** Get the origin position of an object in world space, accounting for any existing pin */\n private getOriginPosition(obj: SceneObject): Vec2 {\n if (!this.scene) throw new Error('Scene not set');\n\n const pin = this.pins.get(obj);\n if (!pin) {\n return this.base.get(obj)!.translate;\n }\n\n // Compute origin from pin: origin = pinWorld - transformed(localAnchor)\n const base = this.base.get(obj)!;\n const ch = this.channels.get(obj);\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n const rotate = ch?.rotate ?? base.rotate;\n\n const localAnchor = this.scene.resolveAnchor(obj, pin.anchor);\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = localAnchor[0] * scaleX * cos - localAnchor[1] * scaleY * sin;\n const transformedY = localAnchor[0] * scaleX * sin + localAnchor[1] * scaleY * cos;\n\n return [pin.world[0] - transformedX, pin.world[1] - transformedY];\n }\n\n private resolveGroupAnchor(group: GroupObject, anchor: Anchor): Vec2 {\n const bounds = this.getGroupBounds(group);\n\n // Map anchor to position within bounds\n const anchorMap: Record<Anchor, Vec2> = {\n origin: [bounds.x, bounds.y], // For groups, origin is same as topLeft\n topLeft: [bounds.x, bounds.y],\n top: [bounds.x + bounds.w / 2, bounds.y],\n topRight: [bounds.x + bounds.w, bounds.y],\n left: [bounds.x, bounds.y + bounds.h / 2],\n center: [bounds.x + bounds.w / 2, bounds.y + bounds.h / 2],\n right: [bounds.x + bounds.w, bounds.y + bounds.h / 2],\n bottomLeft: [bounds.x, bounds.y + bounds.h],\n bottom: [bounds.x + bounds.w / 2, bounds.y + bounds.h],\n bottomRight: [bounds.x + bounds.w, bounds.y + bounds.h],\n baselineLeft: [bounds.x, bounds.y + bounds.h], // baseline defaults to bottom\n baseline: [bounds.x + bounds.w / 2, bounds.y + bounds.h],\n };\n\n return anchorMap[anchor];\n }\n\n private getGroupCenter(group: GroupObject): Vec2 {\n const bounds = this.getGroupBounds(group);\n return [bounds.x + bounds.w / 2, bounds.y + bounds.h / 2];\n }\n\n scale(obj: SceneObject | GroupObject): TransformMethods {\n if (isGroup(obj)) {\n // For groups, scale() is RELATIVE - it multiplies each member's scale by the factor\n // This preserves relative sizes within the group\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const groupCenter = this.getGroupCenter(obj);\n // Interpolated scale factor: 1 -> v\n const scaleFactor = lerp(1, v, u);\n\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentScale = ch.scale ?? base.scale;\n // Multiply by scale factor to preserve relative sizes\n ch.scale = currentScale * scaleFactor;\n\n // Scale origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const scaledOffset: Vec2 = [offsetFromCenter[0] * scaleFactor, offsetFromCenter[1] * scaleFactor];\n const newOriginPos = vec.add(groupCenter, scaledOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const groupCenter = this.getGroupCenter(obj);\n const scaleFactor = lerp(1, 1 + delta, u);\n\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentScale = ch.scale ?? base.scale;\n ch.scale = currentScale * scaleFactor;\n\n // Scale origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const scaledOffset: Vec2 = [offsetFromCenter[0] * scaleFactor, offsetFromCenter[1] * scaleFactor];\n const newOriginPos = vec.add(groupCenter, scaledOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n }\n };\n }\n\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n // Use current scale for continuity between tweens\n const current = ch.scale ?? this.base.get(obj)!.scale;\n ch.scale = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scale ?? this.base.get(obj)!.scale;\n ch.scale = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n scaleX(obj: SceneObject): TransformMethods {\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleX ?? 1;\n ch.scaleX = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleX ?? 1;\n ch.scaleX = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n scaleY(obj: SceneObject): TransformMethods {\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleY ?? 1;\n ch.scaleY = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleY ?? 1;\n ch.scaleY = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n width(obj: SceneObject): TransformMethods {\n if (!this.scene) throw new Error('Scene not set');\n const bounds = this.scene.getBounds(obj);\n const originalWidth = bounds.w;\n\n return {\n to: (targetPxExpr: NumExpr, u: number) => {\n const targetPx = this.resolveNum(targetPxExpr);\n const targetScaleX = targetPx / originalWidth;\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleX ?? 1;\n ch.scaleX = lerp(current, targetScaleX, u);\n this.channels.set(obj, ch);\n },\n by: (deltaPxExpr: NumExpr, u: number) => {\n const deltaPx = this.resolveNum(deltaPxExpr);\n const ch = this.channels.get(obj) ?? {};\n const currentScaleX = ch.scaleX ?? 1;\n const currentWidth = originalWidth * currentScaleX;\n const targetWidth = currentWidth + deltaPx;\n const targetScaleX = targetWidth / originalWidth;\n ch.scaleX = lerp(currentScaleX, targetScaleX, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n height(obj: SceneObject): TransformMethods {\n if (!this.scene) throw new Error('Scene not set');\n const bounds = this.scene.getBounds(obj);\n const originalHeight = bounds.h;\n\n return {\n to: (targetPxExpr: NumExpr, u: number) => {\n const targetPx = this.resolveNum(targetPxExpr);\n const targetScaleY = targetPx / originalHeight;\n const ch = this.channels.get(obj) ?? {};\n const current = ch.scaleY ?? 1;\n ch.scaleY = lerp(current, targetScaleY, u);\n this.channels.set(obj, ch);\n },\n by: (deltaPxExpr: NumExpr, u: number) => {\n const deltaPx = this.resolveNum(deltaPxExpr);\n const ch = this.channels.get(obj) ?? {};\n const currentScaleY = ch.scaleY ?? 1;\n const currentHeight = originalHeight * currentScaleY;\n const targetHeight = currentHeight + deltaPx;\n const targetScaleY = targetHeight / originalHeight;\n ch.scaleY = lerp(currentScaleY, targetScaleY, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n resize(obj: SceneObject): ResizeMethods {\n if (!this.scene) throw new Error('Scene not set');\n const bounds = this.scene.getBounds(obj);\n const originalWidth = bounds.w;\n const originalHeight = bounds.h;\n\n // Resolve any expressions in the resize target\n const resolveTarget = (target: ResizeTargetExpr): ResizeTarget => {\n if (typeof target === 'number') return target;\n if (typeof target === 'function') return this.resolveNum(target);\n if ('fit' in target) return { fit: this.resolveNum(target.fit) };\n if ('width' in target && 'height' in target) {\n return { width: this.resolveNum(target.width), height: this.resolveNum(target.height) };\n }\n if ('width' in target) return { width: this.resolveNum(target.width) };\n if ('height' in target) return { height: this.resolveNum(target.height) };\n return target as ResizeTarget;\n };\n\n const parseTarget = (target: ResizeTarget): { scaleX?: number; scaleY?: number; scale?: number } => {\n if (typeof target === 'number') {\n // Width-based uniform scaling\n return { scale: target / originalWidth };\n }\n if ('fit' in target) {\n // Fit within box - use the smaller scale to fit both dimensions\n const scaleW = target.fit / originalWidth;\n const scaleH = target.fit / originalHeight;\n return { scale: Math.min(scaleW, scaleH) };\n }\n if ('width' in target && 'height' in target) {\n // Non-uniform scaling\n return {\n scaleX: target.width / originalWidth,\n scaleY: target.height / originalHeight\n };\n }\n if ('width' in target) {\n // Width-based uniform scaling (explicit)\n return { scale: target.width / originalWidth };\n }\n if ('height' in target) {\n // Height-based uniform scaling\n return { scale: target.height / originalHeight };\n }\n return {};\n };\n\n return {\n to: (targetExpr: ResizeTargetExpr, u: number) => {\n const target = resolveTarget(targetExpr);\n const { scaleX, scaleY, scale } = parseTarget(target);\n const ch = this.channels.get(obj) ?? {};\n\n if (scale !== undefined) {\n // Uniform scaling - use current scale for continuity\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n ch.scale = lerp(currentScale, scale, u);\n } else {\n // Non-uniform scaling\n if (scaleX !== undefined) {\n const current = ch.scaleX ?? 1;\n ch.scaleX = lerp(current, scaleX, u);\n }\n if (scaleY !== undefined) {\n const current = ch.scaleY ?? 1;\n ch.scaleY = lerp(current, scaleY, u);\n }\n }\n\n this.channels.set(obj, ch);\n },\n by: (deltaExpr: ResizeTargetExpr, u: number) => {\n const delta = resolveTarget(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n\n if (typeof delta === 'number') {\n // Width-based: add delta to current width, scale uniformly\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentWidth = originalWidth * currentScale;\n const targetWidth = currentWidth + delta;\n const targetScale = targetWidth / originalWidth;\n ch.scale = lerp(currentScale, targetScale, u);\n } else if ('fit' in delta) {\n // Fit: add delta to current fit box\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentFit = Math.max(originalWidth, originalHeight) * currentScale;\n const targetFit = currentFit + delta.fit;\n const scaleW = targetFit / originalWidth;\n const scaleH = targetFit / originalHeight;\n const targetScale = Math.min(scaleW, scaleH);\n ch.scale = lerp(currentScale, targetScale, u);\n } else if ('width' in delta && 'height' in delta) {\n // Non-uniform: add deltas to current dimensions\n const currentScaleX = ch.scaleX ?? 1;\n const currentScaleY = ch.scaleY ?? 1;\n const currentWidth = originalWidth * currentScaleX;\n const currentHeight = originalHeight * currentScaleY;\n const targetScaleX = (currentWidth + delta.width) / originalWidth;\n const targetScaleY = (currentHeight + delta.height) / originalHeight;\n ch.scaleX = lerp(currentScaleX, targetScaleX, u);\n ch.scaleY = lerp(currentScaleY, targetScaleY, u);\n } else if ('width' in delta) {\n // Width-based uniform: add delta to current width\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentWidth = originalWidth * currentScale;\n const targetScale = (currentWidth + delta.width) / originalWidth;\n ch.scale = lerp(currentScale, targetScale, u);\n } else if ('height' in delta) {\n // Height-based uniform: add delta to current height\n const currentScale = ch.scale ?? this.base.get(obj)!.scale;\n const currentHeight = originalHeight * currentScale;\n const targetScale = (currentHeight + delta.height) / originalHeight;\n ch.scale = lerp(currentScale, targetScale, u);\n }\n\n this.channels.set(obj, ch);\n }\n };\n }\n\n fit(obj: SceneObject): FitMethods {\n return {\n to: (bbox: BBoxHandle, u: number) => {\n // Resize to match bbox dimensions\n this.resize(obj).to(bbox.whSize(), u);\n // Pin center to bbox center\n this.pin(obj, 'center').to(bbox.center(), u);\n },\n toBBox: (target: SceneObject | GroupObject, u: number, opts?: FitToBBoxOpts) => {\n // Measure the target\n let bbox = this.bbox(target);\n // Apply padding if specified\n if (opts?.pad !== undefined) {\n bbox = bbox.pad(opts.pad);\n }\n // Resize and pin\n this.resize(obj).to(bbox.whSize(), u);\n this.pin(obj, 'center').to(bbox.center(), u);\n }\n };\n }\n\n private computeWorldBounds(obj: SceneObject): Rect {\n if (!this.scene) throw new Error('Scene not set');\n\n const bounds = this.scene.getBounds(obj);\n const ch = this.channels.get(obj);\n const base = this.base.get(obj)!;\n\n // Get current position from pin or base\n const pin = this.pins.get(obj);\n let translate: Vec2;\n if (pin) {\n // Pin stores where anchor goes - need to compute actual translate\n const local = this.scene.resolveAnchor(obj, pin.anchor);\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n const rotate = ch?.rotate ?? base.rotate;\n\n // Transform local anchor to get offset\n const cos = Math.cos(rotate);\n const sin = Math.sin(rotate);\n const transformedX = local[0] * scaleX * cos - local[1] * scaleY * sin;\n const transformedY = local[0] * scaleX * sin + local[1] * scaleY * cos;\n\n translate = [pin.world[0] - transformedX, pin.world[1] - transformedY];\n } else {\n translate = base.translate;\n }\n\n // Get scale factors\n const scale = ch?.scale ?? base.scale;\n const scaleX = (ch?.scaleX ?? 1) * scale;\n const scaleY = (ch?.scaleY ?? 1) * scale;\n\n // Compute world bounds (axis-aligned, ignoring rotation for simplicity)\n return {\n x: translate[0] + bounds.x * scaleX,\n y: translate[1] + bounds.y * scaleY,\n w: bounds.w * scaleX,\n h: bounds.h * scaleY,\n };\n }\n\n private computeGroupWorldBounds(group: GroupObject): Rect {\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n for (const member of group.members) {\n const b = this.computeWorldBounds(member);\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.w);\n maxY = Math.max(maxY, b.y + b.h);\n }\n\n if (!isFinite(minX)) {\n return { x: 0, y: 0, w: 0, h: 0 };\n }\n\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n }\n\n bbox(obj: SceneObject | GroupObject): BBoxHandle {\n if (!this.scene) throw new Error('Scene not set');\n\n // Return a lazy bbox handle that computes rect on demand\n const computeRect = (): Rect => {\n return isGroup(obj)\n ? this.computeGroupWorldBounds(obj)\n : this.computeWorldBounds(obj);\n };\n\n return new BBoxHandleImpl(computeRect);\n }\n\n rotate(obj: SceneObject | GroupObject): TransformMethods {\n if (isGroup(obj)) {\n return {\n to: (radExpr: NumExpr, u: number) => {\n const rad = this.resolveNum(radExpr);\n const groupCenter = this.getGroupCenter(obj);\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentRot = ch.rotate ?? base.rotate;\n ch.rotate = lerp(currentRot, rad, u);\n\n // Rotate origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const angle = lerp(0, rad, u);\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const rotatedOffset: Vec2 = [\n offsetFromCenter[0] * cos - offsetFromCenter[1] * sin,\n offsetFromCenter[0] * sin + offsetFromCenter[1] * cos\n ];\n const newOriginPos = vec.add(groupCenter, rotatedOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const groupCenter = this.getGroupCenter(obj);\n for (const member of obj.members) {\n const base = this.base.get(member)!;\n const ch = this.channels.get(member) ?? {};\n const currentRot = ch.rotate ?? base.rotate;\n ch.rotate = currentRot + delta * u;\n\n // Rotate origin position around group center\n const originPos = this.getOriginPosition(member);\n const offsetFromCenter = vec.sub(originPos, groupCenter);\n const angle = delta * u;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const rotatedOffset: Vec2 = [\n offsetFromCenter[0] * cos - offsetFromCenter[1] * sin,\n offsetFromCenter[0] * sin + offsetFromCenter[1] * cos\n ];\n const newOriginPos = vec.add(groupCenter, rotatedOffset);\n\n this.pins.set(member, {\n anchor: 'origin',\n world: newOriginPos,\n });\n this.channels.set(member, ch);\n }\n }\n };\n }\n\n return {\n to: (radExpr: NumExpr, u: number) => {\n const rad = this.resolveNum(radExpr);\n const ch = this.channels.get(obj) ?? {};\n // Use current rotation for continuity between tweens\n const current = ch.rotate ?? this.base.get(obj)!.rotate;\n ch.rotate = lerp(current, rad, u);\n this.channels.set(obj, ch);\n },\n\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.rotate ?? this.base.get(obj)!.rotate;\n ch.rotate = current + delta * u;\n this.channels.set(obj, ch);\n }\n };\n }\n\n pin(obj: SceneObject | GroupObject, anchor: Anchor): PinMethods {\n if (isGroup(obj)) {\n return {\n to: (posExpr: Vec2Expr, u: number) => {\n const pos = this.resolveVec2(posExpr);\n // Get current group anchor position\n const currentAnchor = this.resolveGroupAnchor(obj, anchor);\n // Calculate interpolated target\n const targetAnchor = vec.lerp(currentAnchor, pos, u);\n // Calculate delta needed to move anchor to target\n const delta = vec.sub(targetAnchor, currentAnchor);\n\n // Apply delta to all members, preserving their individual pin anchors\n for (const member of obj.members) {\n const existingPin = this.pins.get(member);\n const memberAnchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(member, memberAnchor);\n const newPos = vec.add(currentAnchorPos, delta);\n this.pins.set(member, {\n anchor: memberAnchor,\n world: newPos,\n });\n }\n },\n by: (deltaExpr: Vec2Expr, u: number) => {\n const delta = this.resolveVec2(deltaExpr);\n const interpolatedDelta = vec.lerp([0, 0], delta, u);\n\n // Apply delta to all members, preserving their individual pin anchors\n for (const member of obj.members) {\n const existingPin = this.pins.get(member);\n const memberAnchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(member, memberAnchor);\n const newPos = vec.add(currentAnchorPos, interpolatedDelta);\n this.pins.set(member, {\n anchor: memberAnchor,\n world: newPos,\n });\n }\n }\n };\n }\n\n return {\n to: (posExpr: Vec2Expr, u: number) => {\n const pos = this.resolveVec2(posExpr);\n // Get current world position of this specific anchor for smooth interpolation\n const current = this.getCurrentAnchorPosition(obj, anchor);\n const world = vec.lerp(current, pos, u);\n\n this.pins.set(obj, {\n anchor,\n world,\n });\n },\n\n by: (deltaExpr: Vec2Expr, u: number) => {\n const delta = this.resolveVec2(deltaExpr);\n // Get current world position of this specific anchor\n const current = this.getCurrentAnchorPosition(obj, anchor);\n const world = vec.add(current, vec.lerp([0, 0], delta, u));\n\n this.pins.set(obj, {\n anchor,\n world,\n });\n }\n };\n }\n\n opacity(obj: SceneObject | GroupObject): TransformMethods {\n if (isGroup(obj)) {\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n for (const member of obj.members) {\n const ch = this.channels.get(member) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = lerp(current, v, u);\n this.channels.set(member, ch);\n }\n },\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n for (const member of obj.members) {\n const ch = this.channels.get(member) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = current * lerp(1, 1 + delta, u);\n this.channels.set(member, ch);\n }\n }\n };\n }\n\n return {\n to: (vExpr: NumExpr, u: number) => {\n const v = this.resolveNum(vExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = lerp(current, v, u);\n this.channels.set(obj, ch);\n },\n\n by: (deltaExpr: NumExpr, u: number) => {\n const delta = this.resolveNum(deltaExpr);\n const ch = this.channels.get(obj) ?? {};\n const current = ch.opacity ?? 1;\n ch.opacity = current * lerp(1, 1 + delta, u);\n this.channels.set(obj, ch);\n }\n };\n }\n\n group(...objects: SceneObject[]): GroupBuilder {\n const groupObj: GroupObject = {\n id: Symbol('group'),\n members: objects,\n isGroup: true as const,\n };\n\n // Create builder with fluent methods that call back to this context\n // Debug tracking for groups is deferred - we track when animated via trackGroupDebug\n const self = this;\n const builder: GroupBuilder = {\n ...groupObj,\n pin: (anchor: Anchor) => {\n const methods = self.pin(groupObj, anchor);\n return {\n to: (pos: Vec2, u: number) => {\n methods.to(pos, u);\n self.trackGroupDebug(groupObj, u, { anchor, target: pos });\n },\n by: (delta: Vec2, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n scale: () => {\n const methods = self.scale(groupObj);\n return {\n to: (v: number, u: number) => {\n methods.to(v, u);\n self.trackGroupDebug(groupObj, u);\n },\n by: (delta: number, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n rotate: () => {\n const methods = self.rotate(groupObj);\n return {\n to: (v: number, u: number) => {\n methods.to(v, u);\n self.trackGroupDebug(groupObj, u);\n },\n by: (delta: number, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n opacity: () => {\n const methods = self.opacity(groupObj);\n return {\n to: (v: number, u: number) => {\n methods.to(v, u);\n self.trackGroupDebug(groupObj, u);\n },\n by: (delta: number, u: number) => {\n methods.by(delta, u);\n self.trackGroupDebug(groupObj, u);\n },\n };\n },\n };\n\n return builder;\n }\n\n private trackGroupDebug(groupObj: GroupObject, u: number, pin?: { anchor: Anchor; target: Vec2 }): DebugGroupInfo | null {\n // Only track during active animation, not at completion\n if (u < 1) {\n // Find existing or create new\n let entry = this.debugGroups.find(\n g => g.kind === 'group' && g.members === groupObj.members\n );\n if (!entry) {\n entry = {\n members: groupObj.members,\n kind: 'group',\n };\n this.debugGroups.push(entry);\n }\n if (pin) {\n entry.pin = pin;\n }\n return entry;\n }\n return null;\n }\n\n /** Flatten objects for final result (extracts all SceneObjects from groups) */\n private flattenToSceneObjects(objects: ObjRef[]): SceneObject[] {\n const result: SceneObject[] = [];\n for (const obj of objects) {\n if (isGroup(obj)) {\n result.push(...obj.members);\n } else {\n result.push(obj);\n }\n }\n return result;\n }\n\n /** Get bounds for an ObjRef (single object or group) */\n private getObjRefBounds(obj: ObjRef): Rect {\n if (isGroup(obj)) {\n return this.computeGroupWorldBounds(obj);\n }\n return this.computeWorldBounds(obj);\n }\n\n /** Get the top-left position of an ObjRef (bounds position, not pin position) */\n private getObjRefPosition(obj: ObjRef): Vec2 {\n const bounds = this.getObjRefBounds(obj);\n return [bounds.x, bounds.y];\n }\n\n /** Move an ObjRef by a delta (moves all members of a group together, preserving pin anchors) */\n private moveObjRef(obj: ObjRef, fromPos: Vec2, toPos: Vec2, u: number): void {\n const delta = vec.sub(toPos, fromPos);\n const interpolatedDelta = vec.lerp([0, 0], delta, u);\n\n if (isGroup(obj)) {\n for (const member of obj.members) {\n // Preserve existing pin anchor, or default to 'origin'\n const existingPin = this.pins.get(member);\n const anchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(member, anchor);\n const newPos = vec.add(currentAnchorPos, interpolatedDelta);\n this.pins.set(member, {\n anchor,\n world: newPos,\n });\n }\n } else {\n // Preserve existing pin anchor, or default to 'origin'\n const existingPin = this.pins.get(obj);\n const anchor = existingPin?.anchor ?? 'origin';\n const currentAnchorPos = this.getCurrentAnchorPosition(obj, anchor);\n const newPos = vec.add(currentAnchorPos, interpolatedDelta);\n this.pins.set(obj, {\n anchor,\n world: newPos,\n });\n }\n }\n\n private alignOnCrossAxis(\n start: number,\n size: number,\n maxSize: number,\n align: Anchor\n ): number {\n if (align === \"center\") {\n return start + (maxSize - size) / 2;\n }\n if (align === \"topLeft\" || align === \"left\" || align === \"top\") {\n return start;\n }\n if (align === \"bottomRight\" || align === \"right\" || align === \"bottom\") {\n return start + maxSize - size;\n }\n // Baseline alignment (for text) - treat as bottom for now\n if (align === \"baselineLeft\" || align === \"baseline\") {\n return start + maxSize - size;\n }\n return start;\n }\n\n private calculateLayoutPositions(\n objects: ObjRef[],\n axis: \"x\" | \"y\",\n align: Anchor,\n gap: number\n ): Vec2[] {\n if (!this.scene) throw new Error('Scene not set');\n\n // Get current bounds for each object (groups use their combined bounds)\n const boundsList = objects.map(obj => this.getObjRefBounds(obj));\n\n // Find the starting position (leftmost/topmost of current positions)\n const startX = Math.min(...boundsList.map(b => b.x));\n const startY = Math.min(...boundsList.map(b => b.y));\n\n // Calculate cross-axis alignment reference\n const maxH = Math.max(...boundsList.map(b => b.h));\n const maxW = Math.max(...boundsList.map(b => b.w));\n\n const targets: Vec2[] = [];\n let cursor = axis === \"x\" ? startX : startY;\n\n for (let i = 0; i < objects.length; i++) {\n const b = boundsList[i];\n let x: number, y: number;\n\n if (axis === \"x\") {\n x = cursor;\n y = this.alignOnCrossAxis(startY, b.h, maxH, align);\n cursor += b.w + gap;\n } else {\n x = this.alignOnCrossAxis(startX, b.w, maxW, align);\n y = cursor;\n cursor += b.h + gap;\n }\n\n targets.push([x, y]);\n }\n\n return targets;\n }\n\n layout(...args: (ObjRef | LayoutOpts)[]): LayoutBuilder {\n // Parse args - last arg may be LayoutOpts\n let opts: LayoutOpts = {};\n let objects: ObjRef[];\n\n const last = args[args.length - 1];\n if (last && typeof last === 'object' && !('id' in last)) {\n opts = last as LayoutOpts;\n objects = args.slice(0, -1) as ObjRef[];\n } else {\n objects = args as ObjRef[];\n }\n\n const axis = opts.axis ?? \"x\";\n const align = opts.align ?? \"center\";\n const gap = opts.gap ?? 0;\n\n return {\n to: (u: number): GroupBuilder => {\n // Calculate target positions for each ObjRef (groups stay as units)\n const targets = this.calculateLayoutPositions(objects, axis, align, gap);\n\n // Move each object/group to its target position\n for (let i = 0; i < objects.length; i++) {\n const obj = objects[i];\n const currentPos = this.getObjRefPosition(obj);\n const targetPos = targets[i];\n this.moveObjRef(obj, currentPos, targetPos, u);\n }\n\n // Flatten to get all scene objects for the result group\n const allMembers = this.flattenToSceneObjects(objects);\n\n // Create group for chaining\n const groupObj: GroupObject = {\n id: Symbol('layout-group'),\n members: allMembers,\n isGroup: true as const,\n };\n\n // Track for debug overlay as layout (only during active animation, not at completion)\n let debugEntry: DebugGroupInfo | null = null;\n if (u < 1) {\n debugEntry = {\n members: allMembers,\n kind: 'layout',\n };\n this.debugGroups.push(debugEntry);\n }\n\n // Return GroupBuilder for chaining with debug tracking\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const builder: GroupBuilder = {\n ...groupObj,\n pin: (anchor: Anchor) => {\n const methods = self.pin(groupObj, anchor);\n return {\n to: (pos: Vec2, pinU: number) => {\n methods.to(pos, pinU);\n if (debugEntry) {\n debugEntry.pin = { anchor, target: pos };\n }\n },\n by: (delta: Vec2, pinU: number) => {\n methods.by(delta, pinU);\n },\n };\n },\n scale: () => self.scale(groupObj),\n rotate: () => self.rotate(groupObj),\n opacity: () => self.opacity(groupObj),\n };\n\n return builder;\n }\n };\n }\n\n inline(...args: (ObjRef | number)[]): LayoutBuilder {\n const { objects, gap } = this.parseLayoutArgs(args);\n return this.layout(...objects, { axis: \"x\", align: \"baselineLeft\", gap });\n }\n\n stack(...args: (ObjRef | number)[]): LayoutBuilder {\n const { objects, gap } = this.parseLayoutArgs(args);\n return this.layout(...objects, { axis: \"y\", align: \"center\", gap });\n }\n\n paragraph(...args: (ObjRef | number)[]): LayoutBuilder {\n const { objects, gap } = this.parseLayoutArgs(args);\n return this.layout(...objects, { axis: \"y\", align: \"left\", gap });\n }\n\n /** Parse layout args - last arg may be a gap number */\n private parseLayoutArgs(args: (ObjRef | number)[]): { objects: ObjRef[], gap: number } {\n const last = args[args.length - 1];\n if (typeof last === 'number') {\n return { objects: args.slice(0, -1) as ObjRef[], gap: last };\n }\n return { objects: args as ObjRef[], gap: 0 };\n }\n\n /** Get anchor offset within bounds */\n private getAnchorOffsetFromRect(bounds: Rect, anchor: Anchor): Vec2 {\n let ox = 0, oy = 0;\n\n if (anchor === 'top' || anchor === 'center' || anchor === 'bottom' || anchor === 'baseline') {\n ox = bounds.w / 2;\n } else if (anchor === 'topRight' || anchor === 'right' || anchor === 'bottomRight') {\n ox = bounds.w;\n }\n\n if (anchor === 'left' || anchor === 'center' || anchor === 'right') {\n oy = bounds.h / 2;\n } else if (anchor === 'bottomLeft' || anchor === 'bottom' || anchor === 'bottomRight' || anchor === 'baselineLeft' || anchor === 'baseline') {\n oy = bounds.h;\n }\n\n return [ox, oy];\n }\n\n /** Get anchor position in world space for an ObjRef */\n private getObjRefAnchorPosition(obj: ObjRef, anchor: Anchor): Vec2 {\n const bounds = this.getObjRefBounds(obj);\n const offset = this.getAnchorOffsetFromRect(bounds, anchor);\n return [bounds.x + offset[0], bounds.y + offset[1]];\n }\n\n align(...args: (ObjRef | AlignOpts)[]): LayoutBuilder {\n // Parse args - last arg may be AlignOpts\n let opts: AlignOpts = {};\n let objects: ObjRef[];\n\n const last = args[args.length - 1];\n if (last && typeof last === 'object' && !('id' in last)) {\n opts = last as AlignOpts;\n objects = args.slice(0, -1) as ObjRef[];\n } else {\n objects = args as ObjRef[];\n }\n\n const anchor = opts.anchor ?? \"center\";\n\n return {\n to: (u: number): GroupBuilder => {\n if (!this.scene || objects.length === 0) {\n const allMembers = this.flattenToSceneObjects(objects);\n return this.group(...allMembers);\n }\n\n // Get the first object's anchor position as the reference\n const targetAnchorPos = this.getObjRefAnchorPosition(objects[0], anchor);\n\n // Move all other objects so their anchor aligns with the first object's anchor\n for (let i = 1; i < objects.length; i++) {\n const obj = objects[i];\n const bounds = this.getObjRefBounds(obj);\n const anchorOffset = this.getAnchorOffsetFromRect(bounds, anchor);\n\n // Target top-left position = target anchor position - anchor offset within bounds\n const targetPos: Vec2 = [\n targetAnchorPos[0] - anchorOffset[0],\n targetAnchorPos[1] - anchorOffset[1]\n ];\n\n const currentPos = this.getObjRefPosition(obj);\n this.moveObjRef(obj, currentPos, targetPos, u);\n }\n\n // Flatten to get all scene objects for the result group\n const allMembers = this.flattenToSceneObjects(objects);\n\n // Create group for chaining\n const groupObj: GroupObject = {\n id: Symbol('align-group'),\n members: allMembers,\n isGroup: true as const,\n };\n\n // Track for debug overlay\n let debugEntry: DebugGroupInfo | null = null;\n if (u < 1) {\n debugEntry = {\n members: allMembers,\n kind: 'layout',\n };\n this.debugGroups.push(debugEntry);\n }\n\n // Return GroupBuilder for chaining\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n return {\n ...groupObj,\n pin: (pinAnchor: Anchor) => {\n const methods = self.pin(groupObj, pinAnchor);\n return {\n to: (pos: Vec2, pinU: number) => {\n methods.to(pos, pinU);\n if (debugEntry) {\n debugEntry.pin = { anchor: pinAnchor, target: pos };\n }\n },\n by: (delta: Vec2, pinU: number) => {\n methods.by(delta, pinU);\n },\n };\n },\n scale: () => self.scale(groupObj),\n rotate: () => self.rotate(groupObj),\n opacity: () => self.opacity(groupObj),\n };\n }\n };\n }\n\n center(...objects: ObjRef[]): LayoutBuilder {\n return this.align(...objects, { anchor: \"center\" });\n }\n\n solve(scene: Scene): ResolvedCtx {\n const resolved = new Map<SceneObject, Transform>();\n const opacity = new Map<SceneObject, number>();\n\n for (const obj of scene.objects()) {\n const base = scene.getInitialTransform(obj);\n\n const ch = this.channels.get(obj);\n const scale = ch?.scale ?? base.scale;\n const scaleX = ch?.scaleX;\n const scaleY = ch?.scaleY;\n const rotate = ch?.rotate ?? base.rotate;\n\n let translate = base.translate ?? [0, 0] as const;\n const pin = this.pins.get(obj);\n if (pin) {\n const local = scene.resolveAnchor(obj, pin.anchor);\n const transformed = applySR(local, scale, rotate, scaleX ?? 1, scaleY ?? 1);\n translate = vec.sub(pin.world, transformed);\n }\n\n resolved.set(obj, {\n translate,\n rotate: rotate ?? 0,\n scale: scale ?? 1,\n scaleX,\n scaleY,\n });\n opacity.set(obj, ch?.opacity ?? 1);\n }\n\n return {\n getTransform: (o) => resolved.get(o)!,\n getOpacity: (o) => opacity.get(o) ?? 1,\n };\n }\n}\n","import type { Anchor, AnimCtx, PinConstraint, ResolvedCtx, Scene, SceneObject, Timeline, Transform } from './types';\nimport type { DebugGroupInfo } from './context';\nimport { AnimCtxImpl } from './context';\n\nexport interface Player {\n play(): void;\n pause(): void;\n stop(): void;\n seek(timeMs: number): void;\n renderAt(timeMs: number): void;\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n debug: boolean;\n onTimeUpdate: ((time: number) => void) | null;\n onError: ((error: Error) => void) | null;\n dispose(): void;\n}\n\nexport interface PlayerOptions {\n scene: Scene;\n timeline: Timeline<AnimCtx>;\n}\n\ninterface DebugInfo {\n obj: SceneObject;\n transform: Transform;\n bounds: { x: number; y: number; w: number; h: number };\n opacity: number;\n}\n\nfunction getAnchorOffset(anchor: Anchor, bounds: { x: number; y: number; w: number; h: number }): [number, number] {\n const { x, y, w, h } = bounds;\n const left = x;\n const right = x + w;\n const top = y;\n const bottom = y + h;\n const centerX = x + w / 2;\n const centerY = y + h / 2;\n\n switch (anchor) {\n case 'origin': return [0, 0];\n case 'topLeft': return [left, top];\n case 'top': return [centerX, top];\n case 'topRight': return [right, top];\n case 'left': return [left, centerY];\n case 'center': return [centerX, centerY];\n case 'right': return [right, centerY];\n case 'bottomLeft': return [left, bottom];\n case 'bottom': return [centerX, bottom];\n case 'bottomRight': return [right, bottom];\n case 'baselineLeft': return [left, bottom];\n case 'baseline': return [centerX, bottom];\n default: return [0, 0];\n }\n}\n\nfunction renderDebugOverlay(\n g: CanvasRenderingContext2D,\n scene: Scene,\n solved: ResolvedCtx,\n debugGroups: DebugGroupInfo[],\n pins: Map<SceneObject, PinConstraint>,\n dpr: number\n) {\n g.save();\n g.scale(dpr, dpr);\n\n const debugInfos: DebugInfo[] = [];\n\n // Collect debug info for all objects\n for (const obj of scene.objects()) {\n const transform = solved.getTransform(obj);\n if (!transform || !transform.translate) continue;\n\n const bounds = scene.getBounds(obj);\n const opacity = solved.getOpacity(obj);\n\n debugInfos.push({ obj, transform, bounds, opacity });\n }\n\n // Draw group/layout bounds first (behind individual objects)\n for (const groupInfo of debugGroups) {\n const { members, kind, pin } = groupInfo;\n\n // Calculate bounds from current member positions\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n for (const member of members) {\n const transform = solved.getTransform(member);\n if (!transform || !transform.translate) continue;\n\n const memberBounds = scene.getBounds(member);\n const x = transform.translate[0] + memberBounds.x;\n const y = transform.translate[1] + memberBounds.y;\n\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + memberBounds.w * transform.scale);\n maxY = Math.max(maxY, y + memberBounds.h * transform.scale);\n }\n\n if (!isFinite(minX)) continue;\n\n const bounds = { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n\n // Yellow for groups, magenta for layouts\n const color = kind === 'group' ? 'rgba(255, 200, 0' : 'rgba(255, 0, 255';\n g.strokeStyle = color + ', 0.7)';\n\n g.lineWidth = 2;\n g.setLineDash([6, 4]);\n g.strokeRect(bounds.x, bounds.y, bounds.w, bounds.h);\n\n // Draw small label\n g.font = '10px monospace';\n g.fillStyle = color + ', 0.9)';\n g.fillText(kind, bounds.x + 2, bounds.y - 3);\n\n // Draw pin anchor if present\n if (pin) {\n // Calculate anchor position from bounds\n let anchorX = bounds.x, anchorY = bounds.y;\n const anchor = pin.anchor;\n\n if (anchor === 'top' || anchor === 'center' || anchor === 'bottom' || anchor === 'baseline') {\n anchorX = bounds.x + bounds.w / 2;\n } else if (anchor === 'topRight' || anchor === 'right' || anchor === 'bottomRight') {\n anchorX = bounds.x + bounds.w;\n }\n\n if (anchor === 'left' || anchor === 'center' || anchor === 'right') {\n anchorY = bounds.y + bounds.h / 2;\n } else if (anchor === 'bottomLeft' || anchor === 'bottom' || anchor === 'bottomRight' || anchor === 'baselineLeft' || anchor === 'baseline') {\n anchorY = bounds.y + bounds.h;\n }\n\n // Draw anchor point (diamond shape)\n g.fillStyle = color + ', 0.9)';\n g.beginPath();\n g.moveTo(anchorX, anchorY - 5);\n g.lineTo(anchorX + 5, anchorY);\n g.lineTo(anchorX, anchorY + 5);\n g.lineTo(anchorX - 5, anchorY);\n g.closePath();\n g.fill();\n\n // Draw target position (X marker)\n const [tx, ty] = pin.target;\n g.strokeStyle = color + ', 0.9)';\n g.lineWidth = 2;\n g.setLineDash([]);\n g.beginPath();\n g.moveTo(tx - 6, ty - 6);\n g.lineTo(tx + 6, ty + 6);\n g.moveTo(tx + 6, ty - 6);\n g.lineTo(tx - 6, ty + 6);\n g.stroke();\n\n // Draw line from anchor to target\n g.strokeStyle = color + ', 0.4)';\n g.lineWidth = 1;\n g.setLineDash([3, 3]);\n g.beginPath();\n g.moveTo(anchorX, anchorY);\n g.lineTo(tx, ty);\n g.stroke();\n\n // Label the anchor\n g.font = '9px monospace';\n g.fillStyle = color + ', 0.9)';\n g.fillText(anchor, anchorX + 7, anchorY - 2);\n }\n }\n\n // Draw bounding boxes for individual objects\n for (const { transform, bounds } of debugInfos) {\n g.save();\n g.translate(transform.translate[0], transform.translate[1]);\n g.rotate(transform.rotate);\n const sx = (transform.scaleX ?? 1) * transform.scale;\n const sy = (transform.scaleY ?? 1) * transform.scale;\n g.scale(sx, sy);\n\n // Bounding box\n const avgScale = (sx + sy) / 2;\n g.strokeStyle = 'rgba(0, 200, 255, 0.8)';\n g.lineWidth = 1 / avgScale;\n g.setLineDash([4 / avgScale, 4 / avgScale]);\n g.strokeRect(bounds.x, bounds.y, bounds.w, bounds.h);\n\n g.restore();\n }\n\n // Draw anchor points, centers, pins, and baselines\n for (const { obj, transform, bounds } of debugInfos) {\n const x = transform.translate[0];\n const y = transform.translate[1];\n const sx = (transform.scaleX ?? 1) * transform.scale;\n const sy = (transform.scaleY ?? 1) * transform.scale;\n const cos = Math.cos(transform.rotate);\n const sin = Math.sin(transform.rotate);\n\n // Object origin (transform origin point)\n g.fillStyle = 'rgba(255, 100, 100, 0.9)';\n g.beginPath();\n g.arc(x, y, 4, 0, Math.PI * 2);\n g.fill();\n\n // Object center (accounting for bounds offset and scale)\n const centerOffX = (bounds.x + bounds.w / 2) * sx;\n const centerOffY = (bounds.y + bounds.h / 2) * sy;\n const centerX = x + centerOffX * cos - centerOffY * sin;\n const centerY = y + centerOffX * sin + centerOffY * cos;\n\n g.fillStyle = 'rgba(100, 255, 100, 0.9)';\n g.beginPath();\n g.arc(centerX, centerY, 3, 0, Math.PI * 2);\n g.fill();\n\n // Crosshair at origin\n g.strokeStyle = 'rgba(255, 100, 100, 0.6)';\n g.lineWidth = 1;\n g.setLineDash([]);\n g.beginPath();\n g.moveTo(x - 8, y);\n g.lineTo(x + 8, y);\n g.moveTo(x, y - 8);\n g.lineTo(x, y + 8);\n g.stroke();\n\n // Draw baseline if text object\n const baseline = scene.getBaseline(obj);\n if (baseline !== null) {\n g.save();\n g.translate(x, y);\n g.rotate(transform.rotate);\n g.scale(transform.scale, transform.scale);\n\n // Baseline line\n g.strokeStyle = 'rgba(255, 165, 0, 0.8)';\n g.lineWidth = 1 / transform.scale;\n g.setLineDash([2 / transform.scale, 2 / transform.scale]);\n g.beginPath();\n g.moveTo(bounds.x - 5, baseline);\n g.lineTo(bounds.x + bounds.w + 5, baseline);\n g.stroke();\n\n g.restore();\n }\n\n // Draw pin target and path for individual objects\n const pin = pins.get(obj);\n if (pin) {\n // Calculate anchor position on the object (using full bounds info)\n const [anchorOffX, anchorOffY] = getAnchorOffset(pin.anchor, bounds);\n\n // Transform anchor offset to world space\n const scaledOffX = anchorOffX * sx;\n const scaledOffY = anchorOffY * sy;\n const anchorX = x + scaledOffX * cos - scaledOffY * sin;\n const anchorY = y + scaledOffX * sin + scaledOffY * cos;\n\n // Target position\n const [tx, ty] = pin.world;\n\n // Draw anchor point (small diamond)\n g.fillStyle = 'rgba(0, 200, 255, 0.9)';\n g.beginPath();\n g.moveTo(anchorX, anchorY - 4);\n g.lineTo(anchorX + 4, anchorY);\n g.lineTo(anchorX, anchorY + 4);\n g.lineTo(anchorX - 4, anchorY);\n g.closePath();\n g.fill();\n\n // Draw target (X marker)\n g.strokeStyle = 'rgba(0, 200, 255, 0.9)';\n g.lineWidth = 2;\n g.setLineDash([]);\n g.beginPath();\n g.moveTo(tx - 5, ty - 5);\n g.lineTo(tx + 5, ty + 5);\n g.moveTo(tx + 5, ty - 5);\n g.lineTo(tx - 5, ty + 5);\n g.stroke();\n\n // Draw line from anchor to target\n g.strokeStyle = 'rgba(0, 200, 255, 0.4)';\n g.lineWidth = 1;\n g.setLineDash([3, 3]);\n g.beginPath();\n g.moveTo(anchorX, anchorY);\n g.lineTo(tx, ty);\n g.stroke();\n\n // Label the anchor\n g.font = '9px monospace';\n g.fillStyle = 'rgba(0, 200, 255, 0.9)';\n g.fillText(pin.anchor, anchorX + 6, anchorY - 4);\n }\n }\n\n g.restore();\n}\n\nexport function makePlayer(canvas: HTMLCanvasElement, opts: PlayerOptions): Player {\n const ctx = new AnimCtxImpl();\n const { scene, timeline } = opts;\n const duration = timeline.duration;\n\n let isPlaying = false;\n let currentTime = 0;\n let startTime = 0;\n let animationFrameId: number | null = null;\n let onTimeUpdate: ((time: number) => void) | null = null;\n let onError: ((error: Error) => void) | null = null;\n let hasError = false;\n let debugMode = false;\n\n function render(timeMs: number, throwOnError = false): boolean {\n try {\n ctx.reset(scene);\n timeline.evaluate(timeMs, ctx);\n const solved = ctx.solve(scene);\n scene.render(solved, canvas);\n\n // Draw debug overlay if enabled\n if (debugMode) {\n const g = canvas.getContext('2d')!;\n const dpr = window.devicePixelRatio || 1;\n renderDebugOverlay(g, scene, solved, ctx.getDebugGroups(), ctx.getDebugPins(), dpr);\n }\n\n return true;\n } catch (e) {\n hasError = true;\n isPlaying = false;\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId);\n animationFrameId = null;\n }\n const error = e instanceof Error ? e : new Error(String(e));\n if (throwOnError || !onError) {\n throw error;\n }\n onError(error);\n return false;\n }\n }\n\n function frame(now: number) {\n if (!isPlaying || hasError) return;\n\n currentTime = now - startTime;\n\n // Loop or stop at end\n if (currentTime >= duration) {\n currentTime = duration;\n isPlaying = false;\n render(currentTime);\n onTimeUpdate?.(currentTime);\n return;\n }\n\n if (render(currentTime)) {\n onTimeUpdate?.(currentTime);\n animationFrameId = requestAnimationFrame(frame);\n }\n }\n\n // Initial render at time 0 (throw errors since onError isn't set yet)\n render(0, true);\n\n return {\n get isPlaying() {\n return isPlaying;\n },\n\n get currentTime() {\n return currentTime;\n },\n\n get duration() {\n return duration;\n },\n\n get onTimeUpdate() {\n return onTimeUpdate;\n },\n\n set onTimeUpdate(callback: ((time: number) => void) | null) {\n onTimeUpdate = callback;\n },\n\n get onError() {\n return onError;\n },\n\n set onError(callback: ((error: Error) => void) | null) {\n onError = callback;\n },\n\n get debug() {\n return debugMode;\n },\n\n set debug(value: boolean) {\n debugMode = value;\n // Re-render to show/hide debug overlay\n if (!isPlaying) {\n render(currentTime);\n }\n },\n\n play() {\n if (isPlaying || hasError) return;\n\n // If at end, restart from beginning\n if (currentTime >= duration) {\n currentTime = 0;\n }\n\n isPlaying = true;\n startTime = performance.now() - currentTime;\n animationFrameId = requestAnimationFrame(frame);\n },\n\n pause() {\n isPlaying = false;\n if (animationFrameId !== null) {\n cancelAnimationFrame(animationFrameId);\n animationFrameId = null;\n }\n },\n\n stop() {\n this.pause();\n currentTime = 0;\n render(0);\n onTimeUpdate?.(0);\n },\n\n seek(timeMs: number) {\n if (hasError) return;\n currentTime = Math.max(0, Math.min(duration, timeMs));\n startTime = performance.now() - currentTime;\n render(currentTime);\n onTimeUpdate?.(currentTime);\n },\n\n renderAt(timeMs: number) {\n if (hasError) return;\n render(Math.max(0, Math.min(duration, timeMs)));\n },\n\n dispose() {\n this.pause();\n },\n };\n}\n","var __accessCheck = (obj, member, msg) => {\n if (!member.has(obj))\n throw TypeError(\"Cannot \" + msg);\n};\nvar __privateGet = (obj, member, getter) => {\n __accessCheck(obj, member, \"read from private field\");\n return getter ? getter.call(obj) : member.get(obj);\n};\nvar __privateAdd = (obj, member, value) => {\n if (member.has(obj))\n throw TypeError(\"Cannot add the same private member more than once\");\n member instanceof WeakSet ? member.add(obj) : member.set(obj, value);\n};\nvar __privateSet = (obj, member, value, setter) => {\n __accessCheck(obj, member, \"write to private field\");\n setter ? setter.call(obj, value) : member.set(obj, value);\n return value;\n};\nvar __privateWrapper = (obj, member, setter, getter) => ({\n set _(value) {\n __privateSet(obj, member, value, setter);\n },\n get _() {\n return __privateGet(obj, member, getter);\n }\n});\nvar __privateMethod = (obj, member, method) => {\n __accessCheck(obj, member, \"access private method\");\n return method;\n};\n\n// src/misc.ts\nvar bytes = new Uint8Array(8);\nvar view = new DataView(bytes.buffer);\nvar u8 = (value) => {\n return [(value % 256 + 256) % 256];\n};\nvar u16 = (value) => {\n view.setUint16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar i16 = (value) => {\n view.setInt16(0, value, false);\n return [bytes[0], bytes[1]];\n};\nvar u24 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[1], bytes[2], bytes[3]];\n};\nvar u32 = (value) => {\n view.setUint32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar i32 = (value) => {\n view.setInt32(0, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar u64 = (value) => {\n view.setUint32(0, Math.floor(value / 2 ** 32), false);\n view.setUint32(4, value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]];\n};\nvar fixed_8_8 = (value) => {\n view.setInt16(0, 2 ** 8 * value, false);\n return [bytes[0], bytes[1]];\n};\nvar fixed_16_16 = (value) => {\n view.setInt32(0, 2 ** 16 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar fixed_2_30 = (value) => {\n view.setInt32(0, 2 ** 30 * value, false);\n return [bytes[0], bytes[1], bytes[2], bytes[3]];\n};\nvar ascii = (text, nullTerminated = false) => {\n let bytes2 = Array(text.length).fill(null).map((_, i) => text.charCodeAt(i));\n if (nullTerminated)\n bytes2.push(0);\n return bytes2;\n};\nvar last = (arr) => {\n return arr && arr[arr.length - 1];\n};\nvar lastPresentedSample = (samples) => {\n let result = void 0;\n for (let sample of samples) {\n if (!result || sample.presentationTimestamp > result.presentationTimestamp) {\n result = sample;\n }\n }\n return result;\n};\nvar intoTimescale = (timeInSeconds, timescale, round = true) => {\n let value = timeInSeconds * timescale;\n return round ? Math.round(value) : value;\n};\nvar rotationMatrix = (rotationInDegrees) => {\n let theta = rotationInDegrees * (Math.PI / 180);\n let cosTheta = Math.cos(theta);\n let sinTheta = Math.sin(theta);\n return [\n cosTheta,\n sinTheta,\n 0,\n -sinTheta,\n cosTheta,\n 0,\n 0,\n 0,\n 1\n ];\n};\nvar IDENTITY_MATRIX = rotationMatrix(0);\nvar matrixToBytes = (matrix) => {\n return [\n fixed_16_16(matrix[0]),\n fixed_16_16(matrix[1]),\n fixed_2_30(matrix[2]),\n fixed_16_16(matrix[3]),\n fixed_16_16(matrix[4]),\n fixed_2_30(matrix[5]),\n fixed_16_16(matrix[6]),\n fixed_16_16(matrix[7]),\n fixed_2_30(matrix[8])\n ];\n};\nvar deepClone = (x) => {\n if (!x)\n return x;\n if (typeof x !== \"object\")\n return x;\n if (Array.isArray(x))\n return x.map(deepClone);\n return Object.fromEntries(Object.entries(x).map(([key, value]) => [key, deepClone(value)]));\n};\nvar isU32 = (value) => {\n return value >= 0 && value < 2 ** 32;\n};\n\n// src/box.ts\nvar box = (type, contents, children) => ({\n type,\n contents: contents && new Uint8Array(contents.flat(10)),\n children\n});\nvar fullBox = (type, version, flags, contents, children) => box(\n type,\n [u8(version), u24(flags), contents ?? []],\n children\n);\nvar ftyp = (details) => {\n let minorVersion = 512;\n if (details.fragmented)\n return box(\"ftyp\", [\n ascii(\"iso5\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"iso5\"),\n ascii(\"iso6\"),\n ascii(\"mp41\")\n ]);\n return box(\"ftyp\", [\n ascii(\"isom\"),\n // Major brand\n u32(minorVersion),\n // Minor version\n // Compatible brands\n ascii(\"isom\"),\n details.holdsAvc ? ascii(\"avc1\") : [],\n ascii(\"mp41\")\n ]);\n};\nvar mdat = (reserveLargeSize) => ({ type: \"mdat\", largeSize: reserveLargeSize });\nvar free = (size) => ({ type: \"free\", size });\nvar moov = (tracks, creationTime, fragmented = false) => box(\"moov\", null, [\n mvhd(creationTime, tracks),\n ...tracks.map((x) => trak(x, creationTime)),\n fragmented ? mvex(tracks) : null\n]);\nvar mvhd = (creationTime, tracks) => {\n let duration = intoTimescale(Math.max(\n 0,\n ...tracks.filter((x) => x.samples.length > 0).map((x) => {\n const lastSample = lastPresentedSample(x.samples);\n return lastSample.presentationTimestamp + lastSample.duration;\n })\n ), GLOBAL_TIMESCALE);\n let nextTrackId = Math.max(...tracks.map((x) => x.id)) + 1;\n let needsU64 = !isU32(creationTime) || !isU32(duration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mvhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(GLOBAL_TIMESCALE),\n // Timescale\n u32OrU64(duration),\n // Duration\n fixed_16_16(1),\n // Preferred rate\n fixed_8_8(1),\n // Preferred volume\n Array(10).fill(0),\n // Reserved\n matrixToBytes(IDENTITY_MATRIX),\n // Matrix\n Array(24).fill(0),\n // Pre-defined\n u32(nextTrackId)\n // Next track ID\n ]);\n};\nvar trak = (track, creationTime) => box(\"trak\", null, [\n tkhd(track, creationTime),\n mdia(track, creationTime)\n]);\nvar tkhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let durationInGlobalTimescale = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n GLOBAL_TIMESCALE\n );\n let needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale);\n let u32OrU64 = needsU64 ? u64 : u32;\n let matrix;\n if (track.info.type === \"video\") {\n matrix = typeof track.info.rotation === \"number\" ? rotationMatrix(track.info.rotation) : track.info.rotation;\n } else {\n matrix = IDENTITY_MATRIX;\n }\n return fullBox(\"tkhd\", +needsU64, 3, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.id),\n // Track ID\n u32(0),\n // Reserved\n u32OrU64(durationInGlobalTimescale),\n // Duration\n Array(8).fill(0),\n // Reserved\n u16(0),\n // Layer\n u16(0),\n // Alternate group\n fixed_8_8(track.info.type === \"audio\" ? 1 : 0),\n // Volume\n u16(0),\n // Reserved\n matrixToBytes(matrix),\n // Matrix\n fixed_16_16(track.info.type === \"video\" ? track.info.width : 0),\n // Track width\n fixed_16_16(track.info.type === \"video\" ? track.info.height : 0)\n // Track height\n ]);\n};\nvar mdia = (track, creationTime) => box(\"mdia\", null, [\n mdhd(track, creationTime),\n hdlr(track.info.type === \"video\" ? \"vide\" : \"soun\"),\n minf(track)\n]);\nvar mdhd = (track, creationTime) => {\n let lastSample = lastPresentedSample(track.samples);\n let localDuration = intoTimescale(\n lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0,\n track.timescale\n );\n let needsU64 = !isU32(creationTime) || !isU32(localDuration);\n let u32OrU64 = needsU64 ? u64 : u32;\n return fullBox(\"mdhd\", +needsU64, 0, [\n u32OrU64(creationTime),\n // Creation time\n u32OrU64(creationTime),\n // Modification time\n u32(track.timescale),\n // Timescale\n u32OrU64(localDuration),\n // Duration\n u16(21956),\n // Language (\"und\", undetermined)\n u16(0)\n // Quality\n ]);\n};\nvar hdlr = (componentSubtype) => fullBox(\"hdlr\", 0, 0, [\n ascii(\"mhlr\"),\n // Component type\n ascii(componentSubtype),\n // Component subtype\n u32(0),\n // Component manufacturer\n u32(0),\n // Component flags\n u32(0),\n // Component flags mask\n ascii(\"mp4-muxer-hdlr\", true)\n // Component name\n]);\nvar minf = (track) => box(\"minf\", null, [\n track.info.type === \"video\" ? vmhd() : smhd(),\n dinf(),\n stbl(track)\n]);\nvar vmhd = () => fullBox(\"vmhd\", 0, 1, [\n u16(0),\n // Graphics mode\n u16(0),\n // Opcolor R\n u16(0),\n // Opcolor G\n u16(0)\n // Opcolor B\n]);\nvar smhd = () => fullBox(\"smhd\", 0, 0, [\n u16(0),\n // Balance\n u16(0)\n // Reserved\n]);\nvar dinf = () => box(\"dinf\", null, [\n dref()\n]);\nvar dref = () => fullBox(\"dref\", 0, 0, [\n u32(1)\n // Entry count\n], [\n url()\n]);\nvar url = () => fullBox(\"url \", 0, 1);\nvar stbl = (track) => {\n const needsCtts = track.compositionTimeOffsetTable.length > 1 || track.compositionTimeOffsetTable.some((x) => x.sampleCompositionTimeOffset !== 0);\n return box(\"stbl\", null, [\n stsd(track),\n stts(track),\n stss(track),\n stsc(track),\n stsz(track),\n stco(track),\n needsCtts ? ctts(track) : null\n ]);\n};\nvar stsd = (track) => fullBox(\"stsd\", 0, 0, [\n u32(1)\n // Entry count\n], [\n track.info.type === \"video\" ? videoSampleDescription(\n VIDEO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n ) : soundSampleDescription(\n AUDIO_CODEC_TO_BOX_NAME[track.info.codec],\n track\n )\n]);\nvar videoSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Pre-defined\n u16(0),\n // Reserved\n Array(12).fill(0),\n // Pre-defined\n u16(track.info.width),\n // Width\n u16(track.info.height),\n // Height\n u32(4718592),\n // Horizontal resolution\n u32(4718592),\n // Vertical resolution\n u32(0),\n // Reserved\n u16(1),\n // Frame count\n Array(32).fill(0),\n // Compressor name\n u16(24),\n // Depth\n i16(65535)\n // Pre-defined\n], [\n VIDEO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track),\n track.info.decoderConfig.colorSpace ? colr(track) : null\n]);\nvar COLOR_PRIMARIES_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // ITU-R BT.601 525 - SMPTE 170M\n};\nvar TRANSFER_CHARACTERISTICS_MAP = {\n \"bt709\": 1,\n // ITU-R BT.709\n \"smpte170m\": 6,\n // SMPTE 170M\n \"iec61966-2-1\": 13\n // IEC 61966-2-1\n};\nvar MATRIX_COEFFICIENTS_MAP = {\n \"rgb\": 0,\n // Identity\n \"bt709\": 1,\n // ITU-R BT.709\n \"bt470bg\": 5,\n // ITU-R BT.470BG\n \"smpte170m\": 6\n // SMPTE 170M\n};\nvar colr = (track) => box(\"colr\", [\n ascii(\"nclx\"),\n // Colour type\n u16(COLOR_PRIMARIES_MAP[track.info.decoderConfig.colorSpace.primaries]),\n // Colour primaries\n u16(TRANSFER_CHARACTERISTICS_MAP[track.info.decoderConfig.colorSpace.transfer]),\n // Transfer characteristics\n u16(MATRIX_COEFFICIENTS_MAP[track.info.decoderConfig.colorSpace.matrix]),\n // Matrix coefficients\n u8((track.info.decoderConfig.colorSpace.fullRange ? 1 : 0) << 7)\n // Full range flag\n]);\nvar avcC = (track) => track.info.decoderConfig && box(\"avcC\", [\n // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar hvcC = (track) => track.info.decoderConfig && box(\"hvcC\", [\n // For HEVC, description is a HEVCDecoderConfigurationRecord, so nothing else to do here\n ...new Uint8Array(track.info.decoderConfig.description)\n]);\nvar vpcC = (track) => {\n if (!track.info.decoderConfig) {\n return null;\n }\n let decoderConfig = track.info.decoderConfig;\n if (!decoderConfig.colorSpace) {\n throw new Error(`'colorSpace' is required in the decoder config for VP9.`);\n }\n let parts = decoderConfig.codec.split(\".\");\n let profile = Number(parts[1]);\n let level = Number(parts[2]);\n let bitDepth = Number(parts[3]);\n let chromaSubsampling = 0;\n let thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + Number(decoderConfig.colorSpace.fullRange);\n let colourPrimaries = 2;\n let transferCharacteristics = 2;\n let matrixCoefficients = 2;\n return fullBox(\"vpcC\", 1, 0, [\n u8(profile),\n // Profile\n u8(level),\n // Level\n u8(thirdByte),\n // Bit depth, chroma subsampling, full range\n u8(colourPrimaries),\n // Colour primaries\n u8(transferCharacteristics),\n // Transfer characteristics\n u8(matrixCoefficients),\n // Matrix coefficients\n u16(0)\n // Codec initialization data size\n ]);\n};\nvar av1C = () => {\n let marker = 1;\n let version = 1;\n let firstByte = (marker << 7) + version;\n return box(\"av1C\", [\n firstByte,\n 0,\n 0,\n 0\n ]);\n};\nvar soundSampleDescription = (compressionType, track) => box(compressionType, [\n Array(6).fill(0),\n // Reserved\n u16(1),\n // Data reference index\n u16(0),\n // Version\n u16(0),\n // Revision level\n u32(0),\n // Vendor\n u16(track.info.numberOfChannels),\n // Number of channels\n u16(16),\n // Sample size (bits)\n u16(0),\n // Compression ID\n u16(0),\n // Packet size\n fixed_16_16(track.info.sampleRate)\n // Sample rate\n], [\n AUDIO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track)\n]);\nvar esds = (track) => {\n let description = new Uint8Array(track.info.decoderConfig.description);\n return fullBox(\"esds\", 0, 0, [\n // https://stackoverflow.com/a/54803118\n u32(58753152),\n // TAG(3) = Object Descriptor ([2])\n u8(32 + description.byteLength),\n // length of this OD (which includes the next 2 tags)\n u16(1),\n // ES_ID = 1\n u8(0),\n // flags etc = 0\n u32(75530368),\n // TAG(4) = ES Descriptor ([2]) embedded in above OD\n u8(18 + description.byteLength),\n // length of this ESD\n u8(64),\n // MPEG-4 Audio\n u8(21),\n // stream type(6bits)=5 audio, flags(2bits)=1\n u24(0),\n // 24bit buffer size\n u32(130071),\n // max bitrate\n u32(130071),\n // avg bitrate\n u32(92307584),\n // TAG(5) = ASC ([2],[3]) embedded in above OD\n u8(description.byteLength),\n // length\n ...description,\n u32(109084800),\n // TAG(6)\n u8(1),\n // length\n u8(2)\n // data\n ]);\n};\nvar dOps = (track) => {\n let preskip = 3840;\n let gain = 0;\n const description = track.info.decoderConfig?.description;\n if (description) {\n if (description.byteLength < 18) {\n throw new TypeError(\"Invalid decoder description provided for Opus; must be at least 18 bytes long.\");\n }\n const view2 = ArrayBuffer.isView(description) ? new DataView(description.buffer, description.byteOffset, description.byteLength) : new DataView(description);\n preskip = view2.getUint16(10, true);\n gain = view2.getInt16(14, true);\n }\n return box(\"dOps\", [\n u8(0),\n // Version\n u8(track.info.numberOfChannels),\n // OutputChannelCount\n u16(preskip),\n u32(track.info.sampleRate),\n // InputSampleRate\n fixed_8_8(gain),\n // OutputGain\n u8(0)\n // ChannelMappingFamily\n ]);\n};\nvar stts = (track) => {\n return fullBox(\"stts\", 0, 0, [\n u32(track.timeToSampleTable.length),\n // Number of entries\n track.timeToSampleTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleDelta)\n // Sample duration\n ])\n ]);\n};\nvar stss = (track) => {\n if (track.samples.every((x) => x.type === \"key\"))\n return null;\n let keySamples = [...track.samples.entries()].filter(([, sample]) => sample.type === \"key\");\n return fullBox(\"stss\", 0, 0, [\n u32(keySamples.length),\n // Number of entries\n keySamples.map(([index]) => u32(index + 1))\n // Sync sample table\n ]);\n};\nvar stsc = (track) => {\n return fullBox(\"stsc\", 0, 0, [\n u32(track.compactlyCodedChunkTable.length),\n // Number of entries\n track.compactlyCodedChunkTable.map((x) => [\n // Sample-to-chunk table\n u32(x.firstChunk),\n // First chunk\n u32(x.samplesPerChunk),\n // Samples per chunk\n u32(1)\n // Sample description index\n ])\n ]);\n};\nvar stsz = (track) => fullBox(\"stsz\", 0, 0, [\n u32(0),\n // Sample size (0 means non-constant size)\n u32(track.samples.length),\n // Number of entries\n track.samples.map((x) => u32(x.size))\n // Sample size table\n]);\nvar stco = (track) => {\n if (track.finalizedChunks.length > 0 && last(track.finalizedChunks).offset >= 2 ** 32) {\n return fullBox(\"co64\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u64(x.offset))\n // Chunk offset table\n ]);\n }\n return fullBox(\"stco\", 0, 0, [\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((x) => u32(x.offset))\n // Chunk offset table\n ]);\n};\nvar ctts = (track) => {\n return fullBox(\"ctts\", 0, 0, [\n u32(track.compositionTimeOffsetTable.length),\n // Number of entries\n track.compositionTimeOffsetTable.map((x) => [\n // Time-to-sample table\n u32(x.sampleCount),\n // Sample count\n u32(x.sampleCompositionTimeOffset)\n // Sample offset\n ])\n ]);\n};\nvar mvex = (tracks) => {\n return box(\"mvex\", null, tracks.map(trex));\n};\nvar trex = (track) => {\n return fullBox(\"trex\", 0, 0, [\n u32(track.id),\n // Track ID\n u32(1),\n // Default sample description index\n u32(0),\n // Default sample duration\n u32(0),\n // Default sample size\n u32(0)\n // Default sample flags\n ]);\n};\nvar moof = (sequenceNumber, tracks) => {\n return box(\"moof\", null, [\n mfhd(sequenceNumber),\n ...tracks.map(traf)\n ]);\n};\nvar mfhd = (sequenceNumber) => {\n return fullBox(\"mfhd\", 0, 0, [\n u32(sequenceNumber)\n // Sequence number\n ]);\n};\nvar fragmentSampleFlags = (sample) => {\n let byte1 = 0;\n let byte2 = 0;\n let byte3 = 0;\n let byte4 = 0;\n let sampleIsDifferenceSample = sample.type === \"delta\";\n byte2 |= +sampleIsDifferenceSample;\n if (sampleIsDifferenceSample) {\n byte1 |= 1;\n } else {\n byte1 |= 2;\n }\n return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;\n};\nvar traf = (track) => {\n return box(\"traf\", null, [\n tfhd(track),\n tfdt(track),\n trun(track)\n ]);\n};\nvar tfhd = (track) => {\n let tfFlags = 0;\n tfFlags |= 8;\n tfFlags |= 16;\n tfFlags |= 32;\n tfFlags |= 131072;\n let referenceSample = track.currentChunk.samples[1] ?? track.currentChunk.samples[0];\n let referenceSampleInfo = {\n duration: referenceSample.timescaleUnitsToNextSample,\n size: referenceSample.size,\n flags: fragmentSampleFlags(referenceSample)\n };\n return fullBox(\"tfhd\", 0, tfFlags, [\n u32(track.id),\n // Track ID\n u32(referenceSampleInfo.duration),\n // Default sample duration\n u32(referenceSampleInfo.size),\n // Default sample size\n u32(referenceSampleInfo.flags)\n // Default sample flags\n ]);\n};\nvar tfdt = (track) => {\n return fullBox(\"tfdt\", 1, 0, [\n u64(intoTimescale(track.currentChunk.startTimestamp, track.timescale))\n // Base Media Decode Time\n ]);\n};\nvar trun = (track) => {\n let allSampleDurations = track.currentChunk.samples.map((x) => x.timescaleUnitsToNextSample);\n let allSampleSizes = track.currentChunk.samples.map((x) => x.size);\n let allSampleFlags = track.currentChunk.samples.map(fragmentSampleFlags);\n let allSampleCompositionTimeOffsets = track.currentChunk.samples.map((x) => intoTimescale(x.presentationTimestamp - x.decodeTimestamp, track.timescale));\n let uniqueSampleDurations = new Set(allSampleDurations);\n let uniqueSampleSizes = new Set(allSampleSizes);\n let uniqueSampleFlags = new Set(allSampleFlags);\n let uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets);\n let firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1];\n let sampleDurationPresent = uniqueSampleDurations.size > 1;\n let sampleSizePresent = uniqueSampleSizes.size > 1;\n let sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1;\n let sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some((x) => x !== 0);\n let flags = 0;\n flags |= 1;\n flags |= 4 * +firstSampleFlagsPresent;\n flags |= 256 * +sampleDurationPresent;\n flags |= 512 * +sampleSizePresent;\n flags |= 1024 * +sampleFlagsPresent;\n flags |= 2048 * +sampleCompositionTimeOffsetsPresent;\n return fullBox(\"trun\", 1, flags, [\n u32(track.currentChunk.samples.length),\n // Sample count\n u32(track.currentChunk.offset - track.currentChunk.moofOffset || 0),\n // Data offset\n firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [],\n track.currentChunk.samples.map((_, i) => [\n sampleDurationPresent ? u32(allSampleDurations[i]) : [],\n // Sample duration\n sampleSizePresent ? u32(allSampleSizes[i]) : [],\n // Sample size\n sampleFlagsPresent ? u32(allSampleFlags[i]) : [],\n // Sample flags\n // Sample composition time offsets\n sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : []\n ])\n ]);\n};\nvar mfra = (tracks) => {\n return box(\"mfra\", null, [\n ...tracks.map(tfra),\n mfro()\n ]);\n};\nvar tfra = (track, trackIndex) => {\n let version = 1;\n return fullBox(\"tfra\", version, 0, [\n u32(track.id),\n // Track ID\n u32(63),\n // This specifies that traf number, trun number and sample number are 32-bit ints\n u32(track.finalizedChunks.length),\n // Number of entries\n track.finalizedChunks.map((chunk) => [\n u64(intoTimescale(chunk.startTimestamp, track.timescale)),\n // Time\n u64(chunk.moofOffset),\n // moof offset\n u32(trackIndex + 1),\n // traf number\n u32(1),\n // trun number\n u32(1)\n // Sample number\n ])\n ]);\n};\nvar mfro = () => {\n return fullBox(\"mfro\", 0, 0, [\n // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box\n // is known\n u32(0)\n // Size\n ]);\n};\nvar VIDEO_CODEC_TO_BOX_NAME = {\n \"avc\": \"avc1\",\n \"hevc\": \"hvc1\",\n \"vp9\": \"vp09\",\n \"av1\": \"av01\"\n};\nvar VIDEO_CODEC_TO_CONFIGURATION_BOX = {\n \"avc\": avcC,\n \"hevc\": hvcC,\n \"vp9\": vpcC,\n \"av1\": av1C\n};\nvar AUDIO_CODEC_TO_BOX_NAME = {\n \"aac\": \"mp4a\",\n \"opus\": \"Opus\"\n};\nvar AUDIO_CODEC_TO_CONFIGURATION_BOX = {\n \"aac\": esds,\n \"opus\": dOps\n};\n\n// src/target.ts\nvar isTarget = Symbol(\"isTarget\");\nvar Target = class {\n};\nisTarget;\nvar ArrayBufferTarget = class extends Target {\n constructor() {\n super(...arguments);\n this.buffer = null;\n }\n};\nvar StreamTarget = class extends Target {\n constructor(options) {\n super();\n this.options = options;\n if (typeof options !== \"object\") {\n throw new TypeError(\"StreamTarget requires an options object to be passed to its constructor.\");\n }\n if (options.onData) {\n if (typeof options.onData !== \"function\") {\n throw new TypeError(\"options.onData, when provided, must be a function.\");\n }\n if (options.onData.length < 2) {\n throw new TypeError(\n \"options.onData, when provided, must be a function that takes in at least two arguments (data and position). Ignoring the position argument, which specifies the byte offset at which the data is to be written, can lead to broken outputs.\"\n );\n }\n }\n if (options.chunked !== void 0 && typeof options.chunked !== \"boolean\") {\n throw new TypeError(\"options.chunked, when provided, must be a boolean.\");\n }\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize < 1024)) {\n throw new TypeError(\"options.chunkSize, when provided, must be an integer and not smaller than 1024.\");\n }\n }\n};\nvar FileSystemWritableFileStreamTarget = class extends Target {\n constructor(stream, options) {\n super();\n this.stream = stream;\n this.options = options;\n if (!(stream instanceof FileSystemWritableFileStream)) {\n throw new TypeError(\"FileSystemWritableFileStreamTarget requires a FileSystemWritableFileStream instance.\");\n }\n if (options !== void 0 && typeof options !== \"object\") {\n throw new TypeError(\"FileSystemWritableFileStreamTarget's options, when provided, must be an object.\");\n }\n if (options) {\n if (options.chunkSize !== void 0 && (!Number.isInteger(options.chunkSize) || options.chunkSize <= 0)) {\n throw new TypeError(\"options.chunkSize, when provided, must be a positive integer\");\n }\n }\n }\n};\n\n// src/writer.ts\nvar _helper, _helperView;\nvar Writer = class {\n constructor() {\n this.pos = 0;\n __privateAdd(this, _helper, new Uint8Array(8));\n __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer));\n /**\n * Stores the position from the start of the file to where boxes elements have been written. This is used to\n * rewrite/edit elements that were already added before, and to measure sizes of things.\n */\n this.offsets = /* @__PURE__ */ new WeakMap();\n }\n /** Sets the current position for future writes to a new one. */\n seek(newPos) {\n this.pos = newPos;\n }\n writeU32(value) {\n __privateGet(this, _helperView).setUint32(0, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 4));\n }\n writeU64(value) {\n __privateGet(this, _helperView).setUint32(0, Math.floor(value / 2 ** 32), false);\n __privateGet(this, _helperView).setUint32(4, value, false);\n this.write(__privateGet(this, _helper).subarray(0, 8));\n }\n writeAscii(text) {\n for (let i = 0; i < text.length; i++) {\n __privateGet(this, _helperView).setUint8(i % 8, text.charCodeAt(i));\n if (i % 8 === 7)\n this.write(__privateGet(this, _helper));\n }\n if (text.length % 8 !== 0) {\n this.write(__privateGet(this, _helper).subarray(0, text.length % 8));\n }\n }\n writeBox(box2) {\n this.offsets.set(box2, this.pos);\n if (box2.contents && !box2.children) {\n this.writeBoxHeader(box2, box2.size ?? box2.contents.byteLength + 8);\n this.write(box2.contents);\n } else {\n let startPos = this.pos;\n this.writeBoxHeader(box2, 0);\n if (box2.contents)\n this.write(box2.contents);\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n this.writeBox(child);\n }\n let endPos = this.pos;\n let size = box2.size ?? endPos - startPos;\n this.seek(startPos);\n this.writeBoxHeader(box2, size);\n this.seek(endPos);\n }\n }\n writeBoxHeader(box2, size) {\n this.writeU32(box2.largeSize ? 1 : size);\n this.writeAscii(box2.type);\n if (box2.largeSize)\n this.writeU64(size);\n }\n measureBoxHeader(box2) {\n return 8 + (box2.largeSize ? 8 : 0);\n }\n patchBox(box2) {\n let endPos = this.pos;\n this.seek(this.offsets.get(box2));\n this.writeBox(box2);\n this.seek(endPos);\n }\n measureBox(box2) {\n if (box2.contents && !box2.children) {\n let headerSize = this.measureBoxHeader(box2);\n return headerSize + box2.contents.byteLength;\n } else {\n let result = this.measureBoxHeader(box2);\n if (box2.contents)\n result += box2.contents.byteLength;\n if (box2.children) {\n for (let child of box2.children)\n if (child)\n result += this.measureBox(child);\n }\n return result;\n }\n }\n};\n_helper = new WeakMap();\n_helperView = new WeakMap();\nvar _target, _buffer, _bytes, _maxPos, _ensureSize, ensureSize_fn;\nvar ArrayBufferTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _ensureSize);\n __privateAdd(this, _target, void 0);\n __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16));\n __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer)));\n __privateAdd(this, _maxPos, 0);\n __privateSet(this, _target, target);\n }\n write(data) {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength);\n __privateGet(this, _bytes).set(data, this.pos);\n this.pos += data.byteLength;\n __privateSet(this, _maxPos, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n finalize() {\n __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos);\n __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, Math.max(__privateGet(this, _maxPos), this.pos));\n }\n};\n_target = new WeakMap();\n_buffer = new WeakMap();\n_bytes = new WeakMap();\n_maxPos = new WeakMap();\n_ensureSize = new WeakSet();\nensureSize_fn = function(size) {\n let newLength = __privateGet(this, _buffer).byteLength;\n while (newLength < size)\n newLength *= 2;\n if (newLength === __privateGet(this, _buffer).byteLength)\n return;\n let newBuffer = new ArrayBuffer(newLength);\n let newBytes = new Uint8Array(newBuffer);\n newBytes.set(__privateGet(this, _bytes), 0);\n __privateSet(this, _buffer, newBuffer);\n __privateSet(this, _bytes, newBytes);\n};\nvar DEFAULT_CHUNK_SIZE = 2 ** 24;\nvar MAX_CHUNKS_AT_ONCE = 2;\nvar _target2, _sections, _chunked, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn;\nvar StreamTargetWriter = class extends Writer {\n constructor(target) {\n super();\n __privateAdd(this, _writeDataIntoChunks);\n __privateAdd(this, _insertSectionIntoChunk);\n __privateAdd(this, _createChunk);\n __privateAdd(this, _flushChunks);\n __privateAdd(this, _target2, void 0);\n __privateAdd(this, _sections, []);\n __privateAdd(this, _chunked, void 0);\n __privateAdd(this, _chunkSize, void 0);\n /**\n * The data is divided up into fixed-size chunks, whose contents are first filled in RAM and then flushed out.\n * A chunk is flushed if all of its contents have been written.\n */\n __privateAdd(this, _chunks, []);\n __privateSet(this, _target2, target);\n __privateSet(this, _chunked, target.options?.chunked ?? false);\n __privateSet(this, _chunkSize, target.options?.chunkSize ?? DEFAULT_CHUNK_SIZE);\n }\n write(data) {\n __privateGet(this, _sections).push({\n data: data.slice(),\n start: this.pos\n });\n this.pos += data.byteLength;\n }\n flush() {\n if (__privateGet(this, _sections).length === 0)\n return;\n let chunks = [];\n let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start);\n chunks.push({\n start: sorted[0].start,\n size: sorted[0].data.byteLength\n });\n for (let i = 1; i < sorted.length; i++) {\n let lastChunk = chunks[chunks.length - 1];\n let section = sorted[i];\n if (section.start <= lastChunk.start + lastChunk.size) {\n lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start);\n } else {\n chunks.push({\n start: section.start,\n size: section.data.byteLength\n });\n }\n }\n for (let chunk of chunks) {\n chunk.data = new Uint8Array(chunk.size);\n for (let section of __privateGet(this, _sections)) {\n if (chunk.start <= section.start && section.start < chunk.start + chunk.size) {\n chunk.data.set(section.data, section.start - chunk.start);\n }\n }\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, chunk.data, chunk.start);\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n } else {\n __privateGet(this, _target2).options.onData?.(chunk.data, chunk.start);\n }\n }\n __privateGet(this, _sections).length = 0;\n }\n finalize() {\n if (__privateGet(this, _chunked)) {\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true);\n }\n }\n};\n_target2 = new WeakMap();\n_sections = new WeakMap();\n_chunked = new WeakMap();\n_chunkSize = new WeakMap();\n_chunks = new WeakMap();\n_writeDataIntoChunks = new WeakSet();\nwriteDataIntoChunks_fn = function(data, position) {\n let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize));\n if (chunkIndex === -1)\n chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position);\n let chunk = __privateGet(this, _chunks)[chunkIndex];\n let relativePosition = position - chunk.start;\n let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength));\n chunk.data.set(toWrite, relativePosition);\n let section = {\n start: relativePosition,\n end: relativePosition + toWrite.byteLength\n };\n __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section);\n if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) {\n chunk.shouldFlush = true;\n }\n if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) {\n for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) {\n __privateGet(this, _chunks)[i].shouldFlush = true;\n }\n __privateMethod(this, _flushChunks, flushChunks_fn).call(this);\n }\n if (toWrite.byteLength < data.byteLength) {\n __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength);\n }\n};\n_insertSectionIntoChunk = new WeakSet();\ninsertSectionIntoChunk_fn = function(chunk, section) {\n let low = 0;\n let high = chunk.written.length - 1;\n let index = -1;\n while (low <= high) {\n let mid = Math.floor(low + (high - low + 1) / 2);\n if (chunk.written[mid].start <= section.start) {\n low = mid + 1;\n index = mid;\n } else {\n high = mid - 1;\n }\n }\n chunk.written.splice(index + 1, 0, section);\n if (index === -1 || chunk.written[index].end < section.start)\n index++;\n while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) {\n chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end);\n chunk.written.splice(index + 1, 1);\n }\n};\n_createChunk = new WeakSet();\ncreateChunk_fn = function(includesPosition) {\n let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize);\n let chunk = {\n start,\n data: new Uint8Array(__privateGet(this, _chunkSize)),\n written: [],\n shouldFlush: false\n };\n __privateGet(this, _chunks).push(chunk);\n __privateGet(this, _chunks).sort((a, b) => a.start - b.start);\n return __privateGet(this, _chunks).indexOf(chunk);\n};\n_flushChunks = new WeakSet();\nflushChunks_fn = function(force = false) {\n for (let i = 0; i < __privateGet(this, _chunks).length; i++) {\n let chunk = __privateGet(this, _chunks)[i];\n if (!chunk.shouldFlush && !force)\n continue;\n for (let section of chunk.written) {\n __privateGet(this, _target2).options.onData?.(\n chunk.data.subarray(section.start, section.end),\n chunk.start + section.start\n );\n }\n __privateGet(this, _chunks).splice(i--, 1);\n }\n};\nvar FileSystemWritableFileStreamTargetWriter = class extends StreamTargetWriter {\n constructor(target) {\n super(new StreamTarget({\n onData: (data, position) => target.stream.write({\n type: \"write\",\n data,\n position\n }),\n chunked: true,\n chunkSize: target.options?.chunkSize\n }));\n }\n};\n\n// src/muxer.ts\nvar GLOBAL_TIMESCALE = 1e3;\nvar SUPPORTED_VIDEO_CODECS = [\"avc\", \"hevc\", \"vp9\", \"av1\"];\nvar SUPPORTED_AUDIO_CODECS = [\"aac\", \"opus\"];\nvar TIMESTAMP_OFFSET = 2082844800;\nvar FIRST_TIMESTAMP_BEHAVIORS = [\"strict\", \"offset\", \"cross-track-offset\"];\nvar _options, _writer, _ftypSize, _mdat, _videoTrack, _audioTrack, _creationTime, _finalizedChunks, _nextFragmentNumber, _videoSampleQueue, _audioSampleQueue, _finalized, _validateOptions, validateOptions_fn, _writeHeader, writeHeader_fn, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn, _prepareTracks, prepareTracks_fn, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn, _createSampleForTrack, createSampleForTrack_fn, _addSampleToTrack, addSampleToTrack_fn, _validateTimestamp, validateTimestamp_fn, _finalizeCurrentChunk, finalizeCurrentChunk_fn, _finalizeFragment, finalizeFragment_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _ensureNotFinalized, ensureNotFinalized_fn;\nvar Muxer = class {\n constructor(options) {\n __privateAdd(this, _validateOptions);\n __privateAdd(this, _writeHeader);\n __privateAdd(this, _computeMoovSizeUpperBound);\n __privateAdd(this, _prepareTracks);\n // https://wiki.multimedia.cx/index.php/MPEG-4_Audio\n __privateAdd(this, _generateMpeg4AudioSpecificConfig);\n __privateAdd(this, _createSampleForTrack);\n __privateAdd(this, _addSampleToTrack);\n __privateAdd(this, _validateTimestamp);\n __privateAdd(this, _finalizeCurrentChunk);\n __privateAdd(this, _finalizeFragment);\n __privateAdd(this, _maybeFlushStreamingTargetWriter);\n __privateAdd(this, _ensureNotFinalized);\n __privateAdd(this, _options, void 0);\n __privateAdd(this, _writer, void 0);\n __privateAdd(this, _ftypSize, void 0);\n __privateAdd(this, _mdat, void 0);\n __privateAdd(this, _videoTrack, null);\n __privateAdd(this, _audioTrack, null);\n __privateAdd(this, _creationTime, Math.floor(Date.now() / 1e3) + TIMESTAMP_OFFSET);\n __privateAdd(this, _finalizedChunks, []);\n // Fields for fragmented MP4:\n __privateAdd(this, _nextFragmentNumber, 1);\n __privateAdd(this, _videoSampleQueue, []);\n __privateAdd(this, _audioSampleQueue, []);\n __privateAdd(this, _finalized, false);\n __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options);\n options.video = deepClone(options.video);\n options.audio = deepClone(options.audio);\n options.fastStart = deepClone(options.fastStart);\n this.target = options.target;\n __privateSet(this, _options, {\n firstTimestampBehavior: \"strict\",\n ...options\n });\n if (options.target instanceof ArrayBufferTarget) {\n __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target));\n } else if (options.target instanceof StreamTarget) {\n __privateSet(this, _writer, new StreamTargetWriter(options.target));\n } else if (options.target instanceof FileSystemWritableFileStreamTarget) {\n __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target));\n } else {\n throw new Error(`Invalid target: ${options.target}`);\n }\n __privateMethod(this, _prepareTracks, prepareTracks_fn).call(this);\n __privateMethod(this, _writeHeader, writeHeader_fn).call(this);\n }\n addVideoChunk(sample, meta, timestamp, compositionTimeOffset) {\n if (!(sample instanceof EncodedVideoChunk)) {\n throw new TypeError(\"addVideoChunk's first argument (sample) must be of type EncodedVideoChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addVideoChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunk's fourth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addVideoChunkRaw(\n data,\n sample.type,\n timestamp ?? sample.timestamp,\n sample.duration,\n meta,\n compositionTimeOffset\n );\n }\n addVideoChunkRaw(data, type, timestamp, duration, meta, compositionTimeOffset) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addVideoChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addVideoChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addVideoChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addVideoChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addVideoChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n if (compositionTimeOffset !== void 0 && !Number.isFinite(compositionTimeOffset)) {\n throw new TypeError(\n \"addVideoChunkRaw's sixth argument (compositionTimeOffset), when provided, must be a real number.\"\n );\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).video)\n throw new Error(\"No video track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _videoTrack).samples.length === __privateGet(this, _options).fastStart.expectedVideoChunks) {\n throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedVideoChunks}).`);\n }\n let videoSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _videoTrack), data, type, timestamp, duration, meta, compositionTimeOffset);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _audioTrack)) {\n while (__privateGet(this, _audioSampleQueue).length > 0 && __privateGet(this, _audioSampleQueue)[0].decodeTimestamp <= videoSample.decodeTimestamp) {\n let audioSample = __privateGet(this, _audioSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n if (videoSample.decodeTimestamp <= __privateGet(this, _audioTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n } else {\n __privateGet(this, _videoSampleQueue).push(videoSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n }\n addAudioChunk(sample, meta, timestamp) {\n if (!(sample instanceof EncodedAudioChunk)) {\n throw new TypeError(\"addAudioChunk's first argument (sample) must be of type EncodedAudioChunk.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunk's second argument (meta), when provided, must be an object.\");\n }\n if (timestamp !== void 0 && (!Number.isFinite(timestamp) || timestamp < 0)) {\n throw new TypeError(\n \"addAudioChunk's third argument (timestamp), when provided, must be a non-negative real number.\"\n );\n }\n let data = new Uint8Array(sample.byteLength);\n sample.copyTo(data);\n this.addAudioChunkRaw(data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta);\n }\n addAudioChunkRaw(data, type, timestamp, duration, meta) {\n if (!(data instanceof Uint8Array)) {\n throw new TypeError(\"addAudioChunkRaw's first argument (data) must be an instance of Uint8Array.\");\n }\n if (type !== \"key\" && type !== \"delta\") {\n throw new TypeError(\"addAudioChunkRaw's second argument (type) must be either 'key' or 'delta'.\");\n }\n if (!Number.isFinite(timestamp) || timestamp < 0) {\n throw new TypeError(\"addAudioChunkRaw's third argument (timestamp) must be a non-negative real number.\");\n }\n if (!Number.isFinite(duration) || duration < 0) {\n throw new TypeError(\"addAudioChunkRaw's fourth argument (duration) must be a non-negative real number.\");\n }\n if (meta && typeof meta !== \"object\") {\n throw new TypeError(\"addAudioChunkRaw's fifth argument (meta), when provided, must be an object.\");\n }\n __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this);\n if (!__privateGet(this, _options).audio)\n throw new Error(\"No audio track declared.\");\n if (typeof __privateGet(this, _options).fastStart === \"object\" && __privateGet(this, _audioTrack).samples.length === __privateGet(this, _options).fastStart.expectedAudioChunks) {\n throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedAudioChunks}).`);\n }\n let audioSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _audioTrack), data, type, timestamp, duration, meta);\n if (__privateGet(this, _options).fastStart === \"fragmented\" && __privateGet(this, _videoTrack)) {\n while (__privateGet(this, _videoSampleQueue).length > 0 && __privateGet(this, _videoSampleQueue)[0].decodeTimestamp <= audioSample.decodeTimestamp) {\n let videoSample = __privateGet(this, _videoSampleQueue).shift();\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n }\n if (audioSample.decodeTimestamp <= __privateGet(this, _videoTrack).lastDecodeTimestamp) {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n } else {\n __privateGet(this, _audioSampleQueue).push(audioSample);\n }\n } else {\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n }\n }\n /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */\n finalize() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot finalize a muxer more than once.\");\n }\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n for (let videoSample of __privateGet(this, _videoSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample);\n for (let audioSample of __privateGet(this, _audioSampleQueue))\n __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample);\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this, false);\n } else {\n if (__privateGet(this, _videoTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _videoTrack));\n if (__privateGet(this, _audioTrack))\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _audioTrack));\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter(Boolean);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n let mdatSize;\n for (let i = 0; i < 2; i++) {\n let movieBox2 = moov(tracks, __privateGet(this, _creationTime));\n let movieBoxSize = __privateGet(this, _writer).measureBox(movieBox2);\n mdatSize = __privateGet(this, _writer).measureBox(__privateGet(this, _mdat));\n let currentChunkPos = __privateGet(this, _writer).pos + movieBoxSize + mdatSize;\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n chunk.offset = currentChunkPos;\n for (let { data } of chunk.samples) {\n currentChunkPos += data.byteLength;\n mdatSize += data.byteLength;\n }\n }\n if (currentChunkPos < 2 ** 32)\n break;\n if (mdatSize >= 2 ** 32)\n __privateGet(this, _mdat).largeSize = true;\n }\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n __privateGet(this, _writer).writeBox(movieBox);\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n for (let chunk of __privateGet(this, _finalizedChunks)) {\n for (let sample of chunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let startPos = __privateGet(this, _writer).pos;\n let mfraBox = mfra(tracks);\n __privateGet(this, _writer).writeBox(mfraBox);\n let mfraBoxSize = __privateGet(this, _writer).pos - startPos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos - 4);\n __privateGet(this, _writer).writeU32(mfraBoxSize);\n } else {\n let mdatPos = __privateGet(this, _writer).offsets.get(__privateGet(this, _mdat));\n let mdatSize = __privateGet(this, _writer).pos - mdatPos;\n __privateGet(this, _mdat).size = mdatSize;\n __privateGet(this, _mdat).largeSize = mdatSize >= 2 ** 32;\n __privateGet(this, _writer).patchBox(__privateGet(this, _mdat));\n let movieBox = moov(tracks, __privateGet(this, _creationTime));\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n __privateGet(this, _writer).seek(__privateGet(this, _ftypSize));\n __privateGet(this, _writer).writeBox(movieBox);\n let remainingBytes = mdatPos - __privateGet(this, _writer).pos;\n __privateGet(this, _writer).writeBox(free(remainingBytes));\n } else {\n __privateGet(this, _writer).writeBox(movieBox);\n }\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n __privateGet(this, _writer).finalize();\n __privateSet(this, _finalized, true);\n }\n};\n_options = new WeakMap();\n_writer = new WeakMap();\n_ftypSize = new WeakMap();\n_mdat = new WeakMap();\n_videoTrack = new WeakMap();\n_audioTrack = new WeakMap();\n_creationTime = new WeakMap();\n_finalizedChunks = new WeakMap();\n_nextFragmentNumber = new WeakMap();\n_videoSampleQueue = new WeakMap();\n_audioSampleQueue = new WeakMap();\n_finalized = new WeakMap();\n_validateOptions = new WeakSet();\nvalidateOptions_fn = function(options) {\n if (typeof options !== \"object\") {\n throw new TypeError(\"The muxer requires an options object to be passed to its constructor.\");\n }\n if (!(options.target instanceof Target)) {\n throw new TypeError(\"The target must be provided and an instance of Target.\");\n }\n if (options.video) {\n if (!SUPPORTED_VIDEO_CODECS.includes(options.video.codec)) {\n throw new TypeError(`Unsupported video codec: ${options.video.codec}`);\n }\n if (!Number.isInteger(options.video.width) || options.video.width <= 0) {\n throw new TypeError(`Invalid video width: ${options.video.width}. Must be a positive integer.`);\n }\n if (!Number.isInteger(options.video.height) || options.video.height <= 0) {\n throw new TypeError(`Invalid video height: ${options.video.height}. Must be a positive integer.`);\n }\n const videoRotation = options.video.rotation;\n if (typeof videoRotation === \"number\" && ![0, 90, 180, 270].includes(videoRotation)) {\n throw new TypeError(`Invalid video rotation: ${videoRotation}. Has to be 0, 90, 180 or 270.`);\n } else if (Array.isArray(videoRotation) && (videoRotation.length !== 9 || videoRotation.some((value) => typeof value !== \"number\"))) {\n throw new TypeError(`Invalid video transformation matrix: ${videoRotation.join()}`);\n }\n if (options.video.frameRate !== void 0 && (!Number.isInteger(options.video.frameRate) || options.video.frameRate <= 0)) {\n throw new TypeError(\n `Invalid video frame rate: ${options.video.frameRate}. Must be a positive integer.`\n );\n }\n }\n if (options.audio) {\n if (!SUPPORTED_AUDIO_CODECS.includes(options.audio.codec)) {\n throw new TypeError(`Unsupported audio codec: ${options.audio.codec}`);\n }\n if (!Number.isInteger(options.audio.numberOfChannels) || options.audio.numberOfChannels <= 0) {\n throw new TypeError(\n `Invalid number of audio channels: ${options.audio.numberOfChannels}. Must be a positive integer.`\n );\n }\n if (!Number.isInteger(options.audio.sampleRate) || options.audio.sampleRate <= 0) {\n throw new TypeError(\n `Invalid audio sample rate: ${options.audio.sampleRate}. Must be a positive integer.`\n );\n }\n }\n if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) {\n throw new TypeError(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`);\n }\n if (typeof options.fastStart === \"object\") {\n if (options.video) {\n if (options.fastStart.expectedVideoChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedVideoChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedVideoChunks) || options.fastStart.expectedVideoChunks < 0) {\n throw new TypeError(`'expectedVideoChunks' must be a non-negative integer.`);\n }\n }\n if (options.audio) {\n if (options.fastStart.expectedAudioChunks === void 0) {\n throw new TypeError(`'fastStart' is an object but is missing property 'expectedAudioChunks'.`);\n } else if (!Number.isInteger(options.fastStart.expectedAudioChunks) || options.fastStart.expectedAudioChunks < 0) {\n throw new TypeError(`'expectedAudioChunks' must be a non-negative integer.`);\n }\n }\n } else if (![false, \"in-memory\", \"fragmented\"].includes(options.fastStart)) {\n throw new TypeError(`'fastStart' option must be false, 'in-memory', 'fragmented' or an object.`);\n }\n if (options.minFragmentDuration !== void 0 && (!Number.isFinite(options.minFragmentDuration) || options.minFragmentDuration < 0)) {\n throw new TypeError(`'minFragmentDuration' must be a non-negative number.`);\n }\n};\n_writeHeader = new WeakSet();\nwriteHeader_fn = function() {\n __privateGet(this, _writer).writeBox(ftyp({\n holdsAvc: __privateGet(this, _options).video?.codec === \"avc\",\n fragmented: __privateGet(this, _options).fastStart === \"fragmented\"\n }));\n __privateSet(this, _ftypSize, __privateGet(this, _writer).pos);\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n __privateSet(this, _mdat, mdat(false));\n } else if (__privateGet(this, _options).fastStart === \"fragmented\") {\n } else {\n if (typeof __privateGet(this, _options).fastStart === \"object\") {\n let moovSizeUpperBound = __privateMethod(this, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn).call(this);\n __privateGet(this, _writer).seek(__privateGet(this, _writer).pos + moovSizeUpperBound);\n }\n __privateSet(this, _mdat, mdat(true));\n __privateGet(this, _writer).writeBox(__privateGet(this, _mdat));\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_computeMoovSizeUpperBound = new WeakSet();\ncomputeMoovSizeUpperBound_fn = function() {\n if (typeof __privateGet(this, _options).fastStart !== \"object\")\n return;\n let upperBound = 0;\n let sampleCounts = [\n __privateGet(this, _options).fastStart.expectedVideoChunks,\n __privateGet(this, _options).fastStart.expectedAudioChunks\n ];\n for (let n of sampleCounts) {\n if (!n)\n continue;\n upperBound += (4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n);\n upperBound += 4 * n;\n upperBound += 8 * n;\n }\n upperBound += 4096;\n return upperBound;\n};\n_prepareTracks = new WeakSet();\nprepareTracks_fn = function() {\n if (__privateGet(this, _options).video) {\n __privateSet(this, _videoTrack, {\n id: 1,\n info: {\n type: \"video\",\n codec: __privateGet(this, _options).video.codec,\n width: __privateGet(this, _options).video.width,\n height: __privateGet(this, _options).video.height,\n rotation: __privateGet(this, _options).video.rotation ?? 0,\n decoderConfig: null\n },\n // The fallback contains many common frame rates as factors\n timescale: __privateGet(this, _options).video.frameRate ?? 57600,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n }\n if (__privateGet(this, _options).audio) {\n __privateSet(this, _audioTrack, {\n id: __privateGet(this, _options).video ? 2 : 1,\n info: {\n type: \"audio\",\n codec: __privateGet(this, _options).audio.codec,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate,\n decoderConfig: null\n },\n timescale: __privateGet(this, _options).audio.sampleRate,\n samples: [],\n finalizedChunks: [],\n currentChunk: null,\n firstDecodeTimestamp: void 0,\n lastDecodeTimestamp: -1,\n timeToSampleTable: [],\n compositionTimeOffsetTable: [],\n lastTimescaleUnits: null,\n lastSample: null,\n compactlyCodedChunkTable: []\n });\n if (__privateGet(this, _options).audio.codec === \"aac\") {\n let guessedCodecPrivate = __privateMethod(this, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn).call(\n this,\n 2,\n // Object type for AAC-LC, since it's the most common\n __privateGet(this, _options).audio.sampleRate,\n __privateGet(this, _options).audio.numberOfChannels\n );\n __privateGet(this, _audioTrack).info.decoderConfig = {\n codec: __privateGet(this, _options).audio.codec,\n description: guessedCodecPrivate,\n numberOfChannels: __privateGet(this, _options).audio.numberOfChannels,\n sampleRate: __privateGet(this, _options).audio.sampleRate\n };\n }\n }\n};\n_generateMpeg4AudioSpecificConfig = new WeakSet();\ngenerateMpeg4AudioSpecificConfig_fn = function(objectType, sampleRate, numberOfChannels) {\n let frequencyIndices = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350];\n let frequencyIndex = frequencyIndices.indexOf(sampleRate);\n let channelConfig = numberOfChannels;\n let configBits = \"\";\n configBits += objectType.toString(2).padStart(5, \"0\");\n configBits += frequencyIndex.toString(2).padStart(4, \"0\");\n if (frequencyIndex === 15)\n configBits += sampleRate.toString(2).padStart(24, \"0\");\n configBits += channelConfig.toString(2).padStart(4, \"0\");\n let paddingLength = Math.ceil(configBits.length / 8) * 8;\n configBits = configBits.padEnd(paddingLength, \"0\");\n let configBytes = new Uint8Array(configBits.length / 8);\n for (let i = 0; i < configBits.length; i += 8) {\n configBytes[i / 8] = parseInt(configBits.slice(i, i + 8), 2);\n }\n return configBytes;\n};\n_createSampleForTrack = new WeakSet();\ncreateSampleForTrack_fn = function(track, data, type, timestamp, duration, meta, compositionTimeOffset) {\n let presentationTimestampInSeconds = timestamp / 1e6;\n let decodeTimestampInSeconds = (timestamp - (compositionTimeOffset ?? 0)) / 1e6;\n let durationInSeconds = duration / 1e6;\n let adjusted = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, presentationTimestampInSeconds, decodeTimestampInSeconds, track);\n presentationTimestampInSeconds = adjusted.presentationTimestamp;\n decodeTimestampInSeconds = adjusted.decodeTimestamp;\n if (meta?.decoderConfig) {\n if (track.info.decoderConfig === null) {\n track.info.decoderConfig = meta.decoderConfig;\n } else {\n Object.assign(track.info.decoderConfig, meta.decoderConfig);\n }\n }\n let sample = {\n presentationTimestamp: presentationTimestampInSeconds,\n decodeTimestamp: decodeTimestampInSeconds,\n duration: durationInSeconds,\n data,\n size: data.byteLength,\n type,\n // Will be refined once the next sample comes in\n timescaleUnitsToNextSample: intoTimescale(durationInSeconds, track.timescale)\n };\n return sample;\n};\n_addSampleToTrack = new WeakSet();\naddSampleToTrack_fn = function(track, sample) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.samples.push(sample);\n }\n const sampleCompositionTimeOffset = intoTimescale(sample.presentationTimestamp - sample.decodeTimestamp, track.timescale);\n if (track.lastTimescaleUnits !== null) {\n let timescaleUnits = intoTimescale(sample.decodeTimestamp, track.timescale, false);\n let delta = Math.round(timescaleUnits - track.lastTimescaleUnits);\n track.lastTimescaleUnits += delta;\n track.lastSample.timescaleUnitsToNextSample = delta;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n let lastTableEntry = last(track.timeToSampleTable);\n if (lastTableEntry.sampleCount === 1) {\n lastTableEntry.sampleDelta = delta;\n lastTableEntry.sampleCount++;\n } else if (lastTableEntry.sampleDelta === delta) {\n lastTableEntry.sampleCount++;\n } else {\n lastTableEntry.sampleCount--;\n track.timeToSampleTable.push({\n sampleCount: 2,\n sampleDelta: delta\n });\n }\n const lastCompositionTimeOffsetTableEntry = last(track.compositionTimeOffsetTable);\n if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) {\n lastCompositionTimeOffsetTableEntry.sampleCount++;\n } else {\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n } else {\n track.lastTimescaleUnits = 0;\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n track.timeToSampleTable.push({\n sampleCount: 1,\n sampleDelta: intoTimescale(sample.duration, track.timescale)\n });\n track.compositionTimeOffsetTable.push({\n sampleCount: 1,\n sampleCompositionTimeOffset\n });\n }\n }\n track.lastSample = sample;\n let beginNewChunk = false;\n if (!track.currentChunk) {\n beginNewChunk = true;\n } else {\n let currentChunkDuration = sample.presentationTimestamp - track.currentChunk.startTimestamp;\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n let mostImportantTrack = __privateGet(this, _videoTrack) ?? __privateGet(this, _audioTrack);\n const chunkDuration = __privateGet(this, _options).minFragmentDuration ?? 1;\n if (track === mostImportantTrack && sample.type === \"key\" && currentChunkDuration >= chunkDuration) {\n beginNewChunk = true;\n __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this);\n }\n } else {\n beginNewChunk = currentChunkDuration >= 0.5;\n }\n }\n if (beginNewChunk) {\n if (track.currentChunk) {\n __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, track);\n }\n track.currentChunk = {\n startTimestamp: sample.presentationTimestamp,\n samples: []\n };\n }\n track.currentChunk.samples.push(sample);\n};\n_validateTimestamp = new WeakSet();\nvalidateTimestamp_fn = function(presentationTimestamp, decodeTimestamp, track) {\n const strictTimestampBehavior = __privateGet(this, _options).firstTimestampBehavior === \"strict\";\n const noLastDecodeTimestamp = track.lastDecodeTimestamp === -1;\n const timestampNonZero = decodeTimestamp !== 0;\n if (strictTimestampBehavior && noLastDecodeTimestamp && timestampNonZero) {\n throw new Error(\n `The first chunk for your media track must have a timestamp of 0 (received DTS=${decodeTimestamp}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want.\n\nIf you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options.\n`\n );\n } else if (__privateGet(this, _options).firstTimestampBehavior === \"offset\" || __privateGet(this, _options).firstTimestampBehavior === \"cross-track-offset\") {\n if (track.firstDecodeTimestamp === void 0) {\n track.firstDecodeTimestamp = decodeTimestamp;\n }\n let baseDecodeTimestamp;\n if (__privateGet(this, _options).firstTimestampBehavior === \"offset\") {\n baseDecodeTimestamp = track.firstDecodeTimestamp;\n } else {\n baseDecodeTimestamp = Math.min(\n __privateGet(this, _videoTrack)?.firstDecodeTimestamp ?? Infinity,\n __privateGet(this, _audioTrack)?.firstDecodeTimestamp ?? Infinity\n );\n }\n decodeTimestamp -= baseDecodeTimestamp;\n presentationTimestamp -= baseDecodeTimestamp;\n }\n if (decodeTimestamp < track.lastDecodeTimestamp) {\n throw new Error(\n `Timestamps must be monotonically increasing (DTS went from ${track.lastDecodeTimestamp * 1e6} to ${decodeTimestamp * 1e6}).`\n );\n }\n track.lastDecodeTimestamp = decodeTimestamp;\n return { presentationTimestamp, decodeTimestamp };\n};\n_finalizeCurrentChunk = new WeakSet();\nfinalizeCurrentChunk_fn = function(track) {\n if (__privateGet(this, _options).fastStart === \"fragmented\") {\n throw new Error(\"Can't finalize individual chunks if 'fastStart' is set to 'fragmented'.\");\n }\n if (!track.currentChunk)\n return;\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n if (track.compactlyCodedChunkTable.length === 0 || last(track.compactlyCodedChunkTable).samplesPerChunk !== track.currentChunk.samples.length) {\n track.compactlyCodedChunkTable.push({\n firstChunk: track.finalizedChunks.length,\n // 1-indexed\n samplesPerChunk: track.currentChunk.samples.length\n });\n }\n if (__privateGet(this, _options).fastStart === \"in-memory\") {\n track.currentChunk.offset = 0;\n return;\n }\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n};\n_finalizeFragment = new WeakSet();\nfinalizeFragment_fn = function(flushStreamingWriter = true) {\n if (__privateGet(this, _options).fastStart !== \"fragmented\") {\n throw new Error(\"Can't finalize a fragment unless 'fastStart' is set to 'fragmented'.\");\n }\n let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter((track) => track && track.currentChunk);\n if (tracks.length === 0)\n return;\n let fragmentNumber = __privateWrapper(this, _nextFragmentNumber)._++;\n if (fragmentNumber === 1) {\n let movieBox = moov(tracks, __privateGet(this, _creationTime), true);\n __privateGet(this, _writer).writeBox(movieBox);\n }\n let moofOffset = __privateGet(this, _writer).pos;\n let moofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(moofBox);\n {\n let mdatBox = mdat(false);\n let totalTrackSampleSize = 0;\n for (let track of tracks) {\n for (let sample of track.currentChunk.samples) {\n totalTrackSampleSize += sample.size;\n }\n }\n let mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n if (mdatSize >= 2 ** 32) {\n mdatBox.largeSize = true;\n mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize;\n }\n mdatBox.size = mdatSize;\n __privateGet(this, _writer).writeBox(mdatBox);\n }\n for (let track of tracks) {\n track.currentChunk.offset = __privateGet(this, _writer).pos;\n track.currentChunk.moofOffset = moofOffset;\n for (let sample of track.currentChunk.samples) {\n __privateGet(this, _writer).write(sample.data);\n sample.data = null;\n }\n }\n let endPos = __privateGet(this, _writer).pos;\n __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(moofBox));\n let newMoofBox = moof(fragmentNumber, tracks);\n __privateGet(this, _writer).writeBox(newMoofBox);\n __privateGet(this, _writer).seek(endPos);\n for (let track of tracks) {\n track.finalizedChunks.push(track.currentChunk);\n __privateGet(this, _finalizedChunks).push(track.currentChunk);\n track.currentChunk = null;\n }\n if (flushStreamingWriter) {\n __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this);\n }\n};\n_maybeFlushStreamingTargetWriter = new WeakSet();\nmaybeFlushStreamingTargetWriter_fn = function() {\n if (__privateGet(this, _writer) instanceof StreamTargetWriter) {\n __privateGet(this, _writer).flush();\n }\n};\n_ensureNotFinalized = new WeakSet();\nensureNotFinalized_fn = function() {\n if (__privateGet(this, _finalized)) {\n throw new Error(\"Cannot add new video or audio chunks after the file has been finalized.\");\n }\n};\nexport {\n ArrayBufferTarget,\n FileSystemWritableFileStreamTarget,\n Muxer,\n StreamTarget\n};\n","import { Muxer, ArrayBufferTarget } from 'mp4-muxer';\nimport type { Scene, Timeline, AnimCtx } from './types';\nimport { AnimCtxImpl } from './context';\n\nexport interface RenderOptions {\n scene: Scene;\n timeline: Timeline<AnimCtx>;\n fps: number;\n bitrate: number;\n scale: number; // 1 = 720p, 2 = 1440p, etc.\n onProgress: (progress: number, frame: number, totalFrames: number) => void;\n}\n\nexport interface RenderResult {\n blob: Blob;\n duration: number;\n frames: number;\n}\n\nexport interface RenderController {\n start(): Promise<RenderResult>;\n cancel(): void;\n}\n\nconst CANVAS_WIDTH = 1280;\nconst CANVAS_HEIGHT = 720;\n\nexport function isWebCodecsSupported(): boolean {\n return typeof VideoEncoder !== 'undefined' && typeof VideoFrame !== 'undefined';\n}\n\nexport function createVideoRenderer(options: RenderOptions): RenderController {\n const { scene, timeline, fps, bitrate, scale, onProgress } = options;\n\n let cancelled = false;\n let encoder: VideoEncoder | null = null;\n let muxer: Muxer<ArrayBufferTarget> | null = null;\n let encoderError: Error | null = null;\n\n return {\n async start(): Promise<RenderResult> {\n if (!isWebCodecsSupported()) {\n throw new Error('WebCodecs is not supported in this browser. Please use Chrome, Edge, or Opera.');\n }\n\n const duration = timeline.duration;\n const totalFrames = Math.ceil((duration / 1000) * fps);\n const frameDurationUs = 1_000_000 / fps;\n\n // Canvas at scaled resolution\n const videoWidth = CANVAS_WIDTH * scale;\n const videoHeight = CANVAS_HEIGHT * scale;\n const canvas = document.createElement('canvas');\n canvas.width = videoWidth;\n canvas.height = videoHeight;\n const ctx = canvas.getContext('2d')!;\n\n // Create animation context\n const animCtx = new AnimCtxImpl();\n\n // Set up MP4 muxer\n muxer = new Muxer({\n target: new ArrayBufferTarget(),\n video: {\n codec: 'avc',\n width: videoWidth,\n height: videoHeight,\n },\n fastStart: 'in-memory',\n });\n\n // Set up VideoEncoder\n encoder = new VideoEncoder({\n output: (chunk, meta) => {\n if (cancelled || !muxer) return;\n muxer.addVideoChunk(chunk, meta);\n },\n error: (e) => {\n console.error('VideoEncoder error:', e);\n encoderError = e;\n },\n });\n\n encoder.configure({\n codec: 'avc1.640032', // H.264 High Profile Level 5.1 (supports up to 4K)\n width: videoWidth,\n height: videoHeight,\n bitrate: bitrate,\n framerate: fps,\n });\n\n // Render frames\n for (let frame = 0; frame < totalFrames && !cancelled && !encoderError; frame++) {\n const timeMs = (frame / fps) * 1000;\n\n // Render frame\n animCtx.reset(scene);\n timeline.evaluate(timeMs, animCtx);\n const solved = animCtx.solve(scene);\n\n // Clear canvas and render scene at specified scale\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n scene.render(solved, canvas, scale);\n\n // Create VideoFrame from canvas\n const videoFrame = new VideoFrame(canvas, {\n timestamp: frame * frameDurationUs,\n });\n\n // Encode frame (keyframe every 1 second)\n const keyFrame = frame % fps === 0;\n encoder.encode(videoFrame, { keyFrame });\n videoFrame.close();\n\n // Report progress\n onProgress((frame + 1) / totalFrames, frame + 1, totalFrames);\n\n // Yield to UI thread periodically\n if (frame % 5 === 0) {\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n }\n\n if (encoderError) {\n throw encoderError;\n }\n\n if (cancelled) {\n encoder.close();\n throw new Error('Rendering cancelled');\n }\n\n // Flush encoder and finalize muxer\n await encoder.flush();\n encoder.close();\n encoder = null;\n\n if (cancelled || !muxer) {\n throw new Error('Rendering cancelled');\n }\n\n muxer.finalize();\n const buffer = muxer.target.buffer;\n muxer = null;\n\n const blob = new Blob([buffer], { type: 'video/mp4' });\n\n return {\n blob,\n duration: duration,\n frames: totalFrames,\n };\n },\n\n cancel() {\n cancelled = true;\n if (encoder && encoder.state !== 'closed') {\n encoder.close();\n }\n },\n };\n}\n\nexport function downloadBlob(blob: Blob, filename: string) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n"],"names":["cos","sin","transformedX","transformedY","scale","scaleX","scaleY","angle","last","allMembers","url"],"mappings":"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","x_google_ignoreList":[4]}