{"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;;;;"}