{"version":3,"file":"Item.mjs","sources":["../../../../src/components/Reorder/Item.tsx"],"sourcesContent":["\"use client\"\n\nimport { isMotionValue } from \"motion-dom\"\nimport { invariant } from \"motion-utils\"\nimport * as React from \"react\"\nimport { forwardRef, FunctionComponent, useContext } from \"react\"\nimport { ReorderContext } from \"../../context/ReorderContext\"\nimport { motion } from \"../../render/components/motion/proxy\"\nimport { HTMLMotionProps } from \"../../render/html/types\"\nimport { useConstant } from \"../../utils/use-constant\"\nimport { useMotionValue } from \"../../value/use-motion-value\"\nimport { useTransform } from \"../../value/use-transform\"\n\nimport { DefaultItemElement, ReorderElementTag } from \"./types\"\nimport {\n    autoScrollIfNeeded,\n    resetAutoScrollState,\n} from \"./utils/auto-scroll\"\n\nexport interface Props<\n    V,\n    TagName extends ReorderElementTag = DefaultItemElement\n> {\n    /**\n     * A HTML element to render this component as. Defaults to `\"li\"`.\n     *\n     * @public\n     */\n    as?: TagName\n\n    /**\n     * The value in the list that this component represents.\n     *\n     * @public\n     */\n    value: V\n\n    /**\n     * A subset of layout options primarily used to disable layout=\"size\"\n     *\n     * @public\n     * @default true\n     */\n    layout?: true | \"position\"\n}\n\nfunction useDefaultMotionValue(value: any, defaultValue: number = 0) {\n    return isMotionValue(value) ? value : useMotionValue(defaultValue)\n}\n\ntype ReorderItemProps<\n    V,\n    TagName extends ReorderElementTag = DefaultItemElement\n> = Props<V, TagName> &\n    Omit<HTMLMotionProps<TagName>, \"value\" | \"layout\"> &\n    React.PropsWithChildren<{}>\n\nexport function ReorderItemComponent<\n    V,\n    TagName extends ReorderElementTag = DefaultItemElement\n>(\n    {\n        children,\n        style = {},\n        value,\n        as = \"li\" as TagName,\n        onDrag,\n        onDragEnd,\n        layout = true,\n        ...props\n    }: ReorderItemProps<V, TagName>,\n    externalRef?: React.ForwardedRef<any>\n): React.JSX.Element {\n    const Component = useConstant(\n        () => motion[as as keyof typeof motion]\n    ) as FunctionComponent<\n        React.PropsWithChildren<HTMLMotionProps<any> & { ref?: React.Ref<any> }>\n    >\n\n    const context = useContext(ReorderContext)\n    const point = {\n        x: useDefaultMotionValue(style.x),\n        y: useDefaultMotionValue(style.y),\n    }\n\n    const zIndex = useTransform([point.x, point.y], ([latestX, latestY]) =>\n        latestX || latestY ? 1 : \"unset\"\n    )\n\n    invariant(\n        Boolean(context),\n        \"Reorder.Item must be a child of Reorder.Group\",\n        \"reorder-item-child\"\n    )\n\n    const { axis, registerItem, updateOrder, groupRef } = context!\n\n    return (\n        <Component\n            drag={axis}\n            {...props}\n            dragSnapToOrigin\n            style={{ ...style, x: point.x, y: point.y, zIndex }}\n            layout={layout}\n            onDrag={(event, gesturePoint) => {\n                const { velocity, point: pointerPoint } = gesturePoint\n                const offset = point[axis].get()\n\n                // Always attempt to update order - checkReorder handles the logic\n                updateOrder(value, offset, velocity[axis])\n\n                autoScrollIfNeeded(\n                    groupRef.current,\n                    pointerPoint[axis],\n                    axis,\n                    velocity[axis]\n                )\n\n                onDrag && onDrag(event, gesturePoint)\n            }}\n            onDragEnd={(event, gesturePoint) => {\n                resetAutoScrollState()\n                onDragEnd && onDragEnd(event, gesturePoint)\n            }}\n            onLayoutMeasure={(measured) => {\n                registerItem(value, measured)\n            }}\n            ref={externalRef}\n            ignoreStrict\n        >\n            {children}\n        </Component>\n    )\n}\n\nexport const ReorderItem = /*@__PURE__*/ forwardRef(ReorderItemComponent) as <\n    V,\n    TagName extends ReorderElementTag = DefaultItemElement\n>(\n    props: ReorderItemProps<V, TagName> & { ref?: React.ForwardedRef<any> }\n) => ReturnType<typeof ReorderItemComponent>\n"],"names":[],"mappings":";;;;;;;;;;;;AA8CA;AACI;AACJ;AASM;AAgBF;AAMA;AACA;AACI;AACA;;AAGJ;;;;;;;;AA0BY;AAOA;;AAGA;AACA;AACJ;AAEI;;AAQhB;AAEO;;"}