@omnedia/rxjs-typewriter
Version:
A simple typewriter effect to animate text.
65 lines • 1.71 kB
JavaScript
// src/index.ts
import {
concat,
concatMap,
delay,
from,
ignoreElements,
interval,
map,
of,
repeat,
take
} from "rxjs";
var TypeWriter = class {
constructor() {
this.writeSpeed = 40;
this.waitAfterTyped = 3500;
this.waitAfterDeleted = 50;
this.loop = true;
this.wordsCount = 0;
}
typeWriteEffect(words, loop, writeSpeed, deleteDelay, writeDelay) {
this.writeSpeed = writeSpeed != null ? writeSpeed : this.writeSpeed;
this.waitAfterTyped = deleteDelay != null ? deleteDelay : this.waitAfterTyped;
this.waitAfterDeleted = writeDelay != null ? writeDelay : this.waitAfterDeleted;
this.loop = loop != null ? loop : this.loop;
this.wordsCount = words.length;
return this.startTypewriter(words);
}
startTypewriter(words) {
if (this.loop === false) {
return from(words).pipe(concatMap((word) => this.typeEffect(word)));
}
return from(words).pipe(
concatMap((word) => this.typeEffect(word)),
repeat()
);
}
typeEffect(word) {
if (this.loop === false) {
this.wordsCount -= 1;
}
return concat(
this.typeWord(word),
of("").pipe(delay(this.waitAfterTyped), ignoreElements()),
this.typeWord(word, true),
of("").pipe(delay(this.waitAfterDeleted), ignoreElements())
);
}
typeWord(word, backwards) {
if (this.loop === false && this.wordsCount <= 0 && backwards) {
return of(word);
}
return interval(this.writeSpeed).pipe(
map((x) => {
return backwards ? word.substring(0, word.length - x) : word.substring(0, x + 1);
}),
take(word.length + 1)
);
}
};
export {
TypeWriter
};
//# sourceMappingURL=index.mjs.map