{"version":3,"file":"create-projection-node.mjs","sources":["../../../../src/projection/node/create-projection-node.ts"],"sourcesContent":["import {\n    Axis,\n    AxisDelta,\n    Box,\n    clamp,\n    Delta,\n    noop,\n    Point,\n    SubscriptionManager,\n} from \"motion-utils\"\nimport { animateSingleValue } from \"../../animation/animate/single-value\"\nimport { JSAnimation } from \"../../animation/JSAnimation\"\nimport { getOptimisedAppearId } from \"../../animation/optimized-appear/get-appear-id\"\nimport { Transition, ValueAnimationOptions } from \"../../animation/types\"\nimport { getValueTransition } from \"../../animation/utils/get-value-transition\"\nimport { cancelFrame, frame, frameData, frameSteps } from \"../../frameloop\"\nimport { microtask } from \"../../frameloop/microtask\"\nimport { time } from \"../../frameloop/sync-time\"\nimport type { Process } from \"../../frameloop/types\"\nimport { HTMLVisualElement } from \"../../render/html/HTMLVisualElement\"\nimport type { ResolvedValues } from \"../../render/types\"\nimport { scaleCorrectors } from \"../../render/utils/is-forced-motion-value\"\nimport type { MotionStyle, VisualElement } from \"../../render/VisualElement\"\nimport { activeAnimations } from \"../../stats/animation-count\"\nimport { statsBuffer } from \"../../stats/buffer\"\nimport { delay } from \"../../utils/delay\"\nimport { isSVGElement } from \"../../utils/is-svg-element\"\nimport { isSVGSVGElement } from \"../../utils/is-svg-svg-element\"\nimport { mixNumber } from \"../../utils/mix/number\"\nimport { MotionValue, motionValue } from \"../../value\"\nimport { resolveMotionValue } from \"../../value/utils/resolve-motion-value\"\nimport { mixValues } from \"../animation/mix-values\"\nimport { copyAxisDeltaInto, copyBoxInto } from \"../geometry/copy\"\nimport {\n    applyBoxDelta,\n    applyTreeDeltas,\n    transformBox,\n    translateAxis,\n} from \"../geometry/delta-apply\"\nimport {\n    calcBoxDelta,\n    calcLength,\n    calcRelativeBox,\n    calcRelativePosition,\n    isNear,\n} from \"../geometry/delta-calc\"\nimport { removeBoxTransforms } from \"../geometry/delta-remove\"\nimport { createBox, createDelta } from \"../geometry/models\"\nimport {\n    aspectRatio,\n    axisDeltaEquals,\n    boxEquals,\n    boxEqualsRounded,\n    isDeltaZero,\n} from \"../geometry/utils\"\nimport { NodeStack } from \"../shared/stack\"\nimport { buildProjectionTransform } from \"../styles/transform\"\nimport { eachAxis } from \"../utils/each-axis\"\nimport { FlatTree } from \"../utils/flat-tree\"\nimport { has2DTranslate, hasScale, hasTransform } from \"../utils/has-transform\"\nimport { globalProjectionState } from \"./state\"\nimport {\n    IProjectionNode,\n    LayoutEvents,\n    LayoutUpdateData,\n    Measurements,\n    Phase,\n    ProjectionNodeConfig,\n    ProjectionNodeOptions,\n    ScrollMeasurements,\n} from \"./types\"\n\nconst metrics = {\n    nodes: 0,\n    calculatedTargetDeltas: 0,\n    calculatedProjections: 0,\n}\n\nconst transformAxes = [\"\", \"X\", \"Y\", \"Z\"]\n\n/**\n * We use 1000 as the animation target as 0-1000 maps better to pixels than 0-1\n * which has a noticeable difference in spring animations\n */\nconst animationTarget = 1000\n\nlet id = 0\n\nfunction resetDistortingTransform(\n    key: string,\n    visualElement: VisualElement,\n    values: ResolvedValues,\n    sharedAnimationValues?: ResolvedValues\n) {\n    const { latestValues } = visualElement\n\n    // Record the distorting transform and then temporarily set it to 0\n    if (latestValues[key]) {\n        values[key] = latestValues[key]\n        visualElement.setStaticValue(key, 0)\n        if (sharedAnimationValues) {\n            sharedAnimationValues[key] = 0\n        }\n    }\n}\n\nfunction cancelTreeOptimisedTransformAnimations(\n    projectionNode: IProjectionNode\n) {\n    projectionNode.hasCheckedOptimisedAppear = true\n    if (projectionNode.root === projectionNode) return\n\n    const { visualElement } = projectionNode.options\n\n    if (!visualElement) return\n\n    const appearId = getOptimisedAppearId(visualElement)\n\n    if (window.MotionHasOptimisedAnimation!(appearId, \"transform\")) {\n        const { layout, layoutId } = projectionNode.options\n        window.MotionCancelOptimisedAnimation!(\n            appearId,\n            \"transform\",\n            frame,\n            !(layout || layoutId)\n        )\n    }\n\n    const { parent } = projectionNode\n    if (parent && !parent.hasCheckedOptimisedAppear) {\n        cancelTreeOptimisedTransformAnimations(parent)\n    }\n}\n\nexport function createProjectionNode<I>({\n    attachResizeListener,\n    defaultParent,\n    measureScroll,\n    checkIsScrollRoot,\n    resetTransform,\n}: ProjectionNodeConfig<I>) {\n    return class ProjectionNode implements IProjectionNode<I> {\n        /**\n         * A unique ID generated for every projection node.\n         */\n        id: number = id++\n\n        /**\n         * An id that represents a unique session instigated by startUpdate.\n         */\n        animationId: number = 0\n\n        animationCommitId = 0\n\n        /**\n         * A reference to the platform-native node (currently this will be a HTMLElement).\n         */\n        instance: I | undefined\n\n        /**\n         * A reference to the root projection node. There'll only ever be one tree and one root.\n         */\n        root: IProjectionNode\n\n        /**\n         * A reference to this node's parent.\n         */\n        parent?: IProjectionNode\n\n        /**\n         * A path from this node to the root node. This provides a fast way to iterate\n         * back up the tree.\n         */\n        path: IProjectionNode[]\n\n        /**\n         * A Set containing all this component's children. This is used to iterate\n         * through the children.\n         *\n         * TODO: This could be faster to iterate as a flat array stored on the root node.\n         */\n        children = new Set<IProjectionNode>()\n\n        /**\n         * Options for the node. We use this to configure what kind of layout animations\n         * we should perform (if any).\n         */\n        options: ProjectionNodeOptions = {}\n\n        /**\n         * A snapshot of the element's state just before the current update. This is\n         * hydrated when this node's `willUpdate` method is called and scrubbed at the\n         * end of the tree's `didUpdate` method.\n         */\n        snapshot: Measurements | undefined\n\n        /**\n         * A box defining the element's layout relative to the page. This will have been\n         * captured with all parent scrolls and projection transforms unset.\n         */\n        layout: Measurements | undefined\n\n        /**\n         * The layout used to calculate the previous layout animation. We use this to compare\n         * layouts between renders and decide whether we need to trigger a new layout animation\n         * or just let the current one play out.\n         */\n        targetLayout?: Box\n\n        /**\n         * A mutable data structure we use to apply all parent transforms currently\n         * acting on the element's layout. It's from here we can calculate the projectionDelta\n         * required to get the element from its layout into its calculated target box.\n         */\n        layoutCorrected: Box\n\n        /**\n         * An ideal projection transform we want to apply to the element. This is calculated,\n         * usually when an element's layout has changed, and we want the element to look as though\n         * its in its previous layout on the next frame. From there, we animated it down to 0\n         * to animate the element to its new layout.\n         */\n        targetDelta?: Delta\n\n        /**\n         * A mutable structure representing the visual bounding box on the page where we want\n         * and element to appear. This can be set directly but is currently derived once a frame\n         * from apply targetDelta to layout.\n         */\n        target?: Box\n\n        /**\n         * A mutable structure describing a visual bounding box relative to the element's\n         * projected parent. If defined, target will be derived from this rather than targetDelta.\n         * If not defined, we'll attempt to calculate on the first layout animation frame\n         * based on the targets calculated from targetDelta. This will transfer a layout animation\n         * from viewport-relative to parent-relative.\n         */\n        relativeTarget?: Box\n\n        relativeTargetOrigin?: Box\n        relativeParent?: IProjectionNode\n\n        /**\n         * We use this to detect when its safe to shut down part of a projection tree.\n         * We have to keep projecting children for scale correction and relative projection\n         * until all their parents stop performing layout animations.\n         */\n        isTreeAnimating = false\n\n        isAnimationBlocked = false\n\n        /**\n         * If true, attempt to resolve relativeTarget.\n         */\n        attemptToResolveRelativeTarget?: boolean\n\n        /**\n         * A mutable structure that represents the target as transformed by the element's\n         * latest user-set transforms (ie scale, x)\n         */\n        targetWithTransforms?: Box\n\n        /**\n         * The previous projection delta, which we can compare with the newly calculated\n         * projection delta to see if we need to render.\n         */\n        prevProjectionDelta?: Delta\n\n        /**\n         * A calculated transform that will project an element from its layoutCorrected\n         * into the target. This will be used by children to calculate their own layoutCorrect boxes.\n         */\n        projectionDelta?: Delta\n\n        /**\n         * A calculated transform that will project an element from its layoutCorrected\n         * into the targetWithTransforms.\n         */\n        projectionDeltaWithTransform?: Delta\n\n        /**\n         * If we're tracking the scroll of this element, we store it here.\n         */\n        scroll?: ScrollMeasurements\n\n        /**\n         * Flag to true if we think this layout has been changed. We can't always know this,\n         * currently we set it to true every time a component renders, or if it has a layoutDependency\n         * if that has changed between renders. Additionally, components can be grouped by LayoutGroup\n         * and if one node is dirtied, they all are.\n         */\n        isLayoutDirty = false\n\n        /**\n         * Flag to true if we think the projection calculations for this node needs\n         * recalculating as a result of an updated transform or layout animation.\n         */\n        isProjectionDirty = false\n\n        /**\n         * Flag to true if the layout *or* transform has changed. This then gets propagated\n         * throughout the projection tree, forcing any element below to recalculate on the next frame.\n         */\n        isSharedProjectionDirty = false\n\n        /**\n         * Flag transform dirty. This gets propagated throughout the whole tree but is only\n         * respected by shared nodes.\n         */\n        isTransformDirty = false\n\n        /**\n         * Block layout updates for instant layout transitions throughout the tree.\n         */\n        updateManuallyBlocked = false\n\n        updateBlockedByResize = false\n\n        /**\n         * Set to true between the start of the first `willUpdate` call and the end of the `didUpdate`\n         * call.\n         */\n        isUpdating = false\n\n        /**\n         * If this is an SVG element we currently disable projection transforms\n         */\n        isSVG = false\n\n        /**\n         * Flag to true (during promotion) if a node doing an instant layout transition needs to reset\n         * its projection styles.\n         */\n        needsReset = false\n\n        /**\n         * Flags whether this node should have its transform reset prior to measuring.\n         */\n        shouldResetTransform = false\n\n        /**\n         * Store whether this node has been checked for optimised appear animations. As\n         * effects fire bottom-up, and we want to look up the tree for appear animations,\n         * this makes sure we only check each path once, stopping at nodes that\n         * have already been checked.\n         */\n        hasCheckedOptimisedAppear = false\n\n        /**\n         * An object representing the calculated contextual/accumulated/tree scale.\n         * This will be used to scale calculcated projection transforms, as these are\n         * calculated in screen-space but need to be scaled for elements to layoutly\n         * make it to their calculated destinations.\n         *\n         * TODO: Lazy-init\n         */\n        treeScale: Point = { x: 1, y: 1 }\n\n        /**\n         * Is hydrated with a projection node if an element is animating from another.\n         */\n        resumeFrom?: IProjectionNode\n\n        /**\n         * Is hydrated with a projection node if an element is animating from another.\n         */\n        resumingFrom?: IProjectionNode\n\n        /**\n         * A reference to the element's latest animated values. This is a reference shared\n         * between the element's VisualElement and the ProjectionNode.\n         */\n        latestValues: ResolvedValues\n\n        /**\n         *\n         */\n        eventHandlers = new Map<LayoutEvents, SubscriptionManager<any>>()\n\n        nodes?: FlatTree\n\n        depth: number\n\n        /**\n         * If transformTemplate generates a different value before/after the\n         * update, we need to reset the transform.\n         */\n        prevTransformTemplateValue: string | undefined\n\n        preserveOpacity?: boolean\n\n        hasTreeAnimated = false\n\n        layoutVersion: number = 0\n\n        constructor(\n            latestValues: ResolvedValues = {},\n            parent: IProjectionNode | undefined = defaultParent?.()\n        ) {\n            this.latestValues = latestValues\n            this.root = parent ? parent.root || parent : this\n            this.path = parent ? [...parent.path, parent] : []\n            this.parent = parent\n\n            this.depth = parent ? parent.depth + 1 : 0\n\n            for (let i = 0; i < this.path.length; i++) {\n                this.path[i].shouldResetTransform = true\n            }\n\n            if (this.root === this) this.nodes = new FlatTree()\n        }\n\n        addEventListener(name: LayoutEvents, handler: any) {\n            if (!this.eventHandlers.has(name)) {\n                this.eventHandlers.set(name, new SubscriptionManager())\n            }\n\n            return this.eventHandlers.get(name)!.add(handler)\n        }\n\n        notifyListeners(name: LayoutEvents, ...args: any) {\n            const subscriptionManager = this.eventHandlers.get(name)\n            subscriptionManager && subscriptionManager.notify(...args)\n        }\n\n        hasListeners(name: LayoutEvents) {\n            return this.eventHandlers.has(name)\n        }\n\n        /**\n         * Lifecycles\n         */\n        mount(instance: I) {\n            if (this.instance) return\n\n            this.isSVG = isSVGElement(instance) && !isSVGSVGElement(instance)\n\n            this.instance = instance\n\n            const { layoutId, layout, visualElement } = this.options\n            if (visualElement && !visualElement.current) {\n                visualElement.mount(instance)\n            }\n\n            this.root.nodes!.add(this)\n            this.parent && this.parent.children.add(this)\n\n            if (this.root.hasTreeAnimated && (layout || layoutId)) {\n                this.isLayoutDirty = true\n            }\n\n            if (attachResizeListener) {\n                let cancelDelay: VoidFunction\n                let innerWidth = 0\n\n                const resizeUnblockUpdate = () =>\n                    (this.root.updateBlockedByResize = false)\n\n                // Set initial innerWidth in a frame.read callback to batch the read\n                frame.read(() => {\n                    innerWidth = window.innerWidth\n                })\n\n                attachResizeListener(instance, () => {\n                    const newInnerWidth = window.innerWidth\n                    if (newInnerWidth === innerWidth) return\n\n                    innerWidth = newInnerWidth\n\n                    this.root.updateBlockedByResize = true\n\n                    cancelDelay && cancelDelay()\n                    cancelDelay = delay(resizeUnblockUpdate, 250)\n\n                    if (globalProjectionState.hasAnimatedSinceResize) {\n                        globalProjectionState.hasAnimatedSinceResize = false\n                        this.nodes!.forEach(finishAnimation)\n                    }\n                })\n            }\n\n            if (layoutId) {\n                this.root.registerSharedNode(layoutId, this)\n            }\n\n            // Only register the handler if it requires layout animation\n            if (\n                this.options.animate !== false &&\n                visualElement &&\n                (layoutId || layout)\n            ) {\n                this.addEventListener(\n                    \"didUpdate\",\n                    ({\n                        delta,\n                        hasLayoutChanged,\n                        hasRelativeLayoutChanged,\n                        layout: newLayout,\n                    }: LayoutUpdateData) => {\n                        if (this.isTreeAnimationBlocked()) {\n                            this.target = undefined\n                            this.relativeTarget = undefined\n                            return\n                        }\n\n                        // TODO: Check here if an animation exists\n                        const layoutTransition =\n                            this.options.transition ||\n                            visualElement.getDefaultTransition() ||\n                            defaultLayoutTransition\n\n                        const {\n                            onLayoutAnimationStart,\n                            onLayoutAnimationComplete,\n                        } = visualElement.getProps()\n\n                        /**\n                         * The target layout of the element might stay the same,\n                         * but its position relative to its parent has changed.\n                         */\n                        const hasTargetChanged =\n                            !this.targetLayout ||\n                            !boxEqualsRounded(this.targetLayout, newLayout)\n                        /*\n                         * Note: Disabled to fix relative animations always triggering new\n                         * layout animations. If this causes further issues, we can try\n                         * a different approach to detecting relative target changes.\n                         */\n                        // || hasRelativeLayoutChanged\n\n                        /**\n                         * If the layout hasn't seemed to have changed, it might be that the\n                         * element is visually in the same place in the document but its position\n                         * relative to its parent has indeed changed. So here we check for that.\n                         */\n                        const hasOnlyRelativeTargetChanged =\n                            !hasLayoutChanged && hasRelativeLayoutChanged\n\n                        if (\n                            this.options.layoutRoot ||\n                            this.resumeFrom ||\n                            hasOnlyRelativeTargetChanged ||\n                            (hasLayoutChanged &&\n                                (hasTargetChanged || !this.currentAnimation))\n                        ) {\n                            if (this.resumeFrom) {\n                                this.resumingFrom = this.resumeFrom\n                                this.resumingFrom.resumingFrom = undefined\n                            }\n\n                            const animationOptions = {\n                                ...getValueTransition(\n                                    layoutTransition,\n                                    \"layout\"\n                                ),\n                                onPlay: onLayoutAnimationStart,\n                                onComplete: onLayoutAnimationComplete,\n                            }\n\n                            if (\n                                visualElement.shouldReduceMotion ||\n                                this.options.layoutRoot\n                            ) {\n                                animationOptions.delay = 0\n                                animationOptions.type = false\n                            }\n\n                            this.startAnimation(animationOptions)\n                            /**\n                             * Set animation origin after starting animation to avoid layout jump\n                             * caused by stopping previous layout animation\n                             */\n                            this.setAnimationOrigin(\n                                delta,\n                                hasOnlyRelativeTargetChanged\n                            )\n                        } else {\n                            /**\n                             * If the layout hasn't changed and we have an animation that hasn't started yet,\n                             * finish it immediately. Otherwise it will be animating from a location\n                             * that was probably never committed to screen and look like a jumpy box.\n                             */\n\n                            if (!hasLayoutChanged) {\n                                finishAnimation(this)\n                            }\n\n                            if (this.isLead() && this.options.onExitComplete) {\n                                this.options.onExitComplete()\n                            }\n                        }\n\n                        this.targetLayout = newLayout\n                    }\n                )\n            }\n        }\n\n        unmount() {\n            this.options.layoutId && this.willUpdate()\n            this.root.nodes!.remove(this)\n            const stack = this.getStack()\n            stack && stack.remove(this)\n            this.parent && this.parent.children.delete(this)\n            this.instance = undefined\n            this.eventHandlers.clear()\n\n            cancelFrame(this.updateProjection)\n        }\n\n        // only on the root\n        blockUpdate() {\n            this.updateManuallyBlocked = true\n        }\n\n        unblockUpdate() {\n            this.updateManuallyBlocked = false\n        }\n\n        isUpdateBlocked() {\n            return this.updateManuallyBlocked || this.updateBlockedByResize\n        }\n\n        isTreeAnimationBlocked() {\n            return (\n                this.isAnimationBlocked ||\n                (this.parent && this.parent.isTreeAnimationBlocked()) ||\n                false\n            )\n        }\n\n        // Note: currently only running on root node\n        startUpdate() {\n            if (this.isUpdateBlocked()) return\n\n            this.isUpdating = true\n\n            this.nodes && this.nodes.forEach(resetSkewAndRotation)\n            this.animationId++\n        }\n\n        getTransformTemplate() {\n            const { visualElement } = this.options\n            return visualElement && visualElement.getProps().transformTemplate\n        }\n\n        willUpdate(shouldNotifyListeners = true) {\n            this.root.hasTreeAnimated = true\n\n            if (this.root.isUpdateBlocked()) {\n                this.options.onExitComplete && this.options.onExitComplete()\n                return\n            }\n\n            /**\n             * If we're running optimised appear animations then these must be\n             * cancelled before measuring the DOM. This is so we can measure\n             * the true layout of the element rather than the WAAPI animation\n             * which will be unaffected by the resetSkewAndRotate step.\n             *\n             * Note: This is a DOM write. Worst case scenario is this is sandwiched\n             * between other snapshot reads which will cause unnecessary style recalculations.\n             * This has to happen here though, as we don't yet know which nodes will need\n             * snapshots in startUpdate(), but we only want to cancel optimised animations\n             * if a layout animation measurement is actually going to be affected by them.\n             */\n            if (\n                window.MotionCancelOptimisedAnimation &&\n                !this.hasCheckedOptimisedAppear\n            ) {\n                cancelTreeOptimisedTransformAnimations(this)\n            }\n\n            !this.root.isUpdating && this.root.startUpdate()\n\n            if (this.isLayoutDirty) return\n\n            this.isLayoutDirty = true\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i]\n                node.shouldResetTransform = true\n\n                node.updateScroll(\"snapshot\")\n\n                if (node.options.layoutRoot) {\n                    node.willUpdate(false)\n                }\n            }\n\n            const { layoutId, layout } = this.options\n            if (layoutId === undefined && !layout) return\n\n            const transformTemplate = this.getTransformTemplate()\n            this.prevTransformTemplateValue = transformTemplate\n                ? transformTemplate(this.latestValues, \"\")\n                : undefined\n\n            this.updateSnapshot()\n            shouldNotifyListeners && this.notifyListeners(\"willUpdate\")\n        }\n\n        // Note: Currently only running on root node\n        updateScheduled = false\n\n        update() {\n            this.updateScheduled = false\n\n            const updateWasBlocked = this.isUpdateBlocked()\n\n            // When doing an instant transition, we skip the layout update,\n            // but should still clean up the measurements so that the next\n            // snapshot could be taken correctly.\n            if (updateWasBlocked) {\n                this.unblockUpdate()\n                this.clearAllSnapshots()\n                this.nodes!.forEach(clearMeasurements)\n                return\n            }\n\n            /**\n             * If this is a repeat of didUpdate then ignore the animation.\n             */\n            if (this.animationId <= this.animationCommitId) {\n                this.nodes!.forEach(clearIsLayoutDirty)\n                return\n            }\n\n            this.animationCommitId = this.animationId\n\n            if (!this.isUpdating) {\n                this.nodes!.forEach(clearIsLayoutDirty)\n            } else {\n                this.isUpdating = false\n\n                /**\n                 * Write\n                 */\n                this.nodes!.forEach(resetTransformStyle)\n\n                /**\n                 * Read ==================\n                 */\n                // Update layout measurements of updated children\n                this.nodes!.forEach(updateLayout)\n\n                /**\n                 * Write\n                 */\n                // Notify listeners that the layout is updated\n                this.nodes!.forEach(notifyLayoutUpdate)\n            }\n\n            this.clearAllSnapshots()\n\n            /**\n             * Manually flush any pending updates. Ideally\n             * we could leave this to the following requestAnimationFrame but this seems\n             * to leave a flash of incorrectly styled content.\n             */\n            const now = time.now()\n            frameData.delta = clamp(0, 1000 / 60, now - frameData.timestamp)\n            frameData.timestamp = now\n            frameData.isProcessing = true\n            frameSteps.update.process(frameData)\n            frameSteps.preRender.process(frameData)\n            frameSteps.render.process(frameData)\n            frameData.isProcessing = false\n        }\n\n        scheduleUpdate = () => this.update()\n\n        didUpdate() {\n            if (!this.updateScheduled) {\n                this.updateScheduled = true\n                microtask.read(this.scheduleUpdate)\n            }\n        }\n\n        clearAllSnapshots() {\n            this.nodes!.forEach(clearSnapshot)\n            this.sharedNodes.forEach(removeLeadSnapshots)\n        }\n\n        projectionUpdateScheduled = false\n        scheduleUpdateProjection() {\n            if (!this.projectionUpdateScheduled) {\n                this.projectionUpdateScheduled = true\n                frame.preRender(this.updateProjection, false, true)\n            }\n        }\n\n        scheduleCheckAfterUnmount() {\n            /**\n             * If the unmounting node is in a layoutGroup and did trigger a willUpdate,\n             * we manually call didUpdate to give a chance to the siblings to animate.\n             * Otherwise, cleanup all snapshots to prevents future nodes from reusing them.\n             */\n            frame.postRender(() => {\n                if (this.isLayoutDirty) {\n                    this.root.didUpdate()\n                } else {\n                    this.root.checkUpdateFailed()\n                }\n            })\n        }\n\n        checkUpdateFailed = () => {\n            if (this.isUpdating) {\n                this.isUpdating = false\n                this.clearAllSnapshots()\n            }\n        }\n\n        /**\n         * This is a multi-step process as shared nodes might be of different depths. Nodes\n         * are sorted by depth order, so we need to resolve the entire tree before moving to\n         * the next step.\n         */\n        updateProjection = () => {\n            this.projectionUpdateScheduled = false\n\n            /**\n             * Reset debug counts. Manually resetting rather than creating a new\n             * object each frame.\n             */\n            if (statsBuffer.value) {\n                metrics.nodes =\n                    metrics.calculatedTargetDeltas =\n                    metrics.calculatedProjections =\n                        0\n            }\n\n            this.nodes!.forEach(propagateDirtyNodes)\n            this.nodes!.forEach(resolveTargetDelta)\n            this.nodes!.forEach(calcProjection)\n            this.nodes!.forEach(cleanDirtyNodes)\n\n            if (statsBuffer.addProjectionMetrics) {\n                statsBuffer.addProjectionMetrics(metrics)\n            }\n        }\n\n        /**\n         * Update measurements\n         */\n        updateSnapshot() {\n            if (this.snapshot || !this.instance) return\n\n            this.snapshot = this.measure()\n\n            if (\n                this.snapshot &&\n                !calcLength(this.snapshot.measuredBox.x) &&\n                !calcLength(this.snapshot.measuredBox.y)\n            ) {\n                this.snapshot = undefined\n            }\n        }\n\n        updateLayout() {\n            if (!this.instance) return\n\n            this.updateScroll()\n\n            if (\n                !(this.options.alwaysMeasureLayout && this.isLead()) &&\n                !this.isLayoutDirty\n            ) {\n                return\n            }\n\n            /**\n             * When a node is mounted, it simply resumes from the prevLead's\n             * snapshot instead of taking a new one, but the ancestors scroll\n             * might have updated while the prevLead is unmounted. We need to\n             * update the scroll again to make sure the layout we measure is\n             * up to date.\n             */\n            if (this.resumeFrom && !this.resumeFrom.instance) {\n                for (let i = 0; i < this.path.length; i++) {\n                    const node = this.path[i]\n                    node.updateScroll()\n                }\n            }\n\n            const prevLayout = this.layout\n            this.layout = this.measure(false)\n            this.layoutVersion++\n            this.layoutCorrected = createBox()\n            this.isLayoutDirty = false\n            this.projectionDelta = undefined\n            this.notifyListeners(\"measure\", this.layout.layoutBox)\n\n            const { visualElement } = this.options\n            visualElement &&\n                visualElement.notify(\n                    \"LayoutMeasure\",\n                    this.layout.layoutBox,\n                    prevLayout ? prevLayout.layoutBox : undefined\n                )\n        }\n\n        updateScroll(phase: Phase = \"measure\") {\n            let needsMeasurement = Boolean(\n                this.options.layoutScroll && this.instance\n            )\n\n            if (\n                this.scroll &&\n                this.scroll.animationId === this.root.animationId &&\n                this.scroll.phase === phase\n            ) {\n                needsMeasurement = false\n            }\n\n            if (needsMeasurement && this.instance) {\n                const isRoot = checkIsScrollRoot(this.instance)\n                this.scroll = {\n                    animationId: this.root.animationId,\n                    phase,\n                    isRoot,\n                    offset: measureScroll(this.instance),\n                    wasRoot: this.scroll ? this.scroll.isRoot : isRoot,\n                }\n            }\n        }\n\n        resetTransform() {\n            if (!resetTransform) return\n\n            const isResetRequested =\n                this.isLayoutDirty ||\n                this.shouldResetTransform ||\n                this.options.alwaysMeasureLayout\n\n            const hasProjection =\n                this.projectionDelta && !isDeltaZero(this.projectionDelta)\n\n            const transformTemplate = this.getTransformTemplate()\n            const transformTemplateValue = transformTemplate\n                ? transformTemplate(this.latestValues, \"\")\n                : undefined\n\n            const transformTemplateHasChanged =\n                transformTemplateValue !== this.prevTransformTemplateValue\n\n            if (\n                isResetRequested &&\n                this.instance &&\n                (hasProjection ||\n                    hasTransform(this.latestValues) ||\n                    transformTemplateHasChanged)\n            ) {\n                resetTransform(this.instance, transformTemplateValue)\n                this.shouldResetTransform = false\n                this.scheduleRender()\n            }\n        }\n\n        measure(removeTransform = true) {\n            const pageBox = this.measurePageBox()\n\n            let layoutBox = this.removeElementScroll(pageBox)\n\n            /**\n             * Measurements taken during the pre-render stage\n             * still have transforms applied so we remove them\n             * via calculation.\n             */\n            if (removeTransform) {\n                layoutBox = this.removeTransform(layoutBox)\n            }\n\n            roundBox(layoutBox)\n\n            return {\n                animationId: this.root.animationId,\n                measuredBox: pageBox,\n                layoutBox,\n                latestValues: {},\n                source: this.id,\n            }\n        }\n\n        measurePageBox() {\n            const { visualElement } = this.options\n            if (!visualElement) return createBox()\n\n            const box = visualElement.measureViewportBox()\n\n            const wasInScrollRoot =\n                this.scroll?.wasRoot || this.path.some(checkNodeWasScrollRoot)\n\n            if (!wasInScrollRoot) {\n                // Remove viewport scroll to give page-relative coordinates\n                const { scroll } = this.root\n                if (scroll) {\n                    translateAxis(box.x, scroll.offset.x)\n                    translateAxis(box.y, scroll.offset.y)\n                }\n            }\n\n            return box\n        }\n\n        removeElementScroll(box: Box): Box {\n            const boxWithoutScroll = createBox()\n            copyBoxInto(boxWithoutScroll, box)\n\n            if (this.scroll?.wasRoot) {\n                return boxWithoutScroll\n            }\n\n            /**\n             * Performance TODO: Keep a cumulative scroll offset down the tree\n             * rather than loop back up the path.\n             */\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i]\n                const { scroll, options } = node\n\n                if (node !== this.root && scroll && options.layoutScroll) {\n                    /**\n                     * If this is a new scroll root, we want to remove all previous scrolls\n                     * from the viewport box.\n                     */\n                    if (scroll.wasRoot) {\n                        copyBoxInto(boxWithoutScroll, box)\n                    }\n\n                    translateAxis(boxWithoutScroll.x, scroll.offset.x)\n                    translateAxis(boxWithoutScroll.y, scroll.offset.y)\n                }\n            }\n\n            return boxWithoutScroll\n        }\n\n        applyTransform(box: Box, transformOnly = false): Box {\n            const withTransforms = createBox()\n            copyBoxInto(withTransforms, box)\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i]\n\n                if (\n                    !transformOnly &&\n                    node.options.layoutScroll &&\n                    node.scroll &&\n                    node !== node.root\n                ) {\n                    transformBox(withTransforms, {\n                        x: -node.scroll.offset.x,\n                        y: -node.scroll.offset.y,\n                    })\n                }\n\n                if (!hasTransform(node.latestValues)) continue\n                transformBox(withTransforms, node.latestValues)\n            }\n\n            if (hasTransform(this.latestValues)) {\n                transformBox(withTransforms, this.latestValues)\n            }\n\n            return withTransforms\n        }\n\n        removeTransform(box: Box): Box {\n            const boxWithoutTransform = createBox()\n            copyBoxInto(boxWithoutTransform, box)\n\n            for (let i = 0; i < this.path.length; i++) {\n                const node = this.path[i]\n                if (!node.instance) continue\n                if (!hasTransform(node.latestValues)) continue\n\n                hasScale(node.latestValues) && node.updateSnapshot()\n\n                const sourceBox = createBox()\n                const nodeBox = node.measurePageBox()\n                copyBoxInto(sourceBox, nodeBox)\n\n                removeBoxTransforms(\n                    boxWithoutTransform,\n                    node.latestValues,\n                    node.snapshot ? node.snapshot.layoutBox : undefined,\n                    sourceBox\n                )\n            }\n\n            if (hasTransform(this.latestValues)) {\n                removeBoxTransforms(boxWithoutTransform, this.latestValues)\n            }\n\n            return boxWithoutTransform\n        }\n\n        setTargetDelta(delta: Delta) {\n            this.targetDelta = delta\n            this.root.scheduleUpdateProjection()\n            this.isProjectionDirty = true\n        }\n\n        setOptions(options: ProjectionNodeOptions) {\n            this.options = {\n                ...this.options,\n                ...options,\n                crossfade:\n                    options.crossfade !== undefined ? options.crossfade : true,\n            }\n        }\n\n        clearMeasurements() {\n            this.scroll = undefined\n            this.layout = undefined\n            this.snapshot = undefined\n            this.prevTransformTemplateValue = undefined\n            this.targetDelta = undefined\n            this.target = undefined\n            this.isLayoutDirty = false\n        }\n\n        forceRelativeParentToResolveTarget() {\n            if (!this.relativeParent) return\n\n            /**\n             * If the parent target isn't up-to-date, force it to update.\n             * This is an unfortunate de-optimisation as it means any updating relative\n             * projection will cause all the relative parents to recalculate back\n             * up the tree.\n             */\n            if (\n                this.relativeParent.resolvedRelativeTargetAt !==\n                frameData.timestamp\n            ) {\n                this.relativeParent.resolveTargetDelta(true)\n            }\n        }\n\n        /**\n         * Frame calculations\n         */\n        resolvedRelativeTargetAt: number = 0.0\n        resolveTargetDelta(forceRecalculation = false) {\n            /**\n             * Once the dirty status of nodes has been spread through the tree, we also\n             * need to check if we have a shared node of a different depth that has itself\n             * been dirtied.\n             */\n            const lead = this.getLead()\n            this.isProjectionDirty ||= lead.isProjectionDirty\n            this.isTransformDirty ||= lead.isTransformDirty\n            this.isSharedProjectionDirty ||= lead.isSharedProjectionDirty\n\n            const isShared = Boolean(this.resumingFrom) || this !== lead\n\n            /**\n             * We don't use transform for this step of processing so we don't\n             * need to check whether any nodes have changed transform.\n             */\n            const canSkip = !(\n                forceRecalculation ||\n                (isShared && this.isSharedProjectionDirty) ||\n                this.isProjectionDirty ||\n                this.parent?.isProjectionDirty ||\n                this.attemptToResolveRelativeTarget ||\n                this.root.updateBlockedByResize\n            )\n\n            if (canSkip) return\n\n            const { layout, layoutId } = this.options\n\n            /**\n             * If we have no layout, we can't perform projection, so early return\n             */\n            if (!this.layout || !(layout || layoutId)) return\n\n            this.resolvedRelativeTargetAt = frameData.timestamp\n\n            const relativeParent = this.getClosestProjectingParent()\n\n            if (\n                relativeParent &&\n                this.linkedParentVersion !== relativeParent.layoutVersion &&\n                !relativeParent.options.layoutRoot\n            ) {\n                this.removeRelativeTarget()\n            }\n\n            /**\n             * If we don't have a targetDelta but do have a layout, we can attempt to resolve\n             * a relativeParent. This will allow a component to perform scale correction\n             * even if no animation has started.\n             */\n            if (!this.targetDelta && !this.relativeTarget) {\n                if (relativeParent && relativeParent.layout) {\n                    this.createRelativeTarget(\n                        relativeParent,\n                        this.layout.layoutBox,\n                        relativeParent.layout.layoutBox\n                    )\n                } else {\n                    this.removeRelativeTarget()\n                }\n            }\n\n            /**\n             * If we have no relative target or no target delta our target isn't valid\n             * for this frame.\n             */\n            if (!this.relativeTarget && !this.targetDelta) return\n\n            /**\n             * Lazy-init target data structure\n             */\n            if (!this.target) {\n                this.target = createBox()\n                this.targetWithTransforms = createBox()\n            }\n\n            /**\n             * If we've got a relative box for this component, resolve it into a target relative to the parent.\n             */\n            if (\n                this.relativeTarget &&\n                this.relativeTargetOrigin &&\n                this.relativeParent &&\n                this.relativeParent.target\n            ) {\n                this.forceRelativeParentToResolveTarget()\n\n                calcRelativeBox(\n                    this.target,\n                    this.relativeTarget,\n                    this.relativeParent.target\n                )\n\n                /**\n                 * If we've only got a targetDelta, resolve it into a target\n                 */\n            } else if (this.targetDelta) {\n                if (Boolean(this.resumingFrom)) {\n                    // TODO: This is creating a new object every frame\n                    this.target = this.applyTransform(this.layout.layoutBox)\n                } else {\n                    copyBoxInto(this.target, this.layout.layoutBox)\n                }\n\n                applyBoxDelta(this.target, this.targetDelta)\n            } else {\n                /**\n                 * If no target, use own layout as target\n                 */\n                copyBoxInto(this.target, this.layout.layoutBox)\n            }\n\n            /**\n             * If we've been told to attempt to resolve a relative target, do so.\n             */\n            if (this.attemptToResolveRelativeTarget) {\n                this.attemptToResolveRelativeTarget = false\n\n                if (\n                    relativeParent &&\n                    Boolean(relativeParent.resumingFrom) ===\n                        Boolean(this.resumingFrom) &&\n                    !relativeParent.options.layoutScroll &&\n                    relativeParent.target &&\n                    this.animationProgress !== 1\n                ) {\n                    this.createRelativeTarget(\n                        relativeParent,\n                        this.target,\n                        relativeParent.target\n                    )\n                } else {\n                    this.relativeParent = this.relativeTarget = undefined\n                }\n            }\n\n            /**\n             * Increase debug counter for resolved target deltas\n             */\n            if (statsBuffer.value) {\n                metrics.calculatedTargetDeltas++\n            }\n        }\n\n        getClosestProjectingParent() {\n            if (\n                !this.parent ||\n                hasScale(this.parent.latestValues) ||\n                has2DTranslate(this.parent.latestValues)\n            ) {\n                return undefined\n            }\n\n            if (this.parent.isProjecting()) {\n                return this.parent\n            } else {\n                return this.parent.getClosestProjectingParent()\n            }\n        }\n\n        isProjecting() {\n            return Boolean(\n                (this.relativeTarget ||\n                    this.targetDelta ||\n                    this.options.layoutRoot) &&\n                    this.layout\n            )\n        }\n\n        linkedParentVersion: number = 0\n        createRelativeTarget(\n            relativeParent: IProjectionNode,\n            layout: Box,\n            parentLayout: Box\n        ) {\n            this.relativeParent = relativeParent\n            this.linkedParentVersion = relativeParent.layoutVersion\n            this.forceRelativeParentToResolveTarget()\n            this.relativeTarget = createBox()\n            this.relativeTargetOrigin = createBox()\n            calcRelativePosition(\n                this.relativeTargetOrigin,\n                layout,\n                parentLayout\n            )\n\n            copyBoxInto(this.relativeTarget, this.relativeTargetOrigin)\n        }\n\n        removeRelativeTarget() {\n            this.relativeParent = this.relativeTarget = undefined\n        }\n\n        hasProjected: boolean = false\n\n        calcProjection() {\n            const lead = this.getLead()\n            const isShared = Boolean(this.resumingFrom) || this !== lead\n\n            let canSkip = true\n\n            /**\n             * If this is a normal layout animation and neither this node nor its nearest projecting\n             * is dirty then we can't skip.\n             */\n            if (this.isProjectionDirty || this.parent?.isProjectionDirty) {\n                canSkip = false\n            }\n\n            /**\n             * If this is a shared layout animation and this node's shared projection is dirty then\n             * we can't skip.\n             */\n            if (\n                isShared &&\n                (this.isSharedProjectionDirty || this.isTransformDirty)\n            ) {\n                canSkip = false\n            }\n\n            /**\n             * If we have resolved the target this frame we must recalculate the\n             * projection to ensure it visually represents the internal calculations.\n             */\n            if (this.resolvedRelativeTargetAt === frameData.timestamp) {\n                canSkip = false\n            }\n\n            if (canSkip) return\n\n            const { layout, layoutId } = this.options\n\n            /**\n             * If this section of the tree isn't animating we can\n             * delete our target sources for the following frame.\n             */\n            this.isTreeAnimating = Boolean(\n                (this.parent && this.parent.isTreeAnimating) ||\n                    this.currentAnimation ||\n                    this.pendingAnimation\n            )\n            if (!this.isTreeAnimating) {\n                this.targetDelta = this.relativeTarget = undefined\n            }\n\n            if (!this.layout || !(layout || layoutId)) return\n\n            /**\n             * Reset the corrected box with the latest values from box, as we're then going\n             * to perform mutative operations on it.\n             */\n            copyBoxInto(this.layoutCorrected, this.layout.layoutBox)\n\n            /**\n             * Record previous tree scales before updating.\n             */\n            const prevTreeScaleX = this.treeScale.x\n            const prevTreeScaleY = this.treeScale.y\n            /**\n             * Apply all the parent deltas to this box to produce the corrected box. This\n             * is the layout box, as it will appear on screen as a result of the transforms of its parents.\n             */\n            applyTreeDeltas(\n                this.layoutCorrected,\n                this.treeScale,\n                this.path,\n                isShared\n            )\n\n            /**\n             * If this layer needs to perform scale correction but doesn't have a target,\n             * use the layout as the target.\n             */\n            if (\n                lead.layout &&\n                !lead.target &&\n                (this.treeScale.x !== 1 || this.treeScale.y !== 1)\n            ) {\n                lead.target = lead.layout.layoutBox\n                lead.targetWithTransforms = createBox()\n            }\n\n            const { target } = lead\n\n            if (!target) {\n                /**\n                 * If we don't have a target to project into, but we were previously\n                 * projecting, we want to remove the stored transform and schedule\n                 * a render to ensure the elements reflect the removed transform.\n                 */\n                if (this.prevProjectionDelta) {\n                    this.createProjectionDeltas()\n                    this.scheduleRender()\n                }\n\n                return\n            }\n\n            if (!this.projectionDelta || !this.prevProjectionDelta) {\n                this.createProjectionDeltas()\n            } else {\n                copyAxisDeltaInto(\n                    this.prevProjectionDelta.x,\n                    this.projectionDelta.x\n                )\n                copyAxisDeltaInto(\n                    this.prevProjectionDelta.y,\n                    this.projectionDelta.y\n                )\n            }\n\n            /**\n             * Update the delta between the corrected box and the target box before user-set transforms were applied.\n             * This will allow us to calculate the corrected borderRadius and boxShadow to compensate\n             * for our layout reprojection, but still allow them to be scaled correctly by the user.\n             * It might be that to simplify this we may want to accept that user-set scale is also corrected\n             * and we wouldn't have to keep and calc both deltas, OR we could support a user setting\n             * to allow people to choose whether these styles are corrected based on just the\n             * layout reprojection or the final bounding box.\n             */\n            calcBoxDelta(\n                this.projectionDelta!,\n                this.layoutCorrected,\n                target,\n                this.latestValues\n            )\n\n            if (\n                this.treeScale.x !== prevTreeScaleX ||\n                this.treeScale.y !== prevTreeScaleY ||\n                !axisDeltaEquals(\n                    this.projectionDelta!.x,\n                    this.prevProjectionDelta!.x\n                ) ||\n                !axisDeltaEquals(\n                    this.projectionDelta!.y,\n                    this.prevProjectionDelta!.y\n                )\n            ) {\n                this.hasProjected = true\n                this.scheduleRender()\n                this.notifyListeners(\"projectionUpdate\", target)\n            }\n\n            /**\n             * Increase debug counter for recalculated projections\n             */\n            if (statsBuffer.value) {\n                metrics.calculatedProjections++\n            }\n        }\n\n        isVisible = true\n        hide() {\n            this.isVisible = false\n            // TODO: Schedule render\n        }\n        show() {\n            this.isVisible = true\n            // TODO: Schedule render\n        }\n\n        scheduleRender(notifyAll = true) {\n            this.options.visualElement?.scheduleRender()\n            if (notifyAll) {\n                const stack = this.getStack()\n                stack && stack.scheduleRender()\n            }\n            if (this.resumingFrom && !this.resumingFrom.instance) {\n                this.resumingFrom = undefined\n            }\n        }\n\n        createProjectionDeltas() {\n            this.prevProjectionDelta = createDelta()\n            this.projectionDelta = createDelta()\n            this.projectionDeltaWithTransform = createDelta()\n        }\n\n        /**\n         * Animation\n         */\n        animationValues?: ResolvedValues\n        pendingAnimation?: Process\n        currentAnimation?: JSAnimation<number>\n        mixTargetDelta: (progress: number) => void\n        animationProgress = 0\n\n        setAnimationOrigin(\n            delta: Delta,\n            hasOnlyRelativeTargetChanged: boolean = false\n        ) {\n            const snapshot = this.snapshot\n            const snapshotLatestValues = snapshot ? snapshot.latestValues : {}\n            const mixedValues = { ...this.latestValues }\n\n            const targetDelta = createDelta()\n            if (\n                !this.relativeParent ||\n                !this.relativeParent.options.layoutRoot\n            ) {\n                this.relativeTarget = this.relativeTargetOrigin = undefined\n            }\n            this.attemptToResolveRelativeTarget = !hasOnlyRelativeTargetChanged\n\n            const relativeLayout = createBox()\n\n            const snapshotSource = snapshot ? snapshot.source : undefined\n            const layoutSource = this.layout ? this.layout.source : undefined\n            const isSharedLayoutAnimation = snapshotSource !== layoutSource\n            const stack = this.getStack()\n            const isOnlyMember = !stack || stack.members.length <= 1\n            const shouldCrossfadeOpacity = Boolean(\n                isSharedLayoutAnimation &&\n                    !isOnlyMember &&\n                    this.options.crossfade === true &&\n                    !this.path.some(hasOpacityCrossfade)\n            )\n\n            this.animationProgress = 0\n\n            let prevRelativeTarget: Box\n\n            this.mixTargetDelta = (latest: number) => {\n                const progress = latest / 1000\n\n                mixAxisDelta(targetDelta.x, delta.x, progress)\n                mixAxisDelta(targetDelta.y, delta.y, progress)\n                this.setTargetDelta(targetDelta)\n\n                if (\n                    this.relativeTarget &&\n                    this.relativeTargetOrigin &&\n                    this.layout &&\n                    this.relativeParent &&\n                    this.relativeParent.layout\n                ) {\n                    calcRelativePosition(\n                        relativeLayout,\n                        this.layout.layoutBox,\n                        this.relativeParent.layout.layoutBox\n                    )\n                    mixBox(\n                        this.relativeTarget,\n                        this.relativeTargetOrigin,\n                        relativeLayout,\n                        progress\n                    )\n\n                    /**\n                     * If this is an unchanged relative target we can consider the\n                     * projection not dirty.\n                     */\n                    if (\n                        prevRelativeTarget &&\n                        boxEquals(this.relativeTarget, prevRelativeTarget)\n                    ) {\n                        this.isProjectionDirty = false\n                    }\n\n                    if (!prevRelativeTarget) prevRelativeTarget = createBox()\n                    copyBoxInto(prevRelativeTarget, this.relativeTarget)\n                }\n\n                if (isSharedLayoutAnimation) {\n                    this.animationValues = mixedValues\n\n                    mixValues(\n                        mixedValues,\n                        snapshotLatestValues,\n                        this.latestValues,\n                        progress,\n                        shouldCrossfadeOpacity,\n                        isOnlyMember\n                    )\n                }\n\n                this.root.scheduleUpdateProjection()\n                this.scheduleRender()\n\n                this.animationProgress = progress\n            }\n\n            this.mixTargetDelta(this.options.layoutRoot ? 1000 : 0)\n        }\n\n        motionValue?: MotionValue<number>\n        startAnimation(options: ValueAnimationOptions<number>) {\n            this.notifyListeners(\"animationStart\")\n\n            this.currentAnimation?.stop()\n            this.resumingFrom?.currentAnimation?.stop()\n\n            if (this.pendingAnimation) {\n                cancelFrame(this.pendingAnimation)\n                this.pendingAnimation = undefined\n            }\n\n            /**\n             * Start the animation in the next frame to have a frame with progress 0,\n             * where the target is the same as when the animation started, so we can\n             * calculate the relative positions correctly for instant transitions.\n             */\n            this.pendingAnimation = frame.update(() => {\n                globalProjectionState.hasAnimatedSinceResize = true\n\n                activeAnimations.layout++\n                this.motionValue ||= motionValue(0)\n                this.motionValue.jump(0, false)\n\n                this.currentAnimation = animateSingleValue(\n                    this.motionValue,\n                    [0, 1000],\n                    {\n                        ...(options as any),\n                        velocity: 0,\n                        isSync: true,\n                        onUpdate: (latest: number) => {\n                            this.mixTargetDelta(latest)\n                            options.onUpdate && options.onUpdate(latest)\n                        },\n                        onStop: () => {\n                            activeAnimations.layout--\n                        },\n                        onComplete: () => {\n                            activeAnimations.layout--\n                            options.onComplete && options.onComplete()\n                            this.completeAnimation()\n                        },\n                    }\n                ) as JSAnimation<number>\n\n                if (this.resumingFrom) {\n                    this.resumingFrom.currentAnimation = this.currentAnimation\n                }\n\n                this.pendingAnimation = undefined\n            })\n        }\n\n        completeAnimation() {\n            if (this.resumingFrom) {\n                this.resumingFrom.currentAnimation = undefined\n                this.resumingFrom.preserveOpacity = undefined\n            }\n\n            const stack = this.getStack()\n            stack && stack.exitAnimationComplete()\n            this.resumingFrom =\n                this.currentAnimation =\n                this.animationValues =\n                    undefined\n\n            this.notifyListeners(\"animationComplete\")\n        }\n\n        finishAnimation() {\n            if (this.currentAnimation) {\n                this.mixTargetDelta && this.mixTargetDelta(animationTarget)\n                this.currentAnimation.stop()\n            }\n\n            this.completeAnimation()\n        }\n\n        applyTransformsToTarget() {\n            const lead = this.getLead()\n            let { targetWithTransforms, target, layout, latestValues } = lead\n\n            if (!targetWithTransforms || !target || !layout) return\n\n            /**\n             * If we're only animating position, and this element isn't the lead element,\n             * then instead of projecting into the lead box we instead want to calculate\n             * a new target that aligns the two boxes but maintains the layout shape.\n             */\n            if (\n                this !== lead &&\n                this.layout &&\n                layout &&\n                shouldAnimatePositionOnly(\n                    this.options.animationType,\n                    this.layout.layoutBox,\n                    layout.layoutBox\n                )\n            ) {\n                target = this.target || createBox()\n\n                const xLength = calcLength(this.layout!.layoutBox.x)\n                target!.x.min = lead.target!.x.min\n                target!.x.max = target.x.min + xLength\n\n                const yLength = calcLength(this.layout!.layoutBox.y)\n                target!.y.min = lead.target!.y.min\n                target!.y.max = target.y.min + yLength\n            }\n\n            copyBoxInto(targetWithTransforms, target)\n\n            /**\n             * Apply the latest user-set transforms to the targetBox to produce the targetBoxFinal.\n             * This is the final box that we will then project into by calculating a transform delta and\n             * applying it to the corrected box.\n             */\n            transformBox(targetWithTransforms, latestValues)\n\n            /**\n             * Update the delta between the corrected box and the final target box, after\n             * user-set transforms are applied to it. This will be used by the renderer to\n             * create a transform style that will reproject the element from its layout layout\n             * into the desired bounding box.\n             */\n            calcBoxDelta(\n                this.projectionDeltaWithTransform!,\n                this.layoutCorrected,\n                targetWithTransforms!,\n                latestValues\n            )\n        }\n\n        /**\n         * Shared layout\n         */\n        // TODO Only running on root node\n        sharedNodes: Map<string, NodeStack> = new Map()\n        registerSharedNode(layoutId: string, node: IProjectionNode) {\n            if (!this.sharedNodes.has(layoutId)) {\n                this.sharedNodes.set(layoutId, new NodeStack())\n            }\n\n            const stack = this.sharedNodes.get(layoutId)!\n            stack.add(node)\n\n            const config = node.options.initialPromotionConfig\n            node.promote({\n                transition: config ? config.transition : undefined,\n                preserveFollowOpacity:\n                    config && config.shouldPreserveFollowOpacity\n                        ? config.shouldPreserveFollowOpacity(node)\n                        : undefined,\n            })\n        }\n\n        isLead(): boolean {\n            const stack = this.getStack()\n            return stack ? stack.lead === this : true\n        }\n\n        getLead() {\n            const { layoutId } = this.options\n            return layoutId ? this.getStack()?.lead || this : this\n        }\n\n        getPrevLead() {\n            const { layoutId } = this.options\n            return layoutId ? this.getStack()?.prevLead : undefined\n        }\n\n        getStack() {\n            const { layoutId } = this.options\n            if (layoutId) return this.root.sharedNodes.get(layoutId)\n        }\n\n        promote({\n            needsReset,\n            transition,\n            preserveFollowOpacity,\n        }: {\n            needsReset?: boolean\n            transition?: Transition\n            preserveFollowOpacity?: boolean\n        } = {}) {\n            const stack = this.getStack()\n            if (stack) stack.promote(this, preserveFollowOpacity)\n\n            if (needsReset) {\n                this.projectionDelta = undefined\n                this.needsReset = true\n            }\n            if (transition) this.setOptions({ transition })\n        }\n\n        relegate(): boolean {\n            const stack = this.getStack()\n            if (stack) {\n                return stack.relegate(this)\n            } else {\n                return false\n            }\n        }\n\n        resetSkewAndRotation() {\n            const { visualElement } = this.options\n\n            if (!visualElement) return\n\n            // If there's no detected skew or rotation values, we can early return without a forced render.\n            let hasDistortingTransform = false\n\n            /**\n             * An unrolled check for rotation values. Most elements don't have any rotation and\n             * skipping the nested loop and new object creation is 50% faster.\n             */\n            const { latestValues } = visualElement\n            if (\n                latestValues.z ||\n                latestValues.rotate ||\n                latestValues.rotateX ||\n                latestValues.rotateY ||\n                latestValues.rotateZ ||\n                latestValues.skewX ||\n                latestValues.skewY\n            ) {\n                hasDistortingTransform = true\n            }\n\n            // If there's no distorting values, we don't need to do any more.\n            if (!hasDistortingTransform) return\n\n            const resetValues: ResolvedValues = {}\n\n            if (latestValues.z) {\n                resetDistortingTransform(\n                    \"z\",\n                    visualElement,\n                    resetValues,\n                    this.animationValues\n                )\n            }\n\n            // Check the skew and rotate value of all axes and reset to 0\n            for (let i = 0; i < transformAxes.length; i++) {\n                resetDistortingTransform(\n                    `rotate${transformAxes[i]}`,\n                    visualElement,\n                    resetValues,\n                    this.animationValues\n                )\n                resetDistortingTransform(\n                    `skew${transformAxes[i]}`,\n                    visualElement,\n                    resetValues,\n                    this.animationValues\n                )\n            }\n\n            // Force a render of this element to apply the transform with all skews and rotations\n            // set to 0.\n            visualElement.render()\n\n            // Put back all the values we reset\n            for (const key in resetValues) {\n                visualElement.setStaticValue(key, resetValues[key])\n                if (this.animationValues) {\n                    this.animationValues[key] = resetValues[key]\n                }\n            }\n\n            // Schedule a render for the next frame. This ensures we won't visually\n            // see the element with the reset rotate value applied.\n            visualElement.scheduleRender()\n        }\n\n        applyProjectionStyles(\n            targetStyle: any, // CSSStyleDeclaration - doesn't allow numbers to be assigned to properties\n            styleProp?: MotionStyle\n        ) {\n            if (!this.instance || this.isSVG) return\n\n            if (!this.isVisible) {\n                targetStyle.visibility = \"hidden\"\n                return\n            }\n\n            const transformTemplate = this.getTransformTemplate()\n\n            if (this.needsReset) {\n                this.needsReset = false\n\n                targetStyle.visibility = \"\"\n                targetStyle.opacity = \"\"\n                targetStyle.pointerEvents =\n                    resolveMotionValue(styleProp?.pointerEvents) || \"\"\n                targetStyle.transform = transformTemplate\n                    ? transformTemplate(this.latestValues, \"\")\n                    : \"none\"\n                return\n            }\n\n            const lead = this.getLead()\n            if (!this.projectionDelta || !this.layout || !lead.target) {\n                if (this.options.layoutId) {\n                    targetStyle.opacity =\n                        this.latestValues.opacity !== undefined\n                            ? this.latestValues.opacity\n                            : 1\n                    targetStyle.pointerEvents =\n                        resolveMotionValue(styleProp?.pointerEvents) || \"\"\n                }\n                if (this.hasProjected && !hasTransform(this.latestValues)) {\n                    targetStyle.transform = transformTemplate\n                        ? transformTemplate({}, \"\")\n                        : \"none\"\n                    this.hasProjected = false\n                }\n\n                return\n            }\n\n            targetStyle.visibility = \"\"\n\n            const valuesToRender = lead.animationValues || lead.latestValues\n            this.applyTransformsToTarget()\n\n            let transform = buildProjectionTransform(\n                this.projectionDeltaWithTransform!,\n                this.treeScale,\n                valuesToRender\n            )\n\n            if (transformTemplate) {\n                transform = transformTemplate(valuesToRender, transform)\n            }\n\n            targetStyle.transform = transform\n\n            const { x, y } = this.projectionDelta\n            targetStyle.transformOrigin = `${x.origin * 100}% ${\n                y.origin * 100\n            }% 0`\n\n            if (lead.animationValues) {\n                /**\n                 * If the lead component is animating, assign this either the entering/leaving\n                 * opacity\n                 */\n                targetStyle.opacity =\n                    lead === this\n                        ? valuesToRender.opacity ??\n                          this.latestValues.opacity ??\n                          1\n                        : this.preserveOpacity\n                        ? this.latestValues.opacity\n                        : valuesToRender.opacityExit\n            } else {\n                /**\n                 * Or we're not animating at all, set the lead component to its layout\n                 * opacity and other components to hidden.\n                 */\n                targetStyle.opacity =\n                    lead === this\n                        ? valuesToRender.opacity !== undefined\n                            ? valuesToRender.opacity\n                            : \"\"\n                        : valuesToRender.opacityExit !== undefined\n                        ? valuesToRender.opacityExit\n                        : 0\n            }\n\n            /**\n             * Apply scale correction\n             */\n            for (const key in scaleCorrectors) {\n                if (valuesToRender[key] === undefined) continue\n\n                const { correct, applyTo, isCSSVariable } = scaleCorrectors[key]\n\n                /**\n                 * Only apply scale correction to the value if we have an\n                 * active projection transform. Otherwise these values become\n                 * vulnerable to distortion if the element changes size without\n                 * a corresponding layout animation.\n                 */\n                const corrected =\n                    transform === \"none\"\n                        ? valuesToRender[key]\n                        : correct(valuesToRender[key], lead)\n\n                if (applyTo) {\n                    const num = applyTo.length\n                    for (let i = 0; i < num; i++) {\n                        targetStyle[applyTo[i] as any] = corrected\n                    }\n                } else {\n                    // If this is a CSS variable, set it directly on the instance.\n                    // Replacing this function from creating styles to setting them\n                    // would be a good place to remove per frame object creation\n                    if (isCSSVariable) {\n                        ;(\n                            this.options.visualElement as HTMLVisualElement\n                        ).renderState.vars[key] = corrected\n                    } else {\n                        targetStyle[key as any] = corrected\n                    }\n                }\n            }\n\n            /**\n             * Disable pointer events on follow components. This is to ensure\n             * that if a follow component covers a lead component it doesn't block\n             * pointer events on the lead.\n             */\n            if (this.options.layoutId) {\n                targetStyle.pointerEvents =\n                    lead === this\n                        ? resolveMotionValue(styleProp?.pointerEvents) || \"\"\n                        : \"none\"\n            }\n        }\n\n        clearSnapshot() {\n            this.resumeFrom = this.snapshot = undefined\n        }\n\n        // Only run on root\n        resetTree() {\n            this.root.nodes!.forEach((node: IProjectionNode) =>\n                node.currentAnimation?.stop()\n            )\n            this.root.nodes!.forEach(clearMeasurements)\n            this.root.sharedNodes.clear()\n        }\n    }\n}\n\nfunction updateLayout(node: IProjectionNode) {\n    node.updateLayout()\n}\n\nfunction notifyLayoutUpdate(node: IProjectionNode) {\n    const snapshot = node.resumeFrom?.snapshot || node.snapshot\n\n    if (\n        node.isLead() &&\n        node.layout &&\n        snapshot &&\n        node.hasListeners(\"didUpdate\")\n    ) {\n        const { layoutBox: layout, measuredBox: measuredLayout } = node.layout\n        const { animationType } = node.options\n\n        const isShared = snapshot.source !== node.layout.source\n\n        // TODO Maybe we want to also resize the layout snapshot so we don't trigger\n        // animations for instance if layout=\"size\" and an element has only changed position\n        if (animationType === \"size\") {\n            eachAxis((axis) => {\n                const axisSnapshot = isShared\n                    ? snapshot.measuredBox[axis]\n                    : snapshot.layoutBox[axis]\n                const length = calcLength(axisSnapshot)\n                axisSnapshot.min = layout[axis].min\n                axisSnapshot.max = axisSnapshot.min + length\n            })\n        } else if (\n            shouldAnimatePositionOnly(animationType, snapshot.layoutBox, layout)\n        ) {\n            eachAxis((axis) => {\n                const axisSnapshot = isShared\n                    ? snapshot.measuredBox[axis]\n                    : snapshot.layoutBox[axis]\n                const length = calcLength(layout[axis])\n                axisSnapshot.max = axisSnapshot.min + length\n\n                /**\n                 * Ensure relative target gets resized and rerendererd\n                 */\n                if (node.relativeTarget && !node.currentAnimation) {\n                    node.isProjectionDirty = true\n                    node.relativeTarget[axis].max =\n                        node.relativeTarget[axis].min + length\n                }\n            })\n        }\n\n        const layoutDelta = createDelta()\n\n        calcBoxDelta(layoutDelta, layout, snapshot.layoutBox)\n        const visualDelta = createDelta()\n        if (isShared) {\n            calcBoxDelta(\n                visualDelta,\n                node.applyTransform(measuredLayout, true),\n                snapshot.measuredBox\n            )\n        } else {\n            calcBoxDelta(visualDelta, layout, snapshot.layoutBox)\n        }\n\n        const hasLayoutChanged = !isDeltaZero(layoutDelta)\n        let hasRelativeLayoutChanged = false\n\n        if (!node.resumeFrom) {\n            const relativeParent = node.getClosestProjectingParent()\n\n            /**\n             * If the relativeParent is itself resuming from a different element then\n             * the relative snapshot is not relavent\n             */\n            if (relativeParent && !relativeParent.resumeFrom) {\n                const { snapshot: parentSnapshot, layout: parentLayout } =\n                    relativeParent\n\n                if (parentSnapshot && parentLayout) {\n                    const relativeSnapshot = createBox()\n                    calcRelativePosition(\n                        relativeSnapshot,\n                        snapshot.layoutBox,\n                        parentSnapshot.layoutBox\n                    )\n\n                    const relativeLayout = createBox()\n                    calcRelativePosition(\n                        relativeLayout,\n                        layout,\n                        parentLayout.layoutBox\n                    )\n\n                    if (!boxEqualsRounded(relativeSnapshot, relativeLayout)) {\n                        hasRelativeLayoutChanged = true\n                    }\n\n                    if (relativeParent.options.layoutRoot) {\n                        node.relativeTarget = relativeLayout\n                        node.relativeTargetOrigin = relativeSnapshot\n                        node.relativeParent = relativeParent\n                    }\n                }\n            }\n        }\n\n        node.notifyListeners(\"didUpdate\", {\n            layout,\n            snapshot,\n            delta: visualDelta,\n            layoutDelta,\n            hasLayoutChanged,\n            hasRelativeLayoutChanged,\n        })\n    } else if (node.isLead()) {\n        const { onExitComplete } = node.options\n        onExitComplete && onExitComplete()\n    }\n\n    /**\n     * Clearing transition\n     * TODO: Investigate why this transition is being passed in as {type: false } from Framer\n     * and why we need it at all\n     */\n    node.options.transition = undefined\n}\n\nexport function propagateDirtyNodes(node: IProjectionNode) {\n    /**\n     * Increase debug counter for nodes encountered this frame\n     */\n    if (statsBuffer.value) {\n        metrics.nodes++\n    }\n\n    if (!node.parent) return\n\n    /**\n     * If this node isn't projecting, propagate isProjectionDirty. It will have\n     * no performance impact but it will allow the next child that *is* projecting\n     * but *isn't* dirty to just check its parent to see if *any* ancestor needs\n     * correcting.\n     */\n    if (!node.isProjecting()) {\n        node.isProjectionDirty = node.parent.isProjectionDirty\n    }\n\n    /**\n     * Propagate isSharedProjectionDirty and isTransformDirty\n     * throughout the whole tree. A future revision can take another look at\n     * this but for safety we still recalcualte shared nodes.\n     */\n    node.isSharedProjectionDirty ||= Boolean(\n        node.isProjectionDirty ||\n            node.parent.isProjectionDirty ||\n            node.parent.isSharedProjectionDirty\n    )\n\n    node.isTransformDirty ||= node.parent.isTransformDirty\n}\n\nexport function cleanDirtyNodes(node: IProjectionNode) {\n    node.isProjectionDirty =\n        node.isSharedProjectionDirty =\n        node.isTransformDirty =\n            false\n}\n\nfunction clearSnapshot(node: IProjectionNode) {\n    node.clearSnapshot()\n}\n\nfunction clearMeasurements(node: IProjectionNode) {\n    node.clearMeasurements()\n}\n\nfunction clearIsLayoutDirty(node: IProjectionNode) {\n    node.isLayoutDirty = false\n}\n\nfunction resetTransformStyle(node: IProjectionNode) {\n    const { visualElement } = node.options\n    if (visualElement && visualElement.getProps().onBeforeLayoutMeasure) {\n        visualElement.notify(\"BeforeLayoutMeasure\")\n    }\n\n    node.resetTransform()\n}\n\nfunction finishAnimation(node: IProjectionNode) {\n    node.finishAnimation()\n    node.targetDelta = node.relativeTarget = node.target = undefined\n    node.isProjectionDirty = true\n}\n\nfunction resolveTargetDelta(node: IProjectionNode) {\n    node.resolveTargetDelta()\n}\n\nfunction calcProjection(node: IProjectionNode) {\n    node.calcProjection()\n}\n\nfunction resetSkewAndRotation(node: IProjectionNode) {\n    node.resetSkewAndRotation()\n}\n\nfunction removeLeadSnapshots(stack: NodeStack) {\n    stack.removeLeadSnapshot()\n}\n\nexport function mixAxisDelta(output: AxisDelta, delta: AxisDelta, p: number) {\n    output.translate = mixNumber(delta.translate, 0, p)\n    output.scale = mixNumber(delta.scale, 1, p)\n    output.origin = delta.origin\n    output.originPoint = delta.originPoint\n}\n\nexport function mixAxis(output: Axis, from: Axis, to: Axis, p: number) {\n    output.min = mixNumber(from.min, to.min, p)\n    output.max = mixNumber(from.max, to.max, p)\n}\n\nexport function mixBox(output: Box, from: Box, to: Box, p: number) {\n    mixAxis(output.x, from.x, to.x, p)\n    mixAxis(output.y, from.y, to.y, p)\n}\n\nfunction hasOpacityCrossfade(node: IProjectionNode) {\n    return (\n        node.animationValues && node.animationValues.opacityExit !== undefined\n    )\n}\n\nconst defaultLayoutTransition = {\n    duration: 0.45,\n    ease: [0.4, 0, 0.1, 1],\n}\n\nconst userAgentContains = (string: string) =>\n    typeof navigator !== \"undefined\" &&\n    navigator.userAgent &&\n    navigator.userAgent.toLowerCase().includes(string)\n\n/**\n * Measured bounding boxes must be rounded in Safari and\n * left untouched in Chrome, otherwise non-integer layouts within scaled-up elements\n * can appear to jump.\n */\nconst roundPoint =\n    userAgentContains(\"applewebkit/\") && !userAgentContains(\"chrome/\")\n        ? Math.round\n        : noop\n\nfunction roundAxis(axis: Axis): void {\n    // Round to the nearest .5 pixels to support subpixel layouts\n    axis.min = roundPoint(axis.min)\n    axis.max = roundPoint(axis.max)\n}\n\nfunction roundBox(box: Box): void {\n    roundAxis(box.x)\n    roundAxis(box.y)\n}\n\nfunction shouldAnimatePositionOnly(\n    animationType: string | undefined,\n    snapshot: Box,\n    layout: Box\n) {\n    return (\n        animationType === \"position\" ||\n        (animationType === \"preserve-aspect\" &&\n            !isNear(aspectRatio(snapshot), aspectRatio(layout), 0.2))\n    )\n}\n\nfunction checkNodeWasScrollRoot(node: IProjectionNode) {\n    return node !== node.root && node.scroll?.wasRoot\n}\n"],"names":[],"mappings":"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"}