/**
|
|
* @name ityped
|
|
* @description Dead simple Animated Typing with no dependencies
|
|
* @author Luis Vinícius
|
|
* @email luis@uilabs.me
|
|
*/
|
|
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
(factory((global.ityped = global.ityped || {})));
|
|
}(this, (function (exports) { 'use strict';
|
|
|
|
/**
|
|
* async foreach
|
|
* https://www.npmjs.com/package/async-foreach
|
|
*/
|
|
var forEach = function forEach(a, b, c) {
|
|
var d = -1,
|
|
e = a.length >>> 0;
|
|
(function f(g) {
|
|
var h,
|
|
j = g === !1;
|
|
do {
|
|
++d;
|
|
} while (!(d in a) && d !== e);
|
|
if (j || d === e) {
|
|
c && c(!j, a);
|
|
return;
|
|
}
|
|
g = b.call({
|
|
async: function async() {
|
|
return h = !0, f;
|
|
}
|
|
}, a[d], d, a), h || f(g);
|
|
})();
|
|
};
|
|
|
|
/**
|
|
* el is the element
|
|
*/
|
|
var selectedElement = void 0;
|
|
var props = void 0;
|
|
var cursor = document.createElement('span');
|
|
cursor.classList.add('ityped-cursor');
|
|
cursor.textContent = '|';
|
|
|
|
/**
|
|
* @name setProps
|
|
* @description Set the ityped properties configuration
|
|
* @param {Object} config The configuration properties
|
|
* @return {Promise}
|
|
*/
|
|
function setProps(config) {
|
|
var props = config;
|
|
props.strings = config.strings || ['Put your string here...', 'and Enjoy!'];
|
|
props.typeSpeed = config.typeSpeed || 100;
|
|
props.backSpeed = config.backSpeed || 75;
|
|
props.backDelay = config.backDelay || 2000;
|
|
props.startDelay = config.startDelay || 750;
|
|
props.showCursor = config.showCursor;
|
|
props.loop = config.loop || false;
|
|
|
|
if (props.showCursor === undefined) props.showCursor = true;
|
|
|
|
return Promise.resolve(props);
|
|
}
|
|
/**
|
|
* @name init
|
|
* @param { String || Element } element The element that will receive the strings
|
|
* @param {Object} config The initial configuration
|
|
*/
|
|
function init(element, config) {
|
|
typeof element === 'string' ? element = document.querySelector(element) : element = element;
|
|
setProps(config).then(function (properties) {
|
|
props = properties;
|
|
element._props = props;
|
|
// init cursor if needed
|
|
if (props.showCursor) {
|
|
initCursorOn(element, props.cursorChar || '|');
|
|
}
|
|
loopingOnWords(element);
|
|
});
|
|
}
|
|
|
|
function initCursorOn(element, cursorChar) {
|
|
var newCursor = cursor.cloneNode();
|
|
element.insertAdjacentElement('afterend', newCursor);
|
|
newCursor.textContent = cursorChar;
|
|
}
|
|
|
|
/**
|
|
* @name loopingOnWords
|
|
* @description Loop on each string passed
|
|
* @param {HTMLElement} element The element to handle the animation on
|
|
* @param {Array} words The array that contain the words
|
|
*/
|
|
function loopingOnWords(element) {
|
|
forEach(element._props.strings, function (word, index, arr) {
|
|
var time = element._props.typeSpeed * word.length - 1;
|
|
/**
|
|
* set the correct time
|
|
* with the differences of type and back
|
|
* speed
|
|
*/
|
|
if (element._props.backSpeed < element._props.typeSpeed) {
|
|
time -= (element._props.typeSpeed - element._props.backSpeed) * word.length;
|
|
} else if (element._props.backSpeed > element._props.typeSpeed) {
|
|
time += (element._props.backSpeed - element._props.typeSpeed) * word.length;
|
|
}
|
|
var done = this.async();
|
|
var len = element._props.strings.length;
|
|
iterateWords(element, word, index, len).then(function () {
|
|
setTimeout(function () {
|
|
done();
|
|
}, time);
|
|
});
|
|
}, function () {
|
|
if (element._props.loop) {
|
|
loopingOnWords(element);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* @name increment
|
|
* @description Increment each letter and append it on element
|
|
* @param {Element} element The Element that will receive the letters
|
|
* @param {String} word The string that will be looped to
|
|
* get each letter
|
|
* @return {Promise}
|
|
*/
|
|
function increment(element, word) {
|
|
return new Promise(function (resolve, reject) {
|
|
var count = 0;
|
|
|
|
var _loop = function _loop(i) {
|
|
var wordIndex = i;
|
|
var len = word.length;
|
|
setTimeout(function (i) {
|
|
appendWord(element, word.charAt(wordIndex));
|
|
count++;
|
|
if (count === len - 1) {
|
|
resolve();
|
|
}
|
|
}, element._props.typeSpeed * i);
|
|
};
|
|
|
|
for (var i = 0; i < word.length; i++) {
|
|
_loop(i);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* @name appendWord
|
|
* @description Append each letter on Element
|
|
* @param {Element} element The Element that will receive the letter
|
|
* @param {String} word The string that will be appended
|
|
*/
|
|
function appendWord(element, word) {
|
|
element.innerHTML += word;
|
|
}
|
|
|
|
/**
|
|
* @name iterateWords
|
|
* @description Iterate on each word, incrementing and decrementing
|
|
* @param {Element} element The Element that will receive the letters of word
|
|
* @param {String} word The string that is the word
|
|
* @param {Integer} index The index position of the words Array
|
|
* @param {Integer} wordsLengthArray The length of words Array
|
|
* @return {Promise}
|
|
*/
|
|
function iterateWords(element, word, index, wordsLengthArray) {
|
|
return new Promise(function (resolve, reject) {
|
|
increment(element, word).then(function () {
|
|
setTimeout(function () {
|
|
decrement(element, word, index, wordsLengthArray).then(function () {
|
|
setTimeout(function () {
|
|
resolve();
|
|
}, element._props.startDelay);
|
|
});
|
|
}, element._props.backDelay);
|
|
});
|
|
});
|
|
}
|
|
/**
|
|
* @name iterateInsideDecrement
|
|
* @description Iterate on each word, inside the decrement function for decrement the word
|
|
* @param {Element} element The Element that will receive the letters of word
|
|
* @param {String} word The string that is the word
|
|
* @param {Integer} len The length of words Array
|
|
* @param {Promise} resolve The Promise.resolve method that will be trigerred when
|
|
* the decrement iteration are finished
|
|
* @return {Promise}
|
|
*/
|
|
function iterateInsideDecrement(element, word, len, resolve) {
|
|
var _loop2 = function _loop2(i) {
|
|
var iteratedI = i,
|
|
count = len;
|
|
setTimeout(function (i) {
|
|
element.innerHTML = word.substring(0, len - iteratedI);
|
|
count--;
|
|
if (iteratedI === 1) {
|
|
resolve();
|
|
}
|
|
}, element._props.backSpeed * i);
|
|
};
|
|
|
|
for (var i = len; i > 0; i--) {
|
|
_loop2(i);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @name decrement
|
|
* @description decrement the word in the correct case
|
|
* @param {Element} element The Element that will receive the letters of word
|
|
* @param {String} word The string that is the word
|
|
* @param {Integer} index The index of the Array that contain the word
|
|
* @param {Integer} lengthWords The length of words Array
|
|
*/
|
|
function decrement(element, word, index, lengthWords) {
|
|
return new Promise(function (resolve, reject) {
|
|
var len = word.length;
|
|
// if is the last letter and the last word and no loop
|
|
if (index + 1 === lengthWords) {
|
|
if (!element._props.loop) {
|
|
// when the last word
|
|
if (element._props.onFinished !== undefined && typeof element._props.onFinished === "function") {
|
|
element._props.onFinished();
|
|
}
|
|
element.innerHTML = word;
|
|
} else if (element._props.loop) {
|
|
iterateInsideDecrement(element, word, len, resolve);
|
|
}
|
|
} else if (index + 1 !== lengthWords) {
|
|
iterateInsideDecrement(element, word, len, resolve);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @name destroy
|
|
* @description destroy the onFinished function
|
|
*/
|
|
function destroy(element) {
|
|
element._props.onFinished = function () {
|
|
return void 0;
|
|
};
|
|
}
|
|
|
|
exports.init = init;
|
|
exports.destroy = destroy;
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
})));
|
|
//# sourceMappingURL=ityped.js.map
|