import type { InteractivitySchema } from './interactivity-schema.js';
import type { ExtrapolateType, InterpolateOutputOption } from './interpolate.js';
import type { CanUpdateSequencePropsResponse, SequencePropsSubscriptionKey } from './SequenceManager.js';
export type CanUpdateSequencePropStatusStatic = {
    status: 'static';
    codeValue: unknown;
    keyframeDisplayOffsetAdjustment: number | null;
    numericExpression?: VideoConfigNumericExpression;
};
export type CanUpdateSequencePropStatusKeyframe = {
    frame: number;
    value: unknown;
    frameExpression?: VideoConfigNumericExpression;
};
export type VideoConfigNumericExpression = {
    type: 'literal';
    value: number;
} | {
    type: 'video-config-value';
    identifier: string;
    value: number;
} | {
    type: 'video-config-multiplication';
    identifier: string;
    multiplier: number;
    multiplicand: number;
    factorPosition: 'left' | 'right';
    value: number;
} | {
    type: 'video-config-subtraction';
    identifier: string;
    minuend: number;
    subtrahend: number;
    value: number;
};
export type CanUpdateSequencePropStatusLinearEasing = {
    type: 'linear';
};
export type CanUpdateSequencePropStatusStep1Easing = {
    type: 'step1';
};
export type CanUpdateSequencePropStatusBezierEasing = {
    type: 'bezier';
    x1: number;
    y1: number;
    x2: number;
    y2: number;
};
export type CanUpdateSequencePropStatusSpringEasing = {
    type: 'spring';
    allowTail: boolean | null;
    damping: number;
    mass: number;
    stiffness: number;
    overshootClamping: boolean;
    durationRestThreshold: number | null;
};
export type CanUpdateSequencePropStatusEasing = CanUpdateSequencePropStatusLinearEasing | CanUpdateSequencePropStatusStep1Easing | CanUpdateSequencePropStatusBezierEasing | CanUpdateSequencePropStatusSpringEasing;
export declare const DEFAULT_LINEAR_EASING: CanUpdateSequencePropStatusLinearEasing;
export type CanUpdateSequencePropStatusClamping = {
    left: ExtrapolateType;
    right: ExtrapolateType;
};
export type CanUpdateSequencePropStatusInterpolationFunction = 'interpolate' | 'interpolateColors';
export type CanUpdateSequencePropStatusComputed = {
    status: 'computed';
};
export type CanUpdateSequencePropStatusKeyframed = {
    status: 'keyframed';
    interpolationFunction: CanUpdateSequencePropStatusInterpolationFunction;
    /**
     * Added to the timeline track's keyframe display offset and subtracted from
     * the controlled element's local frame when evaluating the interpolation.
     * This is non-zero when the useCurrentFrame() call is outside a timing
     * element that wraps the controlled element.
     */
    keyframeDisplayOffsetAdjustment: number | null;
    keyframes: CanUpdateSequencePropStatusKeyframe[];
    easing: CanUpdateSequencePropStatusEasing[];
    clamping: CanUpdateSequencePropStatusClamping;
    posterize: number | undefined;
    output: InterpolateOutputOption | undefined;
};
export type CanUpdateSequencePropStatusFalse = CanUpdateSequencePropStatusComputed;
export type CanUpdateSequencePropStatus = CanUpdateSequencePropStatusStatic | CanUpdateSequencePropStatusKeyframed | CanUpdateSequencePropStatusFalse;
export type DragOverrideValue = {
    readonly type: 'static';
    readonly value: unknown;
} | {
    readonly type: 'keyframed';
    readonly status: CanUpdateSequencePropStatusKeyframed;
};
export type DragOverrides = Record<string, Record<string, DragOverrideValue>>;
export type EffectDragOverrides = Record<string, Record<string, DragOverrideValue>>;
export type PropStatuses = Record<string, CanUpdateSequencePropsResponse>;
export type GetPropStatuses = (nodePath: SequencePropsSubscriptionKey) => Record<string, CanUpdateSequencePropStatus> | undefined;
export type GetEffectPropStatuses = (nodePath: SequencePropsSubscriptionKey, effectIndex: number) => Record<string, CanUpdateSequencePropStatus> | undefined;
export type GetDragOverrides = (nodePath: SequencePropsSubscriptionKey) => DragOverrides[string];
export type GetEffectDragOverrides = (nodePath: SequencePropsSubscriptionKey, effectIndex: number) => Record<string, DragOverrideValue>;
export declare const makeStaticDragOverride: (value: unknown) => DragOverrideValue;
export declare const makeKeyframedDragOverride: ({ status, frame, value, defaultEasing, }: {
    status: CanUpdateSequencePropStatusKeyframed;
    frame: number;
    value: unknown;
    defaultEasing?: CanUpdateSequencePropStatusEasing | undefined;
}) => DragOverrideValue;
export declare const getStaticDragOverrideValue: (dragOverrideValue: DragOverrideValue | undefined) => unknown;
export declare const isKeyframedStatus: (status: CanUpdateSequencePropStatus | null) => status is CanUpdateSequencePropStatusKeyframed;
export declare const computeEffectiveSchemaValuesDotNotation: ({ schema, currentValue, overrideValues, propStatus, frame, }: {
    schema: InteractivitySchema;
    currentValue: Record<string, unknown>;
    overrideValues: Record<string, DragOverrideValue>;
    propStatus: Record<string, CanUpdateSequencePropStatus> | undefined;
    frame: number | null;
}) => {
    merged: Record<string, unknown>;
    propsToDelete: Set<string>;
};
