{"version":3,"file":"VisualElementDragControls.mjs","sources":["../../../../src/gestures/drag/VisualElementDragControls.ts"],"sourcesContent":["import { Axis, invariant, Point } from \"motion-utils\"\nimport { animateMotionValue } from \"../../animation/interfaces/motion-value\"\nimport type { Transition } from \"../../animation/types\"\nimport { getVariableValue } from \"../../animation/utils/css-variables-conversion\"\nimport { isCSSVariableToken } from \"../../animation/utils/is-css-variable\"\nimport { addDomEvent } from \"../../events/add-dom-event\"\nimport { addPointerEvent } from \"../../events/add-pointer-event\"\nimport { frame } from \"../../frameloop/frame\"\nimport type { MotionNodeOptions } from \"../../node/types\"\nimport {\n    convertBoundingBoxToBox,\n    convertBoxToBoundingBox,\n} from \"../../projection/geometry/conversion\"\nimport { calcLength } from \"../../projection/geometry/delta-calc\"\nimport { createBox } from \"../../projection/geometry/models\"\nimport type {\n    IProjectionNode,\n    LayoutUpdateData,\n} from \"../../projection/node/types\"\nimport { eachAxis } from \"../../projection/utils/each-axis\"\nimport { measurePageBox } from \"../../projection/utils/measure\"\nimport type { VisualElement } from \"../../render/VisualElement\"\nimport { resize } from \"../../resize\"\nimport { mixNumber } from \"../../utils/mix/number\"\nimport { percent, px } from \"../../value/types/numbers/units\"\nimport { addValueToWillChange } from \"../../value/will-change/add-will-change\"\nimport type { PanInfo } from \"../pan/types\"\nimport { PanSession } from \"../pan/PanSession\"\nimport { isElementTextInput } from \"../press/utils/is-keyboard-accessible\"\nimport { setDragLock } from \"./state/set-active\"\nimport type { DragPointConstraint, ResolvedConstraints } from \"./types\"\nimport {\n    applyConstraints,\n    calcOrigin,\n    calcRelativeConstraints,\n    calcViewportConstraints,\n    defaultElastic,\n    rebaseAxisConstraints,\n    resolveDragElastic,\n} from \"./utils/constraints\"\n\n/**\n * Re-read the scroll of the projection's ancestors, and return that of the\n * `layoutScroll` ones as a key that changes when any of them scroll.\n *\n * Clear the cached scroll first so `updateScroll` bypasses its\n * per-animationId cache and re-reads the live value.\n */\nfunction measureScroll(projection: IProjectionNode) {\n    let key = \"\"\n\n    for (const node of projection.path) {\n        node.scroll = undefined\n        node.updateScroll()\n\n        const { scroll } = node as IProjectionNode\n        if (node !== projection.root && scroll) {\n            key += scroll.offset.x + \",\" + scroll.offset.y + \",\"\n        }\n    }\n\n    return key\n}\n\nexport const elementDragControls = new WeakMap<\n    VisualElement,\n    VisualElementDragControls\n>()\n\nexport interface DragControlOptions {\n    /**\n     * This distance after which dragging starts and a direction is locked in.\n     *\n     * @public\n     */\n    distanceThreshold?: number\n\n    /**\n     * Whether to immediately snap to the cursor when dragging starts.\n     *\n     * @public\n     */\n    snapToCursor?: boolean\n\n    /**\n     * Start dragging straight away, rather than once the pointer has moved\n     * past `distanceThreshold`. For instance, to carry on a drag from\n     * another element.\n     *\n     * @public\n     */\n    immediate?: boolean\n}\n\ntype DragDirection = \"x\" | \"y\"\n\nexport class VisualElementDragControls {\n    visualElement: VisualElement<HTMLElement>\n\n    panSession?: PanSession\n\n    private openDragLock: VoidFunction | null = null\n\n    isDragging = false\n    private currentDirection: DragDirection | null = null\n\n    /**\n     * Where the drag started, which pointer offsets are added to. Public\n     * so pinch() can restart a drag from where it leaves the element.\n     */\n    originPoint: Point = { x: 0, y: 0 }\n\n    /**\n     * The permitted boundaries of travel, in pixels.\n     */\n    private constraints: ResolvedConstraints | false = false\n\n    private hasMutatedConstraints = false\n\n    /**\n     * A constraint, from a `dragConstraints` function, that moves the\n     * element itself, from the drag's latest pointer position.\n     */\n    private point?: DragPointConstraint | false\n\n    /**\n     * The `layoutScroll` ancestors' scroll (see measureScroll) when ref\n     * constraints were last measured.\n     */\n    private scroll?: string\n\n    /**\n     * The per-axis resolved elastic values.\n     */\n    elastic = createBox()\n\n    /**\n     * The latest pointer event. Used as fallback when the `cancel` and `stop` functions are called without arguments.\n     */\n    private latestPointerEvent: PointerEvent | null = null\n\n    /**\n     * The latest pan info. Used as fallback when the `cancel` and `stop` functions are called without arguments.\n     */\n    private latestPanInfo: PanInfo | null = null\n\n    /**\n     * Where drag options are read from. By default these are the\n     * VisualElement's props (as with a React `motion` component), but the\n     * vanilla `drag()` API provides its own.\n     */\n    private readProps: () => MotionNodeOptions\n\n    constructor(\n        visualElement: VisualElement<HTMLElement>,\n        readProps: () => MotionNodeOptions = () => visualElement.getProps()\n    ) {\n        this.visualElement = visualElement\n        this.readProps = readProps\n    }\n\n    start(originEvent: PointerEvent, options: DragControlOptions = {}) {\n        /**\n         * Don't start dragging if this component is exiting\n         */\n        if (this.visualElement.presenceContext?.isPresent === false) return\n\n        const onSessionStart = (event: PointerEvent) => {\n            if (options.snapToCursor) this.snapToCursor(event)\n            this.stopAnimation()\n        }\n\n        const onStart = (event: PointerEvent, info: PanInfo) => {\n            // Attempt to grab the global drag gesture lock - maybe make this part of PanSession\n            const { drag, dragConstraints, dragPropagation, onDragStart } =\n                this.getProps()\n\n            if (drag && !dragPropagation) {\n                this.openDragLock?.()\n\n                this.openDragLock = setDragLock(drag)\n\n                // If we don 't have the lock, don't start dragging\n                if (!this.openDragLock) return\n            }\n\n            this.latestPointerEvent = event\n            this.latestPanInfo = info\n            this.isDragging = true\n\n            this.currentDirection = null\n\n            this.resolveConstraints()\n\n            const { projection } = this.visualElement\n            if (projection) {\n                projection.isAnimationBlocked = true\n                projection.target = undefined\n            }\n\n            /**\n             * Record gesture origin and pointer offset\n             */\n            eachAxis((axis) => {\n                let current = this.getAxisMotionValue(axis).get() || 0\n\n                /**\n                 * If the MotionValue is a CSS variable, like \"var(--y)\",\n                 * resolve it so it can be converted to px below.\n                 */\n                if (isCSSVariableToken(current)) {\n                    current =\n                        getVariableValue(\n                            current,\n                            this.visualElement.current!\n                        ) || 0\n                }\n\n                /**\n                 * If the MotionValue is a px or percentage value convert to px\n                 */\n                if (px.test(current)) {\n                    current = parseFloat(current)\n                } else if (percent.test(current)) {\n                    const measuredAxis = projection?.layout?.layoutBox[axis]\n\n                    if (measuredAxis) {\n                        current =\n                            calcLength(measuredAxis) *\n                            (parseFloat(current) / 100)\n                    }\n                }\n\n                this.originPoint[axis] = current\n            })\n\n            this.point =\n                typeof dragConstraints === \"function\" && dragConstraints(this)\n\n            // Fire onDragStart event\n            if (onDragStart) {\n                frame.update(() => onDragStart(event, info), false, true)\n            }\n\n            addValueToWillChange(this.visualElement, \"transform\")\n\n            this.visualElement.animationState?.setActive(\"whileDrag\", true)\n        }\n\n        const onMove = (event: PointerEvent, info: PanInfo) => {\n            this.latestPointerEvent = event\n            this.latestPanInfo = info\n\n            const {\n                dragPropagation,\n                dragDirectionLock,\n                onDirectionLock,\n                onDrag,\n            } = this.getProps()\n\n            // If we didn't successfully receive the gesture lock, early return.\n            if (!dragPropagation && !this.openDragLock) return\n\n            const { offset } = info\n            // Attempt to detect drag direction if directionLock is true\n            if (dragDirectionLock && this.currentDirection === null) {\n                this.currentDirection = getCurrentDirection(offset)\n\n                /**\n                 * Wait for more movement until a direction is set. Once\n                 * it is, apply this move too: it can be the last before\n                 * release when the browser coalesces a fast gesture.\n                 */\n                if (this.currentDirection === null) return\n\n                onDirectionLock && onDirectionLock(this.currentDirection)\n            }\n\n            // Update each point with the latest position\n            this.updateAxis(\"x\", offset)\n            this.updateAxis(\"y\", offset)\n            this.point && this.point.move()\n\n            /**\n             * Ideally we would leave the renderer to fire naturally at the end of\n             * this frame but if the element is about to change layout as the result\n             * of a re-render we want to ensure the browser can read the latest\n             * bounding box to ensure the pointer and element don't fall out of sync.\n             */\n            this.visualElement.render()\n\n            /**\n             * This must fire after the render call as it might trigger a state\n             * change which itself might trigger a layout update.\n             */\n            if (onDrag) {\n                frame.update(() => onDrag(event, info), false, true)\n            }\n        }\n\n        const onSessionEnd = (event: PointerEvent, info: PanInfo) => {\n            this.latestPointerEvent = event\n            this.latestPanInfo = info\n\n            this.stop(event, info)\n\n            this.latestPointerEvent = null\n            this.latestPanInfo = null\n        }\n\n        const resumeAnimation = () => {\n            const { dragSnapToOrigin: snap } = this.getProps()\n            if (snap || this.constraints || this.point) {\n                this.startAnimation({ x: 0, y: 0 })\n            }\n        }\n\n        const { dragSnapToOrigin } = this.getProps()\n        this.panSession = new PanSession(\n            originEvent,\n            {\n                onSessionStart,\n                onStart,\n                onMove,\n                onSessionEnd,\n                resumeAnimation,\n            },\n            {\n                ...options,\n                transformPagePoint: this.visualElement.getTransformPagePoint(),\n                dragSnapToOrigin,\n                contextWindow:\n                    this.visualElement.current?.ownerDocument.defaultView,\n                element: this.visualElement.current,\n            }\n        )\n    }\n\n    /**\n     * @param dragAxes - The axes to animate on release, if not the `drag`\n     * prop's, e.g. when drag was disabled mid-gesture.\n     */\n    stop(\n        event?: PointerEvent,\n        panInfo?: PanInfo,\n        dragAxes?: MotionNodeOptions[\"drag\"]\n    ) {\n        const finalEvent = event || this.latestPointerEvent\n        const finalPanInfo = panInfo || this.latestPanInfo\n\n        const isDragging = this.isDragging\n        this.cancel()\n        if (!isDragging || !finalPanInfo || !finalEvent) return\n\n        const { velocity } = finalPanInfo\n        this.startAnimation(velocity, dragAxes)\n\n        const { onDragEnd } = this.getProps()\n        if (onDragEnd) {\n            frame.postRender(() => onDragEnd(finalEvent, finalPanInfo))\n        }\n    }\n\n    cancel() {\n        this.isDragging = false\n\n        const { projection, animationState } = this.visualElement\n\n        if (projection) {\n            projection.isAnimationBlocked = false\n        }\n\n        this.endPanSession()\n\n        if (!this.getProps().dragPropagation && this.openDragLock) {\n            this.openDragLock()\n            this.openDragLock = null\n        }\n\n        animationState?.setActive(\"whileDrag\", false)\n    }\n\n    /**\n     * Clean up the pan session without modifying other drag state.\n     * This is used during unmount to ensure event listeners are removed\n     * without affecting projection animations or drag locks.\n     */\n    endPanSession() {\n        this.panSession?.end()\n        this.panSession = undefined\n    }\n\n    private updateAxis(axis: DragDirection, offset?: Point) {\n        /**\n         * Read drag per axis: a callback fired while updating the x axis\n         * can synchronously re-render with new props.\n         */\n        const { drag } = this.readProps()\n\n        // If we're not dragging this axis, do an early return.\n        if (!offset || !shouldDrag(axis, drag, this.currentDirection)) return\n\n        const axisValue = this.getAxisMotionValue(axis)\n        let next = this.originPoint[axis] + offset[axis]\n\n        // Apply constraints\n        const constraints = this.constraints && this.constraints[axis]\n        if (constraints) {\n            next = applyConstraints(next, constraints, this.elastic[axis])\n        }\n\n        this.point ? (this.point[axis] = next) : axisValue.set(next)\n    }\n\n    private resolveConstraints() {\n        const { dragConstraints, dragElastic } = this.getProps()\n\n        const { projection } = this.visualElement\n        const layout =\n            projection && (projection.layout || projection.measure(false))\n\n        const prevConstraints = this.constraints\n\n        if (isElementConstraints(dragConstraints)) {\n            /**\n             * Ref constraints are measured with the layout. Scrolling a\n             * `layoutScroll` ancestor since can move the element relative\n             * to them without a layout measurement, so measure them again\n             * (#2024). Otherwise keep them: they and the layout can both\n             * have moved on the page since, e.g. when content above grows.\n             */\n            if (\n                !this.constraints ||\n                this.scroll !== measureScroll(projection!)\n            ) {\n                this.constraints = this.resolveRefConstraints()\n            }\n        } else {\n            if (\n                dragConstraints &&\n                layout &&\n                typeof dragConstraints === \"object\"\n            ) {\n                this.constraints = calcRelativeConstraints(\n                    layout.layoutBox,\n                    dragConstraints\n                )\n            } else {\n                this.constraints = false\n            }\n        }\n\n        this.elastic = resolveDragElastic(dragElastic)\n\n        /**\n         * If we're outputting to external MotionValues, we want to rebase the measured constraints\n         * from viewport-relative to component-relative. This only applies to relative (non-ref)\n         * constraints, as ref-based constraints from calcViewportConstraints are already in the\n         * correct coordinate space for the motion value transform offset.\n         */\n        if (\n            prevConstraints !== this.constraints &&\n            !isElementConstraints(dragConstraints) &&\n            layout &&\n            this.constraints &&\n            !this.hasMutatedConstraints\n        ) {\n            eachAxis((axis) => {\n                if (\n                    this.constraints !== false &&\n                    this.getAxisMotionValue(axis)\n                ) {\n                    this.constraints[axis] = rebaseAxisConstraints(\n                        layout.layoutBox[axis],\n                        this.constraints[axis]\n                    )\n                }\n            })\n        }\n    }\n\n    private resolveRefConstraints() {\n        const { dragConstraints: constraints, onMeasureDragConstraints } =\n            this.getProps()\n        if (!isElementConstraints(constraints)) return false\n\n        const constraintsElement = resolveConstraintsElement(constraints)\n\n        process.env.NODE_ENV !== \"production\" &&\n            invariant(\n                !!constraintsElement,\n                \"If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.\",\n                \"drag-constraints-ref\"\n            )\n\n        const { projection } = this.visualElement\n\n        // TODO\n        if (!projection || !projection.layout) return false\n\n        /**\n         * Refresh the scroll offsets of the root and `layoutScroll`\n         * ancestors so the constraint's viewport box translates to the\n         * layout's coordinates. The scroll captured when the layout was\n         * measured can be stale if they've scrolled since — e.g. via the\n         * browser restoring scroll on refresh, or an ancestor layout effect\n         * running after this element's mount (#2829).\n         */\n        this.scroll = measureScroll(projection)\n\n        const constraintsBox = measurePageBox(\n            constraintsElement as HTMLElement,\n            projection.root!,\n            this.visualElement.getTransformPagePoint()\n        )\n\n        /**\n         * layoutBox removes the scroll of `layoutScroll` ancestors, so\n         * remove it from the constraints box too.\n         */\n        let measuredConstraints = calcViewportConstraints(\n            projection.layout.layoutBox,\n            projection.removeElementScroll(constraintsBox)\n        )\n\n        /**\n         * If there's an onMeasureDragConstraints listener we call it and\n         * if different constraints are returned, set constraints to that\n         */\n        if (onMeasureDragConstraints) {\n            const userConstraints = onMeasureDragConstraints(\n                convertBoxToBoundingBox(measuredConstraints)\n            )\n\n            this.hasMutatedConstraints = !!userConstraints\n\n            if (userConstraints) {\n                measuredConstraints = convertBoundingBoxToBox(userConstraints)\n            }\n        }\n\n        return measuredConstraints\n    }\n\n    private startAnimation(\n        velocity: Point,\n        dragAxes?: MotionNodeOptions[\"drag\"]\n    ) {\n        const {\n            drag,\n            dragMomentum,\n            dragElastic,\n            dragTransition,\n            dragSnapToOrigin,\n            onDragTransitionEnd,\n        } = this.getProps()\n\n        /**\n         * Overdamp the boundary spring if `dragElastic` is disabled. There's still a frame\n         * of spring animations so we should look into adding a disable spring option to `inertia`.\n         * We could do something here where we affect the `bounceStiffness` and `bounceDamping`\n         * using the value of `dragElastic`.\n         */\n        const options = {\n            bounceStiffness: dragElastic ? 200 : 1000000,\n            bounceDamping: dragElastic ? 40 : 10000000,\n            timeConstant: 750,\n            restDelta: 1,\n            restSpeed: 10,\n            ...dragTransition,\n        }\n\n        const axisVelocity = (axis: DragDirection) =>\n            dragMomentum &&\n            !(this.point && dragSnapToOrigin) &&\n            shouldDrag(axis, dragAxes || drag, this.currentDirection)\n                ? velocity[axis]\n                : 0\n\n        if (this.point && !dragSnapToOrigin) {\n            return this.point\n                .release(\n                    { x: axisVelocity(\"x\"), y: axisVelocity(\"y\") },\n                    options\n                )\n                .then(onDragTransitionEnd)\n        }\n\n        const constraints: Partial<ResolvedConstraints> = this.constraints || {}\n\n        const momentumAnimations = eachAxis((axis) => {\n            if (!shouldDrag(axis, dragAxes || drag, this.currentDirection)) {\n                return\n            }\n\n            let transition = constraints[axis] || {}\n\n            if (\n                dragSnapToOrigin === true ||\n                (dragSnapToOrigin as unknown) === axis\n            )\n                transition = { min: 0, max: 0 }\n\n            const inertia: Transition = {\n                type: \"inertia\",\n                velocity: axisVelocity(axis),\n                ...options,\n                ...transition,\n            }\n\n            // If we're not animating on an externally-provided `MotionValue` we can use the\n            // component's animation controls which will handle interactions with whileHover (etc),\n            // otherwise we just have to animate the `MotionValue` itself.\n            return this.startAxisValueAnimation(axis, inertia)\n        })\n\n        // Run all animations and then resolve the new drag constraints.\n        return Promise.all(momentumAnimations).then(onDragTransitionEnd)\n    }\n\n    private startAxisValueAnimation(\n        axis: DragDirection,\n        transition: Transition\n    ) {\n        const axisValue = this.getAxisMotionValue(axis)\n\n        addValueToWillChange(this.visualElement, axis)\n\n        return axisValue.start(\n            animateMotionValue(\n                axis,\n                axisValue,\n                0,\n                transition,\n                this.visualElement,\n                false\n            )\n        )\n    }\n\n    stopAnimation() {\n        eachAxis((axis) => this.getAxisMotionValue(axis).stop())\n    }\n\n    /**\n     * Drag works differently depending on which props are provided.\n     *\n     * - If _dragX and _dragY are provided, we output the gesture delta directly to those motion values.\n     * - Otherwise, we apply the delta to the x/y motion values.\n     */\n    getAxisMotionValue(axis: DragDirection) {\n        const dragKey =\n            `_drag${axis.toUpperCase()}` as `_drag${Uppercase<DragDirection>}`\n        const props = this.readProps()\n        const externalMotionValue = props[dragKey]\n\n        return externalMotionValue\n            ? externalMotionValue\n            : this.visualElement.getValue(\n                  axis,\n                  this.visualElement.latestValues[axis] ?? 0\n              )\n    }\n\n    /**\n     * Measure the live box - projection.layout may or may not include the\n     * drag transform, depending on when it was measured.\n     */\n    private snapToCursor({ clientX, clientY }: PointerEvent) {\n        const { drag } = this.getProps()\n        const point = { x: clientX, y: clientY }\n        const cursor =\n            this.visualElement.getTransformPagePoint()?.(point) || point\n        const box = this.visualElement.measureViewportBox()\n\n        eachAxis((axis) => {\n            if (!shouldDrag(axis, drag, this.currentDirection)) return\n\n            const axisValue = this.getAxisMotionValue(axis)\n            const { min, max } = box[axis]\n\n            axisValue.set(\n                (axisValue.get() || 0) + cursor[axis] - mixNumber(min, max, 0.5)\n            )\n        })\n    }\n\n    /**\n     * When the viewport resizes we want to check if the measured constraints\n     * have changed and, if so, reposition the element within those new constraints\n     * relative to where it was before the resize.\n     */\n    scalePositionWithinConstraints() {\n        if (!this.visualElement.current) return\n\n        const { drag, dragConstraints } = this.getProps()\n        const { projection } = this.visualElement\n        if (\n            !isElementConstraints(dragConstraints) ||\n            !projection ||\n            !this.constraints\n        )\n            return\n\n        /**\n         * Stop current animations as there can be visual glitching if we try to do\n         * this mid-animation\n         */\n        this.stopAnimation()\n\n        /**\n         * Record the relative position of the dragged element relative to the\n         * constraints box and save as a progress value.\n         */\n        const constraints = this.constraints as ResolvedConstraints\n        const boxProgress = { x: 0, y: 0 }\n        eachAxis((axis) => {\n            const latest = this.getAxisMotionValue(axis).get()\n            boxProgress[axis] = calcOrigin(\n                { min: latest, max: latest },\n                constraints[axis] as Axis\n            )\n        })\n\n        /**\n         * Update the layout of this element and resolve the latest drag constraints\n         */\n        const { transformTemplate } = this.visualElement.getProps()\n        this.visualElement.current.style.transform = transformTemplate\n            ? transformTemplate({}, \"\")\n            : \"none\"\n        projection.root?.updateScroll()\n        projection.updateLayout()\n\n        /**\n         * Reset constraints so resolveConstraints() will recalculate them\n         * with the freshly measured layout rather than returning the cached value.\n         */\n        this.constraints = false\n        this.resolveConstraints()\n\n        /**\n         * For each axis, calculate the current progress of the layout axis\n         * within the new constraints.\n         */\n        eachAxis((axis) => {\n            const axisValue = this.getAxisMotionValue(axis)\n\n            /**\n             * An element resting at its origin has no offset to preserve,\n             * and re-projecting 0 into the new constraints would move it.\n             */\n            if (!shouldDrag(axis, drag, null) || !axisValue.get()) return\n\n            /**\n             * Calculate a new transform based on the previous box progress\n             */\n            const { min, max } = (this.constraints as ResolvedConstraints)[\n                axis\n            ] as Axis\n            axisValue.set(mixNumber(min, max, boxProgress[axis]))\n        })\n\n        /**\n         * Flush the updated transform to the DOM synchronously to prevent\n         * a visual flash at the element's CSS layout position (0,0) when\n         * the transform was stripped for measurement.\n         */\n        this.visualElement.render()\n    }\n\n    addListeners() {\n        if (!this.visualElement.current) return\n        elementDragControls.set(this.visualElement, this)\n        const element = this.visualElement.current\n\n        /**\n         * Attach a pointerdown event listener on this DOM element to initiate drag tracking.\n         */\n        const stopPointerListener = addPointerEvent(\n            element,\n            \"pointerdown\",\n            (event) => {\n                const { drag, dragListener = true } = this.getProps()\n                const target = event.target as Element\n\n                /**\n                 * Only block drag if clicking on a text input child element\n                 * (input, textarea, select, contenteditable) where users might\n                 * want to select text or interact with the control.\n                 *\n                 * Buttons and links don't block drag since they don't have\n                 * click-and-move actions of their own.\n                 */\n                const isClickingTextInputChild =\n                    target !== element && isElementTextInput(target)\n\n                if (drag && dragListener && !isClickingTextInputChild) {\n                    this.start(event)\n                }\n            }\n        )\n\n        /**\n         * If using ref-based constraints, observe both the draggable element\n         * and the constraint container for size changes via ResizeObserver.\n         * Setup is deferred because dragConstraints.current is null when\n         * addListeners first runs (React hasn't committed the ref yet).\n         */\n        let stopResizeObservers: VoidFunction | undefined\n\n        const measureDragConstraints = () => {\n            const { dragConstraints } = this.getProps()\n            const constraintsElement =\n                isElementConstraints(dragConstraints) &&\n                resolveConstraintsElement(dragConstraints)\n\n            if (constraintsElement) {\n                this.constraints = this.resolveRefConstraints()\n\n                if (!stopResizeObservers) {\n                    stopResizeObservers = startResizeObservers(\n                        element,\n                        constraintsElement as HTMLElement,\n                        () => this.scalePositionWithinConstraints()\n                    )\n                }\n            }\n        }\n\n        const { projection } = this.visualElement\n\n        const stopMeasureLayoutListener = projection!.addEventListener(\n            \"measure\",\n            measureDragConstraints\n        )\n\n        if (!projection!.layout) {\n            projection!.root?.updateScroll()\n            projection!.updateLayout()\n        }\n\n        frame.read(measureDragConstraints)\n\n        /**\n         * Attach a window resize listener to scale the draggable target within its defined\n         * constraints as the window resizes.\n         */\n        const stopResizeListener = addDomEvent(window, \"resize\", () =>\n            this.scalePositionWithinConstraints()\n        )\n\n        /**\n         * If the element's layout changes, calculate the delta and apply that to\n         * the drag gesture's origin point.\n         */\n        const stopLayoutUpdateListener = projection!.addEventListener(\n            \"didUpdate\",\n            (({ delta, hasLayoutChanged }: LayoutUpdateData) => {\n                if (this.isDragging && hasLayoutChanged) {\n                    eachAxis((axis) => {\n                        /**\n                         * Only compensate axes this gesture drags. A\n                         * non-drag axis follows its layout instead, as\n                         * nothing would ever move it back (e.g. snapping\n                         * to origin only animates drag axes).\n                         */\n                        if (\n                            !shouldDrag(\n                                axis,\n                                this.getProps().drag,\n                                this.currentDirection\n                            )\n                        )\n                            return\n\n                        const motionValue = this.getAxisMotionValue(axis)\n                        this.originPoint[axis] += delta[axis].translate\n                        motionValue.set(\n                            motionValue.get() + delta[axis].translate\n                        )\n                    })\n\n                    this.visualElement.render()\n                }\n            }) as any\n        )\n\n        return () => {\n            stopResizeListener()\n            stopPointerListener()\n            stopMeasureLayoutListener()\n            stopLayoutUpdateListener()\n            stopResizeObservers?.()\n        }\n    }\n\n    getProps(): MotionNodeOptions {\n        const props = this.readProps()\n        const { dragElastic = defaultElastic, dragMomentum = true } = props\n        return { ...props, dragElastic, dragMomentum }\n    }\n}\n\ntype ConstraintsElement = Element | { current: Element | null }\n\n/**\n * `dragConstraints` can be an element, or a ref (`{ current }`) to one.\n */\nfunction isElementConstraints(\n    constraints: MotionNodeOptions[\"dragConstraints\"]\n): constraints is ConstraintsElement {\n    return (\n        !!constraints &&\n        typeof constraints === \"object\" &&\n        (\"current\" in constraints || \"nodeType\" in constraints)\n    )\n}\n\nconst resolveConstraintsElement = (constraints: ConstraintsElement) =>\n    \"current\" in constraints ? constraints.current : constraints\n\nfunction skipFirstCall(callback: VoidFunction): VoidFunction {\n    let isFirst = true\n    return () => {\n        if (isFirst) {\n            isFirst = false\n            return\n        }\n        callback()\n    }\n}\n\nfunction startResizeObservers(\n    element: HTMLElement,\n    constraintsElement: HTMLElement,\n    onResize: VoidFunction\n): VoidFunction {\n    const stopElement = resize(element, skipFirstCall(onResize))\n    const stopContainer = resize(constraintsElement, skipFirstCall(onResize))\n    return () => {\n        stopElement()\n        stopContainer()\n    }\n}\n\nfunction shouldDrag(\n    direction: DragDirection,\n    drag: boolean | DragDirection | undefined,\n    currentDirection: null | DragDirection\n) {\n    return (\n        (drag === true || drag === direction) &&\n        (currentDirection === null || currentDirection === direction)\n    )\n}\n\n/**\n * Based on an x/y offset determine the current drag direction. If both axis' offsets are lower\n * than the provided threshold, return `null`.\n *\n * @param offset - The x/y offset from origin.\n * @param lockThreshold - (Optional) - the minimum absolute offset before we can determine a drag direction.\n */\nfunction getCurrentDirection(\n    offset: Point,\n    lockThreshold = 10\n): DragDirection | null {\n    let direction: DragDirection | null = null\n\n    if (Math.abs(offset.y) > lockThreshold) {\n        direction = \"y\"\n    } else if (Math.abs(offset.x) > lockThreshold) {\n        direction = \"x\"\n    }\n\n    return direction\n}\n\nexport function expectsResolvedDragConstraints({\n    dragConstraints,\n    onMeasureDragConstraints,\n}: MotionNodeOptions) {\n    return isElementConstraints(dragConstraints) && !!onMeasureDragConstraints\n}\n"],"names":[],"mappings":"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"}