motion-dom
Version:
1 lines • 5.49 kB
Source Map (JSON)
{"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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"}