@omnimedia/omnitool
Version:
open source video processing tools
81 lines (66 loc) • 2.52 kB
text/typescript
import {animationPresets} from "./presets.js"
import type {Item, VisualAnimatableItem} from "../item.js"
import {visualAnimations, animatableProperties} from "./properties.js"
import type {Anim, Interpolation, Keyframes, ScalarAnimation, TrackTransform, TransformAnimation, TransformOptions, Vec2} from "../../types.js"
export type AnimationType = "scalar" | "transform"
export type AnimationChannelType = "number"
export type AnimationUnit = "pixel" | "scale" | "degree" | "ratio"
export type AnimationChannel = {
path?: string
type: AnimationChannelType
default: number
unit?: AnimationUnit
range?: readonly [min: number, max: number]
}
export type AnimationDefinition = {
type: AnimationType
defaultTerp: Interpolation
channels: readonly AnimationChannel[]
}
export type MotionAnimationPresetDefinition = {
type: "motion"
label: string
defaults: Required<Omit<MotionAnimationOptions, "offset">>
transform: {
from: TransformOptions
to: TransformOptions
}
}
export type ScalarAnimationPresetDefinition = {
type: "scalar"
label: string
defaults: Required<Omit<ScalarAnimationOptions, "offset">>
}
export type AnimationPresetDefinition =
| MotionAnimationPresetDefinition
| ScalarAnimationPresetDefinition
export type VisualAnimationProperty = keyof typeof visualAnimations
export type AnimationProperty = keyof typeof animatableProperties
export type AnimationPreset = keyof typeof animationPresets
type AnimationPresetAction<TPreset extends AnimationPresetDefinition> =
TPreset extends MotionAnimationPresetDefinition
? (options?: MotionAnimationOptions) => Anim<TrackTransform>
: TPreset extends ScalarAnimationPresetDefinition
? (options?: ScalarAnimationOptions) => Anim<Keyframes>
: never
export type AnimationPresetActions = {
[TName in AnimationPreset]: AnimationPresetAction<(typeof animationPresets)[TName]>
}
export type AnimationPresetOptions<Value> = {
duration?: number
offset?: number
from?: Value
to?: Value
terp?: Interpolation
}
export type MotionAnimationOptions = AnimationPresetOptions<Vec2>
export type ScalarAnimationOptions = AnimationPresetOptions<number>
export type PresetAnimation = ScalarAnimation | TransformAnimation
export type PresetOptions = MotionAnimationOptions | ScalarAnimationOptions
export interface PresetAnimateAction {
<T extends VisualAnimatableItem>(item: T, options?: PresetOptions): T
make(options?: PresetOptions): Item.Animation
}
export type PresetAnimateActions = {
[TKey in AnimationPreset]: PresetAnimateAction
}