{"version":3,"file":"KeyframesResolver.mjs","sources":["../../../../src/animation/keyframes/KeyframesResolver.ts"],"sourcesContent":["import { frame } from \"../../frameloop\"\nimport { MotionValue } from \"../../value\"\nimport { AnyResolvedKeyframe } from \"../types\"\nimport { WithRender } from \"./types\"\nimport { fillWildcards } from \"./utils/fill-wildcards\"\nimport { removeNonTranslationalTransform } from \"./utils/unit-conversion\"\n\nexport type UnresolvedKeyframes<T extends AnyResolvedKeyframe> = Array<T | null>\n\nexport type ResolvedKeyframes<T extends AnyResolvedKeyframe> = Array<T>\n\nconst toResolve = new Set<KeyframeResolver>()\nlet isScheduled = false\nlet anyNeedsMeasurement = false\nlet isForced = false\n\nfunction measureAllKeyframes() {\n    if (anyNeedsMeasurement) {\n        const resolversToMeasure = Array.from(toResolve).filter(\n            (resolver: KeyframeResolver) => resolver.needsMeasurement\n        )\n        const elementsToMeasure = new Set(\n            resolversToMeasure.map((resolver) => resolver.element)\n        )\n        const transformsToRestore = new Map<\n            WithRender,\n            [string, AnyResolvedKeyframe][]\n        >()\n\n        /**\n         * Write pass\n         * If we're measuring elements we want to remove bounding box-changing transforms.\n         */\n        elementsToMeasure.forEach((element: WithRender) => {\n            const removedTransforms = removeNonTranslationalTransform(\n                element as any\n            )\n\n            if (!removedTransforms.length) return\n\n            transformsToRestore.set(element, removedTransforms)\n\n            element.render()\n        })\n\n        // Read\n        resolversToMeasure.forEach((resolver) => resolver.measureInitialState())\n\n        // Write\n        elementsToMeasure.forEach((element: WithRender) => {\n            element.render()\n\n            const restore = transformsToRestore.get(element)\n            if (restore) {\n                restore.forEach(([key, value]) => {\n                    element.getValue(key)?.set(value)\n                })\n            }\n        })\n\n        // Read\n        resolversToMeasure.forEach((resolver) => resolver.measureEndState())\n\n        // Write\n        resolversToMeasure.forEach((resolver) => {\n            if (resolver.suspendedScrollY !== undefined) {\n                window.scrollTo(0, resolver.suspendedScrollY)\n            }\n        })\n    }\n\n    anyNeedsMeasurement = false\n    isScheduled = false\n\n    toResolve.forEach((resolver) => resolver.complete(isForced))\n    toResolve.clear()\n}\n\nfunction readAllKeyframes() {\n    toResolve.forEach((resolver) => {\n        resolver.readKeyframes()\n\n        if (resolver.needsMeasurement) {\n            anyNeedsMeasurement = true\n        }\n    })\n}\n\nexport function flushKeyframeResolvers() {\n    isForced = true\n    readAllKeyframes()\n    measureAllKeyframes()\n    isForced = false\n}\n\nexport type OnKeyframesResolved<T extends AnyResolvedKeyframe> = (\n    resolvedKeyframes: ResolvedKeyframes<T>,\n    finalKeyframe: T,\n    forced: boolean\n) => void\n\nexport class KeyframeResolver<T extends AnyResolvedKeyframe = any> {\n    name?: string\n    element?: WithRender\n    finalKeyframe?: T\n    suspendedScrollY?: number\n\n    protected unresolvedKeyframes: UnresolvedKeyframes<AnyResolvedKeyframe>\n\n    private motionValue?: MotionValue<T>\n    private onComplete: OnKeyframesResolved<T>\n\n    state: \"pending\" | \"scheduled\" | \"complete\" = \"pending\"\n\n    /**\n     * Track whether this resolver is async. If it is, it'll be added to the\n     * resolver queue and flushed in the next frame. Resolvers that aren't going\n     * to trigger read/write thrashing don't need to be async.\n     */\n    private isAsync = false\n\n    /**\n     * Track whether this resolver needs to perform a measurement\n     * to resolve its keyframes.\n     */\n    needsMeasurement = false\n\n    constructor(\n        unresolvedKeyframes: UnresolvedKeyframes<AnyResolvedKeyframe>,\n        onComplete: OnKeyframesResolved<T>,\n        name?: string,\n        motionValue?: MotionValue<T>,\n        element?: WithRender,\n        isAsync = false\n    ) {\n        this.unresolvedKeyframes = [...unresolvedKeyframes]\n        this.onComplete = onComplete\n        this.name = name\n        this.motionValue = motionValue\n        this.element = element\n        this.isAsync = isAsync\n    }\n\n    scheduleResolve() {\n        this.state = \"scheduled\"\n\n        if (this.isAsync) {\n            toResolve.add(this)\n\n            if (!isScheduled) {\n                isScheduled = true\n                frame.read(readAllKeyframes)\n                frame.resolveKeyframes(measureAllKeyframes)\n            }\n        } else {\n            this.readKeyframes()\n            this.complete()\n        }\n    }\n\n    readKeyframes() {\n        const { unresolvedKeyframes, name, element, motionValue } = this\n\n        // If initial keyframe is null we need to read it from the DOM\n        if (unresolvedKeyframes[0] === null) {\n            const currentValue = motionValue?.get()\n\n            // TODO: This doesn't work if the final keyframe is a wildcard\n            const finalKeyframe =\n                unresolvedKeyframes[unresolvedKeyframes.length - 1]\n\n            if (currentValue !== undefined) {\n                unresolvedKeyframes[0] = currentValue\n            } else if (element && name) {\n                const valueAsRead = element.readValue(name, finalKeyframe)\n\n                if (valueAsRead !== undefined && valueAsRead !== null) {\n                    unresolvedKeyframes[0] = valueAsRead\n                }\n            }\n\n            if (unresolvedKeyframes[0] === undefined) {\n                unresolvedKeyframes[0] = finalKeyframe\n            }\n\n            if (motionValue && currentValue === undefined) {\n                motionValue.set(unresolvedKeyframes[0] as T)\n            }\n        }\n\n        fillWildcards(unresolvedKeyframes)\n    }\n\n    setFinalKeyframe() {}\n    measureInitialState() {}\n    renderEndStyles() {}\n    measureEndState() {}\n\n    complete(isForcedComplete = false) {\n        this.state = \"complete\"\n\n        this.onComplete(\n            this.unresolvedKeyframes as ResolvedKeyframes<T>,\n            this.finalKeyframe as T,\n            isForcedComplete\n        )\n\n        toResolve.delete(this)\n    }\n\n    cancel() {\n        if (this.state === \"scheduled\") {\n            toResolve.delete(this)\n            this.state = \"pending\"\n        }\n    }\n\n    resume() {\n        if (this.state === \"pending\") this.scheduleResolve()\n    }\n}\n"],"names":[],"mappings":"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"}