{"version":3,"file":"TransformAnimation.mjs","sources":["../../../../../src/animation/waapi/transforms/TransformAnimation.ts"],"sourcesContent":["import {\n    BezierDefinition,\n    clamp,\n    isBezierDefinition,\n    millisecondsToSeconds,\n    progress,\n} from \"motion-utils\"\nimport { frame } from \"../../../frameloop/frame\"\nimport { frameData } from \"../../../frameloop/frame-data\"\nimport { time } from \"../../../frameloop/sync-time\"\nimport {\n    buildTransform,\n    translateAlias,\n} from \"../../../render/html/utils/build-transform\"\nimport type { ResolvedValues } from \"../../../render/types\"\nimport { transformPropOrder } from \"../../../render/utils/keys-transform\"\nimport { mixNumber } from \"../../../utils/mix/number\"\nimport type { MotionValue, Owner } from \"../../../value\"\nimport { numberValueTypes } from \"../../../value/types/maps/number\"\nimport { getValueAsType } from \"../../../value/types/utils/get-as-type\"\nimport { frameloopDriver } from \"../../drivers/frame\"\nimport { DriverControls } from \"../../drivers/types\"\nimport { keyframes as keyframesGenerator } from \"../../generators/keyframes\"\nimport { defaultOffset } from \"../../keyframes/offsets/default\"\nimport { JSAnimation, round } from \"../../JSAnimation\"\nimport { sampleDelta } from \"../../NativeAnimationExtended\"\nimport {\n    AnyResolvedKeyframe,\n    TimelineWithFallback,\n    ValueAnimationOptions,\n} from \"../../types\"\nimport { cubicBezierAsString } from \"../easing/cubic-bezier\"\nimport { supportedWaapiEasing } from \"../easing/supported\"\nimport { supportsWaapi } from \"../supports/waapi\"\nimport { supportsLinearEasing } from \"../../../utils/supports/linear-easing\"\nimport { TransformGroupHooks, transformGroups } from \"./groups\"\n\n/**\n * Independent transforms (x, y, scale, rotate etc) all write to the one\n * `transform` style, so they can't each run as their own WAAPI animation.\n * Instead, every transform animation on an element joins a group. While\n * every animation in the group can be accelerated, the group composes them\n * into a single `transform` WAAPI animation. The animations stay\n * JSAnimations, but their driver doesn't tick, so they do no work per\n * frame.\n *\n * When every animation follows the same eased progress, which is the case\n * for values that share a transition, the WAAPI animation has just two\n * keyframes and that easing. Otherwise it has as few sampled keyframes\n * as keep it accurate. It's only rebuilt when an animation starts or\n * stops. Pausing, seeking and speed changes that apply to every animation\n * in the group are made to the WAAPI animation, and animations complete\n * on its finish events.\n *\n * If one of them can't be accelerated, or something else keeps writing\n * the element's transform, the whole group moves to the main thread.\n */\n\ninterface TransformOwner extends Owner {\n    current: HTMLElement\n    latestValues?: Record<string, AnyResolvedKeyframe>\n    getValue(key: string): MotionValue | undefined\n    projection?: { isProjecting(): boolean }\n}\n\ninterface TransformDriverControls extends DriverControls {\n    js: DriverControls\n}\n\ninterface TransformGroup extends TransformGroupHooks {\n    tracks: Set<TransformAnimation<any>>\n\n    /**\n     * Whether the group's animations are running on the main thread.\n     */\n    isJS: boolean\n\n    /**\n     * Whether animations are finishing because they reached their end,\n     * which the WAAPI animation has already rendered.\n     */\n    isFinishing: boolean\n\n    /**\n     * Rebuild or retime the WAAPI animation. A churn is a change it may\n     * not be able to follow, like a seek or an outside write.\n     */\n    schedule(needsBuild: boolean, isChurn?: boolean): void\n\n    /**\n     * An animation was stopped. Rebuild without it or, if it was the last,\n     * end the group.\n     */\n    release(track: TransformAnimation<any>): void\n    demote(canReturn?: boolean): void\n}\n\n/**\n * Where each animation was when the WAAPI animation was built: its time,\n * speed and whether it was held.\n */\ntype BuiltState = [number, number, boolean]\n\ninterface Segment {\n    animation: Animation\n    /**\n     * When this starts and ends, relative to when the group was built.\n     */\n    offset: number\n    end: number\n    isDone?: boolean\n}\n\n/**\n * Sample at the interruption sampling rate, up to a cap for long\n * animations.\n */\nconst maxSamples = 200\n\n/**\n * How far values may stray from the WAAPI animation: as a fraction of\n * each value's change when they share an easing, otherwise in px or deg,\n * or for scale.\n */\nconst easingTolerance = 0.001\nconst sampleTolerance = 0.1\nconst scaleTolerance = 0.001\n\n/**\n * If an outside write, or a seek the WAAPI animation can't follow,\n * happens again within this window, the group is being driven every\n * frame (scrubbing, drag), which is cheaper on the main thread than\n * rebuilding the WAAPI animation every frame.\n */\nconst churnWindow = 100\n\n/**\n * Named easings that are the same cubic-bezier in JS and CSS.\n */\nconst isNativeEasing = (ease: unknown): ease is \"linear\" =>\n    /^(linear|ease(In|Out|InOut))$/.test(ease as string)\n\nconst byTime = (a: number, b: number) => a - b\n\n/**\n * n + 1 evenly spaced timestamps, from one timestamp to another.\n */\nconst spread = (from: number, to: number, n: number) => {\n    const result: number[] = []\n    for (let i = 0; i <= n; i++) result.push(mixNumber(from, to, i / n))\n    return result\n}\n\nconst getOwner = (options: ValueAnimationOptions<any>) =>\n    options.motionValue!.owner as TransformOwner\n\nconst getGroup = (element: Element) =>\n    transformGroups.get(element) as TransformGroup | undefined\n\nconst read = (owner: TransformOwner, key: string) =>\n    owner.latestValues ? owner.latestValues[key] : owner.getValue(key)?.get()\n\n/**\n * Whether this animation should join its element's transform group.\n * Animations that can't be accelerated still join, so the group knows\n * to stay on the main thread while they run. Browsers without linear()\n * easing stay on the main thread.\n */\nexport const canGroupTransform = ({\n    name,\n    motionValue,\n}: ValueAnimationOptions<any>) =>\n    name &&\n    transformPropOrder.includes(name) &&\n    motionValue?.owner?.current instanceof HTMLElement &&\n    supportsWaapi() &&\n    supportsLinearEasing()\n\nfunction canAccelerateTransform(options: ValueAnimationOptions<any>) {\n    const owner = getOwner(options)\n    const { onUpdate, transformTemplate } = owner.getProps()\n\n    return (\n        /**\n         * A handoff from an optimised appear animation is already running\n         * on its own WAAPI animation. onUpdate needs every value, every\n         * frame.\n         */\n        !options.isHandoff &&\n        !onUpdate &&\n        !options.hasOnUpdate &&\n        /**\n         * transformTemplate could output anything.\n         */\n        !transformTemplate &&\n        options.type !== \"inertia\" &&\n        /**\n         * A literal transform, or pathRotation, replaces or adds to the\n         * transform we'd build. styleEffect builds its own as \"none\".\n         */\n        (read(owner, \"transform\") || \"none\") === \"none\" &&\n        !read(owner, \"pathRotation\") &&\n        /**\n         * Layout animations write transform every frame.\n         */\n        !owner.projection?.isProjecting()\n    )\n}\n\nexport class TransformAnimation<\n    T extends number | string\n> extends JSAnimation<T> {\n    canAccelerate: boolean\n\n    constructor(options: ValueAnimationOptions<T>) {\n        const element = getOwner(options).current\n        const { driver = frameloopDriver } = options\n        let animation: TransformAnimation<T>\n\n        /**\n         * Before JSAnimation replaces the type with its generator.\n         */\n        const canAccelerate = canAccelerateTransform(options)\n\n        /**\n         * The driver ticks on the main thread only once the group has\n         * moved there. Until then, starting or stopping tells the group to\n         * update its WAAPI animation.\n         */\n        options.driver = (update) => {\n            const js = driver(update)\n\n            return {\n                js,\n                now: js.now,\n                start: (keepAlive = true) => {\n                    const group = getGroup(element)\n                    const isJS = !group || group.isJS\n\n                    /**\n                     * keepAlive is false when seeking. Seeking the WAAPI\n                     * animation is free, but if a seek needs a rebuild and\n                     * keeps happening, the group moves to the main thread.\n                     */\n                    isJS\n                        ? js.start(keepAlive)\n                        : group.schedule(false, !keepAlive)\n                },\n                stop: () => {\n                    js.stop()\n                    const group = getGroup(element)\n                    group && !group.isFinishing && group.release(animation)\n                },\n            } as TransformDriverControls\n        }\n\n        super(options)\n\n        animation = this\n        this.canAccelerate = canAccelerate\n\n        /**\n         * stop is bound in JSAnimation, so wrap it rather than override.\n         * Before stopping, set the motion value to where the WAAPI\n         * animation is now, with velocity, for the next animation to\n         * start from.\n         */\n        const { stop } = this\n        this.stop = () => {\n            this.isAccelerated() && this.sync()\n            stop()\n        }\n    }\n\n    get group() {\n        return getGroup(getOwner(this.options).current)\n    }\n\n    get js() {\n        return (this.driver as TransformDriverControls | undefined)?.js\n    }\n\n    get name() {\n        return this.options.name!\n    }\n\n    /**\n     * When this stops moving, or, if it repeats forever, when it starts\n     * repeating, and how long each repeat takes. Held (paused, or at\n     * speed 0) animations never stop moving.\n     */\n    timing() {\n        const { startTime, speed, totalDuration } = this\n        const { delay = 0, repeatType } = this.options\n\n        return this.holdTime !== null\n            ? [Infinity, 0]\n            : totalDuration === Infinity\n            ? [\n                  startTime! + delay / speed,\n                  (this.resolvedDuration * (repeatType === \"loop\" ? 1 : 2)) /\n                      speed || 1,\n              ]\n            : [startTime! + (delay + totalDuration) / speed, 0]\n    }\n\n    /**\n     * Whether this is running, or paused, on the compositor.\n     */\n    isAccelerated() {\n        const { group, state } = this\n        return (\n            group?.tracks.has(this) &&\n            !group.isJS &&\n            this.canAccelerate &&\n            (state === \"running\" || state === \"paused\")\n        )\n    }\n\n    /**\n     * The value now, while this runs on the compositor and so doesn't\n     * set its motion value every frame.\n     */\n    liveValue() {\n        return this.isAccelerated() ? this.sampleAt(time.now()) : undefined\n    }\n\n    /**\n     * If this is a two-keyframe tween whose easing WAAPI runs exactly,\n     * when it starts and stops moving, and that easing.\n     */\n    tween(): [number, number, string] | undefined {\n        const { keyframes, type, ease, times, repeat, delay = 0 } = this.options\n        const easing = isBezierDefinition(ease!)\n            ? cubicBezierAsString(ease as BezierDefinition)\n            : isNativeEasing(ease) && supportedWaapiEasing[ease]\n\n        if (\n            easing &&\n            !repeat &&\n            !times &&\n            keyframes.length === 2 &&\n            type === keyframesGenerator &&\n            this.holdTime === null\n        ) {\n            const start = this.startTime! + delay / this.speed\n            return [start, start + this.resolvedDuration / this.speed, easing]\n        }\n    }\n\n    /**\n     * The timestamps between two timestamps where this reaches a\n     * keyframe or starts a repeat, where it can turn or jump.\n     */\n    boundaries(from: number, to: number) {\n        const { startTime, speed, resolvedDuration, options } = this\n        const {\n            delay = 0,\n            repeat = 0,\n            repeatDelay = 0,\n            repeatType,\n            times,\n            keyframes,\n            type,\n        } = options\n        const offsets =\n            (type || keyframesGenerator) === keyframesGenerator\n                ? times || defaultOffset(keyframes)\n                : [0, 1]\n        const start = startTime! + delay / speed\n        const result: number[] = []\n\n        if (this.holdTime !== null || !(resolvedDuration > 0)) return result\n\n        for (\n            let i = Math.max(\n                0,\n                Math.floor(((from - start) * speed) / resolvedDuration)\n            );\n            i <= repeat;\n            i++\n        ) {\n            const iterationStart = start + (i * resolvedDuration) / speed\n            if (iterationStart > to) break\n\n            for (const offset of offsets) {\n                const t =\n                    iterationStart +\n                    ((i % 2 && repeatType && repeatType !== \"loop\"\n                        ? 1 - offset\n                        : offset) *\n                        (resolvedDuration - repeatDelay)) /\n                        speed\n                t > from && t < to && result.push(t)\n            }\n        }\n\n        return result\n    }\n\n    /**\n     * The value at a timestamp, as a number.\n     */\n    numberAt(timestamp: number) {\n        return parseFloat(this.sampleAt(timestamp, true) as string)\n    }\n\n    /**\n     * Write the current value, and velocity, to the motion value.\n     */\n    sync() {\n        const now = time.now()\n        this.options.motionValue!.setWithVelocity(\n            this.sampleAt(now - sampleDelta, true),\n            this.sampleAt(now, true),\n            sampleDelta\n        )\n    }\n\n    play() {\n        /**\n         * A stopped animation (one that was interrupted) can't play again,\n         * so it mustn't join the group.\n         */\n        if (this.isStopped) return\n        ;(this.group || createGroup(getOwner(this.options))).tracks.add(this)\n\n        super.play()\n    }\n\n    pause() {\n        super.pause()\n\n        if (this.isAccelerated()) {\n            this.sync()\n            this.group!.schedule(false)\n        }\n    }\n\n    /**\n     * JSAnimation finishes on its next tick, which only happens on the\n     * main thread, so finish now.\n     */\n    complete() {\n        super.complete()\n        const { group } = this\n        group && !group.isJS && this.canAccelerate && this.tick(time.now())\n    }\n\n    /**\n     * Without a tick to rebase it, a held time still includes the delay,\n     * so take it off here, as a JS animation does on its next tick.\n     */\n    get time() {\n        if (this.isAccelerated()) {\n            return millisecondsToSeconds(\n                clamp(\n                    0,\n                    this.totalDuration,\n                    this.at(time.now()) - (this.options.delay || 0)\n                )\n            )\n        }\n\n        return super.time\n    }\n\n    /**\n     * A JS animation sets its motion value from a seek on its next tick.\n     * This doesn't tick, so set it now, rather than leave it to be set\n     * when this next stops.\n     */\n    set time(newTime: number) {\n        super.time = newTime\n        this.isAccelerated() && this.sync()\n    }\n\n    /**\n     * Scroll timelines set time every frame, so run these on the main\n     * thread.\n     */\n    attachTimeline(timeline: TimelineWithFallback) {\n        this.canAccelerate = false\n        this.group?.demote(true)\n        return super.attachTimeline(timeline)\n    }\n}\n\nfunction createGroup(owner: TransformOwner): TransformGroup {\n    const element = owner.current\n    const tracks = new Set<TransformAnimation<any>>()\n    const byKey = new Map<string, TransformAnimation<any>>()\n\n    /**\n     * Transforms that aren't animating, as built into the WAAPI animation.\n     */\n    let statics: Record<string, AnyResolvedKeyframe | undefined> = {}\n    /**\n     * The transforms in the WAAPI animation, in order.\n     */\n    let keys: string[] = []\n    let built = new Map<TransformAnimation<any>, BuiltState>()\n    let segments: Segment[] = []\n    let needsBuild = false\n    let isScheduled = false\n    let isEnded = false\n    let hasChurned = false\n    let lastChurn = -Infinity\n\n    const has = (key: string) => {\n        for (const track of tracks) if (track.name === key) return true\n    }\n\n    /**\n     * The transform values at a timestamp or, without one, from the\n     * motion values. Animations that don't repeat forever are sampled no\n     * earlier than settled, so a loop that starts from an earlier cycle\n     * boundary holds them at their end.\n     */\n    const valuesAt = (timestamp?: number, settled?: number) => {\n        const values: ResolvedValues = {}\n        for (const key of timestamp === undefined ? transformPropOrder : keys) {\n            const track = byKey.get(key)\n            const value =\n                timestamp === undefined\n                    ? read(owner, key)\n                    : track\n                    ? track.sampleAt(\n                          settled! > timestamp && !track.timing()[1]\n                              ? settled!\n                              : timestamp\n                      )\n                    : statics[key]\n\n            if (value !== undefined) values[key] = value\n        }\n        return values\n    }\n\n    /**\n     * Build the transform at a timestamp. Unlike buildTransform, every key\n     * is written, even at its default, so each keyframe has the same list\n     * of functions and the browser interpolates them one by one.\n     */\n    const compose = (timestamp: number, settled?: number) => {\n        let transform = \"\"\n        const values = valuesAt(timestamp, settled)\n        for (const key in values) {\n            transform +=\n                (translateAlias[key] || key) +\n                \"(\" +\n                getValueAsType(values[key], numberValueTypes[key]) +\n                \") \"\n        }\n        return transform || \"none\"\n    }\n\n    /**\n     * Write the transform as an inline style, as the renderer would.\n     */\n    const commit = (values = valuesAt()) => {\n        element.style.transform = buildTransform(values, {})\n    }\n\n    /**\n     * Cancel the WAAPI animations, by default first committing the\n     * transform. The renderer writes its own version on its next render.\n     */\n    const stop = (shouldCommit = true) => {\n        shouldCommit && commit()\n        segments.forEach(({ animation }) => animation.cancel())\n        segments = []\n    }\n\n    const add = (animation: Animation, offset: number, end = Infinity) => {\n        const segment: Segment = { animation, offset, end }\n        animation.startTime = time.now() + offset\n\n        /**\n         * Animations finish when the WAAPI animation reaches their end.\n         * Once a loop has taken over, the finished animation isn't needed.\n         */\n        if (end < Infinity) {\n            animation.onfinish = () => {\n                segment.isDone = true\n                if (segments.some((s) => s.end === Infinity)) {\n                    animation.cancel()\n                    segments = segments.filter((s) => s !== segment)\n                }\n                group.schedule(false)\n            }\n        }\n\n        /**\n         * Something else cancelled it, so carry on on the main thread.\n         */\n        animation.oncancel = () => segments.includes(segment) && group.demote()\n\n        segments.push(segment)\n    }\n\n    /**\n     * Where a value jumps between two timestamps, as when a repeat starts\n     * again: the timestamps either side of the jump, or none if it moves\n     * there continuously.\n     */\n    const jumpAt = (value: (t: number) => number, a: number, b: number) => {\n        const change = (x: number, y: number) => Math.abs(value(y) - value(x))\n        const size = change(a, b)\n        while (b - a > 0.01) {\n            const mid = (a + b) / 2\n            change(a, mid) > change(mid, b) ? (b = mid) : (a = mid)\n        }\n        return change(a, b) > size / 2 ? [a, b] : []\n    }\n\n    /**\n     * If every moving animation follows the same eased progress between\n     * two timestamps, the easing that describes it.\n     */\n    const getEasing = (\n        moving: TransformAnimation<any>[],\n        from: number,\n        to: number,\n        bounds: number[]\n    ) => {\n        const samples = Math.min(\n            maxSamples,\n            Math.max(2, Math.ceil((to - from) / sampleDelta))\n        )\n\n        /**\n         * Too many keyframes or repeats to follow with this many samples.\n         */\n        if (bounds.length * 4 > samples) return\n\n        const at = spread(from, to, samples).concat(bounds).sort(byTime)\n\n        const position = (t: number) => progress(from, to, t)\n        let shared: number[] | undefined\n        let progressAt: (t: number) => number\n\n        for (const track of moving) {\n            const values = at.map((t) => track.numberAt(t))\n            const [first] = values\n            const changes = values.map((value) => value - first)\n            const end = changes[changes.length - 1]\n\n            /**\n             * A value that ends only a tiny way from where it started, as\n             * a round trip does if it's built just after it starts, or\n             * from a float residue, ends where it started. Dividing by\n             * that tiny range would stretch the easing to values the\n             * compositor can't render.\n             */\n            const range = changes.some(\n                (change) => Math.abs(change) * easingTolerance > Math.abs(end)\n            )\n                ? 0\n                : end\n\n            const progress = changes.map((change) =>\n                range ? change / range : change\n            )\n\n            /**\n             * A value that doesn't change, like one still in its delay,\n             * fits any easing. One that changes but ends where it started\n             * fits none.\n             */\n            if (!range) {\n                if (progress.some((p) => !(Math.abs(p) <= easingTolerance))) {\n                    return\n                }\n            } else if (!shared) {\n                shared = progress\n                progressAt = (t) => (track.numberAt(t) - first) / range\n            } else if (\n                progress.some(\n                    (p, i) => !(Math.abs(p - shared![i]) <= easingTolerance)\n                )\n            ) {\n                return\n            }\n        }\n\n        if (\n            !shared ||\n            shared.every(\n                (p, i) => Math.abs(p - position(at[i])) <= easingTolerance\n            )\n        ) {\n            return \"linear\"\n        }\n\n        /**\n         * A repeat that starts again jumps back, which takes two points at\n         * the same position.\n         */\n        const points: string[] = []\n        const point = (t: number, p = progressAt(t)) =>\n            points.push(round(p) + \" \" + round(position(t) * 100) + \"%\")\n        shared.forEach((p, i) => {\n            i &&\n                Math.abs(p - shared![i - 1]) > 0.2 &&\n                jumpAt(progressAt, at[i - 1], at[i]).forEach((t) => point(t))\n            point(at[i], p)\n        })\n\n        return \"linear(\" + points + \")\"\n    }\n\n    /**\n     * Sample timestamps between two timestamps, closer together where the\n     * moving animations curve.\n     */\n    const sample = (\n        moving: TransformAnimation<any>[],\n        from: number,\n        to: number,\n        bounds: number[]\n    ) => {\n        const times = [from]\n\n        /**\n         * Values that aren't numbers, like calc(), are left to the\n         * browser to interpolate.\n         */\n        const isStraight = (a: number, b: number) =>\n            moving.every(\n                (track) =>\n                    !(\n                        Math.abs(\n                            track.numberAt((a + b) / 2) -\n                                (track.numberAt(a) + track.numberAt(b)) / 2\n                        ) >\n                        (track.name.startsWith(\"scale\")\n                            ? scaleTolerance\n                            : sampleTolerance)\n                    )\n            )\n\n        const split = (a: number, b: number, depth: number) => {\n            if (b - a < 1 || isStraight(a, b)) {\n                times.push(b)\n            } else if (depth < 4) {\n                split(a, (a + b) / 2, depth + 1)\n                split((a + b) / 2, b, depth + 1)\n            } else {\n                /**\n                 * Keyframes either side of a jump, like a repeat starting\n                 * again, so it doesn't play as a quick sweep.\n                 */\n                for (const track of moving) {\n                    times.push(...jumpAt((t) => track.numberAt(t), a, b))\n                }\n                times.push(b)\n            }\n        }\n\n        /**\n         * Split at least every 100ms, and at every keyframe and repeat,\n         * either side of where a value can jump.\n         */\n        const ends = spread(from, to, Math.ceil((to - from) / 100))\n        for (const t of bounds) ends.push(t, Math.min(t + 0.01, to))\n\n        let start = from\n        for (const end of ends.sort(byTime)) {\n            end > start && split(start, end, 0)\n            start = end\n        }\n\n        return times.sort(byTime)\n    }\n\n    /**\n     * If every moving animation is the same tween, started together, as\n     * happens for the values of one animate() call or transition, when\n     * they move and their native easing.\n     */\n    const getTween = (moving: TransformAnimation<any>[]) => {\n        let shared: [number, number, string] | undefined\n\n        for (const track of moving) {\n            const tween = track.tween()\n            if (\n                !tween ||\n                shared?.some((v: any, i) =>\n                    i < 2\n                        ? Math.abs((tween[i] as number) - v) > 1\n                        : tween[i] !== v\n                )\n            ) {\n                return\n            }\n            shared = tween\n        }\n\n        return shared\n    }\n\n    /**\n     * A WAAPI animation of the composed transform between two timestamps.\n     */\n    const run = (\n        moving: TransformAnimation<any>[],\n        from: number,\n        to: number,\n        options: KeyframeAnimationOptions = { fill: \"both\" },\n        settled?: number,\n        nativeEasing?: string\n    ) => {\n        const bounds = moving.flatMap((track) => track.boundaries(from, to))\n        const easing = nativeEasing || getEasing(moving, from, to, bounds)\n        const times = easing ? [from, to] : sample(moving, from, to, bounds)\n        const transform = times.map((t) => compose(t, settled))\n        let keyframes: PropertyIndexedKeyframes | null = { transform }\n        if (!easing) {\n            keyframes.offset = times.map((t) => progress(from, to, t))\n        }\n\n        /**\n         * If nothing moves, don't hold a transform, which, even at its\n         * default, would make the element a containing block. The empty\n         * animation still finishes the animations.\n         */\n        if (transform.every((t) => t === transform[0])) {\n            commit(valuesAt(from, settled))\n            keyframes = null\n        }\n\n        return element.animate(keyframes, {\n            ...options,\n            duration: to - from,\n            easing: easing || \"linear\",\n        })\n    }\n\n    /**\n     * Replace the WAAPI animations with ones built from now. Returns\n     * undefined if the animations can't be composed.\n     */\n    const animate = (now: number) => {\n        /**\n         * The finite part runs until the last finite animation (or the\n         * last delay) ends. Infinitely repeating animations then continue\n         * as one looping WAAPI animation, which needs them to share a\n         * cycle.\n         */\n        let end = now\n        let cycle = 0\n        let cycleStart = 0\n        const moving: TransformAnimation<any>[] = []\n        const looping: TransformAnimation<any>[] = []\n        const ends = new Set<number>()\n\n        byKey.clear()\n        built = new Map()\n\n        for (const track of tracks) {\n            byKey.set(track.name, track)\n\n            const [trackEnd, trackCycle] = track.timing()\n            const isHeld = trackEnd === Infinity\n\n            built.set(track, [track.at(now), track.speed, isHeld])\n\n            /**\n             * Held animations don't move, so keep their motion values up\n             * to date, as a JSAnimation would on a seek.\n             */\n            if (isHeld) {\n                track.sync()\n                continue\n            }\n\n            if (track.speed < 0) return\n\n            if (trackCycle) {\n                if (cycle) {\n                    const phase = (trackEnd - cycleStart) / trackCycle\n                    if (\n                        Math.abs(trackCycle - cycle) > 1 ||\n                        Math.abs(phase - Math.round(phase)) * cycle > 1\n                    ) {\n                        return\n                    }\n                } else {\n                    cycle = trackCycle\n                    cycleStart = trackEnd\n                }\n                looping.push(track)\n            } else {\n                ends.add(trackEnd)\n            }\n\n            moving.push(track)\n            end = Math.max(end, trackEnd)\n        }\n\n        statics = {}\n        /**\n         * Transforms that aren't animating are left out at their default.\n         */\n        keys = transformPropOrder.filter((key) => {\n            if (byKey.has(key)) return true\n            const value = (statics[key] = read(owner, key))\n            return (\n                value !== undefined &&\n                parseFloat(value as string) !==\n                    (key.startsWith(\"scale\") ? 1 : 0)\n            )\n        })\n\n        stop(false)\n\n        /**\n         * Values that share one tween are one WAAPI animation of it, with\n         * two keyframes and its own easing, from when they started.\n         */\n        const tween = !cycle && getTween(moving)\n\n        try {\n            if (tween && tween[1] > now) {\n                const [from, to, easing] = tween\n                add(\n                    run(moving, from, to, undefined, undefined, easing),\n                    from - now,\n                    to - from\n                )\n            } else if (end > now) {\n                add(run(moving, now, end), 0, end - now)\n\n                /**\n                 * Animations that end sooner finish on the events of\n                 * empty animations that end with them.\n                 */\n                ends.forEach(\n                    (trackEnd) =>\n                        trackEnd < end - 1 &&\n                        add(\n                            element.animate(null, {\n                                duration: trackEnd - now,\n                            }),\n                            0,\n                            trackEnd - now\n                        )\n                )\n            }\n\n            if (cycle) {\n                /**\n                 * Build one cycle from a cycle boundary, so it repeats\n                 * seamlessly, and start it part way through.\n                 */\n                const from =\n                    cycleStart + Math.floor((end - cycleStart) / cycle) * cycle\n\n                add(\n                    run(\n                        looping,\n                        from,\n                        from + cycle,\n                        {\n                            iterations: Infinity,\n                            iterationStart: (end - from) / cycle,\n                            /**\n                             * It must not fill backwards over the finite part\n                             * that runs before it.\n                             */\n                            fill: \"forwards\",\n                        },\n                        end\n                    ),\n                    end - now\n                )\n            }\n        } catch {\n            return\n        }\n\n        /**\n         * Everything is held, so hold it with an inline style instead.\n         */\n        segments.length || stop()\n\n        return true\n    }\n\n    /**\n     * If every animation has been paused, played, seeked or sped up\n     * together since the WAAPI animation was built, do the same to it.\n     * Returns false if it needs rebuilding instead.\n     */\n    const retime = (now: number) => {\n        let elapsed: number | undefined\n        let rate = 0\n\n        for (const track of tracks) {\n            const state = built.get(track)\n            if (!state) return false\n\n            const [builtTime, builtSpeed, wasHeld] = state\n            const trackTime = track.at(now)\n            const isHeld = track.timing()[0] === Infinity\n\n            if (wasHeld) {\n                if (isHeld && trackTime === builtTime) continue\n                return false\n            }\n\n            const trackElapsed = (trackTime - builtTime) / builtSpeed\n            const trackRate = isHeld ? 0 : track.speed / builtSpeed\n\n            if (elapsed === undefined) {\n                elapsed = trackElapsed\n                rate = trackRate\n            } else if (\n                Math.abs(trackElapsed - elapsed) > 1 ||\n                trackRate !== rate\n            ) {\n                return false\n            }\n        }\n\n        if (elapsed === undefined) return true\n        if (!segments.length) return false\n\n        for (const { offset, end, isDone } of segments) {\n            const local = elapsed - offset\n            if (\n                end < Infinity &&\n                (isDone ? local < end - 1 : local < 0 || local >= end)\n            ) {\n                return false\n            }\n        }\n\n        for (const { animation, offset, isDone } of segments) {\n            if (isDone) continue\n\n            const local = elapsed - offset\n            if (rate) {\n                animation.playbackRate = rate\n                animation.startTime = now - local / rate\n            } else {\n                animation.pause()\n                animation.currentTime = local\n            }\n        }\n\n        return true\n    }\n\n    /**\n     * If no animations are left, write where they got to and cancel the\n     * WAAPI animations. Returns whether the group ended.\n     */\n    const end = () => {\n        if (tracks.size) return false\n\n        isEnded = true\n        transformGroups.delete(element)\n        group.isJS || stop()\n        return true\n    }\n\n    const build = () => {\n        const now = time.now()\n\n        /**\n         * Finish the animations that have reached their end, which the\n         * WAAPI animation has already rendered.\n         */\n        if (!group.isJS) {\n            group.isFinishing = true\n            tracks.forEach((track) => {\n                const [trackEnd, trackCycle] = track.timing()\n\n                if (\n                    track.state === \"running\" &&\n                    track.speed > 0 &&\n                    !trackCycle &&\n                    trackEnd <= now + 1\n                ) {\n                    track.complete()\n\n                    /**\n                     * From now it's checked for outside writes like any\n                     * other static transform. If the WAAPI animation never\n                     * rendered it (it was instant), rebuild with its value.\n                     */\n                    statics[track.name] = read(owner, track.name)\n                    built.has(track) || (needsBuild = true)\n                }\n            })\n            group.isFinishing = false\n        }\n\n        isScheduled = false\n\n        if (isEnded) return\n\n        tracks.forEach(({ state }, track) => {\n            if (state === \"idle\" || state === \"finished\") tracks.delete(track)\n        })\n\n        if (end()) return\n\n        for (const track of tracks) {\n            if (!track.canAccelerate) return group.demote(true)\n        }\n\n        /**\n         * Everything that kept the group on the main thread has finished,\n         * so move the remaining animations back to the compositor.\n         */\n        if (group.isJS) {\n            group.isJS = false\n            needsBuild = true\n            tracks.forEach((track) => track.js?.stop())\n        }\n\n        const shouldBuild = needsBuild\n        const churned = hasChurned\n        needsBuild = hasChurned = false\n\n        if (shouldBuild || !retime(now)) {\n            if (churned) {\n                if (now - lastChurn < churnWindow) return group.demote()\n                lastChurn = now\n            }\n            if (!animate(now)) return group.demote()\n        }\n    }\n\n    const group: TransformGroup = {\n        tracks,\n        isJS: false,\n        isFinishing: false,\n\n        schedule(build_: boolean, isChurn?: boolean) {\n            if (isEnded) return\n\n            needsBuild ||= build_\n            hasChurned ||= !!isChurn\n\n            /**\n             * Build in this frame's render step, so it's in place before\n             * anything reads the DOM in postRender, or straight after the\n             * current task outside of a frame.\n             */\n            if (!isScheduled) {\n                isScheduled = true\n                frameData.isProcessing\n                    ? frame.render(build, false, true)\n                    : queueMicrotask(build)\n            }\n        },\n\n        /**\n         * End the group now, rather than when it next builds, so the\n         * element's transform is the caller's again as soon as its last\n         * animation is stopped.\n         */\n        release(track) {\n            /**\n             * Only drop the stopped animation. Others can be idle because\n             * they're part way through play(), and are about to run.\n             */\n            const { state } = track\n            if (state === \"idle\" || state === \"finished\") tracks.delete(track)\n            end() || group.schedule(true)\n        },\n\n        /**\n         * An outside write. Rebuild once, but if it keeps happening, move\n         * to the main thread.\n         */\n        check() {\n            if (group.isJS) return\n\n            for (const key in statics) {\n                if (read(owner, key) !== statics[key] && !has(key)) {\n                    return group.schedule(true, true)\n                }\n            }\n        },\n\n        demote(canReturn?: boolean) {\n            if (group.isJS || isEnded) return\n\n            /**\n             * Unless only another animation is holding the group on the\n             * main thread, these animations stay there until they end.\n             */\n            tracks.forEach((track) => {\n                track.isAccelerated() && track.sync()\n                canReturn || (track.canAccelerate = false)\n            })\n\n            group.isJS = true\n            built = new Map()\n\n            stop()\n\n            tracks.forEach(\n                (track) => track.state === \"running\" && track.js?.start()\n            )\n        },\n    }\n\n    transformGroups.set(element, group)\n\n    return group\n}\n"],"names":["keyframes","keyframesGenerator"],"mappings":"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"}