1037 lines
32 KiB
JavaScript
Executable File
1037 lines
32 KiB
JavaScript
Executable File
/*!
|
|
*
|
|
* typed.js - A JavaScript Typing Animation Library
|
|
* Author: Matt Boldt <me@mattboldt.com>
|
|
* Version: v2.0.6
|
|
* Url: https://github.com/mattboldt/typed.js
|
|
* License(s): MIT
|
|
*
|
|
*/
|
|
(function webpackUniversalModuleDefinition(root, factory) {
|
|
if(typeof exports === 'object' && typeof module === 'object')
|
|
module.exports = factory();
|
|
else if(typeof define === 'function' && define.amd)
|
|
define([], factory);
|
|
else if(typeof exports === 'object')
|
|
exports["Typed"] = factory();
|
|
else
|
|
root["Typed"] = factory();
|
|
})(this, function() {
|
|
return /******/ (function(modules) { // webpackBootstrap
|
|
/******/ // The module cache
|
|
/******/ var installedModules = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/
|
|
/******/ // Check if module is in cache
|
|
/******/ if(installedModules[moduleId])
|
|
/******/ return installedModules[moduleId].exports;
|
|
/******/
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = installedModules[moduleId] = {
|
|
/******/ exports: {},
|
|
/******/ id: moduleId,
|
|
/******/ loaded: false
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.loaded = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/******/
|
|
/******/ // expose the modules object (__webpack_modules__)
|
|
/******/ __webpack_require__.m = modules;
|
|
/******/
|
|
/******/ // expose the module cache
|
|
/******/ __webpack_require__.c = installedModules;
|
|
/******/
|
|
/******/ // __webpack_public_path__
|
|
/******/ __webpack_require__.p = "";
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __webpack_require__(0);
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ([
|
|
/* 0 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', {
|
|
value: true
|
|
});
|
|
|
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
|
|
var _initializerJs = __webpack_require__(1);
|
|
|
|
var _htmlParserJs = __webpack_require__(3);
|
|
|
|
/**
|
|
* Welcome to Typed.js!
|
|
* @param {string} elementId HTML element ID _OR_ HTML element
|
|
* @param {object} options options object
|
|
* @returns {object} a new Typed object
|
|
*/
|
|
|
|
var Typed = (function () {
|
|
function Typed(elementId, options) {
|
|
_classCallCheck(this, Typed);
|
|
|
|
// Initialize it up
|
|
_initializerJs.initializer.load(this, options, elementId);
|
|
// All systems go!
|
|
this.begin();
|
|
}
|
|
|
|
/**
|
|
* Toggle start() and stop() of the Typed instance
|
|
* @public
|
|
*/
|
|
|
|
_createClass(Typed, [{
|
|
key: 'toggle',
|
|
value: function toggle() {
|
|
this.pause.status ? this.start() : this.stop();
|
|
}
|
|
|
|
/**
|
|
* Stop typing / backspacing and enable cursor blinking
|
|
* @public
|
|
*/
|
|
}, {
|
|
key: 'stop',
|
|
value: function stop() {
|
|
if (this.typingComplete) return;
|
|
if (this.pause.status) return;
|
|
this.toggleBlinking(true);
|
|
this.pause.status = true;
|
|
this.options.onStop(this.arrayPos, this);
|
|
}
|
|
|
|
/**
|
|
* Start typing / backspacing after being stopped
|
|
* @public
|
|
*/
|
|
}, {
|
|
key: 'start',
|
|
value: function start() {
|
|
if (this.typingComplete) return;
|
|
if (!this.pause.status) return;
|
|
this.pause.status = false;
|
|
if (this.pause.typewrite) {
|
|
this.typewrite(this.pause.curString, this.pause.curStrPos);
|
|
} else {
|
|
this.backspace(this.pause.curString, this.pause.curStrPos);
|
|
}
|
|
this.options.onStart(this.arrayPos, this);
|
|
}
|
|
|
|
/**
|
|
* Destroy this instance of Typed
|
|
* @public
|
|
*/
|
|
}, {
|
|
key: 'destroy',
|
|
value: function destroy() {
|
|
this.reset(false);
|
|
this.options.onDestroy(this);
|
|
}
|
|
|
|
/**
|
|
* Reset Typed and optionally restarts
|
|
* @param {boolean} restart
|
|
* @public
|
|
*/
|
|
}, {
|
|
key: 'reset',
|
|
value: function reset() {
|
|
var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
|
|
|
|
clearInterval(this.timeout);
|
|
this.replaceText('');
|
|
if (this.cursor && this.cursor.parentNode) {
|
|
this.cursor.parentNode.removeChild(this.cursor);
|
|
this.cursor = null;
|
|
}
|
|
this.strPos = 0;
|
|
this.arrayPos = 0;
|
|
this.curLoop = 0;
|
|
if (restart) {
|
|
this.insertCursor();
|
|
this.options.onReset(this);
|
|
this.begin();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Begins the typing animation
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'begin',
|
|
value: function begin() {
|
|
var _this = this;
|
|
|
|
this.typingComplete = false;
|
|
this.shuffleStringsIfNeeded(this);
|
|
this.insertCursor();
|
|
if (this.bindInputFocusEvents) this.bindFocusEvents();
|
|
this.timeout = setTimeout(function () {
|
|
// Check if there is some text in the element, if yes start by backspacing the default message
|
|
if (!_this.currentElContent || _this.currentElContent.length === 0) {
|
|
_this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos);
|
|
} else {
|
|
// Start typing
|
|
_this.backspace(_this.currentElContent, _this.currentElContent.length);
|
|
}
|
|
}, this.startDelay);
|
|
}
|
|
|
|
/**
|
|
* Called for each character typed
|
|
* @param {string} curString the current string in the strings array
|
|
* @param {number} curStrPos the current position in the curString
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'typewrite',
|
|
value: function typewrite(curString, curStrPos) {
|
|
var _this2 = this;
|
|
|
|
if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) {
|
|
this.el.classList.remove(this.fadeOutClass);
|
|
if (this.cursor) this.cursor.classList.remove(this.fadeOutClass);
|
|
}
|
|
|
|
var humanize = this.humanizer(this.typeSpeed);
|
|
var numChars = 1;
|
|
|
|
if (this.pause.status === true) {
|
|
this.setPauseStatus(curString, curStrPos, true);
|
|
return;
|
|
}
|
|
|
|
// contain typing function in a timeout humanize'd delay
|
|
this.timeout = setTimeout(function () {
|
|
// skip over any HTML chars
|
|
curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2);
|
|
|
|
var pauseTime = 0;
|
|
var substr = curString.substr(curStrPos);
|
|
// check for an escape character before a pause value
|
|
// format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^
|
|
// single ^ are removed from string
|
|
if (substr.charAt(0) === '^') {
|
|
if (/^\^\d+/.test(substr)) {
|
|
var skip = 1; // skip at least 1
|
|
substr = /\d+/.exec(substr)[0];
|
|
skip += substr.length;
|
|
pauseTime = parseInt(substr);
|
|
_this2.temporaryPause = true;
|
|
_this2.options.onTypingPaused(_this2.arrayPos, _this2);
|
|
// strip out the escape character and pause value so they're not printed
|
|
curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip);
|
|
_this2.toggleBlinking(true);
|
|
}
|
|
}
|
|
|
|
// check for skip characters formatted as
|
|
// "this is a `string to print NOW` ..."
|
|
if (substr.charAt(0) === '`') {
|
|
while (curString.substr(curStrPos + numChars).charAt(0) !== '`') {
|
|
numChars++;
|
|
if (curStrPos + numChars > curString.length) break;
|
|
}
|
|
// strip out the escape characters and append all the string in between
|
|
var stringBeforeSkip = curString.substring(0, curStrPos);
|
|
var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars);
|
|
var stringAfterSkip = curString.substring(curStrPos + numChars + 1);
|
|
curString = stringBeforeSkip + stringSkipped + stringAfterSkip;
|
|
numChars--;
|
|
}
|
|
|
|
// timeout for any pause after a character
|
|
_this2.timeout = setTimeout(function () {
|
|
// Accounts for blinking while paused
|
|
_this2.toggleBlinking(false);
|
|
|
|
// We're done with this sentence!
|
|
if (curStrPos === curString.length) {
|
|
_this2.doneTyping(curString, curStrPos);
|
|
} else {
|
|
_this2.keepTyping(curString, curStrPos, numChars);
|
|
}
|
|
// end of character pause
|
|
if (_this2.temporaryPause) {
|
|
_this2.temporaryPause = false;
|
|
_this2.options.onTypingResumed(_this2.arrayPos, _this2);
|
|
}
|
|
}, pauseTime);
|
|
|
|
// humanized value for typing
|
|
}, humanize);
|
|
}
|
|
|
|
/**
|
|
* Continue to the next string & begin typing
|
|
* @param {string} curString the current string in the strings array
|
|
* @param {number} curStrPos the current position in the curString
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'keepTyping',
|
|
value: function keepTyping(curString, curStrPos, numChars) {
|
|
// call before functions if applicable
|
|
if (curStrPos === 0) {
|
|
this.toggleBlinking(false);
|
|
this.options.preStringTyped(this.arrayPos, this);
|
|
}
|
|
// start typing each new char into existing string
|
|
// curString: arg, this.el.html: original text inside element
|
|
curStrPos += numChars;
|
|
var nextString = curString.substr(0, curStrPos);
|
|
this.replaceText(nextString);
|
|
// loop the function
|
|
this.typewrite(curString, curStrPos);
|
|
}
|
|
|
|
/**
|
|
* We're done typing all strings
|
|
* @param {string} curString the current string in the strings array
|
|
* @param {number} curStrPos the current position in the curString
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'doneTyping',
|
|
value: function doneTyping(curString, curStrPos) {
|
|
var _this3 = this;
|
|
|
|
// fires callback function
|
|
this.options.onStringTyped(this.arrayPos, this);
|
|
this.toggleBlinking(true);
|
|
// is this the final string
|
|
if (this.arrayPos === this.strings.length - 1) {
|
|
// callback that occurs on the last typed string
|
|
this.complete();
|
|
// quit if we wont loop back
|
|
if (this.loop === false || this.curLoop === this.loopCount) {
|
|
return;
|
|
}
|
|
}
|
|
this.timeout = setTimeout(function () {
|
|
_this3.backspace(curString, curStrPos);
|
|
}, this.backDelay);
|
|
}
|
|
|
|
/**
|
|
* Backspaces 1 character at a time
|
|
* @param {string} curString the current string in the strings array
|
|
* @param {number} curStrPos the current position in the curString
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'backspace',
|
|
value: function backspace(curString, curStrPos) {
|
|
var _this4 = this;
|
|
|
|
if (this.pause.status === true) {
|
|
this.setPauseStatus(curString, curStrPos, true);
|
|
return;
|
|
}
|
|
if (this.fadeOut) return this.initFadeOut();
|
|
|
|
this.toggleBlinking(false);
|
|
var humanize = this.humanizer(this.backSpeed);
|
|
|
|
this.timeout = setTimeout(function () {
|
|
curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4);
|
|
// replace text with base text + typed characters
|
|
var curStringAtPosition = curString.substr(0, curStrPos);
|
|
_this4.replaceText(curStringAtPosition);
|
|
|
|
// if smartBack is enabled
|
|
if (_this4.smartBackspace) {
|
|
// the remaining part of the current string is equal of the same part of the new string
|
|
var nextString = _this4.strings[_this4.arrayPos + 1];
|
|
if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) {
|
|
_this4.stopNum = curStrPos;
|
|
} else {
|
|
_this4.stopNum = 0;
|
|
}
|
|
}
|
|
|
|
// if the number (id of character in current string) is
|
|
// less than the stop number, keep going
|
|
if (curStrPos > _this4.stopNum) {
|
|
// subtract characters one by one
|
|
curStrPos--;
|
|
// loop the function
|
|
_this4.backspace(curString, curStrPos);
|
|
} else if (curStrPos <= _this4.stopNum) {
|
|
// if the stop number has been reached, increase
|
|
// array position to next string
|
|
_this4.arrayPos++;
|
|
// When looping, begin at the beginning after backspace complete
|
|
if (_this4.arrayPos === _this4.strings.length) {
|
|
_this4.arrayPos = 0;
|
|
_this4.options.onLastStringBackspaced();
|
|
_this4.shuffleStringsIfNeeded();
|
|
_this4.begin();
|
|
} else {
|
|
_this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos);
|
|
}
|
|
}
|
|
// humanized value for typing
|
|
}, humanize);
|
|
}
|
|
|
|
/**
|
|
* Full animation is complete
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'complete',
|
|
value: function complete() {
|
|
this.options.onComplete(this);
|
|
if (this.loop) {
|
|
this.curLoop++;
|
|
} else {
|
|
this.typingComplete = true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Has the typing been stopped
|
|
* @param {string} curString the current string in the strings array
|
|
* @param {number} curStrPos the current position in the curString
|
|
* @param {boolean} isTyping
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'setPauseStatus',
|
|
value: function setPauseStatus(curString, curStrPos, isTyping) {
|
|
this.pause.typewrite = isTyping;
|
|
this.pause.curString = curString;
|
|
this.pause.curStrPos = curStrPos;
|
|
}
|
|
|
|
/**
|
|
* Toggle the blinking cursor
|
|
* @param {boolean} isBlinking
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'toggleBlinking',
|
|
value: function toggleBlinking(isBlinking) {
|
|
if (!this.cursor) return;
|
|
// if in paused state, don't toggle blinking a 2nd time
|
|
if (this.pause.status) return;
|
|
if (this.cursorBlinking === isBlinking) return;
|
|
this.cursorBlinking = isBlinking;
|
|
var status = isBlinking ? 'infinite' : 0;
|
|
this.cursor.style.animationIterationCount = status;
|
|
}
|
|
|
|
/**
|
|
* Speed in MS to type
|
|
* @param {number} speed
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'humanizer',
|
|
value: function humanizer(speed) {
|
|
return Math.round(Math.random() * speed / 2) + speed;
|
|
}
|
|
|
|
/**
|
|
* Shuffle the sequence of the strings array
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'shuffleStringsIfNeeded',
|
|
value: function shuffleStringsIfNeeded() {
|
|
if (!this.shuffle) return;
|
|
this.sequence = this.sequence.sort(function () {
|
|
return Math.random() - 0.5;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Adds a CSS class to fade out current string
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'initFadeOut',
|
|
value: function initFadeOut() {
|
|
var _this5 = this;
|
|
|
|
this.el.className += ' ' + this.fadeOutClass;
|
|
if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass;
|
|
return setTimeout(function () {
|
|
_this5.arrayPos++;
|
|
_this5.replaceText('');
|
|
|
|
// Resets current string if end of loop reached
|
|
if (_this5.strings.length > _this5.arrayPos) {
|
|
_this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0);
|
|
} else {
|
|
_this5.typewrite(_this5.strings[0], 0);
|
|
_this5.arrayPos = 0;
|
|
}
|
|
}, this.fadeOutDelay);
|
|
}
|
|
|
|
/**
|
|
* Replaces current text in the HTML element
|
|
* depending on element type
|
|
* @param {string} str
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'replaceText',
|
|
value: function replaceText(str) {
|
|
if (this.attr) {
|
|
this.el.setAttribute(this.attr, str);
|
|
} else {
|
|
if (this.isInput) {
|
|
this.el.value = str;
|
|
} else if (this.contentType === 'html') {
|
|
this.el.innerHTML = str;
|
|
} else {
|
|
this.el.textContent = str;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* If using input elements, bind focus in order to
|
|
* start and stop the animation
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'bindFocusEvents',
|
|
value: function bindFocusEvents() {
|
|
var _this6 = this;
|
|
|
|
if (!this.isInput) return;
|
|
this.el.addEventListener('focus', function (e) {
|
|
_this6.stop();
|
|
});
|
|
this.el.addEventListener('blur', function (e) {
|
|
if (_this6.el.value && _this6.el.value.length !== 0) {
|
|
return;
|
|
}
|
|
_this6.start();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* On init, insert the cursor element
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'insertCursor',
|
|
value: function insertCursor() {
|
|
if (!this.showCursor) return;
|
|
if (this.cursor) return;
|
|
this.cursor = document.createElement('span');
|
|
this.cursor.className = 'typed-cursor';
|
|
this.cursor.innerHTML = this.cursorChar;
|
|
this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling);
|
|
}
|
|
}]);
|
|
|
|
return Typed;
|
|
})();
|
|
|
|
exports['default'] = Typed;
|
|
module.exports = exports['default'];
|
|
|
|
/***/ }),
|
|
/* 1 */
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', {
|
|
value: true
|
|
});
|
|
|
|
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
|
|
var _defaultsJs = __webpack_require__(2);
|
|
|
|
var _defaultsJs2 = _interopRequireDefault(_defaultsJs);
|
|
|
|
/**
|
|
* Initialize the Typed object
|
|
*/
|
|
|
|
var Initializer = (function () {
|
|
function Initializer() {
|
|
_classCallCheck(this, Initializer);
|
|
}
|
|
|
|
_createClass(Initializer, [{
|
|
key: 'load',
|
|
|
|
/**
|
|
* Load up defaults & options on the Typed instance
|
|
* @param {Typed} self instance of Typed
|
|
* @param {object} options options object
|
|
* @param {string} elementId HTML element ID _OR_ instance of HTML element
|
|
* @private
|
|
*/
|
|
|
|
value: function load(self, options, elementId) {
|
|
// chosen element to manipulate text
|
|
if (typeof elementId === 'string') {
|
|
self.el = document.querySelector(elementId);
|
|
} else {
|
|
self.el = elementId;
|
|
}
|
|
|
|
self.options = _extends({}, _defaultsJs2['default'], options);
|
|
|
|
// attribute to type into
|
|
self.isInput = self.el.tagName.toLowerCase() === 'input';
|
|
self.attr = self.options.attr;
|
|
self.bindInputFocusEvents = self.options.bindInputFocusEvents;
|
|
|
|
// show cursor
|
|
self.showCursor = self.isInput ? false : self.options.showCursor;
|
|
|
|
// custom cursor
|
|
self.cursorChar = self.options.cursorChar;
|
|
|
|
// Is the cursor blinking
|
|
self.cursorBlinking = true;
|
|
|
|
// text content of element
|
|
self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent;
|
|
|
|
// html or plain text
|
|
self.contentType = self.options.contentType;
|
|
|
|
// typing speed
|
|
self.typeSpeed = self.options.typeSpeed;
|
|
|
|
// add a delay before typing starts
|
|
self.startDelay = self.options.startDelay;
|
|
|
|
// backspacing speed
|
|
self.backSpeed = self.options.backSpeed;
|
|
|
|
// only backspace what doesn't match the previous string
|
|
self.smartBackspace = self.options.smartBackspace;
|
|
|
|
// amount of time to wait before backspacing
|
|
self.backDelay = self.options.backDelay;
|
|
|
|
// Fade out instead of backspace
|
|
self.fadeOut = self.options.fadeOut;
|
|
self.fadeOutClass = self.options.fadeOutClass;
|
|
self.fadeOutDelay = self.options.fadeOutDelay;
|
|
|
|
// variable to check whether typing is currently paused
|
|
self.isPaused = false;
|
|
|
|
// input strings of text
|
|
self.strings = self.options.strings.map(function (s) {
|
|
return s.trim();
|
|
});
|
|
|
|
// div containing strings
|
|
if (typeof self.options.stringsElement === 'string') {
|
|
self.stringsElement = document.querySelector(self.options.stringsElement);
|
|
} else {
|
|
self.stringsElement = self.options.stringsElement;
|
|
}
|
|
|
|
if (self.stringsElement) {
|
|
self.strings = [];
|
|
self.stringsElement.style.display = 'none';
|
|
var strings = Array.prototype.slice.apply(self.stringsElement.children);
|
|
var stringsLength = strings.length;
|
|
|
|
if (stringsLength) {
|
|
for (var i = 0; i < stringsLength; i += 1) {
|
|
var stringEl = strings[i];
|
|
self.strings.push(stringEl.innerHTML.trim());
|
|
}
|
|
}
|
|
}
|
|
|
|
// character number position of current string
|
|
self.strPos = 0;
|
|
|
|
// current array position
|
|
self.arrayPos = 0;
|
|
|
|
// index of string to stop backspacing on
|
|
self.stopNum = 0;
|
|
|
|
// Looping logic
|
|
self.loop = self.options.loop;
|
|
self.loopCount = self.options.loopCount;
|
|
self.curLoop = 0;
|
|
|
|
// shuffle the strings
|
|
self.shuffle = self.options.shuffle;
|
|
// the order of strings
|
|
self.sequence = [];
|
|
|
|
self.pause = {
|
|
status: false,
|
|
typewrite: true,
|
|
curString: '',
|
|
curStrPos: 0
|
|
};
|
|
|
|
// When the typing is complete (when not looped)
|
|
self.typingComplete = false;
|
|
|
|
// Set the order in which the strings are typed
|
|
for (var i in self.strings) {
|
|
self.sequence[i] = i;
|
|
}
|
|
|
|
// If there is some text in the element
|
|
self.currentElContent = this.getCurrentElContent(self);
|
|
|
|
self.autoInsertCss = self.options.autoInsertCss;
|
|
|
|
this.appendAnimationCss(self);
|
|
}
|
|
}, {
|
|
key: 'getCurrentElContent',
|
|
value: function getCurrentElContent(self) {
|
|
var elContent = '';
|
|
if (self.attr) {
|
|
elContent = self.el.getAttribute(self.attr);
|
|
} else if (self.isInput) {
|
|
elContent = self.el.value;
|
|
} else if (self.contentType === 'html') {
|
|
elContent = self.el.innerHTML;
|
|
} else {
|
|
elContent = self.el.textContent;
|
|
}
|
|
return elContent;
|
|
}
|
|
}, {
|
|
key: 'appendAnimationCss',
|
|
value: function appendAnimationCss(self) {
|
|
if (!self.autoInsertCss) {
|
|
return;
|
|
}
|
|
if (!self.showCursor || !self.fadeOut) {
|
|
return;
|
|
}
|
|
|
|
var css = document.createElement('style');
|
|
css.type = 'text/css';
|
|
var innerCss = '';
|
|
if (self.showCursor) {
|
|
innerCss += '\n .typed-cursor{\n opacity: 1;\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n ';
|
|
}
|
|
if (self.fadeOut) {
|
|
innerCss += '\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n -webkit-animation: 0;\n animation: 0;\n }\n ';
|
|
}
|
|
if (css.length === 0) {
|
|
return;
|
|
}
|
|
css.innerHTML = innerCss;
|
|
document.head.appendChild(css);
|
|
}
|
|
}]);
|
|
|
|
return Initializer;
|
|
})();
|
|
|
|
exports['default'] = Initializer;
|
|
var initializer = new Initializer();
|
|
exports.initializer = initializer;
|
|
|
|
/***/ }),
|
|
/* 2 */
|
|
/***/ (function(module, exports) {
|
|
|
|
/**
|
|
* Defaults & options
|
|
* @returns {object} Typed defaults & options
|
|
* @public
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', {
|
|
value: true
|
|
});
|
|
var defaults = {
|
|
/**
|
|
* @property {array} strings strings to be typed
|
|
* @property {string} stringsElement ID of element containing string children
|
|
*/
|
|
strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'],
|
|
stringsElement: null,
|
|
|
|
/**
|
|
* @property {number} typeSpeed type speed in milliseconds
|
|
*/
|
|
typeSpeed: 0,
|
|
|
|
/**
|
|
* @property {number} startDelay time before typing starts in milliseconds
|
|
*/
|
|
startDelay: 0,
|
|
|
|
/**
|
|
* @property {number} backSpeed backspacing speed in milliseconds
|
|
*/
|
|
backSpeed: 0,
|
|
|
|
/**
|
|
* @property {boolean} smartBackspace only backspace what doesn't match the previous string
|
|
*/
|
|
smartBackspace: true,
|
|
|
|
/**
|
|
* @property {boolean} shuffle shuffle the strings
|
|
*/
|
|
shuffle: false,
|
|
|
|
/**
|
|
* @property {number} backDelay time before backspacing in milliseconds
|
|
*/
|
|
backDelay: 700,
|
|
|
|
/**
|
|
* @property {boolean} fadeOut Fade out instead of backspace
|
|
* @property {string} fadeOutClass css class for fade animation
|
|
* @property {boolean} fadeOutDelay Fade out delay in milliseconds
|
|
*/
|
|
fadeOut: false,
|
|
fadeOutClass: 'typed-fade-out',
|
|
fadeOutDelay: 500,
|
|
|
|
/**
|
|
* @property {boolean} loop loop strings
|
|
* @property {number} loopCount amount of loops
|
|
*/
|
|
loop: false,
|
|
loopCount: Infinity,
|
|
|
|
/**
|
|
* @property {boolean} showCursor show cursor
|
|
* @property {string} cursorChar character for cursor
|
|
* @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML <head>
|
|
*/
|
|
showCursor: true,
|
|
cursorChar: '█',
|
|
autoInsertCss: true,
|
|
|
|
/**
|
|
* @property {string} attr attribute for typing
|
|
* Ex: input placeholder, value, or just HTML text
|
|
*/
|
|
attr: null,
|
|
|
|
/**
|
|
* @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input
|
|
*/
|
|
bindInputFocusEvents: false,
|
|
|
|
/**
|
|
* @property {string} contentType 'html' or 'null' for plaintext
|
|
*/
|
|
contentType: 'html',
|
|
|
|
/**
|
|
* All typing is complete
|
|
* @param {Typed} self
|
|
*/
|
|
onComplete: function onComplete(self) {},
|
|
|
|
/**
|
|
* Before each string is typed
|
|
* @param {number} arrayPos
|
|
* @param {Typed} self
|
|
*/
|
|
preStringTyped: function preStringTyped(arrayPos, self) {},
|
|
|
|
/**
|
|
* After each string is typed
|
|
* @param {number} arrayPos
|
|
* @param {Typed} self
|
|
*/
|
|
onStringTyped: function onStringTyped(arrayPos, self) {},
|
|
|
|
/**
|
|
* During looping, after last string is typed
|
|
* @param {Typed} self
|
|
*/
|
|
onLastStringBackspaced: function onLastStringBackspaced(self) {},
|
|
|
|
/**
|
|
* Typing has been stopped
|
|
* @param {number} arrayPos
|
|
* @param {Typed} self
|
|
*/
|
|
onTypingPaused: function onTypingPaused(arrayPos, self) {},
|
|
|
|
/**
|
|
* Typing has been started after being stopped
|
|
* @param {number} arrayPos
|
|
* @param {Typed} self
|
|
*/
|
|
onTypingResumed: function onTypingResumed(arrayPos, self) {},
|
|
|
|
/**
|
|
* After reset
|
|
* @param {Typed} self
|
|
*/
|
|
onReset: function onReset(self) {},
|
|
|
|
/**
|
|
* After stop
|
|
* @param {number} arrayPos
|
|
* @param {Typed} self
|
|
*/
|
|
onStop: function onStop(arrayPos, self) {},
|
|
|
|
/**
|
|
* After start
|
|
* @param {number} arrayPos
|
|
* @param {Typed} self
|
|
*/
|
|
onStart: function onStart(arrayPos, self) {},
|
|
|
|
/**
|
|
* After destroy
|
|
* @param {Typed} self
|
|
*/
|
|
onDestroy: function onDestroy(self) {}
|
|
};
|
|
|
|
exports['default'] = defaults;
|
|
module.exports = exports['default'];
|
|
|
|
/***/ }),
|
|
/* 3 */
|
|
/***/ (function(module, exports) {
|
|
|
|
|
|
/**
|
|
* TODO: These methods can probably be combined somehow
|
|
* Parse HTML tags & HTML Characters
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', {
|
|
value: true
|
|
});
|
|
|
|
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
|
|
|
|
var HTMLParser = (function () {
|
|
function HTMLParser() {
|
|
_classCallCheck(this, HTMLParser);
|
|
}
|
|
|
|
_createClass(HTMLParser, [{
|
|
key: 'typeHtmlChars',
|
|
|
|
/**
|
|
* Type HTML tags & HTML Characters
|
|
* @param {string} curString Current string
|
|
* @param {number} curStrPos Position in current string
|
|
* @param {Typed} self instance of Typed
|
|
* @returns {number} a new string position
|
|
* @private
|
|
*/
|
|
|
|
value: function typeHtmlChars(curString, curStrPos, self) {
|
|
if (self.contentType !== 'html') return curStrPos;
|
|
var curChar = curString.substr(curStrPos).charAt(0);
|
|
if (curChar === '<' || curChar === '&') {
|
|
var endTag = '';
|
|
if (curChar === '<') {
|
|
endTag = '>';
|
|
} else {
|
|
endTag = ';';
|
|
}
|
|
while (curString.substr(curStrPos + 1).charAt(0) !== endTag) {
|
|
curStrPos++;
|
|
if (curStrPos + 1 > curString.length) {
|
|
break;
|
|
}
|
|
}
|
|
curStrPos++;
|
|
}
|
|
return curStrPos;
|
|
}
|
|
|
|
/**
|
|
* Backspace HTML tags and HTML Characters
|
|
* @param {string} curString Current string
|
|
* @param {number} curStrPos Position in current string
|
|
* @param {Typed} self instance of Typed
|
|
* @returns {number} a new string position
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: 'backSpaceHtmlChars',
|
|
value: function backSpaceHtmlChars(curString, curStrPos, self) {
|
|
if (self.contentType !== 'html') return curStrPos;
|
|
var curChar = curString.substr(curStrPos).charAt(0);
|
|
if (curChar === '>' || curChar === ';') {
|
|
var endTag = '';
|
|
if (curChar === '>') {
|
|
endTag = '<';
|
|
} else {
|
|
endTag = '&';
|
|
}
|
|
while (curString.substr(curStrPos - 1).charAt(0) !== endTag) {
|
|
curStrPos--;
|
|
if (curStrPos < 0) {
|
|
break;
|
|
}
|
|
}
|
|
curStrPos--;
|
|
}
|
|
return curStrPos;
|
|
}
|
|
}]);
|
|
|
|
return HTMLParser;
|
|
})();
|
|
|
|
exports['default'] = HTMLParser;
|
|
var htmlParser = new HTMLParser();
|
|
exports.htmlParser = htmlParser;
|
|
|
|
/***/ })
|
|
/******/ ])
|
|
});
|
|
;
|