UNPKG

svelte-typewriter

Version:

A simple and reusable typewriter effect for your Svelte applications

30 lines (26 loc) 1.08 kB
import { rng } from './rng' /** @type {any[]} */ let alreadyChoosenTexts = [] /** @type {import(types').GetRandomText} */ const getRandomElement = elements => { while (true) { const randomIndex = rng(0, elements.length) // After each iteration, avoid repeating the last text from the last iteration const isTextDifferentFromPrevious = typeof alreadyChoosenTexts === 'number' && randomIndex !== alreadyChoosenTexts const isTextFirstTime = Array.isArray(alreadyChoosenTexts) && !alreadyChoosenTexts.includes(randomIndex) const hasSingleChildElement = elements.length === 1 const shouldAnimate = hasSingleChildElement || isTextFirstTime || isTextDifferentFromPrevious if (shouldAnimate) { isTextDifferentFromPrevious && (alreadyChoosenTexts = []) alreadyChoosenTexts.push(randomIndex) const randomText = elements[randomIndex] return randomText } const restartRandomizationCycle = alreadyChoosenTexts.length === elements.length restartRandomizationCycle && (alreadyChoosenTexts = alreadyChoosenTexts.pop()) } } export { getRandomElement }