{"version":3,"file":"check-reorder.mjs","sources":["../../../../../src/components/Reorder/utils/check-reorder.ts"],"sourcesContent":["import { mixNumber } from \"motion-dom\"\nimport { moveItem, Point } from \"motion-utils\"\nimport { ItemData, ReorderAxis } from \"../types\"\n\nexport function checkReorder<T>(\n    order: ItemData<T>[],\n    value: T,\n    offset: Point,\n    velocity: Point,\n    axis: ReorderAxis,\n    direction: \"ltr\" | \"rtl\" = \"ltr\"\n): ItemData<T>[] {\n    const index = order.findIndex((item) => item.value === value)\n\n    if (index === -1) return order\n\n    if (axis === \"xy\") {\n        const { layout } = order[index]\n        const center = {\n            x: mixNumber(layout.x.min, layout.x.max, 0.5) + offset.x,\n            y: mixNumber(layout.y.min, layout.y.max, 0.5) + offset.y,\n        }\n        const lines = getLines(order)\n        const sourceLine = lines.find((line) =>\n            line.items.includes(order[index])\n        )!\n        const targetLine = lines.reduce((closest, line) =>\n            distanceToLine(center.y, line) < distanceToLine(center.y, closest)\n                ? line\n                : closest\n        )\n\n        if (targetLine !== sourceLine) {\n            return moveToLine(order, index, center.x, targetLine, direction)\n        }\n\n        const currentDistance = distanceToBox(center, layout)\n        let target = -1\n        let targetDistance = currentDistance\n\n        order.forEach((item, targetIndex) => {\n            if (targetIndex === index) return\n            const distance = distanceToBox(center, item.layout)\n            if (distance < targetDistance) {\n                target = targetIndex\n                targetDistance = distance\n            }\n        })\n\n        return target === -1\n            ? order\n            : moveItem(order, index, index + Math.sign(target - index))\n    }\n\n    if (!velocity[axis]) return order\n\n    const nextOffset = velocity[axis] > 0 ? 1 : -1\n    const nextItem = order[index + nextOffset]\n\n    if (!nextItem) return order\n\n    const item = order[index]\n    const itemLayout = item.layout[axis]\n    const nextLayout = nextItem.layout[axis]\n    const nextItemCenter = mixNumber(nextLayout.min, nextLayout.max, 0.5)\n\n    if (\n        (nextOffset === 1 && itemLayout.max + offset[axis] > nextItemCenter) ||\n        (nextOffset === -1 && itemLayout.min + offset[axis] < nextItemCenter)\n    ) {\n        return moveItem(order, index, index + nextOffset)\n    }\n\n    return order\n}\n\ninterface Line<T> {\n    items: ItemData<T>[]\n    min: number\n    max: number\n}\n\nfunction getLines<T>(order: ItemData<T>[]) {\n    const lines: Line<T>[] = []\n\n    order.forEach((item) => {\n        const { min, max } = item.layout.y\n        const line = lines[lines.length - 1]\n\n        if (!line || min >= line.max || max <= line.min) {\n            lines.push({ items: [item], min, max })\n        } else {\n            line.items.push(item)\n            line.min = Math.min(line.min, min)\n            line.max = Math.max(line.max, max)\n        }\n    })\n\n    return lines\n}\n\nfunction distanceToLine<T>(y: number, line: Line<T>) {\n    return y < line.min ? line.min - y : y > line.max ? y - line.max : 0\n}\n\nfunction moveToLine<T>(\n    order: ItemData<T>[],\n    index: number,\n    x: number,\n    line: Line<T>,\n    direction: \"ltr\" | \"rtl\"\n) {\n    const remaining = order.filter((_, itemIndex) => itemIndex !== index)\n    const before = line.items.find((item) => {\n        const center = mixNumber(item.layout.x.min, item.layout.x.max, 0.5)\n        return direction === \"ltr\" ? x < center : x > center\n    })\n    const targetIndex = before\n        ? remaining.indexOf(before)\n        : remaining.indexOf(line.items[line.items.length - 1]) + 1\n    const nextOrder = [...remaining]\n    nextOrder.splice(targetIndex, 0, order[index])\n\n    return nextOrder.every((item, itemIndex) => item === order[itemIndex])\n        ? order\n        : nextOrder\n}\n\nfunction distanceToBox(point: Point, box: ItemData<unknown>[\"layout\"]) {\n    const x = Math.max(box.x.min - point.x, 0, point.x - box.x.max)\n    const y = Math.max(box.y.min - point.y, 0, point.y - box.y.max)\n    return x * x + y * y\n}\n"],"names":[],"mappings":"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"}