UNPKG

framer-motion

Version:

A simple and powerful JavaScript animation library

1 lines • 11.2 kB
{"version":3,"file":"check-reorder.mjs","sources":["../../../../../src/components/Reorder/utils/check-reorder.ts"],"sourcesContent":["import { mixNumber } from \"motion-dom\"\nimport { Axis, 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 point = {\n x: center(layout.x) + offset.x,\n y: center(layout.y) + 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(point.y, line) < distanceToLine(point.y, closest)\n ? line\n : closest\n )\n\n if (targetLine !== sourceLine) {\n return moveToLine(order, index, point.x, targetLine, direction)\n }\n\n const currentDistance = distanceToBox(point, layout)\n let target = -1\n let targetDistance = currentDistance\n\n order.forEach((item, targetIndex) => {\n if (targetIndex === index) return\n const distance = distanceToBox(point, 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 = center(nextLayout)\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\n/**\n * The index a key takes `order[index]` to, or -1 if there's nowhere to go,\n * `key` being its index in Up, Left, Down, Right, Home, End. Left and Right\n * go along the order (swapped in RTL). On the \"xy\" axis, Up and Down go to\n * the row above or below, to the item there nearest across. Home and End\n * go to either end.\n */\nexport function keyTarget<T>(\n order: ItemData<T>[],\n index: number,\n key: number,\n axis: ReorderAxis,\n isRTL: boolean\n) {\n const step = key > 1 !== !!(key % 2 && isRTL) ? 1 : -1\n let target = key > 3 ? (key - 4) * (order.length - 1) : index + step\n\n if (axis === \"xy\" && key < 4 && !(key % 2) && index > -1) {\n /**\n * Rows top to bottom as drawn, which isn't their order with\n * flex-wrap: wrap-reverse.\n */\n const lines = getLines(order).sort((a, b) => a.min - b.min)\n const line =\n lines[\n lines.findIndex(({ items }) => items.includes(order[index])) +\n step\n ]\n const distance = (item: ItemData<T>) =>\n Math.abs(center(item.layout.x) - center(order[index].layout.x))\n\n target = line\n ? order.indexOf(\n line.items.reduce((nearest, item) =>\n distance(item) < distance(nearest) ? item : nearest\n )\n )\n : -1\n }\n\n return index > -1 && target !== index && order[target] ? target : -1\n}\n\nconst center = ({ min, max }: Axis) => mixNumber(min, max, 0.5)\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 itemCenter = center(item.layout.x)\n return direction === \"ltr\" ? x < itemCenter : x > itemCenter\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":";;;AAIM,SAAU,YAAY,CACxB,KAAoB,EACpB,KAAQ,EACR,MAAa,EACb,QAAe,EACf,IAAiB,EACjB,YAA2B,KAAK,EAAA;AAEhC,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;IAE7D,IAAI,KAAK,KAAK,EAAE;AAAE,QAAA,OAAO,KAAK;AAE9B,IAAA,IAAI,IAAI,KAAK,IAAI,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;AAC/B,QAAA,MAAM,KAAK,GAAG;YACV,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YAC9B,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;SACjC;AACD,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACnC;AACF,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,KAC1C,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO;AAC3D,cAAE;cACA,OAAO,CAChB;AAED,QAAA,IAAI,UAAU,KAAK,UAAU,EAAE;AAC3B,YAAA,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC;QACnE;QAEA,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC;AACpD,QAAA,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,cAAc,GAAG,eAAe;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,WAAW,KAAI;YAChC,IAAI,WAAW,KAAK,KAAK;gBAAE;YAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAClD,YAAA,IAAI,QAAQ,GAAG,cAAc,EAAE;gBAC3B,MAAM,GAAG,WAAW;gBACpB,cAAc,GAAG,QAAQ;YAC7B;AACJ,QAAA,CAAC,CAAC;QAEF,OAAO,MAAM,KAAK;AACd,cAAE;AACF,cAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IACnE;AAEA,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,KAAK;AAEjC,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;AAE1C,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,KAAK;AAE3B,IAAA,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;IACzB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IACpC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;AACxC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;AAEzC,IAAA,IACI,CAAC,UAAU,KAAK,CAAC,IAAI,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc;AACnE,SAAC,UAAU,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,EACvE;QACE,OAAO,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC;IACrD;AAEA,IAAA,OAAO,KAAK;AAChB;AAEA;;;;;;AAMG;AACG,SAAU,SAAS,CACrB,KAAoB,EACpB,KAAa,EACb,GAAW,EACX,IAAiB,EACjB,KAAc,EAAA;IAEd,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;IACtD,IAAI,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI;IAEpE,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE;AACtD;;;AAGG;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;QAC3D,MAAM,IAAI,GACN,KAAK,CACD,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,YAAA,IAAI,CACX;AACL,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAiB,KAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEnE,QAAA,MAAM,GAAG;AACL,cAAE,KAAK,CAAC,OAAO,CACT,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,KAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,OAAO,CACtD;cAEL,EAAE;IACZ;IAEA,OAAO,KAAK,GAAG,EAAE,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,EAAE;AACxE;AAEA,MAAM,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAQ,KAAK,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAQ/D,SAAS,QAAQ,CAAI,KAAoB,EAAA;IACrC,MAAM,KAAK,GAAc,EAAE;AAE3B,IAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;QACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAEpC,QAAA,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;AAC7C,YAAA,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC3C;aAAO;AACH,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;AAClC,YAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;QACtC;AACJ,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,KAAK;AAChB;AAEA,SAAS,cAAc,CAAI,CAAS,EAAE,IAAa,EAAA;AAC/C,IAAA,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;AACxE;AAEA,SAAS,UAAU,CACf,KAAoB,EACpB,KAAa,EACb,CAAS,EACT,IAAa,EACb,SAAwB,EAAA;AAExB,IAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,KAAK,SAAS,KAAK,KAAK,CAAC;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAI;QACpC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,QAAA,OAAO,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,GAAG,UAAU;AAChE,IAAA,CAAC,CAAC;IACF,MAAM,WAAW,GAAG;AAChB,UAAE,SAAS,CAAC,OAAO,CAAC,MAAM;UACxB,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9D,IAAA,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC;AAChC,IAAA,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAE9C,IAAA,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,KAAK,KAAK,CAAC,SAAS,CAAC;AACjE,UAAE;UACA,SAAS;AACnB;AAEA,SAAS,aAAa,CAAC,KAAY,EAAE,GAAgC,EAAA;AACjE,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/D,IAAA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/D,IAAA,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AACxB;;;;"}