summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/animation/vector-channel.ts
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-06 01:23:47 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-06 01:23:47 +0200
commitfcc09e80e253831a163e2e4941542e0b34f80740 (patch)
tree4cc7aafd0756bb3fa23dfd41080237e462b5ecf2 /apps/web/src/lib/animation/vector-channel.ts
parentc56d6f8188cc1c0e72d75611269a8bda7b79e727 (diff)
parentdedb13546a16235e7d6649961d0c9b235f62aa34 (diff)
downloadopencut-fcc09e80e253831a163e2e4941542e0b34f80740.tar.gz
Merge branch 'temp'
Diffstat (limited to 'apps/web/src/lib/animation/vector-channel.ts')
-rw-r--r--apps/web/src/lib/animation/vector-channel.ts72
1 files changed, 0 insertions, 72 deletions
diff --git a/apps/web/src/lib/animation/vector-channel.ts b/apps/web/src/lib/animation/vector-channel.ts
deleted file mode 100644
index f7f65049..00000000
--- a/apps/web/src/lib/animation/vector-channel.ts
+++ /dev/null
@@ -1,72 +0,0 @@
-import type {
- AnimationPropertyPath,
- ElementAnimations,
- VectorAnimationChannel,
- VectorValue,
-} from "@/lib/animation/types";
-
-export function isVectorValue(value: unknown): value is VectorValue {
- return (
- typeof value === "object" &&
- value !== null &&
- "x" in value &&
- "y" in value &&
- typeof (value as VectorValue).x === "number" &&
- typeof (value as VectorValue).y === "number"
- );
-}
-
-export function getVectorChannelForPath({
- animations,
- propertyPath,
-}: {
- animations: ElementAnimations | undefined;
- propertyPath: AnimationPropertyPath;
-}): VectorAnimationChannel | undefined {
- const channel = animations?.channels[propertyPath];
- if (!channel || channel.valueKind !== "vector") {
- return undefined;
- }
- return channel;
-}
-
-export function getVectorChannelValueAtTime({
- channel,
- time,
- fallbackValue,
-}: {
- channel: VectorAnimationChannel | undefined;
- time: number;
- fallbackValue: VectorValue;
-}): VectorValue {
- if (!channel || channel.keyframes.length === 0) {
- return fallbackValue;
- }
-
- const keyframes = [...channel.keyframes].sort((a, b) => a.time - b.time);
- const first = keyframes[0];
- const last = keyframes[keyframes.length - 1];
-
- if (!first || !last) return fallbackValue;
- if (time <= first.time) return first.value;
- if (time >= last.time) return last.value;
-
- for (let i = 0; i < keyframes.length - 1; i++) {
- const left = keyframes[i];
- const right = keyframes[i + 1];
- if (time < left.time || time > right.time) continue;
-
- if (left.interpolation === "hold") return left.value;
-
- const span = right.time - left.time;
- if (span === 0) return right.value;
-
- const t = (time - left.time) / span;
- return {
- x: left.value.x + (right.value.x - left.value.x) * t,
- y: left.value.y + (right.value.y - left.value.y) * t,
- };
- }
-
- return last.value;
-}