{"version":3,"file":"LayoutAnimationBuilder.mjs","sources":["../../../src/layout/LayoutAnimationBuilder.ts"],"sourcesContent":["import { activeScope } from \"../scope/active\"\nimport { clamp } from \"motion-utils\"\nimport { handOffElementState } from \"../animation/animate/element\"\nimport { GroupAnimation } from \"../animation/GroupAnimation\"\nimport type { AnimationOptions, Transition } from \"../animation/types\"\nimport { frameData, frameSteps } from \"../frameloop\"\nimport { microtask } from \"../frameloop/microtask\"\nimport { time } from \"../frameloop/sync-time\"\nimport { HTMLProjectionNode } from \"../projection/node/HTMLProjectionNode\"\nimport type { IProjectionNode } from \"../projection/node/types\"\nimport { HTMLVisualElement } from \"../render/html/HTMLVisualElement\"\nimport { visualElementStore } from \"../render/store\"\nimport { hasTransform } from \"../projection/utils/has-transform\"\nimport {\n    resolveElements,\n    type ElementOrSelector,\n} from \"../utils/resolve-elements\"\n\ntype LayoutAnimationScope = Element | Document\ntype LayoutBuilderResolve = (animation: GroupAnimation) => void\ntype LayoutBuilderReject = (error: unknown) => void\n\ninterface RestorePoint {\n    parent: Element\n    next: ChildNode | null\n}\n\nconst layoutSelector = \"[data-layout],[data-layout-id]\"\n\n/**\n * All imperatively-created projection nodes live in one persistent tree,\n * shared across animateLayout() calls (and with any React-created nodes,\n * via the singleton document root). Keyed by element for reuse.\n */\nconst layoutNodes = new WeakMap<Element, IProjectionNode>()\n\n/**\n * Builders created within the same synchronous tick are flushed together\n * as a single \"commit\": every node is snapshotted before any updateDom\n * runs, mirroring React batching renders from different parts of the tree.\n */\nlet pendingBuilders: LayoutAnimationBuilder[] | undefined\n\nfunction collectLayoutElements(scope: LayoutAnimationScope): HTMLElement[] {\n    const elements: HTMLElement[] = []\n\n    if (scope instanceof HTMLElement && scope.matches(layoutSelector)) {\n        elements.push(scope)\n    }\n\n    scope.querySelectorAll(layoutSelector).forEach((element) => {\n        if (element instanceof HTMLElement) elements.push(element)\n    })\n\n    return elements\n}\n\n/**\n * Process any work scheduled on the frameloop now. A previous animation\n * may have been seeked while paused (controls.time = x) without a frame\n * having rendered it - we must materialise that state into the DOM\n * before taking snapshots.\n */\nfunction flushPendingFrame() {\n    if (frameData.isProcessing) return\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\nfunction getProjectionParent(element: Element): IProjectionNode | undefined {\n    let ancestor = element.parentElement\n    while (ancestor) {\n        const node = layoutNodes.get(ancestor)\n        if (node && node.instance) return node\n        ancestor = ancestor.parentElement\n    }\n    return undefined\n}\n\nfunction createVisualElement() {\n    return new HTMLVisualElement(\n        {\n            props: {},\n            presenceContext: null,\n            visualState: {\n                latestValues: {},\n                renderState: {\n                    transform: {},\n                    transformOrigin: {},\n                    style: {},\n                    vars: {},\n                },\n            },\n        },\n        { allowProjection: true }\n    )\n}\n\nfunction readNodeOptions(element: HTMLElement, transition?: Transition) {\n    const layoutAttr = element.getAttribute(\"data-layout\")\n    const layoutId = element.getAttribute(\"data-layout-id\") ?? undefined\n\n    return {\n        layoutId,\n        layout: layoutAttr !== null ? true : undefined,\n        animationType: (!layoutAttr || layoutAttr === \"true\"\n            ? \"both\"\n            : layoutAttr) as \"both\",\n        transition,\n    }\n}\n\nfunction prepareNode(\n    element: HTMLElement,\n    transition?: Transition\n): IProjectionNode {\n    let node = layoutNodes.get(element)\n\n    if (!node) {\n        let visualElement = visualElementStore.get(element) as\n            | HTMLVisualElement\n            | undefined\n\n        if (!visualElement) {\n            visualElement = createVisualElement()\n\n            /**\n             * Values animate() has been rendering on this element move to\n             * the VisualElement, so the layout animation composes with\n             * them instead of overwriting them.\n             */\n            handOffElementState(element, visualElement)\n        }\n\n        /**\n         * A first-time element may carry a projection transform in its\n         * inline style (e.g. it was cloned from an element mid-animation).\n         * That transform isn't tracked in latestValues so the engine can't\n         * reset it before measuring - clear it now so the first layout\n         * measurement isn't inflated.\n         */\n        if (\n            element.style.transform &&\n            !hasTransform(visualElement.latestValues)\n        ) {\n            element.style.transform = \"\"\n        }\n\n        node = new HTMLProjectionNode(\n            visualElement.latestValues,\n            getProjectionParent(element)\n        )\n        visualElement.projection = node\n\n        node.setOptions({\n            ...readNodeOptions(element, transition),\n            visualElement,\n        })\n        node.mount(element)\n        layoutNodes.set(element, node)\n    } else {\n        node.setOptions(readNodeOptions(element, transition))\n    }\n\n    node.isPresent = true\n    if (node.options.onExitComplete) {\n        node.setOptions({ onExitComplete: undefined })\n    }\n\n    return node\n}\n\n/**\n * Get a projection node for an element, so imperative gestures like\n * drag() can measure its layout. Reuses a node owned by a `motion`\n * component or animateLayout(), otherwise creates one in the shared\n * imperative tree. Returns the node and a function that releases it.\n */\nexport function acquireProjectionNode(\n    element: HTMLElement\n): [IProjectionNode, VoidFunction] {\n    const owned =\n        layoutNodes.get(element) || visualElementStore.get(element)?.projection\n\n    /**\n     * A VisualElement can outlive a node we released (e.g. a stopped\n     * drag()), so only reuse a node that's still mounted.\n     */\n    if (owned?.instance) return [owned, () => {}]\n\n    const node = prepareNode(element)\n\n    return [\n        node,\n        () => layoutNodes.get(element) === node && dropNode(element, node),\n    ]\n}\n\nfunction sortDocumentOrder(elements: Iterable<HTMLElement>) {\n    return [...elements].sort((a, b) =>\n        a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n    )\n}\n\nfunction dropNode(element: Element, node: IProjectionNode) {\n    node.setOptions({ onExitComplete: undefined })\n\n    /**\n     * Stop any lingering animation so it can't leak into future updates.\n     * A follow node can share its currentAnimation with a surviving lead\n     * (via resumingFrom), in which case it isn't ours to stop.\n     */\n    const stack = node.getStack()\n    if (!stack || node.isLead()) node.currentAnimation?.stop()\n\n    node.unmount()\n    layoutNodes.delete(element)\n}\n\nfunction flushPendingBuilders() {\n    const builders = pendingBuilders!\n    pendingBuilders = undefined\n\n    flushPendingFrame()\n\n    /**\n     * Discover and mount every node across all builders before snapshotting\n     * any of them. Mounting during an active update flags isLayoutDirty,\n     * which would make that node's own willUpdate skip its snapshot.\n     * Document order guarantees ancestors mount before descendants, even\n     * when they're discovered by different builders.\n     */\n    const targets = new Map<HTMLElement, LayoutAnimationBuilder[]>()\n    for (const builder of builders) {\n        for (const element of builder.collectTargets()) {\n            const owners = targets.get(element)\n            owners ? owners.push(builder) : targets.set(element, [builder])\n        }\n    }\n\n    const union = new Map<HTMLElement, IProjectionNode>()\n    for (const element of sortDocumentOrder(targets.keys())) {\n        const owners = targets.get(element)!\n        const node = prepareNode(\n            element,\n            owners[owners.length - 1].transitionFor(element)\n        )\n        for (const owner of owners) owner.adopt(element, node)\n        union.set(element, node)\n    }\n\n    union.forEach((node) => {\n        node.isLayoutDirty = false\n        node.willUpdate()\n    })\n\n    const updatePromises: Promise<void>[] = []\n    for (const builder of builders) {\n        const result = builder.runUpdate()\n        if (result) updatePromises.push(result)\n    }\n\n    const commit = () => {\n        /**\n         * Process all additions before any removals so that, even across\n         * builders, a removed member knows whether a replacement with the\n         * same layoutId was added in this commit.\n         */\n        const newMemberIds = new Set<string>()\n        for (const builder of builders) {\n            builder.reconcileAdditions(newMemberIds)\n        }\n        for (const builder of builders) {\n            builder.reconcileRemovals(newMemberIds)\n        }\n\n        let root: IProjectionNode | undefined\n        union.forEach((node) => (root ||= node.root))\n        for (const builder of builders) root ||= builder.getRoot()\n\n        root?.didUpdate()\n\n        /**\n         * The root flushes the update on a microtask, synchronously\n         * processing the frame that creates the layout animations. Collect\n         * them in a later microtask step of the same pass.\n         */\n        microtask.render(() => {\n            for (const builder of builders) builder.finalize()\n        })\n    }\n\n    updatePromises.length ? Promise.all(updatePromises).then(commit) : commit()\n}\n\nexport class LayoutAnimationBuilder {\n    private sharedTransitions = new Map<string, AnimationOptions>()\n\n    private notifyReady: LayoutBuilderResolve = () => {}\n    private rejectReady: LayoutBuilderReject = () => {}\n    private readyPromise: Promise<GroupAnimation>\n\n    private tracked = new Map<HTMLElement, IProjectionNode>()\n    private restorePoints = new Map<HTMLElement, RestorePoint>()\n    private updateError: unknown\n\n    constructor(\n        private scope: LayoutAnimationScope,\n        private updateDom: () => void | Promise<void>,\n        private defaultOptions?: AnimationOptions\n    ) {\n        this.readyPromise = new Promise<GroupAnimation>((resolve, reject) => {\n            this.notifyReady = resolve\n            this.rejectReady = reject\n        })\n\n        if (!pendingBuilders) {\n            pendingBuilders = []\n            queueMicrotask(flushPendingBuilders)\n        }\n        pendingBuilders.push(this)\n    }\n\n    shared(id: string, transition: AnimationOptions): this {\n        this.sharedTransitions.set(id, transition)\n        return this\n    }\n\n    then(resolve: LayoutBuilderResolve, reject?: LayoutBuilderReject) {\n        return this.readyPromise.then(resolve, reject)\n    }\n\n    transitionFor(element: HTMLElement): Transition | undefined {\n        const layoutId = element.getAttribute(\"data-layout-id\")\n        return ((layoutId && this.sharedTransitions.get(layoutId)) ||\n            this.defaultOptions) as Transition | undefined\n    }\n\n    adopt(element: HTMLElement, node: IProjectionNode) {\n        this.tracked.set(element, node)\n        this.restorePoints.set(element, {\n            parent: element.parentElement!,\n            next: element.nextSibling,\n        })\n    }\n\n    collectTargets() {\n        return collectLayoutElements(this.scope)\n    }\n\n    runUpdate(): Promise<void> | undefined {\n        try {\n            const result = this.updateDom()\n            if (result && typeof result.then === \"function\") {\n                return result.then(undefined, (error: unknown) => {\n                    this.updateError = error\n                })\n            }\n        } catch (error) {\n            this.updateError = error\n        }\n        return undefined\n    }\n\n    reconcileAdditions(newMemberIds: Set<string>) {\n        for (const element of collectLayoutElements(this.scope)) {\n            if (this.tracked.has(element)) continue\n            const node = prepareNode(element, this.transitionFor(element))\n            this.adopt(element, node)\n            node.options.layoutId && newMemberIds.add(node.options.layoutId)\n        }\n    }\n\n    reconcileRemovals(newMemberIds: Set<string>) {\n        this.tracked.forEach((node, element) => {\n            if (element.isConnected) return\n\n            const restore = this.restorePoints.get(element)\n            this.restorePoints.delete(element)\n\n            const { layoutId } = node.options\n            const stack = node.getStack()\n            const hasSurvivor =\n                stack &&\n                stack.members.some(\n                    (member) =>\n                        member !== node &&\n                        (member.instance as HTMLElement | undefined)\n                            ?.isConnected\n                )\n\n            /**\n             * A removed lead with a surviving stack member - and no\n             * replacement member added this commit - runs an exit\n             * crossfade: restore the element to its old position in the\n             * DOM, relegate it and let the survivor take over. It's\n             * removed again once the animation completes.\n             */\n            if (\n                layoutId &&\n                node.isLead() &&\n                hasSurvivor &&\n                !newMemberIds.has(layoutId)\n            ) {\n                if (restore && restore.parent.isConnected) {\n                    restore.parent.insertBefore(\n                        element,\n                        restore.next && restore.next.parentNode === restore.parent\n                            ? restore.next\n                            : null\n                    )\n                    node.isPresent = false\n                    node.setOptions({\n                        onExitComplete: () => {\n                            element.remove()\n                            dropNode(element, node)\n                        },\n                    })\n                    if (node.relegate()) return\n\n                    element.remove()\n                }\n            }\n\n            dropNode(element, node)\n            this.tracked.delete(element)\n        })\n    }\n\n    getRoot(): IProjectionNode | undefined {\n        let root: IProjectionNode | undefined\n        this.tracked.forEach((node) => (root ||= node.root))\n        return root\n    }\n\n    finalize() {\n        if (this.updateError) {\n            this.rejectReady(this.updateError)\n            return\n        }\n\n        const animations = new Set<GroupAnimation[\"animations\"][number]>()\n        this.tracked.forEach((node) => {\n            if (node.instance && node.currentAnimation) {\n                animations.add(node.currentAnimation)\n            }\n        })\n\n        this.notifyReady(new GroupAnimation([...animations]))\n    }\n}\n\nexport function parseAnimateLayoutArgs(\n    scopeOrUpdateDom: ElementOrSelector | (() => void),\n    updateDomOrOptions?: (() => void) | AnimationOptions,\n    options?: AnimationOptions\n): {\n    scope: Element | Document\n    updateDom: () => void\n    defaultOptions?: AnimationOptions\n} {\n    if (typeof scopeOrUpdateDom === \"function\") {\n        return {\n            scope: activeScope.current?.root || document,\n            updateDom: scopeOrUpdateDom,\n            defaultOptions: updateDomOrOptions as AnimationOptions | undefined,\n        }\n    }\n\n    const scope =\n        scopeOrUpdateDom instanceof Document\n            ? scopeOrUpdateDom\n            : resolveElements(scopeOrUpdateDom)[0] ?? document\n\n    return {\n        scope,\n        updateDom: updateDomOrOptions as () => void,\n        defaultOptions: options,\n    }\n}\n"],"names":[],"mappings":"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"}