@it-compiles/anima 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-MRRNy8I9.js","sources":["../src/core/types.ts","../src/core/math.ts","../src/core/context.ts","../src/core/player.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"],"names":["cos","sin","transformedX","transformedY","scale","scaleX","scaleY","angle","allMembers"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type CSSProperties } from 'react';
2
+ import type { AnimationModule } from '../core/define-animation';
3
+ export interface AnimaPlayerProps {
4
+ /** The animation module from defineAnimation() */
5
+ animation: AnimationModule | null;
6
+ /** Canvas width in pixels (default: 1280) */
7
+ width?: number;
8
+ /** Canvas height in pixels (default: 720) */
9
+ height?: number;
10
+ /** Start playing automatically */
11
+ autoPlay?: boolean;
12
+ /** Loop the animation */
13
+ loop?: boolean;
14
+ /** Show playback controls */
15
+ controls?: boolean;
16
+ /** Show debug overlay */
17
+ debug?: boolean;
18
+ /** Show coordinate overlay on hover */
19
+ showCoordinates?: boolean;
20
+ /** Called when playback time updates */
21
+ onTimeUpdate?: (time: number) => void;
22
+ /** Called when animation completes */
23
+ onComplete?: () => void;
24
+ /** Called when an error occurs */
25
+ onError?: (error: Error) => void;
26
+ /** Additional class name for the container */
27
+ className?: string;
28
+ /** Additional styles for the container */
29
+ style?: CSSProperties;
30
+ }
31
+ export interface AnimaPlayerHandle {
32
+ play(): void;
33
+ pause(): void;
34
+ stop(): void;
35
+ seek(timeMs: number): void;
36
+ readonly isPlaying: boolean;
37
+ readonly currentTime: number;
38
+ readonly duration: number;
39
+ }
40
+ export declare const AnimaPlayer: import("react").ForwardRefExoticComponent<AnimaPlayerProps & import("react").RefAttributes<AnimaPlayerHandle>>;
@@ -0,0 +1,2 @@
1
+ export { AnimaPlayer } from './AnimaPlayer';
2
+ export type { AnimaPlayerProps, AnimaPlayerHandle } from './AnimaPlayer';
@@ -0,0 +1 @@
1
+ export * from './react/index';