{"version":3,"file":"VisualElementDragControls.mjs","sources":["../../../../src/gestures/drag/VisualElementDragControls.ts"],"sourcesContent":["import {\n    addValueToWillChange,\n    animateMotionValue,\n    calcLength,\n    convertBoundingBoxToBox,\n    convertBoxToBoundingBox,\n    createBox,\n    eachAxis,\n    frame,\n    isElementTextInput,\n    measurePageBox,\n    mixNumber,\n    PanInfo,\n    percent,\n    ResolvedConstraints,\n    resize,\n    setDragLock,\n    Transition,\n    type VisualElement,\n} from \"motion-dom\"\nimport { Axis, Point, invariant } from \"motion-utils\"\nimport { addDomEvent, type LayoutUpdateData } from \"motion-dom\"\nimport { addPointerEvent } from \"../../events/add-pointer-event\"\nimport { extractEventInfo } from \"../../events/event-info\"\nimport { MotionProps } from \"../../motion/types\"\nimport { getContextWindow } from \"../../utils/get-context-window\"\nimport { isRefObject } from \"../../utils/is-ref-object\"\nimport { PanSession } from \"../pan/PanSession\"\nimport {\n    applyConstraints,\n    calcOrigin,\n    calcRelativeConstraints,\n    calcViewportConstraints,\n    defaultElastic,\n    rebaseAxisConstraints,\n    resolveDragElastic,\n} from \"./utils/constraints\"\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\ntype DragDirection = \"x\" | \"y\"\n\nexport class VisualElementDragControls {\n    private visualElement: VisualElement<HTMLElement>\n\n    private panSession?: PanSession\n\n    private openDragLock: VoidFunction | null = null\n\n    isDragging = false\n    private currentDirection: DragDirection | null = null\n\n    private 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     * The per-axis resolved elastic values.\n     */\n    private 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    constructor(visualElement: VisualElement<HTMLElement>) {\n        this.visualElement = visualElement\n    }\n\n    start(\n        originEvent: PointerEvent,\n        { snapToCursor = false, distanceThreshold }: DragControlOptions = {}\n    ) {\n        /**\n         * Don't start dragging if this component is exiting\n         */\n        const { presenceContext } = this.visualElement\n        if (presenceContext && presenceContext.isPresent === false) return\n\n        const onSessionStart = (event: PointerEvent) => {\n            if (snapToCursor) {\n                this.snapToCursor(extractEventInfo(event).point)\n            }\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, dragPropagation, onDragStart } = this.getProps()\n\n            if (drag && !dragPropagation) {\n                if (this.openDragLock) 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            if (this.visualElement.projection) {\n                this.visualElement.projection.isAnimationBlocked = true\n                this.visualElement.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 percentage value convert to px\n                 */\n                if (percent.test(current)) {\n                    const { projection } = this.visualElement\n\n                    if (projection && projection.layout) {\n                        const measuredAxis = projection.layout.layoutBox[axis]\n\n                        if (measuredAxis) {\n                            const length = calcLength(measuredAxis)\n                            current = length * (parseFloat(current) / 100)\n                        }\n                    }\n                }\n\n                this.originPoint[axis] = current\n            })\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            const { animationState } = this.visualElement\n            animationState && 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                // If we've successfully set a direction, notify listener\n                if (this.currentDirection !== null) {\n                    onDirectionLock && onDirectionLock(this.currentDirection)\n                }\n\n                return\n            }\n\n            // Update each point with the latest position\n            this.updateAxis(\"x\", info.point, offset)\n            this.updateAxis(\"y\", info.point, offset)\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) {\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                transformPagePoint: this.visualElement.getTransformPagePoint(),\n                dragSnapToOrigin,\n                distanceThreshold,\n                contextWindow: getContextWindow(this.visualElement),\n                element: this.visualElement.current,\n            }\n        )\n    }\n\n    /**\n     * @internal\n     */\n    stop(event?: PointerEvent, panInfo?: PanInfo) {\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)\n\n        const { onDragEnd } = this.getProps()\n        if (onDragEnd) {\n            frame.postRender(() => onDragEnd(finalEvent, finalPanInfo))\n        }\n    }\n\n    /**\n     * @internal\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        const { dragPropagation } = this.getProps()\n\n        if (!dragPropagation && this.openDragLock) {\n            this.openDragLock()\n            this.openDragLock = null\n        }\n\n        animationState && 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     * @internal\n     */\n    endPanSession() {\n        this.panSession && this.panSession.end()\n        this.panSession = undefined\n    }\n\n    private updateAxis(axis: DragDirection, _point: Point, offset?: Point) {\n        const { drag } = this.getProps()\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        if (this.constraints && this.constraints[axis]) {\n            next = applyConstraints(\n                next,\n                this.constraints[axis],\n                this.elastic[axis]\n            )\n        }\n\n        axisValue.set(next)\n    }\n\n    private resolveConstraints() {\n        const { dragConstraints, dragElastic } = this.getProps()\n\n        const layout =\n            this.visualElement.projection &&\n            !this.visualElement.projection.layout\n                ? this.visualElement.projection.measure(false)\n                : this.visualElement.projection?.layout\n\n        const prevConstraints = this.constraints\n\n        if (dragConstraints && isRefObject(dragConstraints)) {\n            if (!this.constraints) {\n                this.constraints = this.resolveRefConstraints()\n            }\n        } else {\n            if (dragConstraints && layout) {\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            !isRefObject(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 (!constraints || !isRefObject(constraints)) return false\n\n        const constraintsElement = constraints.current as HTMLElement\n\n        invariant(\n            constraintsElement !== null,\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        const constraintsBox = measurePageBox(\n            constraintsElement,\n            projection.root!,\n            this.visualElement.getTransformPagePoint()\n        )\n\n        let measuredConstraints = calcViewportConstraints(\n            projection.layout.layoutBox,\n            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(velocity: Point) {\n        const {\n            drag,\n            dragMomentum,\n            dragElastic,\n            dragTransition,\n            dragSnapToOrigin,\n            onDragTransitionEnd,\n        } = this.getProps()\n\n        const constraints: Partial<ResolvedConstraints> = this.constraints || {}\n\n        const momentumAnimations = eachAxis((axis) => {\n            if (!shouldDrag(axis, drag, this.currentDirection)) {\n                return\n            }\n\n            let transition = (constraints && constraints[axis]) || {}\n\n            if (\n                dragSnapToOrigin === true ||\n                (dragSnapToOrigin as unknown) === axis\n            )\n                transition = { min: 0, max: 0 }\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 bounceStiffness = dragElastic ? 200 : 1000000\n            const bounceDamping = dragElastic ? 40 : 10000000\n\n            const inertia: Transition = {\n                type: \"inertia\",\n                velocity: dragMomentum ? velocity[axis] : 0,\n                bounceStiffness,\n                bounceDamping,\n                timeConstant: 750,\n                restDelta: 1,\n                restSpeed: 10,\n                ...dragTransition,\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    private 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    private getAxisMotionValue(axis: DragDirection) {\n        const dragKey =\n            `_drag${axis.toUpperCase()}` as `_drag${Uppercase<DragDirection>}`\n        const props = this.visualElement.getProps()\n        const externalMotionValue = props[dragKey]\n\n        return externalMotionValue\n            ? externalMotionValue\n            : this.visualElement.getValue(\n                  axis,\n                  (props.initial\n                      ? props.initial[axis as keyof typeof props.initial]\n                      : undefined) || 0\n              )\n    }\n\n    private snapToCursor(point: Point) {\n        eachAxis((axis) => {\n            const { drag } = this.getProps()\n\n            // If we're not dragging this axis, do an early return.\n            if (!shouldDrag(axis, drag, this.currentDirection)) return\n\n            const { projection } = this.visualElement\n            const axisValue = this.getAxisMotionValue(axis)\n\n            if (projection && projection.layout) {\n                const { min, max } = projection.layout.layoutBox[axis]\n\n                /**\n                 * The layout measurement includes the current transform value,\n                 * so we need to add it back to get the correct snap position.\n                 * This fixes an issue where elements with initial coordinates\n                 * would snap to the wrong position on the first drag.\n                 */\n                const current = axisValue.get() || 0\n\n                axisValue.set(point[axis] - mixNumber(min, max, 0.5) + current)\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 (!isRefObject(dragConstraints) || !projection || !this.constraints)\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 boxProgress = { x: 0, y: 0 }\n        eachAxis((axis) => {\n            const axisValue = this.getAxisMotionValue(axis)\n            if (axisValue && this.constraints !== false) {\n                const latest = axisValue.get()\n                boxProgress[axis] = calcOrigin(\n                    { min: latest, max: latest },\n                    this.constraints[axis] as Axis\n                )\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 && 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            if (!shouldDrag(axis, drag, null)) return\n\n            /**\n             * Calculate a new transform based on the previous box progress\n             */\n            const axisValue = this.getAxisMotionValue(axis)\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            if (isRefObject(dragConstraints) && dragConstraints.current) {\n                this.constraints = this.resolveRefConstraints()\n\n                if (!stopResizeObservers) {\n                    stopResizeObservers = startResizeObservers(\n                        element,\n                        dragConstraints.current 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 && !projection!.layout) {\n            projection.root && 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                        const motionValue = this.getAxisMotionValue(axis)\n                        if (!motionValue) return\n\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 && stopLayoutUpdateListener()\n            stopResizeObservers && stopResizeObservers()\n        }\n    }\n\n    getProps(): MotionProps {\n        const props = this.visualElement.getProps()\n        const {\n            drag = false,\n            dragDirectionLock = false,\n            dragPropagation = false,\n            dragConstraints = false,\n            dragElastic = defaultElastic,\n            dragMomentum = true,\n        } = props\n        return {\n            ...props,\n            drag,\n            dragDirectionLock,\n            dragPropagation,\n            dragConstraints,\n            dragElastic,\n            dragMomentum,\n        }\n    }\n}\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}: MotionProps) {\n    return isRefObject(dragConstraints) && !!onMeasureDragConstraints\n}\n"],"names":[],"mappings":"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"}