UNPKG

framer-motion

Version:

A simple and powerful JavaScript animation library

1 lines 8.73 kB
{"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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"}