Skip to content

Commit c24aa8d

Browse files
committed
refactor: give the preset builders their own keyframe type
1 parent 6db0616 commit c24aa8d

5 files changed

Lines changed: 22 additions & 19 deletions

File tree

‎src/components/canvas/players/player.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import {
1919
import { Pointer } from "@inputs/pointer";
2020
import { type Size, type Vector } from "@layouts/geometry";
2121
import { relativeToAbsolute, absoluteToRelative } from "@layouts/position-builder";
22-
import { type Clip, type ResolvedClip, type Keyframe } from "@schemas";
22+
import { type Clip, type ResolvedClip } from "@schemas";
2323
import * as pixi from "pixi.js";
2424

2525
import { Entity } from "../../../core/shared/entity";
@@ -222,13 +222,13 @@ export abstract class Player extends Entity {
222222
this.rotationKeyframeBuilder.addLayer(transitionSet.out.rotationKeyframes);
223223

224224
// Mask keyframes (reveal effect)
225-
const maskXKeyframes: Keyframe[] = [...transitionSet.in.maskXKeyframes, ...transitionSet.out.maskXKeyframes];
225+
const maskXKeyframes = [...transitionSet.in.maskXKeyframes, ...transitionSet.out.maskXKeyframes];
226226
if (maskXKeyframes.length) {
227227
this.maskXKeyframeBuilder = new KeyframeBuilder(maskXKeyframes, length);
228228
}
229229

230230
// Wipe brightness sweep (wipeLeft/wipeRight) — driven through WipeFilter, not a mask.
231-
const brightnessKeyframes: Keyframe[] = [...transitionSet.in.brightnessKeyframes, ...transitionSet.out.brightnessKeyframes];
231+
const brightnessKeyframes = [...transitionSet.in.brightnessKeyframes, ...transitionSet.out.brightnessKeyframes];
232232
if (brightnessKeyframes.length) {
233233
this.wipeBrightnessBuilder = new KeyframeBuilder(brightnessKeyframes, length);
234234
this.wipeInFromRight = transitionSet.in.wipeFromRight;

‎src/core/animations/composed-keyframe-builder.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type Keyframe } from "@schemas";
1+
import { type AnimationKeyframe } from "@schemas";
22

33
import { KeyframeBuilder } from "./keyframe-builder";
44

@@ -31,7 +31,7 @@ export class ComposedKeyframeBuilder {
3131
* For additive mode, keyframes should represent deltas (e.g., 0 → 0.1 means "move by 0.1")
3232
* For multiplicative mode, keyframes should represent factors (e.g., 1 → 1.3 means "scale by 1.3x")
3333
*/
34-
addLayer(keyframes: Keyframe[]): void {
34+
addLayer(keyframes: AnimationKeyframe[]): void {
3535
if (keyframes.length === 0) return;
3636

3737
const neutralValue = this.mode === "additive" ? 0 : 1;

‎src/core/animations/keyframe-builder.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type Keyframe, type NumericKeyframe } from "@schemas";
1+
import { type AnimationKeyframe, type NumericKeyframe } from "@schemas";
22

33
import { CurveInterpolator } from "./curve-interpolator";
44

@@ -18,7 +18,7 @@ export class KeyframeBuilder {
1818

1919
private cachedIndex = 0;
2020

21-
constructor(value: Keyframe[] | number, length: number, initialValue = 0) {
21+
constructor(value: AnimationKeyframe[] | number, length: number, initialValue = 0) {
2222
this.property = this.createKeyframes(value, length, initialValue);
2323
this.length = length;
2424

@@ -110,7 +110,7 @@ export class KeyframeBuilder {
110110
return -1;
111111
}
112112

113-
private createKeyframes(value: Keyframe[] | number, length: number, initialValue = 0): NumericKeyframe[] {
113+
private createKeyframes(value: AnimationKeyframe[] | number, length: number, initialValue = 0): NumericKeyframe[] {
114114
if (typeof value === "number") {
115115
return [{ start: 0, length, from: value, to: value }];
116116
}
@@ -127,9 +127,9 @@ export class KeyframeBuilder {
127127
return this.insertFillerKeyframes(normalizedKeyframes, length, initialValue);
128128
}
129129

130-
private createNormalizedKeyframes(keyframes: Keyframe[]): NumericKeyframe[] {
130+
private createNormalizedKeyframes(keyframes: AnimationKeyframe[]): NumericKeyframe[] {
131131
return keyframes
132-
.filter((kf): kf is Keyframe & { start: number; length: number } => typeof kf.start === "number" && typeof kf.length === "number")
132+
.filter((kf): kf is AnimationKeyframe & { start: number; length: number } => typeof kf.start === "number" && typeof kf.length === "number")
133133
.sort((a, b) => a.start - b.start)
134134
.map(keyframe => ({
135135
start: keyframe.start,

‎src/core/animations/transition-preset-builder.ts‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { type ResolvedClip, type Keyframe } from "@schemas";
1+
import { type ResolvedClip, type AnimationKeyframe } from "@schemas";
22

33
export type TransitionKeyframeSet = {
4-
offsetXKeyframes: Keyframe[];
5-
offsetYKeyframes: Keyframe[];
6-
opacityKeyframes: Keyframe[];
7-
scaleKeyframes: Keyframe[];
8-
rotationKeyframes: Keyframe[];
9-
maskXKeyframes: Keyframe[];
4+
offsetXKeyframes: AnimationKeyframe[];
5+
offsetYKeyframes: AnimationKeyframe[];
6+
opacityKeyframes: AnimationKeyframe[];
7+
scaleKeyframes: AnimationKeyframe[];
8+
rotationKeyframes: AnimationKeyframe[];
9+
maskXKeyframes: AnimationKeyframe[];
1010
/** Wipe brightness sweep (+1 hidden → −1 revealed), applied through WipeFilter. */
11-
brightnessKeyframes: Keyframe[];
11+
brightnessKeyframes: AnimationKeyframe[];
1212
/** Wipe reveal direction for this phase: true = from the right edge inward, false = from the left. */
1313
wipeFromRight: boolean;
1414
};

‎src/core/schemas/index.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,16 @@ export type ExtendedCaptionAsset = CaptionAsset & {
122122
// ─── Internal Animation Types ───────────────────────────────────────────────
123123
// Keyframes with all required fields and numeric values for animation interpolation
124124

125+
/** A tween as the animation code reads it. */
126+
export type AnimationKeyframe = Tween;
127+
125128
export interface NumericKeyframe {
126129
start: number;
127130
length: number;
128131
from: number;
129132
to: number;
130133
interpolation?: Tween["interpolation"];
131-
easing?: Tween["easing"];
134+
easing?: AnimationKeyframe["easing"];
132135
}
133136

134137
// ─── Zod Schemas (for validation) ──────────────────────────────────────────

0 commit comments

Comments
 (0)