🚀 Big News:Socket Has Acquired Secure Annex.Learn More
Socket
Book a DemoSign in
Socket

theaterjs

Package Overview
Dependencies
Maintainers
1
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

theaterjs - npm Package Compare versions

Comparing version
3.0.0
to
3.1.0
+5
-0
dist/theater.js

@@ -836,2 +836,7 @@ (function webpackUniversalModuleDefinition(root, factory) {

"ячсмитьбюъ"
],
"es": [
"qwertyuiop",
"asdfghjklñ",
"zxcvbnm"
]

@@ -838,0 +843,0 @@ };

+2
-2
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.theaterJS=t():e.theaterJS=t()}(this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var a=r[n]={exports:{},id:n,loaded:!1};return e[n].call(a.exports,a,a.exports,t),a.loaded=!0,a.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([/*!**************************!*\
!*** ./src/theaterJS.js ***!
\**************************/
function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function a(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function u(e){return Array.isArray(e)?e:Array.from(e)}function o(){function e(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],r=arguments.length<=2||void 0===arguments[2]?null:arguments[2],n=(0,s["default"])(e,t,r);return k.casting[n.name]=n,this}function t(e){return k.onStage=e,this}function r(){return k.casting[k.onStage]||null}function n(){function e(r){if(d["default"].isArray(r)&&r.forEach(function(t){e(t)}),d["default"].isString(r)){var n=r.split(":"),a=void 0;n.length>1&&"\\"!==n[0].charAt(n[0].length-1)&&(a=n.shift(),e({name:"erase",actor:a}));var u=n.join(":").replace(/\\:/g,":"),o={name:"type",args:[u]};null!=a&&(o.actor=a),e(o)}d["default"].isFunction(r)&&e({name:"callback",args:[r]}),d["default"].isNumber(r)&&e(r>0?{name:"wait",args:[r]}:{name:"erase",args:[r]}),d["default"].isObject(r)&&(d["default"].isArray(r.args)||(r.args=[]),r.args.unshift(function(){j(r.name+":end",r),c()}),t.push(r))}for(var t=[],r=arguments.length,n=Array(r),a=0;r>a;a++)n[a]=arguments[a];return e([{name:"publisher",args:["sequence:start"]}].concat(n).concat({name:"publisher",args:["sequence:end"]})),Array.prototype.push.apply(k.scenario,t),k.options.autoplay&&o(),this}function o(){return"stopping"===k.status&&(k.status="playing"),"ready"===k.status&&(k.status="playing",c()),this}function i(e){return("ready"===k.status||d["default"].isFunction(e))&&(k.currentScene=-1,"ready"===k.status?o():e()),this}function l(){return k.status="stopping",this}function c(){if("stopping"===k.status)return k.status="ready",this;if("playing"!==k.status)return this;if(k.currentScene+1>=k.scenario.length)return k.status="ready",j("scenario:end"),this;var e=k.scenario[++k.currentScene];if(0===k.currentScene&&j("scenario:start"),"publisher"===e.name){var r=u(e.args),n=r[0],o=r.slice(1);return j.apply(void 0,a(o)),n()}switch(e.actor&&t(e.actor),j(e.name+":start",e),e.name){case"type":p.apply(void 0,a(e.args));break;case"erase":h.apply(void 0,a(e.args));break;case"callback":b.apply(void 0,a(e.args));break;case"wait":x.apply(void 0,a(e.args));break;default:console.debug("No scene handler for "+e.name)}return this}function p(e,t){var n=r(),a=k.options.locale,u=k.options.minSpeed.type,o=k.options.maxSpeed.type,i=n.displayValue,s=-1,l=!1,f=null,c=null,d=m["default"].map(t);return t=m["default"].strip(t),function p(){var r=m["default"].strip(n.displayValue.substr(i.length));if(r===t)return e();var h=t.substr(0,s+1),v=r!==h,y=n.shouldBeMistaken(r,t,f,c),b=l||!y;if(v&&b)l=!0,f=null,n.displayValue=i+m["default"].inject(r.substr(0,r.length-1),d),s--,c=s;else{l=!1;var x=t.charAt(++s);y&&(x=g["default"].randomCharNear(x,a),null==f&&(f=s)),n.displayValue=i+m["default"].inject(r+x,d)}return setTimeout(p,n.getTypingSpeed(u,o))}(),this}function h(e,t){var n=r();if(null==n)return e();if(w.erase!==!0)return n.displayValue="",e();var a=k.options.minSpeed.erase,u=k.options.maxSpeed.erase,o=n.displayValue,i=m["default"].map(o);o=m["default"].strip(o);var s=o.length,l=void 0,f=0;return d["default"].isNumber(t)&&(t>0?l=t:f=o.length+t),function c(){return s===f?e():(n.displayValue=m["default"].inject(o.substr(0,--s),i),setTimeout(c,l||n.getTypingSpeed(a,u)))}(),this}function b(e,t){return t.call(this,e),this}function x(e,t){return setTimeout(e.bind(this),t),this}function S(e,t){return e.split(",").forEach(function(e){e=e.trim(),d["default"].isArray(k.events[e])||(k.events[e]=[]),k.events[e].push(t)}),this}function j(){for(var e=arguments.length,t=Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t[0],a=k.events[n]||[];return a.length>0&&a.concat(k.events["*"]||[]).forEach(function(e){return e.apply(void 0,t)}),this}var w=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(w=f["default"].merge({},y,w),d["default"].isNumber(w.minSpeed)){var A=w,_=A.minSpeed;w.minSpeed={erase:_,type:_}}if(d["default"].isNumber(w.maxSpeed)){var M=w,O=M.maxSpeed;w.maxSpeed={erase:O,type:O}}if("detect"===w.locale&&v){var N=v.languages;d["default"].isArray(N)&&d["default"].isString(N[0])&&(w.locale=N[0].substr(0,2))}g["default"].supports(w.locale)||(w.locale=g["default"].defaultLocale);var k={options:w,casting:{},status:"ready",onStage:null,currentScene:-1,scenario:[],events:{}};return t(null),Object.freeze(Object.defineProperties({addActor:e,getCurrentActor:r,addScene:n,play:o,replay:i,stop:l,on:S},{options:{get:function(){return k.options},configurable:!0,enumerable:!0},status:{get:function(){return k.status},configurable:!0,enumerable:!0}}))}Object.defineProperty(t,"__esModule",{value:!0});var i=r(3),s=n(i),l=r(2),f=n(l),c=r(1),d=n(c),p=r(5),g=n(p),h=r(4),m=n(h),v="undefined"!=typeof window&&window.navigator,y={autoplay:!0,erase:!0,minSpeed:{erase:80,type:80},maxSpeed:{erase:450,type:450},locale:"detect"};o.init=function(){var e=arguments.length<=0||void 0===arguments[0]?"actor":arguments[0],t=o();return t.addActor(e,{accuracy:1,speed:.8}),t},t["default"]=o,e.exports=t["default"]},/*!*****************************!*\
function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function a(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function u(e){return Array.isArray(e)?e:Array.from(e)}function o(){function e(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],r=arguments.length<=2||void 0===arguments[2]?null:arguments[2],n=(0,s["default"])(e,t,r);return N.casting[n.name]=n,this}function t(e){return N.onStage=e,this}function r(){return N.casting[N.onStage]||null}function n(){function e(r){if(d["default"].isArray(r)&&r.forEach(function(t){e(t)}),d["default"].isString(r)){var n=r.split(":"),a=void 0;n.length>1&&"\\"!==n[0].charAt(n[0].length-1)&&(a=n.shift(),e({name:"erase",actor:a}));var u=n.join(":").replace(/\\:/g,":"),o={name:"type",args:[u]};null!=a&&(o.actor=a),e(o)}d["default"].isFunction(r)&&e({name:"callback",args:[r]}),d["default"].isNumber(r)&&e(r>0?{name:"wait",args:[r]}:{name:"erase",args:[r]}),d["default"].isObject(r)&&(d["default"].isArray(r.args)||(r.args=[]),r.args.unshift(function(){j(r.name+":end",r),c()}),t.push(r))}for(var t=[],r=arguments.length,n=Array(r),a=0;r>a;a++)n[a]=arguments[a];return e([{name:"publisher",args:["sequence:start"]}].concat(n).concat({name:"publisher",args:["sequence:end"]})),Array.prototype.push.apply(N.scenario,t),N.options.autoplay&&o(),this}function o(){return"stopping"===N.status&&(N.status="playing"),"ready"===N.status&&(N.status="playing",c()),this}function i(e){return("ready"===N.status||d["default"].isFunction(e))&&(N.currentScene=-1,"ready"===N.status?o():e()),this}function l(){return N.status="stopping",this}function c(){if("stopping"===N.status)return N.status="ready",this;if("playing"!==N.status)return this;if(N.currentScene+1>=N.scenario.length)return N.status="ready",j("scenario:end"),this;var e=N.scenario[++N.currentScene];if(0===N.currentScene&&j("scenario:start"),"publisher"===e.name){var r=u(e.args),n=r[0],o=r.slice(1);return j.apply(void 0,a(o)),n()}switch(e.actor&&t(e.actor),j(e.name+":start",e),e.name){case"type":p.apply(void 0,a(e.args));break;case"erase":h.apply(void 0,a(e.args));break;case"callback":b.apply(void 0,a(e.args));break;case"wait":x.apply(void 0,a(e.args));break;default:console.debug("No scene handler for "+e.name)}return this}function p(e,t){var n=r(),a=N.options.locale,u=N.options.minSpeed.type,o=N.options.maxSpeed.type,i=n.displayValue,s=-1,l=!1,f=null,c=null,d=m["default"].map(t);return t=m["default"].strip(t),function p(){var r=m["default"].strip(n.displayValue.substr(i.length));if(r===t)return e();var h=t.substr(0,s+1),v=r!==h,y=n.shouldBeMistaken(r,t,f,c),b=l||!y;if(v&&b)l=!0,f=null,n.displayValue=i+m["default"].inject(r.substr(0,r.length-1),d),s--,c=s;else{l=!1;var x=t.charAt(++s);y&&(x=g["default"].randomCharNear(x,a),null==f&&(f=s)),n.displayValue=i+m["default"].inject(r+x,d)}return setTimeout(p,n.getTypingSpeed(u,o))}(),this}function h(e,t){var n=r();if(null==n)return e();if(w.erase!==!0)return n.displayValue="",e();var a=N.options.minSpeed.erase,u=N.options.maxSpeed.erase,o=n.displayValue,i=m["default"].map(o);o=m["default"].strip(o);var s=o.length,l=void 0,f=0;return d["default"].isNumber(t)&&(t>0?l=t:f=o.length+t),function c(){return s===f?e():(n.displayValue=m["default"].inject(o.substr(0,--s),i),setTimeout(c,l||n.getTypingSpeed(a,u)))}(),this}function b(e,t){return t.call(this,e),this}function x(e,t){return setTimeout(e.bind(this),t),this}function S(e,t){return e.split(",").forEach(function(e){e=e.trim(),d["default"].isArray(N.events[e])||(N.events[e]=[]),N.events[e].push(t)}),this}function j(){for(var e=arguments.length,t=Array(e),r=0;e>r;r++)t[r]=arguments[r];var n=t[0],a=N.events[n]||[];return a.length>0&&a.concat(N.events["*"]||[]).forEach(function(e){return e.apply(void 0,t)}),this}var w=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(w=f["default"].merge({},y,w),d["default"].isNumber(w.minSpeed)){var A=w,_=A.minSpeed;w.minSpeed={erase:_,type:_}}if(d["default"].isNumber(w.maxSpeed)){var M=w,O=M.maxSpeed;w.maxSpeed={erase:O,type:O}}if("detect"===w.locale&&v){var k=v.languages;d["default"].isArray(k)&&d["default"].isString(k[0])&&(w.locale=k[0].substr(0,2))}g["default"].supports(w.locale)||(w.locale=g["default"].defaultLocale);var N={options:w,casting:{},status:"ready",onStage:null,currentScene:-1,scenario:[],events:{}};return t(null),Object.freeze(Object.defineProperties({addActor:e,getCurrentActor:r,addScene:n,play:o,replay:i,stop:l,on:S},{options:{get:function(){return N.options},configurable:!0,enumerable:!0},status:{get:function(){return N.status},configurable:!0,enumerable:!0}}))}Object.defineProperty(t,"__esModule",{value:!0});var i=r(3),s=n(i),l=r(2),f=n(l),c=r(1),d=n(c),p=r(5),g=n(p),h=r(4),m=n(h),v="undefined"!=typeof window&&window.navigator,y={autoplay:!0,erase:!0,minSpeed:{erase:80,type:80},maxSpeed:{erase:450,type:450},locale:"detect"};o.init=function(){var e=arguments.length<=0||void 0===arguments[0]?"actor":arguments[0],t=o();return t.addActor(e,{accuracy:1,speed:.8}),t},t["default"]=o,e.exports=t["default"]},/*!*****************************!*\
!*** ./src/helpers/type.js ***!

@@ -22,3 +22,3 @@ \*****************************/

\****************************/
function(e,t){e.exports={en:["qwertyuiop","asdfghjkl","zxcvbnm"],fr:["azertyuiop","qsdfghjklm","wxcvbn"],da:["qwertyuiopå","asdfghjklæø","zxcvbnm"],de:["qwertzuiopü","asdfghjklöä","yxcvbnm"],pl:["qwertyuiopęó","asdfghjkląśł","zxcvbnmżźćń"],pt:["qwertyuiop","asdfghjklç","zxcvbnm"],ru:["йцукенгшщзх","фывапролджэ","ячсмитьбюъ"]}},/*!********************************!*\
function(e,t){e.exports={en:["qwertyuiop","asdfghjkl","zxcvbnm"],fr:["azertyuiop","qsdfghjklm","wxcvbn"],da:["qwertyuiopå","asdfghjklæø","zxcvbnm"],de:["qwertzuiopü","asdfghjklöä","yxcvbnm"],pl:["qwertyuiopęó","asdfghjkląśł","zxcvbnmżźćń"],pt:["qwertyuiop","asdfghjklç","zxcvbnm"],ru:["йцукенгшщзх","фывапролджэ","ячсмитьбюъ"],es:["qwertyuiop","asdfghjklñ","zxcvbnm"]}},/*!********************************!*\
!*** ./src/void-elements.json ***!

@@ -25,0 +25,0 @@ \********************************/

@@ -1,1 +0,1 @@

{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///theater.min.js","webpack:///webpack/bootstrap a4a70b5910d15f3adf11","webpack:///./src/theaterJS.js","webpack:///./src/helpers/type.js","webpack:///./src/helpers/utils.js","webpack:///./src/actor.js","webpack:///./src/helpers/html.js","webpack:///./src/helpers/keyboard.js","webpack:///./src/keyboards.json","webpack:///./src/void-elements.json"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_toArray","theaterJS","addActor","actorName","options","arguments","undefined","callback","a","_actor2","props","casting","name","setCurrentActor","onStage","getCurrentActor","addScene","addSceneToSequence","scene","_helpersType2","forEach","s","isString","partials","split","charAt","shift","actor","speech","join","replace","sceneObj","args","isFunction","isNumber","isObject","unshift","publish","playNextScene","sequence","push","_len","scenes","_key","concat","prototype","apply","scenario","autoplay","play","status","replay","done","currentScene","stop","nextScene","_nextScene$args","slice","typeAction","eraseAction","callbackAction","waitAction","console","debug","value","locale","minSpeed","type","maxSpeed","initialValue","displayValue","cursor","isFixing","previousMistakeCursor","previousFixCursor","htmlMap","_helpersHtml2","map","strip","actual","substr","expected","isMistaking","shouldBeMistaken","shouldFix","inject","nextChar","_helpersKeyboard2","randomCharNear","setTimeout","getTypingSpeed","arg","erase","speed","nbCharactersToErase","delay","bind","subscribe","events","eventName","trim","_len2","_key2","callbacks","_helpersUtils2","merge","DEFAULTS","_options","_options2","NAVIGATOR","languages","supports","defaultLocale","Object","freeze","defineProperties","on","get","configurable","enumerable","defineProperty","_actor","_helpersUtils","_helpersType","_helpersKeyboard","_helpersHtml","window","navigator","init","theater","accuracy","toString","o","dst","objs","len","key","hasOwnProperty","random","min","max","Math","floor","randomFloat","getPercentageOf","percentage","DOCUMENT","document","$element","selector","$e","querySelector","Error","newValue","innerHTML","log","fastest","slowest","endValue","nbOfCharactersTyped","maxWrongCharactersAllowed","minCharactersBetweenMistakes","set","isVoidElement","tag","tagName","match","Boolean","_voidElementsJson2","indexOf","toLowerCase","_voidElementsJson","str","regexp","tags","openers","result","exec","position","index","opener","pop","mapKeyboard","alphabet","keyboard","y","lines","chars","x","charsLength","_type","_type2","_utils","_utils2","_keyboardsJson","_keyboardsJson2","DEFAULT_LOCALE","list","mapped","ch","threshold","nearbyChars","uppercase","test","charPosition","abs","randomChar","toUpperCase","en","fr","da","de","pl","pt","ru"],"mappings":"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","file":"theater.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"theaterJS\"] = factory();\n\telse\n\t\troot[\"theaterJS\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"theaterJS\"] = factory();\n\telse\n\t\troot[\"theaterJS\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/*!**************************!*\\\n !*** ./src/theaterJS.js ***!\n \\**************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }\n\t\n\tfunction _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }\n\t\n\tvar _actor = __webpack_require__(/*! ./actor */ 3);\n\t\n\tvar _actor2 = _interopRequireDefault(_actor);\n\t\n\tvar _helpersUtils = __webpack_require__(/*! ./helpers/utils */ 2);\n\t\n\tvar _helpersUtils2 = _interopRequireDefault(_helpersUtils);\n\t\n\tvar _helpersType = __webpack_require__(/*! ./helpers/type */ 1);\n\t\n\tvar _helpersType2 = _interopRequireDefault(_helpersType);\n\t\n\tvar _helpersKeyboard = __webpack_require__(/*! ./helpers/keyboard */ 5);\n\t\n\tvar _helpersKeyboard2 = _interopRequireDefault(_helpersKeyboard);\n\t\n\tvar _helpersHtml = __webpack_require__(/*! ./helpers/html */ 4);\n\t\n\tvar _helpersHtml2 = _interopRequireDefault(_helpersHtml);\n\t\n\tvar NAVIGATOR = typeof window !== 'undefined' && window.navigator;\n\tvar DEFAULTS = {\n\t autoplay: true,\n\t erase: true,\n\t minSpeed: { erase: 80, type: 80 },\n\t maxSpeed: { erase: 450, type: 450 },\n\t locale: 'detect'\n\t};\n\t\n\tfunction theaterJS() {\n\t var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\t\n\t /* ------------------------------------------------- *\\\n\t init\n\t \\* ------------------------------------------------- */\n\t\n\t options = _helpersUtils2['default'].merge({}, DEFAULTS, options);\n\t\n\t if (_helpersType2['default'].isNumber(options.minSpeed)) {\n\t var _options = options;\n\t var minSpeed = _options.minSpeed;\n\t\n\t options.minSpeed = { erase: minSpeed, type: minSpeed };\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(options.maxSpeed)) {\n\t var _options2 = options;\n\t var maxSpeed = _options2.maxSpeed;\n\t\n\t options.maxSpeed = { erase: maxSpeed, type: maxSpeed };\n\t }\n\t\n\t if (options.locale === 'detect' && NAVIGATOR) {\n\t var languages = NAVIGATOR.languages;\n\t if (_helpersType2['default'].isArray(languages) && _helpersType2['default'].isString(languages[0])) {\n\t options.locale = languages[0].substr(0, 2);\n\t }\n\t }\n\t\n\t if (!_helpersKeyboard2['default'].supports(options.locale)) {\n\t options.locale = _helpersKeyboard2['default'].defaultLocale;\n\t }\n\t\n\t var props = { options: options, casting: {}, status: 'ready', onStage: null, currentScene: -1, scenario: [], events: {} };\n\t setCurrentActor(null);\n\t\n\t /* ------------------------------------------------- *\\\n\t methods\n\t \\* ------------------------------------------------- */\n\t\n\t function addActor(actorName) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var callback = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t\n\t var a = (0, _actor2['default'])(actorName, options, callback);\n\t props.casting[a.name] = a;\n\t\n\t return this;\n\t }\n\t\n\t function setCurrentActor(actorName) {\n\t props.onStage = actorName;\n\t return this;\n\t }\n\t\n\t function getCurrentActor() {\n\t return props.casting[props.onStage] || null;\n\t }\n\t\n\t function addScene() {\n\t var sequence = [];\n\t\n\t function addSceneToSequence(scene) {\n\t if (_helpersType2['default'].isArray(scene)) {\n\t scene.forEach(function (s) {\n\t addSceneToSequence(s);\n\t });\n\t }\n\t\n\t if (_helpersType2['default'].isString(scene)) {\n\t var partials = scene.split(':');\n\t\n\t var actorName = undefined;\n\t if (partials.length > 1 && partials[0].charAt(partials[0].length - 1) !== '\\\\') {\n\t actorName = partials.shift();\n\t\n\t addSceneToSequence({ name: 'erase', actor: actorName });\n\t }\n\t\n\t var speech = partials.join(':').replace(/\\\\:/g, ':');\n\t var sceneObj = { name: 'type', args: [speech] };\n\t\n\t if (actorName != null) {\n\t sceneObj.actor = actorName;\n\t }\n\t\n\t addSceneToSequence(sceneObj);\n\t }\n\t\n\t if (_helpersType2['default'].isFunction(scene)) {\n\t addSceneToSequence({ name: 'callback', args: [scene] });\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(scene)) {\n\t if (scene > 0) {\n\t addSceneToSequence({ name: 'wait', args: [scene] });\n\t } else {\n\t addSceneToSequence({ name: 'erase', args: [scene] });\n\t }\n\t }\n\t\n\t if (_helpersType2['default'].isObject(scene)) {\n\t if (!_helpersType2['default'].isArray(scene.args)) {\n\t scene.args = [];\n\t }\n\t\n\t scene.args.unshift(function () {\n\t publish(scene.name + ':end', scene);\n\t playNextScene();\n\t });\n\t\n\t sequence.push(scene);\n\t }\n\t }\n\t\n\t for (var _len = arguments.length, scenes = Array(_len), _key = 0; _key < _len; _key++) {\n\t scenes[_key] = arguments[_key];\n\t }\n\t\n\t addSceneToSequence([{ name: 'publisher', args: ['sequence:start'] }].concat(scenes).concat({ name: 'publisher', args: ['sequence:end'] }));\n\t Array.prototype.push.apply(props.scenario, sequence);\n\t\n\t if (props.options.autoplay) {\n\t play();\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function play() {\n\t if (props.status === 'stopping') {\n\t props.status = 'playing';\n\t }\n\t\n\t if (props.status === 'ready') {\n\t props.status = 'playing';\n\t playNextScene();\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function replay(done) {\n\t if (props.status === 'ready' || _helpersType2['default'].isFunction(done)) {\n\t props.currentScene = -1;\n\t\n\t if (props.status === 'ready') play();else done();\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function stop() {\n\t props.status = 'stopping';\n\t return this;\n\t }\n\t\n\t function playNextScene() {\n\t if (props.status === 'stopping') {\n\t props.status = 'ready';\n\t return this;\n\t }\n\t\n\t if (props.status !== 'playing') return this;\n\t\n\t if (props.currentScene + 1 >= props.scenario.length) {\n\t props.status = 'ready';\n\t publish('scenario:end');\n\t return this;\n\t }\n\t\n\t var nextScene = props.scenario[++props.currentScene];\n\t\n\t if (props.currentScene === 0) {\n\t publish('scenario:start');\n\t }\n\t\n\t if (nextScene.name === 'publisher') {\n\t var _nextScene$args = _toArray(nextScene.args);\n\t\n\t var done = _nextScene$args[0];\n\t\n\t var args = _nextScene$args.slice(1);\n\t\n\t publish.apply(undefined, _toConsumableArray(args));\n\t\n\t return done();\n\t }\n\t\n\t if (nextScene.actor) {\n\t setCurrentActor(nextScene.actor);\n\t }\n\t\n\t publish(nextScene.name + ':start', nextScene);\n\t\n\t switch (nextScene.name) {\n\t case 'type':\n\t typeAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t case 'erase':\n\t eraseAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t case 'callback':\n\t callbackAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t case 'wait':\n\t waitAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t default:\n\t console.debug('No scene handler for ' + nextScene.name);\n\t break;\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function typeAction(done, value) {\n\t var actor = getCurrentActor();\n\t\n\t var locale = props.options.locale;\n\t var minSpeed = props.options.minSpeed.type;\n\t var maxSpeed = props.options.maxSpeed.type;\n\t var initialValue = actor.displayValue;\n\t var cursor = -1;\n\t var isFixing = false;\n\t var previousMistakeCursor = null;\n\t var previousFixCursor = null;\n\t\n\t var htmlMap = _helpersHtml2['default'].map(value);\n\t value = _helpersHtml2['default'].strip(value);(function type() {\n\t var actual = _helpersHtml2['default'].strip(actor.displayValue.substr(initialValue.length));\n\t\n\t if (actual === value) return done();\n\t\n\t var expected = value.substr(0, cursor + 1);\n\t\n\t var isMistaking = actual !== expected;\n\t var shouldBeMistaken = actor.shouldBeMistaken(actual, value, previousMistakeCursor, previousFixCursor);\n\t var shouldFix = isFixing || !shouldBeMistaken;\n\t\n\t if (isMistaking && shouldFix) {\n\t isFixing = true;\n\t previousMistakeCursor = null;\n\t actor.displayValue = initialValue + _helpersHtml2['default'].inject(actual.substr(0, actual.length - 1), htmlMap);\n\t cursor--;\n\t previousFixCursor = cursor;\n\t } else {\n\t isFixing = false;\n\t var nextChar = value.charAt(++cursor);\n\t\n\t if (shouldBeMistaken) {\n\t nextChar = _helpersKeyboard2['default'].randomCharNear(nextChar, locale);\n\t\n\t if (previousMistakeCursor == null) {\n\t previousMistakeCursor = cursor;\n\t }\n\t }\n\t\n\t actor.displayValue = initialValue + _helpersHtml2['default'].inject(actual + nextChar, htmlMap);\n\t }\n\t\n\t return setTimeout(type, actor.getTypingSpeed(minSpeed, maxSpeed));\n\t })();\n\t\n\t return this;\n\t }\n\t\n\t function eraseAction(done, arg) {\n\t var actor = getCurrentActor();\n\t\n\t // erase scenes are added before a type scene\n\t // so for the first scene, there's no actor yet\n\t if (actor == null) {\n\t return done();\n\t }\n\t\n\t if (options.erase !== true) {\n\t actor.displayValue = '';\n\t return done();\n\t }\n\t\n\t var minSpeed = props.options.minSpeed.erase;\n\t var maxSpeed = props.options.maxSpeed.erase;\n\t\n\t var value = actor.displayValue;\n\t var htmlMap = _helpersHtml2['default'].map(value);\n\t\n\t value = _helpersHtml2['default'].strip(value);\n\t\n\t var cursor = value.length;\n\t\n\t var speed = undefined;\n\t var nbCharactersToErase = 0;\n\t\n\t if (_helpersType2['default'].isNumber(arg)) {\n\t if (arg > 0) speed = arg;else nbCharactersToErase = value.length + arg;\n\t }\n\t\n\t (function erase() {\n\t if (cursor === nbCharactersToErase) return done();\n\t actor.displayValue = _helpersHtml2['default'].inject(value.substr(0, --cursor), htmlMap);\n\t\n\t return setTimeout(erase, speed || actor.getTypingSpeed(minSpeed, maxSpeed));\n\t })();\n\t\n\t return this;\n\t }\n\t\n\t function callbackAction(done, callback) {\n\t callback.call(this, done);\n\t return this;\n\t }\n\t\n\t function waitAction(done, delay) {\n\t setTimeout(done.bind(this), delay);\n\t return this;\n\t }\n\t\n\t function subscribe(events, callback) {\n\t events.split(',').forEach(function (eventName) {\n\t eventName = eventName.trim();\n\t\n\t if (!_helpersType2['default'].isArray(props.events[eventName])) {\n\t props.events[eventName] = [];\n\t }\n\t\n\t props.events[eventName].push(callback);\n\t });\n\t\n\t return this;\n\t }\n\t\n\t function publish() {\n\t for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t args[_key2] = arguments[_key2];\n\t }\n\t\n\t var eventName = args[0];\n\t var callbacks = props.events[eventName] || [];\n\t\n\t if (callbacks.length > 0) {\n\t callbacks.concat(props.events['*'] || []).forEach(function (callback) {\n\t return callback.apply(undefined, args);\n\t });\n\t }\n\t\n\t return this;\n\t }\n\t\n\t /* ------------------------------------------------- *\\\n\t public api\n\t \\* ------------------------------------------------- */\n\t\n\t return Object.freeze(Object.defineProperties({\n\t addActor: addActor,\n\t getCurrentActor: getCurrentActor,\n\t addScene: addScene,\n\t play: play,\n\t replay: replay,\n\t stop: stop,\n\t on: subscribe\n\t }, {\n\t options: {\n\t get: function get() {\n\t return props.options;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t },\n\t status: {\n\t get: function get() {\n\t return props.status;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t }\n\t }));\n\t}\n\t\n\ttheaterJS.init = function () {\n\t var actorName = arguments.length <= 0 || arguments[0] === undefined ? 'actor' : arguments[0];\n\t\n\t var theater = theaterJS();\n\t theater.addActor(actorName, { accuracy: 1, speed: 0.8 });\n\t return theater;\n\t};\n\t\n\texports['default'] = theaterJS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/*!*****************************!*\\\n !*** ./src/helpers/type.js ***!\n \\*****************************/\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\tfunction toString(o) {\n\t return ({}).toString.call(o);\n\t}\n\t\n\texports['default'] = {\n\t isNumber: function isNumber(o) {\n\t return typeof o === 'number';\n\t },\n\t\n\t isString: function isString(o) {\n\t return toString(o) === '[object String]';\n\t },\n\t\n\t isObject: function isObject(o) {\n\t return toString(o) === '[object Object]';\n\t },\n\t\n\t isArray: function isArray(o) {\n\t return toString(o) === '[object Array]';\n\t },\n\t\n\t isFunction: function isFunction(o) {\n\t return typeof o === 'function';\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/*!******************************!*\\\n !*** ./src/helpers/utils.js ***!\n \\******************************/\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports[\"default\"] = {\n\t merge: function merge(dst) {\n\t var objs = [].slice.call(arguments, 1);\n\t\n\t for (var i = 0, len = objs.length; i < len; i++) {\n\t var obj = objs[i];\n\t\n\t for (var key in obj) {\n\t if (!obj.hasOwnProperty(key)) continue;\n\t dst[key] = obj[key];\n\t }\n\t }\n\t\n\t return dst;\n\t },\n\t\n\t random: function random(min, max) {\n\t return Math.floor(Math.random() * (max - min + 1)) + min;\n\t },\n\t\n\t randomFloat: function randomFloat(min, max) {\n\t return Math.random() * (max - min) + min;\n\t },\n\t\n\t getPercentageOf: function getPercentageOf(min, max, percentage) {\n\t return min - min * percentage + max * percentage;\n\t }\n\t};\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 3 */\n/*!**********************!*\\\n !*** ./src/actor.js ***!\n \\**********************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _helpersType = __webpack_require__(/*! ./helpers/type */ 1);\n\t\n\tvar _helpersType2 = _interopRequireDefault(_helpersType);\n\t\n\tvar _helpersUtils = __webpack_require__(/*! ./helpers/utils */ 2);\n\t\n\tvar _helpersUtils2 = _interopRequireDefault(_helpersUtils);\n\t\n\tvar DOCUMENT = typeof window !== 'undefined' && window.document;\n\tvar DEFAULTS = { speed: 0.6, accuracy: 0.6 };\n\t\n\texports['default'] = function (actorName) {\n\t var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var callback = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t\n\t var displayValue = '';\n\t var $element = undefined;\n\t\n\t if (_helpersType2['default'].isNumber(props)) {\n\t props = { speed: props, accuracy: props };\n\t }\n\t\n\t props = _helpersUtils2['default'].merge({}, DEFAULTS, props);\n\t\n\t if (DOCUMENT) {\n\t if (callback == null) {\n\t callback = '#' + actorName;\n\t }\n\t\n\t if (_helpersType2['default'].isString(callback)) {\n\t var selector = callback;\n\t var $e = DOCUMENT.querySelector(selector);\n\t\n\t if ($e != null) {\n\t $element = $e;\n\t callback = function (newValue) {\n\t $element.innerHTML = newValue;\n\t };\n\t } else {\n\t throw new Error('no matches for ' + actorName + '\\'s selector: ' + selector);\n\t }\n\t }\n\t }\n\t\n\t if (!_helpersType2['default'].isFunction(callback)) {\n\t callback = console.log.bind(console);\n\t }\n\t\n\t return Object.defineProperties({\n\t $element: $element,\n\t\n\t getTypingSpeed: function getTypingSpeed(fastest, slowest) {\n\t var speed = _helpersUtils2['default'].randomFloat(props.speed, 1);\n\t return _helpersUtils2['default'].getPercentageOf(slowest, fastest, speed);\n\t },\n\t\n\t shouldBeMistaken: function shouldBeMistaken(actual, endValue) {\n\t var previousMistakeCursor = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t var previousFixCursor = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];\n\t\n\t var accuracy = props.accuracy * 10;\n\t\n\t if (accuracy >= 8) {\n\t return false;\n\t }\n\t\n\t if (actual.length <= accuracy) {\n\t return false;\n\t }\n\t\n\t if (actual.length === endValue.length) {\n\t return false;\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(previousMistakeCursor)) {\n\t var nbOfCharactersTyped = actual.length - previousMistakeCursor;\n\t var maxWrongCharactersAllowed = accuracy >= 6 ? 10 - accuracy : 4;\n\t\n\t if (nbOfCharactersTyped >= maxWrongCharactersAllowed) {\n\t return false;\n\t }\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(previousFixCursor)) {\n\t var nbOfCharactersTyped = actual.length - previousFixCursor;\n\t var minCharactersBetweenMistakes = Math.max(accuracy, 2) * 2;\n\t\n\t if (nbOfCharactersTyped <= minCharactersBetweenMistakes) {\n\t return false;\n\t }\n\t }\n\t\n\t return _helpersUtils2['default'].randomFloat(0, 0.8) > props.accuracy;\n\t }\n\t }, {\n\t displayValue: {\n\t get: function get() {\n\t return displayValue;\n\t },\n\t set: function set(value) {\n\t displayValue = value;\n\t callback(value);\n\t },\n\t configurable: true,\n\t enumerable: true\n\t },\n\t name: {\n\t get: function get() {\n\t return actorName;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/*!*****************************!*\\\n !*** ./src/helpers/html.js ***!\n \\*****************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _voidElementsJson = __webpack_require__(/*! ../void-elements.json */ 7);\n\t\n\tvar _voidElementsJson2 = _interopRequireDefault(_voidElementsJson);\n\t\n\tfunction isVoidElement(tag) {\n\t var tagName = tag.match(/<([^\\s>]+)/);\n\t return Boolean(tagName) && _voidElementsJson2['default'].indexOf(tagName[1].toLowerCase()) > -1;\n\t}\n\t\n\texports['default'] = {\n\t strip: function strip(str) {\n\t return str.replace(/(<([^>]+)>)/gi, '');\n\t },\n\t\n\t map: function map(str) {\n\t var regexp = /<[^>]+>/gi;\n\t var tags = [];\n\t var openers = [];\n\t var result = undefined;\n\t var tag = undefined;\n\t\n\t while (result = regexp.exec(str)) {\n\t tag = {\n\t tagName: result[0],\n\t position: result.index\n\t };\n\t\n\t if (tag.tagName.charAt(1) === '/') {\n\t tag.opener = openers.pop();\n\t } else if (tag.tagName.charAt(tag.tagName.length - 2) !== '/' && !isVoidElement(tag.tagName)) {\n\t openers.push(tag);\n\t }\n\t\n\t tags.push(tag);\n\t }\n\t\n\t return tags;\n\t },\n\t\n\t inject: function inject(str, map) {\n\t for (var i = 0, tag = undefined; i < map.length; i++) {\n\t tag = map[i];\n\t\n\t if (str.length > 0 && tag.position <= str.length) {\n\t str = str.substr(0, tag.position) + tag.tagName + str.substr(tag.position);\n\t } else if (tag.opener && tag.opener.position < str.length) {\n\t str += tag.tagName;\n\t }\n\t }\n\t\n\t return str;\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/*!*********************************!*\\\n !*** ./src/helpers/keyboard.js ***!\n \\*********************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _type = __webpack_require__(/*! ./type */ 1);\n\t\n\tvar _type2 = _interopRequireDefault(_type);\n\t\n\tvar _utils = __webpack_require__(/*! ./utils */ 2);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _keyboardsJson = __webpack_require__(/*! ../keyboards.json */ 6);\n\t\n\tvar _keyboardsJson2 = _interopRequireDefault(_keyboardsJson);\n\t\n\tvar DEFAULT_LOCALE = 'en';\n\t\n\tfor (var locale in _keyboardsJson2['default']) {\n\t if (!_keyboardsJson2['default'].hasOwnProperty(locale)) continue;\n\t\n\t var keyboard = _keyboardsJson2['default'][locale];\n\t _keyboardsJson2['default'][locale] = { list: keyboard, mapped: mapKeyboard(keyboard) };\n\t}\n\t\n\tfunction mapKeyboard(alphabet) {\n\t var keyboard = {};\n\t\n\t for (var y = 0, lines = alphabet.length, chars = undefined; y < lines; y++) {\n\t chars = alphabet[y];\n\t\n\t for (var x = 0, charsLength = chars.length; x < charsLength; x++) {\n\t keyboard[chars[x]] = { x: x, y: y };\n\t }\n\t }\n\t\n\t return keyboard;\n\t}\n\t\n\texports['default'] = {\n\t defaultLocale: DEFAULT_LOCALE,\n\t\n\t supports: function supports(locale) {\n\t return _type2['default'].isObject(_keyboardsJson2['default'][locale]);\n\t },\n\t\n\t randomCharNear: function randomCharNear(ch, locale) {\n\t if (!this.supports(locale)) {\n\t throw new Error('locale \"' + locale + '\" is not supported');\n\t }\n\t\n\t var keyboard = _keyboardsJson2['default'][locale].mapped;\n\t var threshold = 1;\n\t var nearbyChars = [];\n\t var uppercase = /[A-Z]/.test(ch);\n\t\n\t ch = ch.toLowerCase();\n\t\n\t var charPosition = keyboard[ch] || [];\n\t var p = undefined;\n\t\n\t for (var c in keyboard) {\n\t if (!keyboard.hasOwnProperty(c) || c === ch) continue;\n\t\n\t p = keyboard[c];\n\t\n\t if (Math.abs(charPosition.x - p.x) <= threshold && Math.abs(charPosition.y - p.y) <= threshold) {\n\t nearbyChars.push(c);\n\t }\n\t }\n\t\n\t var randomChar = nearbyChars.length > 0 ? nearbyChars[_utils2['default'].random(0, nearbyChars.length - 1)] : this.randomChar(locale);\n\t\n\t if (uppercase) {\n\t randomChar = randomChar.toUpperCase();\n\t }\n\t\n\t return randomChar;\n\t },\n\t\n\t randomChar: function randomChar(locale) {\n\t if (!this.supports(locale)) {\n\t throw new Error('locale \"' + locale + '\" is not supported');\n\t }\n\t\n\t var chars = _keyboardsJson2['default'][locale].list.join('');\n\t return chars.charAt(_utils2['default'].random(0, chars.length - 1));\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 6 */\n/*!****************************!*\\\n !*** ./src/keyboards.json ***!\n \\****************************/\n/***/ function(module, exports) {\n\n\tmodule.exports = {\n\t\t\"en\": [\n\t\t\t\"qwertyuiop\",\n\t\t\t\"asdfghjkl\",\n\t\t\t\"zxcvbnm\"\n\t\t],\n\t\t\"fr\": [\n\t\t\t\"azertyuiop\",\n\t\t\t\"qsdfghjklm\",\n\t\t\t\"wxcvbn\"\n\t\t],\n\t\t\"da\": [\n\t\t\t\"qwertyuiopå\",\n\t\t\t\"asdfghjklæø\",\n\t\t\t\"zxcvbnm\"\n\t\t],\n\t\t\"de\": [\n\t\t\t\"qwertzuiopü\",\n\t\t\t\"asdfghjklöä\",\n\t\t\t\"yxcvbnm\"\n\t\t],\n\t\t\"pl\": [\n\t\t\t\"qwertyuiopęó\",\n\t\t\t\"asdfghjkląśł\",\n\t\t\t\"zxcvbnmżźćń\"\n\t\t],\n\t\t\"pt\": [\n\t\t\t\"qwertyuiop\",\n\t\t\t\"asdfghjklç\",\n\t\t\t\"zxcvbnm\"\n\t\t],\n\t\t\"ru\": [\n\t\t\t\"йцукенгшщзх\",\n\t\t\t\"фывапролджэ\",\n\t\t\t\"ячсмитьбюъ\"\n\t\t]\n\t};\n\n/***/ },\n/* 7 */\n/*!********************************!*\\\n !*** ./src/void-elements.json ***!\n \\********************************/\n/***/ function(module, exports) {\n\n\tmodule.exports = [\n\t\t\"area\",\n\t\t\"base\",\n\t\t\"br\",\n\t\t\"col\",\n\t\t\"embed\",\n\t\t\"hr\",\n\t\t\"img\",\n\t\t\"input\",\n\t\t\"keygen\",\n\t\t\"link\",\n\t\t\"menuitem\",\n\t\t\"meta\",\n\t\t\"param\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t\"wbr\"\n\t];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** theater.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap a4a70b5910d15f3adf11\n **/","import actor from './actor'\nimport utils from './helpers/utils'\nimport type from './helpers/type'\nimport keyboard from './helpers/keyboard'\nimport html from './helpers/html'\n\nconst NAVIGATOR = typeof window !== 'undefined' && window.navigator\nconst DEFAULTS = {\n autoplay: true,\n erase: true,\n minSpeed: { erase: 80, type: 80 },\n maxSpeed: { erase: 450, type: 450 },\n locale: 'detect'\n}\n\nfunction theaterJS (options = {}) {\n /* ------------------------------------------------- *\\\n init\n \\* ------------------------------------------------- */\n\n options = utils.merge({}, DEFAULTS, options)\n\n if (type.isNumber(options.minSpeed)) {\n const { minSpeed } = options\n options.minSpeed = { erase: minSpeed, type: minSpeed }\n }\n\n if (type.isNumber(options.maxSpeed)) {\n const { maxSpeed } = options\n options.maxSpeed = { erase: maxSpeed, type: maxSpeed }\n }\n\n if (options.locale === 'detect' && NAVIGATOR) {\n let languages = NAVIGATOR.languages\n if (type.isArray(languages) && type.isString(languages[0])) {\n options.locale = languages[0].substr(0, 2)\n }\n }\n\n if (!keyboard.supports(options.locale)) {\n options.locale = keyboard.defaultLocale\n }\n\n let props = { options, casting: {}, status: 'ready', onStage: null, currentScene: -1, scenario: [], events: {} }\n setCurrentActor(null)\n\n /* ------------------------------------------------- *\\\n methods\n \\* ------------------------------------------------- */\n\n function addActor (actorName, options = {}, callback = null) {\n let a = actor(actorName, options, callback)\n props.casting[a.name] = a\n\n return this\n }\n\n function setCurrentActor (actorName) {\n props.onStage = actorName\n return this\n }\n\n function getCurrentActor () {\n return props.casting[props.onStage] || null\n }\n\n function addScene (...scenes) {\n const sequence = []\n\n function addSceneToSequence (scene) {\n if (type.isArray(scene)) {\n scene.forEach(function (s) { addSceneToSequence(s) })\n }\n\n if (type.isString(scene)) {\n let partials = scene.split(':')\n\n let actorName\n if (partials.length > 1 && partials[0].charAt(partials[0].length - 1) !== '\\\\') {\n actorName = partials.shift()\n\n addSceneToSequence({ name: 'erase', actor: actorName })\n }\n\n let speech = partials.join(':').replace(/\\\\:/g, ':')\n let sceneObj = { name: 'type', args: [speech] }\n\n if (actorName != null) {\n sceneObj.actor = actorName\n }\n\n addSceneToSequence(sceneObj)\n }\n\n if (type.isFunction(scene)) {\n addSceneToSequence({ name: 'callback', args: [scene] })\n }\n\n if (type.isNumber(scene)) {\n if (scene > 0) {\n addSceneToSequence({ name: 'wait', args: [scene] })\n } else {\n addSceneToSequence({ name: 'erase', args: [scene] })\n }\n }\n\n if (type.isObject(scene)) {\n if (!type.isArray(scene.args)) {\n scene.args = []\n }\n\n scene.args.unshift(function () {\n publish(`${scene.name}:end`, scene)\n playNextScene()\n })\n\n sequence.push(scene)\n }\n }\n\n addSceneToSequence([{ name: 'publisher', args: ['sequence:start'] }].concat(scenes).concat({ name: 'publisher', args: ['sequence:end'] }))\n Array.prototype.push.apply(props.scenario, sequence)\n\n if (props.options.autoplay) {\n play()\n }\n\n return this\n }\n\n function play () {\n if (props.status === 'stopping') {\n props.status = 'playing'\n }\n\n if (props.status === 'ready') {\n props.status = 'playing'\n playNextScene()\n }\n\n return this\n }\n\n function replay (done) {\n if (props.status === 'ready' || type.isFunction(done)) {\n props.currentScene = -1\n\n if (props.status === 'ready') play()\n else done()\n }\n\n return this\n }\n\n function stop () {\n props.status = 'stopping'\n return this\n }\n\n function playNextScene () {\n if (props.status === 'stopping') {\n props.status = 'ready'\n return this\n }\n\n if (props.status !== 'playing') return this\n\n if (props.currentScene + 1 >= props.scenario.length) {\n props.status = 'ready'\n publish('scenario:end')\n return this\n }\n\n let nextScene = props.scenario[++props.currentScene]\n\n if (props.currentScene === 0) {\n publish('scenario:start')\n }\n\n if (nextScene.name === 'publisher') {\n const [done, ...args] = nextScene.args\n publish(...args)\n\n return done()\n }\n\n if (nextScene.actor) {\n setCurrentActor(nextScene.actor)\n }\n\n publish(`${nextScene.name}:start`, nextScene)\n\n switch (nextScene.name) {\n case 'type':\n typeAction(...nextScene.args)\n break\n\n case 'erase':\n eraseAction(...nextScene.args)\n break\n\n case 'callback':\n callbackAction(...nextScene.args)\n break\n\n case 'wait':\n waitAction(...nextScene.args)\n break\n\n default:\n console.debug(`No scene handler for ${nextScene.name}`)\n break\n }\n\n return this\n }\n\n function typeAction (done, value) {\n let actor = getCurrentActor()\n\n let locale = props.options.locale\n let minSpeed = props.options.minSpeed.type\n let maxSpeed = props.options.maxSpeed.type\n let initialValue = actor.displayValue\n let cursor = -1\n let isFixing = false\n let previousMistakeCursor = null\n let previousFixCursor = null\n\n let htmlMap = html.map(value)\n value = html.strip(value)\n\n ;(function type () {\n let actual = html.strip(actor.displayValue.substr(initialValue.length))\n\n if (actual === value) return done()\n\n let expected = value.substr(0, cursor + 1)\n\n let isMistaking = actual !== expected\n let shouldBeMistaken = actor.shouldBeMistaken(actual, value, previousMistakeCursor, previousFixCursor)\n let shouldFix = isFixing || !shouldBeMistaken\n\n if (isMistaking && shouldFix) {\n isFixing = true\n previousMistakeCursor = null\n actor.displayValue = initialValue + html.inject(actual.substr(0, actual.length - 1), htmlMap)\n cursor--\n previousFixCursor = cursor\n } else {\n isFixing = false\n let nextChar = value.charAt(++cursor)\n\n if (shouldBeMistaken) {\n nextChar = keyboard.randomCharNear(nextChar, locale)\n\n if (previousMistakeCursor == null) {\n previousMistakeCursor = cursor\n }\n }\n\n actor.displayValue = initialValue + html.inject(actual + nextChar, htmlMap)\n }\n\n return setTimeout(type, actor.getTypingSpeed(minSpeed, maxSpeed))\n })()\n\n return this\n }\n\n function eraseAction (done, arg) {\n let actor = getCurrentActor()\n\n // erase scenes are added before a type scene\n // so for the first scene, there's no actor yet\n if (actor == null) {\n return done()\n }\n\n if (options.erase !== true) {\n actor.displayValue = ''\n return done()\n }\n\n let minSpeed = props.options.minSpeed.erase\n let maxSpeed = props.options.maxSpeed.erase\n\n let value = actor.displayValue\n let htmlMap = html.map(value)\n\n value = html.strip(value)\n\n let cursor = value.length\n\n let speed\n let nbCharactersToErase = 0\n\n if (type.isNumber(arg)) {\n if (arg > 0) speed = arg\n else nbCharactersToErase = value.length + arg\n }\n\n (function erase () {\n if (cursor === nbCharactersToErase) return done()\n actor.displayValue = html.inject(value.substr(0, --cursor), htmlMap)\n\n return setTimeout(erase, speed || actor.getTypingSpeed(minSpeed, maxSpeed))\n })()\n\n return this\n }\n\n function callbackAction (done, callback) {\n callback.call(this, done)\n return this\n }\n\n function waitAction (done, delay) {\n setTimeout(done.bind(this), delay)\n return this\n }\n\n function subscribe (events, callback) {\n events.split(',').forEach(eventName => {\n eventName = eventName.trim()\n\n if (!type.isArray(props.events[eventName])) {\n props.events[eventName] = []\n }\n\n props.events[eventName].push(callback)\n })\n\n return this\n }\n\n function publish (...args) {\n const eventName = args[0]\n const callbacks = props.events[eventName] || []\n\n if (callbacks.length > 0) {\n callbacks\n .concat(props.events['*'] || [])\n .forEach(callback => callback(...args))\n }\n\n return this\n }\n\n /* ------------------------------------------------- *\\\n public api\n \\* ------------------------------------------------- */\n\n return Object.freeze({\n get options () { return props.options },\n get status () { return props.status },\n addActor,\n getCurrentActor,\n addScene,\n play,\n replay,\n stop,\n on: subscribe\n })\n}\n\ntheaterJS.init = function (actorName = 'actor') {\n let theater = theaterJS()\n theater.addActor(actorName, { accuracy: 1, speed: 0.8 })\n return theater\n}\n\nexport default theaterJS\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/theaterJS.js\n **/","function toString (o) {\n return {}.toString.call(o)\n}\n\nexport default {\n isNumber: function (o) {\n return typeof o === 'number'\n },\n\n isString: function (o) {\n return toString(o) === '[object String]'\n },\n\n isObject: function (o) {\n return toString(o) === '[object Object]'\n },\n\n isArray: function (o) {\n return toString(o) === '[object Array]'\n },\n\n isFunction: function (o) {\n return typeof o === 'function'\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/type.js\n **/","export default {\n merge (dst) {\n let objs = [].slice.call(arguments, 1)\n\n for (let i = 0, len = objs.length; i < len; i++) {\n let obj = objs[i]\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) continue\n dst[key] = obj[key]\n }\n }\n\n return dst\n },\n\n random (min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n },\n\n randomFloat (min, max) {\n return Math.random() * (max - min) + min\n },\n\n getPercentageOf (min, max, percentage) {\n return (min - (min * percentage)) + (max * percentage)\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/utils.js\n **/","import type from './helpers/type'\nimport utils from './helpers/utils'\n\nconst DOCUMENT = typeof window !== 'undefined' && window.document\nconst DEFAULTS = { speed: 0.6, accuracy: 0.6 }\n\nexport default function (actorName, props = {}, callback = null) {\n let displayValue = ''\n let $element\n\n if (type.isNumber(props)) {\n props = { speed: props, accuracy: props }\n }\n\n props = utils.merge({}, DEFAULTS, props)\n\n if (DOCUMENT) {\n if (callback == null) {\n callback = `#${actorName}`\n }\n\n if (type.isString(callback)) {\n let selector = callback\n let $e = DOCUMENT.querySelector(selector)\n\n if ($e != null) {\n $element = $e\n callback = function (newValue) { $element.innerHTML = newValue }\n } else {\n throw new Error(`no matches for ${actorName}'s selector: ${selector}`)\n }\n }\n }\n\n if (!type.isFunction(callback)) {\n callback = console.log.bind(console)\n }\n\n return {\n $element,\n\n get displayValue () {\n return displayValue\n },\n\n set displayValue (value) {\n displayValue = value\n callback(value)\n },\n\n get name () {\n return actorName\n },\n\n getTypingSpeed (fastest, slowest) {\n let speed = utils.randomFloat(props.speed, 1)\n return utils.getPercentageOf(slowest, fastest, speed)\n },\n\n shouldBeMistaken (actual, endValue, previousMistakeCursor = null, previousFixCursor = null) {\n let accuracy = props.accuracy * 10\n\n if (accuracy >= 8) {\n return false\n }\n\n if (actual.length <= accuracy) {\n return false\n }\n\n if (actual.length === endValue.length) {\n return false\n }\n\n if (type.isNumber(previousMistakeCursor)) {\n let nbOfCharactersTyped = actual.length - previousMistakeCursor\n let maxWrongCharactersAllowed = accuracy >= 6 ? 10 - accuracy : 4\n\n if (nbOfCharactersTyped >= maxWrongCharactersAllowed) {\n return false\n }\n }\n\n if (type.isNumber(previousFixCursor)) {\n let nbOfCharactersTyped = actual.length - previousFixCursor\n let minCharactersBetweenMistakes = Math.max(accuracy, 2) * 2\n\n if (nbOfCharactersTyped <= minCharactersBetweenMistakes) {\n return false\n }\n }\n\n return utils.randomFloat(0, 0.8) > props.accuracy\n }\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/actor.js\n **/","import voidElements from '../void-elements.json'\n\nfunction isVoidElement (tag) {\n const tagName = tag.match(/<([^\\s>]+)/)\n return Boolean(tagName) && voidElements.indexOf(tagName[1].toLowerCase()) > -1\n}\n\nexport default {\n strip (str) {\n return str.replace(/(<([^>]+)>)/gi, '')\n },\n\n map (str) {\n let regexp = /<[^>]+>/gi\n let tags = []\n let openers = []\n let result\n let tag\n\n while ((result = regexp.exec(str))) {\n tag = {\n tagName: result[0],\n position: result.index\n }\n\n if (tag.tagName.charAt(1) === '/') {\n tag.opener = openers.pop()\n } else if (tag.tagName.charAt(tag.tagName.length - 2) !== '/' && !isVoidElement(tag.tagName)) {\n openers.push(tag)\n }\n\n tags.push(tag)\n }\n\n return tags\n },\n\n inject (str, map) {\n for (let i = 0, tag; i < map.length; i++) {\n tag = map[i]\n\n if (str.length > 0 && tag.position <= str.length) {\n str = str.substr(0, tag.position) + tag.tagName + str.substr(tag.position)\n } else if (tag.opener && tag.opener.position < str.length) {\n str += tag.tagName\n }\n }\n\n return str\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/html.js\n **/","import type from './type'\nimport utils from './utils'\nimport keyboards from '../keyboards.json'\nconst DEFAULT_LOCALE = 'en'\n\nfor (let locale in keyboards) {\n if (!keyboards.hasOwnProperty(locale)) continue\n\n let keyboard = keyboards[locale]\n keyboards[locale] = { list: keyboard, mapped: mapKeyboard(keyboard) }\n}\n\nfunction mapKeyboard (alphabet) {\n let keyboard = {}\n\n for (let y = 0, lines = alphabet.length, chars; y < lines; y++) {\n chars = alphabet[y]\n\n for (let x = 0, charsLength = chars.length; x < charsLength; x++) {\n keyboard[chars[x]] = { x: x, y: y }\n }\n }\n\n return keyboard\n}\n\nexport default {\n defaultLocale: DEFAULT_LOCALE,\n\n supports (locale) {\n return type.isObject(keyboards[locale])\n },\n\n randomCharNear (ch, locale) {\n if (!this.supports(locale)) {\n throw new Error(`locale \"${locale}\" is not supported`)\n }\n\n let keyboard = keyboards[locale].mapped\n let threshold = 1\n let nearbyChars = []\n let uppercase = /[A-Z]/.test(ch)\n\n ch = ch.toLowerCase()\n\n let charPosition = keyboard[ch] || []\n let p\n\n for (let c in keyboard) {\n if (!keyboard.hasOwnProperty(c) || c === ch) continue\n\n p = keyboard[c]\n\n if (Math.abs(charPosition.x - p.x) <= threshold && Math.abs(charPosition.y - p.y) <= threshold) {\n nearbyChars.push(c)\n }\n }\n\n let randomChar =\n nearbyChars.length > 0\n ? nearbyChars[utils.random(0, nearbyChars.length - 1)]\n : this.randomChar(locale)\n\n if (uppercase) {\n randomChar = randomChar.toUpperCase()\n }\n\n return randomChar\n },\n\n randomChar: function (locale) {\n if (!this.supports(locale)) {\n throw new Error(`locale \"${locale}\" is not supported`)\n }\n\n let chars = keyboards[locale].list.join('')\n return chars.charAt(utils.random(0, chars.length - 1))\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/keyboard.js\n **/","module.exports = {\n\t\"en\": [\n\t\t\"qwertyuiop\",\n\t\t\"asdfghjkl\",\n\t\t\"zxcvbnm\"\n\t],\n\t\"fr\": [\n\t\t\"azertyuiop\",\n\t\t\"qsdfghjklm\",\n\t\t\"wxcvbn\"\n\t],\n\t\"da\": [\n\t\t\"qwertyuiopå\",\n\t\t\"asdfghjklæø\",\n\t\t\"zxcvbnm\"\n\t],\n\t\"de\": [\n\t\t\"qwertzuiopü\",\n\t\t\"asdfghjklöä\",\n\t\t\"yxcvbnm\"\n\t],\n\t\"pl\": [\n\t\t\"qwertyuiopęó\",\n\t\t\"asdfghjkląśł\",\n\t\t\"zxcvbnmżźćń\"\n\t],\n\t\"pt\": [\n\t\t\"qwertyuiop\",\n\t\t\"asdfghjklç\",\n\t\t\"zxcvbnm\"\n\t],\n\t\"ru\": [\n\t\t\"йцукенгшщзх\",\n\t\t\"фывапролджэ\",\n\t\t\"ячсмитьбюъ\"\n\t]\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/keyboards.json\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = [\n\t\"area\",\n\t\"base\",\n\t\"br\",\n\t\"col\",\n\t\"embed\",\n\t\"hr\",\n\t\"img\",\n\t\"input\",\n\t\"keygen\",\n\t\"link\",\n\t\"menuitem\",\n\t\"meta\",\n\t\"param\",\n\t\"source\",\n\t\"track\",\n\t\"wbr\"\n];\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/void-elements.json\n ** module id = 7\n ** module chunks = 0\n **/"],"sourceRoot":""}
{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///theater.min.js","webpack:///webpack/bootstrap 0e9e2e0a00f891036afb","webpack:///./src/theaterJS.js","webpack:///./src/helpers/type.js","webpack:///./src/helpers/utils.js","webpack:///./src/actor.js","webpack:///./src/helpers/html.js","webpack:///./src/helpers/keyboard.js","webpack:///./src/keyboards.json","webpack:///./src/void-elements.json"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequireDefault","obj","__esModule","default","_toConsumableArray","arr","Array","isArray","i","arr2","length","from","_toArray","theaterJS","addActor","actorName","options","arguments","undefined","callback","a","_actor2","props","casting","name","setCurrentActor","onStage","getCurrentActor","addScene","addSceneToSequence","scene","_helpersType2","forEach","s","isString","partials","split","charAt","shift","actor","speech","join","replace","sceneObj","args","isFunction","isNumber","isObject","unshift","publish","playNextScene","sequence","push","_len","scenes","_key","concat","prototype","apply","scenario","autoplay","play","status","replay","done","currentScene","stop","nextScene","_nextScene$args","slice","typeAction","eraseAction","callbackAction","waitAction","console","debug","value","locale","minSpeed","type","maxSpeed","initialValue","displayValue","cursor","isFixing","previousMistakeCursor","previousFixCursor","htmlMap","_helpersHtml2","map","strip","actual","substr","expected","isMistaking","shouldBeMistaken","shouldFix","inject","nextChar","_helpersKeyboard2","randomCharNear","setTimeout","getTypingSpeed","arg","erase","speed","nbCharactersToErase","delay","bind","subscribe","events","eventName","trim","_len2","_key2","callbacks","_helpersUtils2","merge","DEFAULTS","_options","_options2","NAVIGATOR","languages","supports","defaultLocale","Object","freeze","defineProperties","on","get","configurable","enumerable","defineProperty","_actor","_helpersUtils","_helpersType","_helpersKeyboard","_helpersHtml","window","navigator","init","theater","accuracy","toString","o","dst","objs","len","key","hasOwnProperty","random","min","max","Math","floor","randomFloat","getPercentageOf","percentage","DOCUMENT","document","$element","selector","$e","querySelector","Error","newValue","innerHTML","log","fastest","slowest","endValue","nbOfCharactersTyped","maxWrongCharactersAllowed","minCharactersBetweenMistakes","set","isVoidElement","tag","tagName","match","Boolean","_voidElementsJson2","indexOf","toLowerCase","_voidElementsJson","str","regexp","tags","openers","result","exec","position","index","opener","pop","mapKeyboard","alphabet","keyboard","y","lines","chars","x","charsLength","_type","_type2","_utils","_utils2","_keyboardsJson","_keyboardsJson2","DEFAULT_LOCALE","list","mapped","ch","threshold","nearbyChars","uppercase","test","charPosition","abs","randomChar","toUpperCase","en","fr","da","de","pl","pt","ru","es"],"mappings":"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","file":"theater.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"theaterJS\"] = factory();\n\telse\n\t\troot[\"theaterJS\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"theaterJS\"] = factory();\n\telse\n\t\troot[\"theaterJS\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/*!**************************!*\\\n !*** ./src/theaterJS.js ***!\n \\**************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }\n\t\n\tfunction _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }\n\t\n\tvar _actor = __webpack_require__(/*! ./actor */ 3);\n\t\n\tvar _actor2 = _interopRequireDefault(_actor);\n\t\n\tvar _helpersUtils = __webpack_require__(/*! ./helpers/utils */ 2);\n\t\n\tvar _helpersUtils2 = _interopRequireDefault(_helpersUtils);\n\t\n\tvar _helpersType = __webpack_require__(/*! ./helpers/type */ 1);\n\t\n\tvar _helpersType2 = _interopRequireDefault(_helpersType);\n\t\n\tvar _helpersKeyboard = __webpack_require__(/*! ./helpers/keyboard */ 5);\n\t\n\tvar _helpersKeyboard2 = _interopRequireDefault(_helpersKeyboard);\n\t\n\tvar _helpersHtml = __webpack_require__(/*! ./helpers/html */ 4);\n\t\n\tvar _helpersHtml2 = _interopRequireDefault(_helpersHtml);\n\t\n\tvar NAVIGATOR = typeof window !== 'undefined' && window.navigator;\n\tvar DEFAULTS = {\n\t autoplay: true,\n\t erase: true,\n\t minSpeed: { erase: 80, type: 80 },\n\t maxSpeed: { erase: 450, type: 450 },\n\t locale: 'detect'\n\t};\n\t\n\tfunction theaterJS() {\n\t var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\t\n\t /* ------------------------------------------------- *\\\n\t init\n\t \\* ------------------------------------------------- */\n\t\n\t options = _helpersUtils2['default'].merge({}, DEFAULTS, options);\n\t\n\t if (_helpersType2['default'].isNumber(options.minSpeed)) {\n\t var _options = options;\n\t var minSpeed = _options.minSpeed;\n\t\n\t options.minSpeed = { erase: minSpeed, type: minSpeed };\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(options.maxSpeed)) {\n\t var _options2 = options;\n\t var maxSpeed = _options2.maxSpeed;\n\t\n\t options.maxSpeed = { erase: maxSpeed, type: maxSpeed };\n\t }\n\t\n\t if (options.locale === 'detect' && NAVIGATOR) {\n\t var languages = NAVIGATOR.languages;\n\t if (_helpersType2['default'].isArray(languages) && _helpersType2['default'].isString(languages[0])) {\n\t options.locale = languages[0].substr(0, 2);\n\t }\n\t }\n\t\n\t if (!_helpersKeyboard2['default'].supports(options.locale)) {\n\t options.locale = _helpersKeyboard2['default'].defaultLocale;\n\t }\n\t\n\t var props = { options: options, casting: {}, status: 'ready', onStage: null, currentScene: -1, scenario: [], events: {} };\n\t setCurrentActor(null);\n\t\n\t /* ------------------------------------------------- *\\\n\t methods\n\t \\* ------------------------------------------------- */\n\t\n\t function addActor(actorName) {\n\t var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var callback = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t\n\t var a = (0, _actor2['default'])(actorName, options, callback);\n\t props.casting[a.name] = a;\n\t\n\t return this;\n\t }\n\t\n\t function setCurrentActor(actorName) {\n\t props.onStage = actorName;\n\t return this;\n\t }\n\t\n\t function getCurrentActor() {\n\t return props.casting[props.onStage] || null;\n\t }\n\t\n\t function addScene() {\n\t var sequence = [];\n\t\n\t function addSceneToSequence(scene) {\n\t if (_helpersType2['default'].isArray(scene)) {\n\t scene.forEach(function (s) {\n\t addSceneToSequence(s);\n\t });\n\t }\n\t\n\t if (_helpersType2['default'].isString(scene)) {\n\t var partials = scene.split(':');\n\t\n\t var actorName = undefined;\n\t if (partials.length > 1 && partials[0].charAt(partials[0].length - 1) !== '\\\\') {\n\t actorName = partials.shift();\n\t\n\t addSceneToSequence({ name: 'erase', actor: actorName });\n\t }\n\t\n\t var speech = partials.join(':').replace(/\\\\:/g, ':');\n\t var sceneObj = { name: 'type', args: [speech] };\n\t\n\t if (actorName != null) {\n\t sceneObj.actor = actorName;\n\t }\n\t\n\t addSceneToSequence(sceneObj);\n\t }\n\t\n\t if (_helpersType2['default'].isFunction(scene)) {\n\t addSceneToSequence({ name: 'callback', args: [scene] });\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(scene)) {\n\t if (scene > 0) {\n\t addSceneToSequence({ name: 'wait', args: [scene] });\n\t } else {\n\t addSceneToSequence({ name: 'erase', args: [scene] });\n\t }\n\t }\n\t\n\t if (_helpersType2['default'].isObject(scene)) {\n\t if (!_helpersType2['default'].isArray(scene.args)) {\n\t scene.args = [];\n\t }\n\t\n\t scene.args.unshift(function () {\n\t publish(scene.name + ':end', scene);\n\t playNextScene();\n\t });\n\t\n\t sequence.push(scene);\n\t }\n\t }\n\t\n\t for (var _len = arguments.length, scenes = Array(_len), _key = 0; _key < _len; _key++) {\n\t scenes[_key] = arguments[_key];\n\t }\n\t\n\t addSceneToSequence([{ name: 'publisher', args: ['sequence:start'] }].concat(scenes).concat({ name: 'publisher', args: ['sequence:end'] }));\n\t Array.prototype.push.apply(props.scenario, sequence);\n\t\n\t if (props.options.autoplay) {\n\t play();\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function play() {\n\t if (props.status === 'stopping') {\n\t props.status = 'playing';\n\t }\n\t\n\t if (props.status === 'ready') {\n\t props.status = 'playing';\n\t playNextScene();\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function replay(done) {\n\t if (props.status === 'ready' || _helpersType2['default'].isFunction(done)) {\n\t props.currentScene = -1;\n\t\n\t if (props.status === 'ready') play();else done();\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function stop() {\n\t props.status = 'stopping';\n\t return this;\n\t }\n\t\n\t function playNextScene() {\n\t if (props.status === 'stopping') {\n\t props.status = 'ready';\n\t return this;\n\t }\n\t\n\t if (props.status !== 'playing') return this;\n\t\n\t if (props.currentScene + 1 >= props.scenario.length) {\n\t props.status = 'ready';\n\t publish('scenario:end');\n\t return this;\n\t }\n\t\n\t var nextScene = props.scenario[++props.currentScene];\n\t\n\t if (props.currentScene === 0) {\n\t publish('scenario:start');\n\t }\n\t\n\t if (nextScene.name === 'publisher') {\n\t var _nextScene$args = _toArray(nextScene.args);\n\t\n\t var done = _nextScene$args[0];\n\t\n\t var args = _nextScene$args.slice(1);\n\t\n\t publish.apply(undefined, _toConsumableArray(args));\n\t\n\t return done();\n\t }\n\t\n\t if (nextScene.actor) {\n\t setCurrentActor(nextScene.actor);\n\t }\n\t\n\t publish(nextScene.name + ':start', nextScene);\n\t\n\t switch (nextScene.name) {\n\t case 'type':\n\t typeAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t case 'erase':\n\t eraseAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t case 'callback':\n\t callbackAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t case 'wait':\n\t waitAction.apply(undefined, _toConsumableArray(nextScene.args));\n\t break;\n\t\n\t default:\n\t console.debug('No scene handler for ' + nextScene.name);\n\t break;\n\t }\n\t\n\t return this;\n\t }\n\t\n\t function typeAction(done, value) {\n\t var actor = getCurrentActor();\n\t\n\t var locale = props.options.locale;\n\t var minSpeed = props.options.minSpeed.type;\n\t var maxSpeed = props.options.maxSpeed.type;\n\t var initialValue = actor.displayValue;\n\t var cursor = -1;\n\t var isFixing = false;\n\t var previousMistakeCursor = null;\n\t var previousFixCursor = null;\n\t\n\t var htmlMap = _helpersHtml2['default'].map(value);\n\t value = _helpersHtml2['default'].strip(value);(function type() {\n\t var actual = _helpersHtml2['default'].strip(actor.displayValue.substr(initialValue.length));\n\t\n\t if (actual === value) return done();\n\t\n\t var expected = value.substr(0, cursor + 1);\n\t\n\t var isMistaking = actual !== expected;\n\t var shouldBeMistaken = actor.shouldBeMistaken(actual, value, previousMistakeCursor, previousFixCursor);\n\t var shouldFix = isFixing || !shouldBeMistaken;\n\t\n\t if (isMistaking && shouldFix) {\n\t isFixing = true;\n\t previousMistakeCursor = null;\n\t actor.displayValue = initialValue + _helpersHtml2['default'].inject(actual.substr(0, actual.length - 1), htmlMap);\n\t cursor--;\n\t previousFixCursor = cursor;\n\t } else {\n\t isFixing = false;\n\t var nextChar = value.charAt(++cursor);\n\t\n\t if (shouldBeMistaken) {\n\t nextChar = _helpersKeyboard2['default'].randomCharNear(nextChar, locale);\n\t\n\t if (previousMistakeCursor == null) {\n\t previousMistakeCursor = cursor;\n\t }\n\t }\n\t\n\t actor.displayValue = initialValue + _helpersHtml2['default'].inject(actual + nextChar, htmlMap);\n\t }\n\t\n\t return setTimeout(type, actor.getTypingSpeed(minSpeed, maxSpeed));\n\t })();\n\t\n\t return this;\n\t }\n\t\n\t function eraseAction(done, arg) {\n\t var actor = getCurrentActor();\n\t\n\t // erase scenes are added before a type scene\n\t // so for the first scene, there's no actor yet\n\t if (actor == null) {\n\t return done();\n\t }\n\t\n\t if (options.erase !== true) {\n\t actor.displayValue = '';\n\t return done();\n\t }\n\t\n\t var minSpeed = props.options.minSpeed.erase;\n\t var maxSpeed = props.options.maxSpeed.erase;\n\t\n\t var value = actor.displayValue;\n\t var htmlMap = _helpersHtml2['default'].map(value);\n\t\n\t value = _helpersHtml2['default'].strip(value);\n\t\n\t var cursor = value.length;\n\t\n\t var speed = undefined;\n\t var nbCharactersToErase = 0;\n\t\n\t if (_helpersType2['default'].isNumber(arg)) {\n\t if (arg > 0) speed = arg;else nbCharactersToErase = value.length + arg;\n\t }\n\t\n\t (function erase() {\n\t if (cursor === nbCharactersToErase) return done();\n\t actor.displayValue = _helpersHtml2['default'].inject(value.substr(0, --cursor), htmlMap);\n\t\n\t return setTimeout(erase, speed || actor.getTypingSpeed(minSpeed, maxSpeed));\n\t })();\n\t\n\t return this;\n\t }\n\t\n\t function callbackAction(done, callback) {\n\t callback.call(this, done);\n\t return this;\n\t }\n\t\n\t function waitAction(done, delay) {\n\t setTimeout(done.bind(this), delay);\n\t return this;\n\t }\n\t\n\t function subscribe(events, callback) {\n\t events.split(',').forEach(function (eventName) {\n\t eventName = eventName.trim();\n\t\n\t if (!_helpersType2['default'].isArray(props.events[eventName])) {\n\t props.events[eventName] = [];\n\t }\n\t\n\t props.events[eventName].push(callback);\n\t });\n\t\n\t return this;\n\t }\n\t\n\t function publish() {\n\t for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t args[_key2] = arguments[_key2];\n\t }\n\t\n\t var eventName = args[0];\n\t var callbacks = props.events[eventName] || [];\n\t\n\t if (callbacks.length > 0) {\n\t callbacks.concat(props.events['*'] || []).forEach(function (callback) {\n\t return callback.apply(undefined, args);\n\t });\n\t }\n\t\n\t return this;\n\t }\n\t\n\t /* ------------------------------------------------- *\\\n\t public api\n\t \\* ------------------------------------------------- */\n\t\n\t return Object.freeze(Object.defineProperties({\n\t addActor: addActor,\n\t getCurrentActor: getCurrentActor,\n\t addScene: addScene,\n\t play: play,\n\t replay: replay,\n\t stop: stop,\n\t on: subscribe\n\t }, {\n\t options: {\n\t get: function get() {\n\t return props.options;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t },\n\t status: {\n\t get: function get() {\n\t return props.status;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t }\n\t }));\n\t}\n\t\n\ttheaterJS.init = function () {\n\t var actorName = arguments.length <= 0 || arguments[0] === undefined ? 'actor' : arguments[0];\n\t\n\t var theater = theaterJS();\n\t theater.addActor(actorName, { accuracy: 1, speed: 0.8 });\n\t return theater;\n\t};\n\t\n\texports['default'] = theaterJS;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 1 */\n/*!*****************************!*\\\n !*** ./src/helpers/type.js ***!\n \\*****************************/\n/***/ function(module, exports) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\tfunction toString(o) {\n\t return ({}).toString.call(o);\n\t}\n\t\n\texports['default'] = {\n\t isNumber: function isNumber(o) {\n\t return typeof o === 'number';\n\t },\n\t\n\t isString: function isString(o) {\n\t return toString(o) === '[object String]';\n\t },\n\t\n\t isObject: function isObject(o) {\n\t return toString(o) === '[object Object]';\n\t },\n\t\n\t isArray: function isArray(o) {\n\t return toString(o) === '[object Array]';\n\t },\n\t\n\t isFunction: function isFunction(o) {\n\t return typeof o === 'function';\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 2 */\n/*!******************************!*\\\n !*** ./src/helpers/utils.js ***!\n \\******************************/\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tObject.defineProperty(exports, \"__esModule\", {\n\t value: true\n\t});\n\texports[\"default\"] = {\n\t merge: function merge(dst) {\n\t var objs = [].slice.call(arguments, 1);\n\t\n\t for (var i = 0, len = objs.length; i < len; i++) {\n\t var obj = objs[i];\n\t\n\t for (var key in obj) {\n\t if (!obj.hasOwnProperty(key)) continue;\n\t dst[key] = obj[key];\n\t }\n\t }\n\t\n\t return dst;\n\t },\n\t\n\t random: function random(min, max) {\n\t return Math.floor(Math.random() * (max - min + 1)) + min;\n\t },\n\t\n\t randomFloat: function randomFloat(min, max) {\n\t return Math.random() * (max - min) + min;\n\t },\n\t\n\t getPercentageOf: function getPercentageOf(min, max, percentage) {\n\t return min - min * percentage + max * percentage;\n\t }\n\t};\n\tmodule.exports = exports[\"default\"];\n\n/***/ },\n/* 3 */\n/*!**********************!*\\\n !*** ./src/actor.js ***!\n \\**********************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _helpersType = __webpack_require__(/*! ./helpers/type */ 1);\n\t\n\tvar _helpersType2 = _interopRequireDefault(_helpersType);\n\t\n\tvar _helpersUtils = __webpack_require__(/*! ./helpers/utils */ 2);\n\t\n\tvar _helpersUtils2 = _interopRequireDefault(_helpersUtils);\n\t\n\tvar DOCUMENT = typeof window !== 'undefined' && window.document;\n\tvar DEFAULTS = { speed: 0.6, accuracy: 0.6 };\n\t\n\texports['default'] = function (actorName) {\n\t var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];\n\t var callback = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t\n\t var displayValue = '';\n\t var $element = undefined;\n\t\n\t if (_helpersType2['default'].isNumber(props)) {\n\t props = { speed: props, accuracy: props };\n\t }\n\t\n\t props = _helpersUtils2['default'].merge({}, DEFAULTS, props);\n\t\n\t if (DOCUMENT) {\n\t if (callback == null) {\n\t callback = '#' + actorName;\n\t }\n\t\n\t if (_helpersType2['default'].isString(callback)) {\n\t var selector = callback;\n\t var $e = DOCUMENT.querySelector(selector);\n\t\n\t if ($e != null) {\n\t $element = $e;\n\t callback = function (newValue) {\n\t $element.innerHTML = newValue;\n\t };\n\t } else {\n\t throw new Error('no matches for ' + actorName + '\\'s selector: ' + selector);\n\t }\n\t }\n\t }\n\t\n\t if (!_helpersType2['default'].isFunction(callback)) {\n\t callback = console.log.bind(console);\n\t }\n\t\n\t return Object.defineProperties({\n\t $element: $element,\n\t\n\t getTypingSpeed: function getTypingSpeed(fastest, slowest) {\n\t var speed = _helpersUtils2['default'].randomFloat(props.speed, 1);\n\t return _helpersUtils2['default'].getPercentageOf(slowest, fastest, speed);\n\t },\n\t\n\t shouldBeMistaken: function shouldBeMistaken(actual, endValue) {\n\t var previousMistakeCursor = arguments.length <= 2 || arguments[2] === undefined ? null : arguments[2];\n\t var previousFixCursor = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];\n\t\n\t var accuracy = props.accuracy * 10;\n\t\n\t if (accuracy >= 8) {\n\t return false;\n\t }\n\t\n\t if (actual.length <= accuracy) {\n\t return false;\n\t }\n\t\n\t if (actual.length === endValue.length) {\n\t return false;\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(previousMistakeCursor)) {\n\t var nbOfCharactersTyped = actual.length - previousMistakeCursor;\n\t var maxWrongCharactersAllowed = accuracy >= 6 ? 10 - accuracy : 4;\n\t\n\t if (nbOfCharactersTyped >= maxWrongCharactersAllowed) {\n\t return false;\n\t }\n\t }\n\t\n\t if (_helpersType2['default'].isNumber(previousFixCursor)) {\n\t var nbOfCharactersTyped = actual.length - previousFixCursor;\n\t var minCharactersBetweenMistakes = Math.max(accuracy, 2) * 2;\n\t\n\t if (nbOfCharactersTyped <= minCharactersBetweenMistakes) {\n\t return false;\n\t }\n\t }\n\t\n\t return _helpersUtils2['default'].randomFloat(0, 0.8) > props.accuracy;\n\t }\n\t }, {\n\t displayValue: {\n\t get: function get() {\n\t return displayValue;\n\t },\n\t set: function set(value) {\n\t displayValue = value;\n\t callback(value);\n\t },\n\t configurable: true,\n\t enumerable: true\n\t },\n\t name: {\n\t get: function get() {\n\t return actorName;\n\t },\n\t configurable: true,\n\t enumerable: true\n\t }\n\t });\n\t};\n\t\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 4 */\n/*!*****************************!*\\\n !*** ./src/helpers/html.js ***!\n \\*****************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _voidElementsJson = __webpack_require__(/*! ../void-elements.json */ 7);\n\t\n\tvar _voidElementsJson2 = _interopRequireDefault(_voidElementsJson);\n\t\n\tfunction isVoidElement(tag) {\n\t var tagName = tag.match(/<([^\\s>]+)/);\n\t return Boolean(tagName) && _voidElementsJson2['default'].indexOf(tagName[1].toLowerCase()) > -1;\n\t}\n\t\n\texports['default'] = {\n\t strip: function strip(str) {\n\t return str.replace(/(<([^>]+)>)/gi, '');\n\t },\n\t\n\t map: function map(str) {\n\t var regexp = /<[^>]+>/gi;\n\t var tags = [];\n\t var openers = [];\n\t var result = undefined;\n\t var tag = undefined;\n\t\n\t while (result = regexp.exec(str)) {\n\t tag = {\n\t tagName: result[0],\n\t position: result.index\n\t };\n\t\n\t if (tag.tagName.charAt(1) === '/') {\n\t tag.opener = openers.pop();\n\t } else if (tag.tagName.charAt(tag.tagName.length - 2) !== '/' && !isVoidElement(tag.tagName)) {\n\t openers.push(tag);\n\t }\n\t\n\t tags.push(tag);\n\t }\n\t\n\t return tags;\n\t },\n\t\n\t inject: function inject(str, map) {\n\t for (var i = 0, tag = undefined; i < map.length; i++) {\n\t tag = map[i];\n\t\n\t if (str.length > 0 && tag.position <= str.length) {\n\t str = str.substr(0, tag.position) + tag.tagName + str.substr(tag.position);\n\t } else if (tag.opener && tag.opener.position < str.length) {\n\t str += tag.tagName;\n\t }\n\t }\n\t\n\t return str;\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 5 */\n/*!*********************************!*\\\n !*** ./src/helpers/keyboard.js ***!\n \\*********************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tvar _type = __webpack_require__(/*! ./type */ 1);\n\t\n\tvar _type2 = _interopRequireDefault(_type);\n\t\n\tvar _utils = __webpack_require__(/*! ./utils */ 2);\n\t\n\tvar _utils2 = _interopRequireDefault(_utils);\n\t\n\tvar _keyboardsJson = __webpack_require__(/*! ../keyboards.json */ 6);\n\t\n\tvar _keyboardsJson2 = _interopRequireDefault(_keyboardsJson);\n\t\n\tvar DEFAULT_LOCALE = 'en';\n\t\n\tfor (var locale in _keyboardsJson2['default']) {\n\t if (!_keyboardsJson2['default'].hasOwnProperty(locale)) continue;\n\t\n\t var keyboard = _keyboardsJson2['default'][locale];\n\t _keyboardsJson2['default'][locale] = { list: keyboard, mapped: mapKeyboard(keyboard) };\n\t}\n\t\n\tfunction mapKeyboard(alphabet) {\n\t var keyboard = {};\n\t\n\t for (var y = 0, lines = alphabet.length, chars = undefined; y < lines; y++) {\n\t chars = alphabet[y];\n\t\n\t for (var x = 0, charsLength = chars.length; x < charsLength; x++) {\n\t keyboard[chars[x]] = { x: x, y: y };\n\t }\n\t }\n\t\n\t return keyboard;\n\t}\n\t\n\texports['default'] = {\n\t defaultLocale: DEFAULT_LOCALE,\n\t\n\t supports: function supports(locale) {\n\t return _type2['default'].isObject(_keyboardsJson2['default'][locale]);\n\t },\n\t\n\t randomCharNear: function randomCharNear(ch, locale) {\n\t if (!this.supports(locale)) {\n\t throw new Error('locale \"' + locale + '\" is not supported');\n\t }\n\t\n\t var keyboard = _keyboardsJson2['default'][locale].mapped;\n\t var threshold = 1;\n\t var nearbyChars = [];\n\t var uppercase = /[A-Z]/.test(ch);\n\t\n\t ch = ch.toLowerCase();\n\t\n\t var charPosition = keyboard[ch] || [];\n\t var p = undefined;\n\t\n\t for (var c in keyboard) {\n\t if (!keyboard.hasOwnProperty(c) || c === ch) continue;\n\t\n\t p = keyboard[c];\n\t\n\t if (Math.abs(charPosition.x - p.x) <= threshold && Math.abs(charPosition.y - p.y) <= threshold) {\n\t nearbyChars.push(c);\n\t }\n\t }\n\t\n\t var randomChar = nearbyChars.length > 0 ? nearbyChars[_utils2['default'].random(0, nearbyChars.length - 1)] : this.randomChar(locale);\n\t\n\t if (uppercase) {\n\t randomChar = randomChar.toUpperCase();\n\t }\n\t\n\t return randomChar;\n\t },\n\t\n\t randomChar: function randomChar(locale) {\n\t if (!this.supports(locale)) {\n\t throw new Error('locale \"' + locale + '\" is not supported');\n\t }\n\t\n\t var chars = _keyboardsJson2['default'][locale].list.join('');\n\t return chars.charAt(_utils2['default'].random(0, chars.length - 1));\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 6 */\n/*!****************************!*\\\n !*** ./src/keyboards.json ***!\n \\****************************/\n/***/ function(module, exports) {\n\n\tmodule.exports = {\n\t\t\"en\": [\n\t\t\t\"qwertyuiop\",\n\t\t\t\"asdfghjkl\",\n\t\t\t\"zxcvbnm\"\n\t\t],\n\t\t\"fr\": [\n\t\t\t\"azertyuiop\",\n\t\t\t\"qsdfghjklm\",\n\t\t\t\"wxcvbn\"\n\t\t],\n\t\t\"da\": [\n\t\t\t\"qwertyuiopå\",\n\t\t\t\"asdfghjklæø\",\n\t\t\t\"zxcvbnm\"\n\t\t],\n\t\t\"de\": [\n\t\t\t\"qwertzuiopü\",\n\t\t\t\"asdfghjklöä\",\n\t\t\t\"yxcvbnm\"\n\t\t],\n\t\t\"pl\": [\n\t\t\t\"qwertyuiopęó\",\n\t\t\t\"asdfghjkląśł\",\n\t\t\t\"zxcvbnmżźćń\"\n\t\t],\n\t\t\"pt\": [\n\t\t\t\"qwertyuiop\",\n\t\t\t\"asdfghjklç\",\n\t\t\t\"zxcvbnm\"\n\t\t],\n\t\t\"ru\": [\n\t\t\t\"йцукенгшщзх\",\n\t\t\t\"фывапролджэ\",\n\t\t\t\"ячсмитьбюъ\"\n\t\t],\n\t\t\"es\": [\n\t\t\t\"qwertyuiop\",\n\t\t\t\"asdfghjklñ\",\n\t\t\t\"zxcvbnm\"\n\t\t]\n\t};\n\n/***/ },\n/* 7 */\n/*!********************************!*\\\n !*** ./src/void-elements.json ***!\n \\********************************/\n/***/ function(module, exports) {\n\n\tmodule.exports = [\n\t\t\"area\",\n\t\t\"base\",\n\t\t\"br\",\n\t\t\"col\",\n\t\t\"embed\",\n\t\t\"hr\",\n\t\t\"img\",\n\t\t\"input\",\n\t\t\"keygen\",\n\t\t\"link\",\n\t\t\"menuitem\",\n\t\t\"meta\",\n\t\t\"param\",\n\t\t\"source\",\n\t\t\"track\",\n\t\t\"wbr\"\n\t];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** theater.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 0e9e2e0a00f891036afb\n **/","import actor from './actor'\nimport utils from './helpers/utils'\nimport type from './helpers/type'\nimport keyboard from './helpers/keyboard'\nimport html from './helpers/html'\n\nconst NAVIGATOR = typeof window !== 'undefined' && window.navigator\nconst DEFAULTS = {\n autoplay: true,\n erase: true,\n minSpeed: { erase: 80, type: 80 },\n maxSpeed: { erase: 450, type: 450 },\n locale: 'detect'\n}\n\nfunction theaterJS (options = {}) {\n /* ------------------------------------------------- *\\\n init\n \\* ------------------------------------------------- */\n\n options = utils.merge({}, DEFAULTS, options)\n\n if (type.isNumber(options.minSpeed)) {\n const { minSpeed } = options\n options.minSpeed = { erase: minSpeed, type: minSpeed }\n }\n\n if (type.isNumber(options.maxSpeed)) {\n const { maxSpeed } = options\n options.maxSpeed = { erase: maxSpeed, type: maxSpeed }\n }\n\n if (options.locale === 'detect' && NAVIGATOR) {\n let languages = NAVIGATOR.languages\n if (type.isArray(languages) && type.isString(languages[0])) {\n options.locale = languages[0].substr(0, 2)\n }\n }\n\n if (!keyboard.supports(options.locale)) {\n options.locale = keyboard.defaultLocale\n }\n\n let props = { options, casting: {}, status: 'ready', onStage: null, currentScene: -1, scenario: [], events: {} }\n setCurrentActor(null)\n\n /* ------------------------------------------------- *\\\n methods\n \\* ------------------------------------------------- */\n\n function addActor (actorName, options = {}, callback = null) {\n let a = actor(actorName, options, callback)\n props.casting[a.name] = a\n\n return this\n }\n\n function setCurrentActor (actorName) {\n props.onStage = actorName\n return this\n }\n\n function getCurrentActor () {\n return props.casting[props.onStage] || null\n }\n\n function addScene (...scenes) {\n const sequence = []\n\n function addSceneToSequence (scene) {\n if (type.isArray(scene)) {\n scene.forEach(function (s) { addSceneToSequence(s) })\n }\n\n if (type.isString(scene)) {\n let partials = scene.split(':')\n\n let actorName\n if (partials.length > 1 && partials[0].charAt(partials[0].length - 1) !== '\\\\') {\n actorName = partials.shift()\n\n addSceneToSequence({ name: 'erase', actor: actorName })\n }\n\n let speech = partials.join(':').replace(/\\\\:/g, ':')\n let sceneObj = { name: 'type', args: [speech] }\n\n if (actorName != null) {\n sceneObj.actor = actorName\n }\n\n addSceneToSequence(sceneObj)\n }\n\n if (type.isFunction(scene)) {\n addSceneToSequence({ name: 'callback', args: [scene] })\n }\n\n if (type.isNumber(scene)) {\n if (scene > 0) {\n addSceneToSequence({ name: 'wait', args: [scene] })\n } else {\n addSceneToSequence({ name: 'erase', args: [scene] })\n }\n }\n\n if (type.isObject(scene)) {\n if (!type.isArray(scene.args)) {\n scene.args = []\n }\n\n scene.args.unshift(function () {\n publish(`${scene.name}:end`, scene)\n playNextScene()\n })\n\n sequence.push(scene)\n }\n }\n\n addSceneToSequence([{ name: 'publisher', args: ['sequence:start'] }].concat(scenes).concat({ name: 'publisher', args: ['sequence:end'] }))\n Array.prototype.push.apply(props.scenario, sequence)\n\n if (props.options.autoplay) {\n play()\n }\n\n return this\n }\n\n function play () {\n if (props.status === 'stopping') {\n props.status = 'playing'\n }\n\n if (props.status === 'ready') {\n props.status = 'playing'\n playNextScene()\n }\n\n return this\n }\n\n function replay (done) {\n if (props.status === 'ready' || type.isFunction(done)) {\n props.currentScene = -1\n\n if (props.status === 'ready') play()\n else done()\n }\n\n return this\n }\n\n function stop () {\n props.status = 'stopping'\n return this\n }\n\n function playNextScene () {\n if (props.status === 'stopping') {\n props.status = 'ready'\n return this\n }\n\n if (props.status !== 'playing') return this\n\n if (props.currentScene + 1 >= props.scenario.length) {\n props.status = 'ready'\n publish('scenario:end')\n return this\n }\n\n let nextScene = props.scenario[++props.currentScene]\n\n if (props.currentScene === 0) {\n publish('scenario:start')\n }\n\n if (nextScene.name === 'publisher') {\n const [done, ...args] = nextScene.args\n publish(...args)\n\n return done()\n }\n\n if (nextScene.actor) {\n setCurrentActor(nextScene.actor)\n }\n\n publish(`${nextScene.name}:start`, nextScene)\n\n switch (nextScene.name) {\n case 'type':\n typeAction(...nextScene.args)\n break\n\n case 'erase':\n eraseAction(...nextScene.args)\n break\n\n case 'callback':\n callbackAction(...nextScene.args)\n break\n\n case 'wait':\n waitAction(...nextScene.args)\n break\n\n default:\n console.debug(`No scene handler for ${nextScene.name}`)\n break\n }\n\n return this\n }\n\n function typeAction (done, value) {\n let actor = getCurrentActor()\n\n let locale = props.options.locale\n let minSpeed = props.options.minSpeed.type\n let maxSpeed = props.options.maxSpeed.type\n let initialValue = actor.displayValue\n let cursor = -1\n let isFixing = false\n let previousMistakeCursor = null\n let previousFixCursor = null\n\n let htmlMap = html.map(value)\n value = html.strip(value)\n\n ;(function type () {\n let actual = html.strip(actor.displayValue.substr(initialValue.length))\n\n if (actual === value) return done()\n\n let expected = value.substr(0, cursor + 1)\n\n let isMistaking = actual !== expected\n let shouldBeMistaken = actor.shouldBeMistaken(actual, value, previousMistakeCursor, previousFixCursor)\n let shouldFix = isFixing || !shouldBeMistaken\n\n if (isMistaking && shouldFix) {\n isFixing = true\n previousMistakeCursor = null\n actor.displayValue = initialValue + html.inject(actual.substr(0, actual.length - 1), htmlMap)\n cursor--\n previousFixCursor = cursor\n } else {\n isFixing = false\n let nextChar = value.charAt(++cursor)\n\n if (shouldBeMistaken) {\n nextChar = keyboard.randomCharNear(nextChar, locale)\n\n if (previousMistakeCursor == null) {\n previousMistakeCursor = cursor\n }\n }\n\n actor.displayValue = initialValue + html.inject(actual + nextChar, htmlMap)\n }\n\n return setTimeout(type, actor.getTypingSpeed(minSpeed, maxSpeed))\n })()\n\n return this\n }\n\n function eraseAction (done, arg) {\n let actor = getCurrentActor()\n\n // erase scenes are added before a type scene\n // so for the first scene, there's no actor yet\n if (actor == null) {\n return done()\n }\n\n if (options.erase !== true) {\n actor.displayValue = ''\n return done()\n }\n\n let minSpeed = props.options.minSpeed.erase\n let maxSpeed = props.options.maxSpeed.erase\n\n let value = actor.displayValue\n let htmlMap = html.map(value)\n\n value = html.strip(value)\n\n let cursor = value.length\n\n let speed\n let nbCharactersToErase = 0\n\n if (type.isNumber(arg)) {\n if (arg > 0) speed = arg\n else nbCharactersToErase = value.length + arg\n }\n\n (function erase () {\n if (cursor === nbCharactersToErase) return done()\n actor.displayValue = html.inject(value.substr(0, --cursor), htmlMap)\n\n return setTimeout(erase, speed || actor.getTypingSpeed(minSpeed, maxSpeed))\n })()\n\n return this\n }\n\n function callbackAction (done, callback) {\n callback.call(this, done)\n return this\n }\n\n function waitAction (done, delay) {\n setTimeout(done.bind(this), delay)\n return this\n }\n\n function subscribe (events, callback) {\n events.split(',').forEach(eventName => {\n eventName = eventName.trim()\n\n if (!type.isArray(props.events[eventName])) {\n props.events[eventName] = []\n }\n\n props.events[eventName].push(callback)\n })\n\n return this\n }\n\n function publish (...args) {\n const eventName = args[0]\n const callbacks = props.events[eventName] || []\n\n if (callbacks.length > 0) {\n callbacks\n .concat(props.events['*'] || [])\n .forEach(callback => callback(...args))\n }\n\n return this\n }\n\n /* ------------------------------------------------- *\\\n public api\n \\* ------------------------------------------------- */\n\n return Object.freeze({\n get options () { return props.options },\n get status () { return props.status },\n addActor,\n getCurrentActor,\n addScene,\n play,\n replay,\n stop,\n on: subscribe\n })\n}\n\ntheaterJS.init = function (actorName = 'actor') {\n let theater = theaterJS()\n theater.addActor(actorName, { accuracy: 1, speed: 0.8 })\n return theater\n}\n\nexport default theaterJS\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/theaterJS.js\n **/","function toString (o) {\n return {}.toString.call(o)\n}\n\nexport default {\n isNumber: function (o) {\n return typeof o === 'number'\n },\n\n isString: function (o) {\n return toString(o) === '[object String]'\n },\n\n isObject: function (o) {\n return toString(o) === '[object Object]'\n },\n\n isArray: function (o) {\n return toString(o) === '[object Array]'\n },\n\n isFunction: function (o) {\n return typeof o === 'function'\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/type.js\n **/","export default {\n merge (dst) {\n let objs = [].slice.call(arguments, 1)\n\n for (let i = 0, len = objs.length; i < len; i++) {\n let obj = objs[i]\n\n for (let key in obj) {\n if (!obj.hasOwnProperty(key)) continue\n dst[key] = obj[key]\n }\n }\n\n return dst\n },\n\n random (min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n },\n\n randomFloat (min, max) {\n return Math.random() * (max - min) + min\n },\n\n getPercentageOf (min, max, percentage) {\n return (min - (min * percentage)) + (max * percentage)\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/utils.js\n **/","import type from './helpers/type'\nimport utils from './helpers/utils'\n\nconst DOCUMENT = typeof window !== 'undefined' && window.document\nconst DEFAULTS = { speed: 0.6, accuracy: 0.6 }\n\nexport default function (actorName, props = {}, callback = null) {\n let displayValue = ''\n let $element\n\n if (type.isNumber(props)) {\n props = { speed: props, accuracy: props }\n }\n\n props = utils.merge({}, DEFAULTS, props)\n\n if (DOCUMENT) {\n if (callback == null) {\n callback = `#${actorName}`\n }\n\n if (type.isString(callback)) {\n let selector = callback\n let $e = DOCUMENT.querySelector(selector)\n\n if ($e != null) {\n $element = $e\n callback = function (newValue) { $element.innerHTML = newValue }\n } else {\n throw new Error(`no matches for ${actorName}'s selector: ${selector}`)\n }\n }\n }\n\n if (!type.isFunction(callback)) {\n callback = console.log.bind(console)\n }\n\n return {\n $element,\n\n get displayValue () {\n return displayValue\n },\n\n set displayValue (value) {\n displayValue = value\n callback(value)\n },\n\n get name () {\n return actorName\n },\n\n getTypingSpeed (fastest, slowest) {\n let speed = utils.randomFloat(props.speed, 1)\n return utils.getPercentageOf(slowest, fastest, speed)\n },\n\n shouldBeMistaken (actual, endValue, previousMistakeCursor = null, previousFixCursor = null) {\n let accuracy = props.accuracy * 10\n\n if (accuracy >= 8) {\n return false\n }\n\n if (actual.length <= accuracy) {\n return false\n }\n\n if (actual.length === endValue.length) {\n return false\n }\n\n if (type.isNumber(previousMistakeCursor)) {\n let nbOfCharactersTyped = actual.length - previousMistakeCursor\n let maxWrongCharactersAllowed = accuracy >= 6 ? 10 - accuracy : 4\n\n if (nbOfCharactersTyped >= maxWrongCharactersAllowed) {\n return false\n }\n }\n\n if (type.isNumber(previousFixCursor)) {\n let nbOfCharactersTyped = actual.length - previousFixCursor\n let minCharactersBetweenMistakes = Math.max(accuracy, 2) * 2\n\n if (nbOfCharactersTyped <= minCharactersBetweenMistakes) {\n return false\n }\n }\n\n return utils.randomFloat(0, 0.8) > props.accuracy\n }\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/actor.js\n **/","import voidElements from '../void-elements.json'\n\nfunction isVoidElement (tag) {\n const tagName = tag.match(/<([^\\s>]+)/)\n return Boolean(tagName) && voidElements.indexOf(tagName[1].toLowerCase()) > -1\n}\n\nexport default {\n strip (str) {\n return str.replace(/(<([^>]+)>)/gi, '')\n },\n\n map (str) {\n let regexp = /<[^>]+>/gi\n let tags = []\n let openers = []\n let result\n let tag\n\n while ((result = regexp.exec(str))) {\n tag = {\n tagName: result[0],\n position: result.index\n }\n\n if (tag.tagName.charAt(1) === '/') {\n tag.opener = openers.pop()\n } else if (tag.tagName.charAt(tag.tagName.length - 2) !== '/' && !isVoidElement(tag.tagName)) {\n openers.push(tag)\n }\n\n tags.push(tag)\n }\n\n return tags\n },\n\n inject (str, map) {\n for (let i = 0, tag; i < map.length; i++) {\n tag = map[i]\n\n if (str.length > 0 && tag.position <= str.length) {\n str = str.substr(0, tag.position) + tag.tagName + str.substr(tag.position)\n } else if (tag.opener && tag.opener.position < str.length) {\n str += tag.tagName\n }\n }\n\n return str\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/html.js\n **/","import type from './type'\nimport utils from './utils'\nimport keyboards from '../keyboards.json'\nconst DEFAULT_LOCALE = 'en'\n\nfor (let locale in keyboards) {\n if (!keyboards.hasOwnProperty(locale)) continue\n\n let keyboard = keyboards[locale]\n keyboards[locale] = { list: keyboard, mapped: mapKeyboard(keyboard) }\n}\n\nfunction mapKeyboard (alphabet) {\n let keyboard = {}\n\n for (let y = 0, lines = alphabet.length, chars; y < lines; y++) {\n chars = alphabet[y]\n\n for (let x = 0, charsLength = chars.length; x < charsLength; x++) {\n keyboard[chars[x]] = { x: x, y: y }\n }\n }\n\n return keyboard\n}\n\nexport default {\n defaultLocale: DEFAULT_LOCALE,\n\n supports (locale) {\n return type.isObject(keyboards[locale])\n },\n\n randomCharNear (ch, locale) {\n if (!this.supports(locale)) {\n throw new Error(`locale \"${locale}\" is not supported`)\n }\n\n let keyboard = keyboards[locale].mapped\n let threshold = 1\n let nearbyChars = []\n let uppercase = /[A-Z]/.test(ch)\n\n ch = ch.toLowerCase()\n\n let charPosition = keyboard[ch] || []\n let p\n\n for (let c in keyboard) {\n if (!keyboard.hasOwnProperty(c) || c === ch) continue\n\n p = keyboard[c]\n\n if (Math.abs(charPosition.x - p.x) <= threshold && Math.abs(charPosition.y - p.y) <= threshold) {\n nearbyChars.push(c)\n }\n }\n\n let randomChar =\n nearbyChars.length > 0\n ? nearbyChars[utils.random(0, nearbyChars.length - 1)]\n : this.randomChar(locale)\n\n if (uppercase) {\n randomChar = randomChar.toUpperCase()\n }\n\n return randomChar\n },\n\n randomChar: function (locale) {\n if (!this.supports(locale)) {\n throw new Error(`locale \"${locale}\" is not supported`)\n }\n\n let chars = keyboards[locale].list.join('')\n return chars.charAt(utils.random(0, chars.length - 1))\n }\n}\n\n\n\n/** WEBPACK FOOTER **\n ** ./src/helpers/keyboard.js\n **/","module.exports = {\n\t\"en\": [\n\t\t\"qwertyuiop\",\n\t\t\"asdfghjkl\",\n\t\t\"zxcvbnm\"\n\t],\n\t\"fr\": [\n\t\t\"azertyuiop\",\n\t\t\"qsdfghjklm\",\n\t\t\"wxcvbn\"\n\t],\n\t\"da\": [\n\t\t\"qwertyuiopå\",\n\t\t\"asdfghjklæø\",\n\t\t\"zxcvbnm\"\n\t],\n\t\"de\": [\n\t\t\"qwertzuiopü\",\n\t\t\"asdfghjklöä\",\n\t\t\"yxcvbnm\"\n\t],\n\t\"pl\": [\n\t\t\"qwertyuiopęó\",\n\t\t\"asdfghjkląśł\",\n\t\t\"zxcvbnmżźćń\"\n\t],\n\t\"pt\": [\n\t\t\"qwertyuiop\",\n\t\t\"asdfghjklç\",\n\t\t\"zxcvbnm\"\n\t],\n\t\"ru\": [\n\t\t\"йцукенгшщзх\",\n\t\t\"фывапролджэ\",\n\t\t\"ячсмитьбюъ\"\n\t],\n\t\"es\": [\n\t\t\"qwertyuiop\",\n\t\t\"asdfghjklñ\",\n\t\t\"zxcvbnm\"\n\t]\n};\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/keyboards.json\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = [\n\t\"area\",\n\t\"base\",\n\t\"br\",\n\t\"col\",\n\t\"embed\",\n\t\"hr\",\n\t\"img\",\n\t\"input\",\n\t\"keygen\",\n\t\"link\",\n\t\"menuitem\",\n\t\"meta\",\n\t\"param\",\n\t\"source\",\n\t\"track\",\n\t\"wbr\"\n];\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/void-elements.json\n ** module id = 7\n ** module chunks = 0\n **/"],"sourceRoot":""}
{
"name": "theaterjs",
"version": "3.0.0",
"version": "3.1.0",
"description": "Typing effect mimicking human behavior.",

@@ -12,11 +12,7 @@ "scripts": {

},
"main": "index.js",
"files": [
"dist",
"src",
"CONTRIBUTING.md",
"index.js",
"LICENSE",
"MIGRATING.md",
"package.json",
"README.md"
"package.json"
],

@@ -23,0 +19,0 @@ "pre-commit": [

@@ -387,2 +387,7 @@ # TheaterJS

### 3.1.0 - 2016-11-14
* add "main" property to the package.json
* remove irrelevant files from the npm package
### 3.0.0 - 2016-03-20

@@ -389,0 +394,0 @@

# Setup
Fork the repository, clone it then:
1. `cd TheaterJS`
2. `npm install`
# Tasks
TheaterJS' build workflow is based on npm scripts and webpack:
* `npm run build` - build the dist version of TheaterJS.
* `npm run dev` - watch for changes and build the dist version when needed.
* `npm run lint` - lint js files using [standard](http://standardjs.com/).
* `npm run test` - run the tests.
Note: there's a git pre-commit hook that's going to run the tests when using `git commit`.
# Adding a keyboard
The keyboards are implemented in `src/keyboards.json`.
A mapped keyboard is just a list of characters, ordered after their "physical" equivalent.
So for example, the english keyboard (aka `qwerty`) looks like this:
```javascript
[
"qwertyuiop",
"asdfghjkl",
"zxcvbnm"
]
```
# Migrating from v1 to v2
TheaterJS' version 2 introduces lots of breaking changes and one could argue that it's almost a new library.
Hopefully, migrating from v1 to v2 should be just about renaming stuff - the core principles stayed the same.
Under the hood, TheaterJS v2 is more robust, simpler and funnier.
* [Migration Example](https://github.com/Zhouzi/TheaterJS/blob/master/MIGRATING.md#migration-example)
* [List of changes](https://github.com/Zhouzi/TheaterJS/blob/master/MIGRATING.md#list-of-changes)
Scared about the migration?
Feel free to [submit an issue](https://github.com/Zhouzi/TheaterJS/issues), I'll review the code and eventually add it as an example to this guide.
## Migration Example
### v1
[jsFiddle](http://jsfiddle.net/vtf5ueg1/2/)
```html
<div id="vader"></div>
<script src="path/to/theater.min.js"></script>
<script>
var theater = new TheaterJS()
theater
.on('say:start, erase:start', function () {
var currentActor = theater.current
var currentActorElement = currentActor.voice
currentActorElement.classList.add('blinking-caret')
})
.on('say:end, erase:end', function () {
var currentActor = theater.current
var currentActorElement = currentActor.voice
currentActorElement.classList.remove('blinking-caret')
})
theater
.describe('vader', 0.8, '#vader')
.write('vader:Luke...', -3, '.', 400)
.write({name:'callback', args: [function () {
// do some funny stuff like making the screen blink
this.next()
}, true]})
.write('vader:I am your father...')
.write(function () { this.play(true) })
</script>
```
### v2
[jsFiddle](http://jsfiddle.net/vtf5ueg1/3/)
```html
<div id="vader"></div>
<script src="path/to/theater.min.js"></script>
<script>
var theater = theaterJS()
theater
.on('type:start, erase:start', function () {
var currentActor = theater.getCurrentActor()
var currentActorElement = currentActor.$element
currentActorElement.classList.add('blinking-caret')
})
.on('type:end, erase:end', function () {
var currentActor = theater.getCurrentActor()
var currentActorElement = currentActor.$element
currentActorElement.classList.remove('blinking-caret')
})
theater
.addActor('vader')
.addScene('vader:Luke...', -3, '.', 400)
.addScene(function (done) {
// do some funny stuff like making the screen blink
done()
})
.addScene('vader:I am your father...')
.addScene(theater.replay)
</script>
```
## List of changes
* TheaterJS is now instantiated via a factory:
* v1: `new TheaterJS()`
* v2: `theaterJS()`
* Renamed `write` to `addScene` for clarity:
* v1: `theater.write('vader:Luke.')`
* v2: `theater.addScene('vader:Luke.')`
* Renamed `describe` to `addActor` for clarity and made it even simpler:
* v1: `theater.describe('vader', 0.8, '#vader')`
* v2: `theater.addActor('vader')` the selector default to the actor's name: `#vader`
* Added a replay method that can be used as a callback:
* v1: `theater.write(function () { this.play(true) })`
* v2: `theater.addScene(theater.replay)`
* Callback scenes now receive a function to call to play the next scene:
* v1: `theater.write(function () { /* do some synchronous stuff */ })`
* v2: `theater.write(function (done) { /* do some sync/async stuff */ done() })`
For more details, please have a look at the [documentation](https://github.com/Zhouzi/TheaterJS#documentation).
import type from './helpers/type'
import utils from './helpers/utils'
const DOCUMENT = typeof window !== 'undefined' && window.document
const DEFAULTS = { speed: 0.6, accuracy: 0.6 }
export default function (actorName, props = {}, callback = null) {
let displayValue = ''
let $element
if (type.isNumber(props)) {
props = { speed: props, accuracy: props }
}
props = utils.merge({}, DEFAULTS, props)
if (DOCUMENT) {
if (callback == null) {
callback = `#${actorName}`
}
if (type.isString(callback)) {
let selector = callback
let $e = DOCUMENT.querySelector(selector)
if ($e != null) {
$element = $e
callback = function (newValue) { $element.innerHTML = newValue }
} else {
throw new Error(`no matches for ${actorName}'s selector: ${selector}`)
}
}
}
if (!type.isFunction(callback)) {
callback = console.log.bind(console)
}
return {
$element,
get displayValue () {
return displayValue
},
set displayValue (value) {
displayValue = value
callback(value)
},
get name () {
return actorName
},
getTypingSpeed (fastest, slowest) {
let speed = utils.randomFloat(props.speed, 1)
return utils.getPercentageOf(slowest, fastest, speed)
},
shouldBeMistaken (actual, endValue, previousMistakeCursor = null, previousFixCursor = null) {
let accuracy = props.accuracy * 10
if (accuracy >= 8) {
return false
}
if (actual.length <= accuracy) {
return false
}
if (actual.length === endValue.length) {
return false
}
if (type.isNumber(previousMistakeCursor)) {
let nbOfCharactersTyped = actual.length - previousMistakeCursor
let maxWrongCharactersAllowed = accuracy >= 6 ? 10 - accuracy : 4
if (nbOfCharactersTyped >= maxWrongCharactersAllowed) {
return false
}
}
if (type.isNumber(previousFixCursor)) {
let nbOfCharactersTyped = actual.length - previousFixCursor
let minCharactersBetweenMistakes = Math.max(accuracy, 2) * 2
if (nbOfCharactersTyped <= minCharactersBetweenMistakes) {
return false
}
}
return utils.randomFloat(0, 0.8) > props.accuracy
}
}
}
import voidElements from '../void-elements.json'
function isVoidElement (tag) {
const tagName = tag.match(/<([^\s>]+)/)
return Boolean(tagName) && voidElements.indexOf(tagName[1].toLowerCase()) > -1
}
export default {
strip (str) {
return str.replace(/(<([^>]+)>)/gi, '')
},
map (str) {
let regexp = /<[^>]+>/gi
let tags = []
let openers = []
let result
let tag
while ((result = regexp.exec(str))) {
tag = {
tagName: result[0],
position: result.index
}
if (tag.tagName.charAt(1) === '/') {
tag.opener = openers.pop()
} else if (tag.tagName.charAt(tag.tagName.length - 2) !== '/' && !isVoidElement(tag.tagName)) {
openers.push(tag)
}
tags.push(tag)
}
return tags
},
inject (str, map) {
for (let i = 0, tag; i < map.length; i++) {
tag = map[i]
if (str.length > 0 && tag.position <= str.length) {
str = str.substr(0, tag.position) + tag.tagName + str.substr(tag.position)
} else if (tag.opener && tag.opener.position < str.length) {
str += tag.tagName
}
}
return str
}
}
import type from './type'
import utils from './utils'
import keyboards from '../keyboards.json'
const DEFAULT_LOCALE = 'en'
for (let locale in keyboards) {
if (!keyboards.hasOwnProperty(locale)) continue
let keyboard = keyboards[locale]
keyboards[locale] = { list: keyboard, mapped: mapKeyboard(keyboard) }
}
function mapKeyboard (alphabet) {
let keyboard = {}
for (let y = 0, lines = alphabet.length, chars; y < lines; y++) {
chars = alphabet[y]
for (let x = 0, charsLength = chars.length; x < charsLength; x++) {
keyboard[chars[x]] = { x: x, y: y }
}
}
return keyboard
}
export default {
defaultLocale: DEFAULT_LOCALE,
supports (locale) {
return type.isObject(keyboards[locale])
},
randomCharNear (ch, locale) {
if (!this.supports(locale)) {
throw new Error(`locale "${locale}" is not supported`)
}
let keyboard = keyboards[locale].mapped
let threshold = 1
let nearbyChars = []
let uppercase = /[A-Z]/.test(ch)
ch = ch.toLowerCase()
let charPosition = keyboard[ch] || []
let p
for (let c in keyboard) {
if (!keyboard.hasOwnProperty(c) || c === ch) continue
p = keyboard[c]
if (Math.abs(charPosition.x - p.x) <= threshold && Math.abs(charPosition.y - p.y) <= threshold) {
nearbyChars.push(c)
}
}
let randomChar =
nearbyChars.length > 0
? nearbyChars[utils.random(0, nearbyChars.length - 1)]
: this.randomChar(locale)
if (uppercase) {
randomChar = randomChar.toUpperCase()
}
return randomChar
},
randomChar: function (locale) {
if (!this.supports(locale)) {
throw new Error(`locale "${locale}" is not supported`)
}
let chars = keyboards[locale].list.join('')
return chars.charAt(utils.random(0, chars.length - 1))
}
}
function toString (o) {
return {}.toString.call(o)
}
export default {
isNumber: function (o) {
return typeof o === 'number'
},
isString: function (o) {
return toString(o) === '[object String]'
},
isObject: function (o) {
return toString(o) === '[object Object]'
},
isArray: function (o) {
return toString(o) === '[object Array]'
},
isFunction: function (o) {
return typeof o === 'function'
}
}
export default {
merge (dst) {
let objs = [].slice.call(arguments, 1)
for (let i = 0, len = objs.length; i < len; i++) {
let obj = objs[i]
for (let key in obj) {
if (!obj.hasOwnProperty(key)) continue
dst[key] = obj[key]
}
}
return dst
},
random (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
},
randomFloat (min, max) {
return Math.random() * (max - min) + min
},
getPercentageOf (min, max, percentage) {
return (min - (min * percentage)) + (max * percentage)
}
}
{
"en": [
"qwertyuiop",
"asdfghjkl",
"zxcvbnm"
],
"fr": [
"azertyuiop",
"qsdfghjklm",
"wxcvbn"
],
"da": [
"qwertyuiopå",
"asdfghjklæø",
"zxcvbnm"
],
"de": [
"qwertzuiopü",
"asdfghjklöä",
"yxcvbnm"
],
"pl": [
"qwertyuiopęó",
"asdfghjkląśł",
"zxcvbnmżźćń"
],
"pt": [
"qwertyuiop",
"asdfghjklç",
"zxcvbnm"
],
"ru": [
"йцукенгшщзх",
"фывапролджэ",
"ячсмитьбюъ"
]
}
import actor from './actor'
import utils from './helpers/utils'
import type from './helpers/type'
import keyboard from './helpers/keyboard'
import html from './helpers/html'
const NAVIGATOR = typeof window !== 'undefined' && window.navigator
const DEFAULTS = {
autoplay: true,
erase: true,
minSpeed: { erase: 80, type: 80 },
maxSpeed: { erase: 450, type: 450 },
locale: 'detect'
}
function theaterJS (options = {}) {
/* ------------------------------------------------- *\
init
\* ------------------------------------------------- */
options = utils.merge({}, DEFAULTS, options)
if (type.isNumber(options.minSpeed)) {
const { minSpeed } = options
options.minSpeed = { erase: minSpeed, type: minSpeed }
}
if (type.isNumber(options.maxSpeed)) {
const { maxSpeed } = options
options.maxSpeed = { erase: maxSpeed, type: maxSpeed }
}
if (options.locale === 'detect' && NAVIGATOR) {
let languages = NAVIGATOR.languages
if (type.isArray(languages) && type.isString(languages[0])) {
options.locale = languages[0].substr(0, 2)
}
}
if (!keyboard.supports(options.locale)) {
options.locale = keyboard.defaultLocale
}
let props = { options, casting: {}, status: 'ready', onStage: null, currentScene: -1, scenario: [], events: {} }
setCurrentActor(null)
/* ------------------------------------------------- *\
methods
\* ------------------------------------------------- */
function addActor (actorName, options = {}, callback = null) {
let a = actor(actorName, options, callback)
props.casting[a.name] = a
return this
}
function setCurrentActor (actorName) {
props.onStage = actorName
return this
}
function getCurrentActor () {
return props.casting[props.onStage] || null
}
function addScene (...scenes) {
const sequence = []
function addSceneToSequence (scene) {
if (type.isArray(scene)) {
scene.forEach(function (s) { addSceneToSequence(s) })
}
if (type.isString(scene)) {
let partials = scene.split(':')
let actorName
if (partials.length > 1 && partials[0].charAt(partials[0].length - 1) !== '\\') {
actorName = partials.shift()
addSceneToSequence({ name: 'erase', actor: actorName })
}
let speech = partials.join(':').replace(/\\:/g, ':')
let sceneObj = { name: 'type', args: [speech] }
if (actorName != null) {
sceneObj.actor = actorName
}
addSceneToSequence(sceneObj)
}
if (type.isFunction(scene)) {
addSceneToSequence({ name: 'callback', args: [scene] })
}
if (type.isNumber(scene)) {
if (scene > 0) {
addSceneToSequence({ name: 'wait', args: [scene] })
} else {
addSceneToSequence({ name: 'erase', args: [scene] })
}
}
if (type.isObject(scene)) {
if (!type.isArray(scene.args)) {
scene.args = []
}
scene.args.unshift(function () {
publish(`${scene.name}:end`, scene)
playNextScene()
})
sequence.push(scene)
}
}
addSceneToSequence([{ name: 'publisher', args: ['sequence:start'] }].concat(scenes).concat({ name: 'publisher', args: ['sequence:end'] }))
Array.prototype.push.apply(props.scenario, sequence)
if (props.options.autoplay) {
play()
}
return this
}
function play () {
if (props.status === 'stopping') {
props.status = 'playing'
}
if (props.status === 'ready') {
props.status = 'playing'
playNextScene()
}
return this
}
function replay (done) {
if (props.status === 'ready' || type.isFunction(done)) {
props.currentScene = -1
if (props.status === 'ready') play()
else done()
}
return this
}
function stop () {
props.status = 'stopping'
return this
}
function playNextScene () {
if (props.status === 'stopping') {
props.status = 'ready'
return this
}
if (props.status !== 'playing') return this
if (props.currentScene + 1 >= props.scenario.length) {
props.status = 'ready'
publish('scenario:end')
return this
}
let nextScene = props.scenario[++props.currentScene]
if (props.currentScene === 0) {
publish('scenario:start')
}
if (nextScene.name === 'publisher') {
const [done, ...args] = nextScene.args
publish(...args)
return done()
}
if (nextScene.actor) {
setCurrentActor(nextScene.actor)
}
publish(`${nextScene.name}:start`, nextScene)
switch (nextScene.name) {
case 'type':
typeAction(...nextScene.args)
break
case 'erase':
eraseAction(...nextScene.args)
break
case 'callback':
callbackAction(...nextScene.args)
break
case 'wait':
waitAction(...nextScene.args)
break
default:
console.debug(`No scene handler for ${nextScene.name}`)
break
}
return this
}
function typeAction (done, value) {
let actor = getCurrentActor()
let locale = props.options.locale
let minSpeed = props.options.minSpeed.type
let maxSpeed = props.options.maxSpeed.type
let initialValue = actor.displayValue
let cursor = -1
let isFixing = false
let previousMistakeCursor = null
let previousFixCursor = null
let htmlMap = html.map(value)
value = html.strip(value)
;(function type () {
let actual = html.strip(actor.displayValue.substr(initialValue.length))
if (actual === value) return done()
let expected = value.substr(0, cursor + 1)
let isMistaking = actual !== expected
let shouldBeMistaken = actor.shouldBeMistaken(actual, value, previousMistakeCursor, previousFixCursor)
let shouldFix = isFixing || !shouldBeMistaken
if (isMistaking && shouldFix) {
isFixing = true
previousMistakeCursor = null
actor.displayValue = initialValue + html.inject(actual.substr(0, actual.length - 1), htmlMap)
cursor--
previousFixCursor = cursor
} else {
isFixing = false
let nextChar = value.charAt(++cursor)
if (shouldBeMistaken) {
nextChar = keyboard.randomCharNear(nextChar, locale)
if (previousMistakeCursor == null) {
previousMistakeCursor = cursor
}
}
actor.displayValue = initialValue + html.inject(actual + nextChar, htmlMap)
}
return setTimeout(type, actor.getTypingSpeed(minSpeed, maxSpeed))
})()
return this
}
function eraseAction (done, arg) {
let actor = getCurrentActor()
// erase scenes are added before a type scene
// so for the first scene, there's no actor yet
if (actor == null) {
return done()
}
if (options.erase !== true) {
actor.displayValue = ''
return done()
}
let minSpeed = props.options.minSpeed.erase
let maxSpeed = props.options.maxSpeed.erase
let value = actor.displayValue
let htmlMap = html.map(value)
value = html.strip(value)
let cursor = value.length
let speed
let nbCharactersToErase = 0
if (type.isNumber(arg)) {
if (arg > 0) speed = arg
else nbCharactersToErase = value.length + arg
}
(function erase () {
if (cursor === nbCharactersToErase) return done()
actor.displayValue = html.inject(value.substr(0, --cursor), htmlMap)
return setTimeout(erase, speed || actor.getTypingSpeed(minSpeed, maxSpeed))
})()
return this
}
function callbackAction (done, callback) {
callback.call(this, done)
return this
}
function waitAction (done, delay) {
setTimeout(done.bind(this), delay)
return this
}
function subscribe (events, callback) {
events.split(',').forEach(eventName => {
eventName = eventName.trim()
if (!type.isArray(props.events[eventName])) {
props.events[eventName] = []
}
props.events[eventName].push(callback)
})
return this
}
function publish (...args) {
const eventName = args[0]
const callbacks = props.events[eventName] || []
if (callbacks.length > 0) {
callbacks
.concat(props.events['*'] || [])
.forEach(callback => callback(...args))
}
return this
}
/* ------------------------------------------------- *\
public api
\* ------------------------------------------------- */
return Object.freeze({
get options () { return props.options },
get status () { return props.status },
addActor,
getCurrentActor,
addScene,
play,
replay,
stop,
on: subscribe
})
}
theaterJS.init = function (actorName = 'actor') {
let theater = theaterJS()
theater.addActor(actorName, { accuracy: 1, speed: 0.8 })
return theater
}
export default theaterJS
[
"area",
"base",
"br",
"col",
"embed",
"hr",
"img",
"input",
"keygen",
"link",
"menuitem",
"meta",
"param",
"source",
"track",
"wbr"
]