{"version":3,"file":"stagger.mjs","sources":["../../../src/utils/stagger.ts"],"sourcesContent":["import { Easing, easingDefinitionToFunction } from \"motion-utils\"\nimport { DynamicOption } from \"../animation/types\"\n\nexport type StaggerOrigin =\n    | \"first\"\n    | \"last\"\n    | \"center\"\n    | \"edges\"\n    | \"random\"\n    | number\n\nexport type StaggerOptions = {\n    startDelay?: number\n    from?: StaggerOrigin\n    ease?: Easing\n    /**\n     * Treat elements as a grid of `[columns, rows]`, in reading order.\n     * Delays are then based on the 2D distance from `from`.\n     */\n    grid?: [number, number]\n}\n\nexport function getOriginIndex(from: StaggerOrigin, total: number) {\n    if (from === \"first\") {\n        return 0\n    } else {\n        const lastIndex = total - 1\n        return from === \"last\" ? lastIndex : lastIndex / 2\n    }\n}\n\nexport function stagger(\n    duration: number = 0.1,\n    { startDelay = 0, from = 0, ease, grid }: StaggerOptions = {}\n): DynamicOption<number> {\n    /**\n     * Distances from the origin for each element count. The final entry\n     * holds the distance used to normalise easing.\n     */\n    const cache: { [total: number]: number[] } = {}\n\n    return (i: number, total: number) => {\n        let distances = cache[total]\n\n        if (!distances) {\n            const [columns, rows] = grid || [Infinity, 1]\n            const lastX = Math.min(columns, total) - 1\n            const lastY = Math.max(rows, Math.ceil(total / columns)) - 1\n            const isIndex = typeof from === \"number\"\n            const scale = from === \"first\" ? 0 : from === \"last\" ? 1 : 0.5\n            const originX = isIndex ? from % columns : lastX * scale\n            const originY = isIndex ? Math.floor(from / columns) : lastY * scale\n\n            distances = cache[total] = []\n\n            for (let j = 0; j < total; j++) {\n                const x = j % columns\n                const y = Math.floor(j / columns)\n                const edgeX = Math.min(x, lastX - x)\n                const edgeY = Math.min(y, lastY - y)\n\n                if (from === \"random\") {\n                    // Inside-out shuffle, so each element gets a distinct step\n                    const k = (Math.random() * (j + 1)) | 0\n                    distances[j] = distances[k]\n                    distances[k] = j\n                } else {\n                    distances[j] =\n                        from === \"edges\"\n                            ? Math.min(\n                                  lastX ? edgeX : edgeY,\n                                  lastY ? edgeY : edgeX\n                              )\n                            : Math.hypot(x - originX, y - originY)\n                }\n            }\n\n            distances.push(grid ? Math.max(...distances) : total)\n        }\n\n        let delay = duration * distances[i]\n        const maxDelay = duration * distances[total]\n\n        if (ease && maxDelay) {\n            const easingFunction = easingDefinitionToFunction(ease)\n            delay = easingFunction(delay / maxDelay) * maxDelay\n        }\n\n        return startDelay + delay\n    }\n}\n"],"names":[],"mappings":"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"}