+48
-23
@@ -67,2 +67,4 @@ (function webpackUniversalModuleDefinition(root, factory) { | ||
| function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } | ||
| var _actor = __webpack_require__(1); | ||
@@ -158,7 +160,11 @@ | ||
| function addScene() { | ||
| var _this = this; | ||
| var sequence = []; | ||
| var scenes = _helpersUtils2['default'].toArray(arguments); | ||
| function addSceneToSequence(scene) { | ||
| if (_helpersType2['default'].isArray(scene)) { | ||
| scene.forEach(function (s) { | ||
| addSceneToSequence(s); | ||
| }); | ||
| } | ||
| scenes.forEach(function (scene) { | ||
| if (_helpersType2['default'].isString(scene)) { | ||
@@ -172,3 +178,3 @@ var partials = scene.split(':'); | ||
| if (props.options.erase) { | ||
| addScene({ name: 'erase', actor: actorName }); | ||
| addSceneToSequence({ name: 'erase', actor: actorName }); | ||
| } | ||
@@ -184,16 +190,18 @@ } | ||
| addScene(sceneObj); | ||
| } else if (_helpersType2['default'].isFunction(scene)) { | ||
| addScene({ name: 'callback', args: [scene] }); | ||
| } else if (_helpersType2['default'].isNumber(scene)) { | ||
| addSceneToSequence(sceneObj); | ||
| } | ||
| if (_helpersType2['default'].isFunction(scene)) { | ||
| addSceneToSequence({ name: 'callback', args: [scene] }); | ||
| } | ||
| if (_helpersType2['default'].isNumber(scene)) { | ||
| if (scene > 0) { | ||
| addScene({ name: 'wait', args: [scene] }); | ||
| addSceneToSequence({ name: 'wait', args: [scene] }); | ||
| } else { | ||
| addScene({ name: 'erase', args: [scene] }); | ||
| addSceneToSequence({ name: 'erase', args: [scene] }); | ||
| } | ||
| } else if (_helpersType2['default'].isArray(scene)) { | ||
| scene.forEach(function (s) { | ||
| addScene(s); | ||
| }); | ||
| } else if (_helpersType2['default'].isObject(scene)) { | ||
| } | ||
| if (_helpersType2['default'].isObject(scene)) { | ||
| if (!_helpersType2['default'].isArray(scene.args)) { | ||
@@ -203,9 +211,18 @@ scene.args = []; | ||
| scene.args.unshift(playNextScene.bind(_this)); | ||
| props.scenario.push(scene); | ||
| scene.args.unshift(playNextScene.bind(this)); | ||
| sequence.push(scene); | ||
| } | ||
| }); | ||
| } | ||
| if (props.options.autoplay) play(); | ||
| for (var _len = arguments.length, scenes = Array(_len), _key = 0; _key < _len; _key++) { | ||
| scenes[_key] = arguments[_key]; | ||
| } | ||
| 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; | ||
@@ -261,2 +278,14 @@ } | ||
| if (nextScene.name === 'publisher') { | ||
| var _nextScene$args = _toArray(nextScene.args); | ||
| var done = _nextScene$args[0]; | ||
| var args = _nextScene$args.slice(1); | ||
| publish.apply(undefined, _toConsumableArray(args)); | ||
| return done(); | ||
| } | ||
| if (nextScene.actor) { | ||
@@ -633,6 +662,2 @@ setCurrentActor(nextScene.actor); | ||
| exports["default"] = { | ||
| toArray: function toArray(ar) { | ||
| return [].slice.call(ar); | ||
| }, | ||
| merge: function merge(dst) { | ||
@@ -639,0 +664,0 @@ var objs = [].slice.call(arguments, 1); |
| !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(){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,i["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(){var e=this,t=l["default"].toArray(arguments);return t.forEach(function(t){if(c["default"].isString(t)){var r=t.split(":"),a=void 0;r.length>1&&"\\"!==r[0].charAt(r[0].length-1)&&(a=r.shift(),N.options.erase&&n({name:"erase",actor:a}));var u=r.join(":").replace(/\\:/g,":"),o={name:"type",args:[u]};null!=a&&(o.actor=a),n(o)}else c["default"].isFunction(t)?n({name:"callback",args:[t]}):c["default"].isNumber(t)?n(t>0?{name:"wait",args:[t]}:{name:"erase",args:[t]}):c["default"].isArray(t)?t.forEach(function(e){n(e)}):c["default"].isObject(t)&&(c["default"].isArray(t.args)||(t.args=[]),t.args.unshift(f.bind(e)),N.scenario.push(t))}),N.options.autoplay&&u(),this}function u(){return"stopping"===N.status&&(N.status="playing"),"ready"===N.status&&(N.status="playing",f()),this}function o(e){return("ready"===N.status||c["default"].isFunction(e))&&(N.currentScene=-1,"ready"===N.status?u():e()),this}function s(){return N.status="stopping",this}function f(){if("stopping"===N.status)return N.status="ready",this;if("playing"!==N.status)return this;var e=N.scenario[N.currentScene];if(null!=e&&S(e.name+":end",e),N.currentScene+1>=N.scenario.length)return N.status="ready",this;var r=N.scenario[++N.currentScene];switch(r.actor&&t(r.actor),S(r.name+":start",r),r.name){case"type":d.apply(void 0,a(r.args));break;case"erase":g.apply(void 0,a(r.args));break;case"callback":y.apply(void 0,a(r.args));break;case"wait":b.apply(void 0,a(r.args));break;default:console.debug("No scene handler for "+r.name)}return this}function d(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=h["default"].map(t);return t=h["default"].strip(t),function g(){var r=h["default"].strip(n.displayValue.substr(i.length));if(r===t)return e();var v=t.substr(0,s+1),m=r!==v,y=n.shouldBeMistaken(r,t,f,c),b=l||!y;if(m&&b)l=!0,f=null,n.displayValue=i+h["default"].inject(r.substr(0,r.length-1),d),s--,c=s;else{l=!1;var x=t.charAt(++s);y&&(x=p["default"].randomCharNear(x,a),null==f&&(f=s)),n.displayValue=i+h["default"].inject(r+x,d)}return setTimeout(g,n.getTypingSpeed(u,o))}(),this}function g(e,t){var n=r(),a=N.options.minSpeed.erase,u=N.options.maxSpeed.erase,o=n.displayValue,i=h["default"].map(o);o=h["default"].strip(o);var s=o.length,l=void 0,f=0;return c["default"].isNumber(t)&&(t>0?l=t:f=o.length+t),function d(){return s===f?e():(n.displayValue=h["default"].inject(o.substr(0,--s),i),setTimeout(d,l||n.getTypingSpeed(a,u)))}(),this}function y(e,t){return t.call(this,e),this}function b(e,t){return setTimeout(e.bind(this),t),this}function x(e,t){return e.split(",").forEach(function(e){e=e.trim(),c["default"].isArray(N.events[e])||(N.events[e]=[]),N.events[e].push(t)}),this}function S(e){var t=arguments;return c["default"].isArray(N.events[e])&&!function(){var r=[].slice.call(t,1);r.unshift(e);var n=(N.events[e]||[]).concat(N.events["*"]||[]);n.forEach(function(e){e.apply(void 0,a(r))})}(),this}var j=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(j=l["default"].merge({},m,j),c["default"].isNumber(j.minSpeed)){var w=j,A=w.minSpeed;j.minSpeed={erase:A,type:A}}if(c["default"].isNumber(j.maxSpeed)){var _=j,M=_.maxSpeed;j.maxSpeed={erase:M,type:M}}if("detect"===j.locale&&v){var O=v.languages;c["default"].isArray(O)&&c["default"].isString(O[0])&&(j.locale=O[0].substr(0,2))}p["default"].supports(j.locale)||(j.locale=p["default"].defaultLocale);var N={options:j,casting:{},status:"ready",onStage:null,currentScene:-1,scenario:[],events:{}};return t(null),Object.freeze(Object.defineProperties({addActor:e,getCurrentActor:r,addScene:n,play:u,replay:o,stop:s,on:x},{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 o=r(3),i=n(o),s=r(2),l=n(s),f=r(1),c=n(f),d=r(5),p=n(d),g=r(4),h=n(g),v="undefined"!=typeof window&&window.navigator,m={autoplay:!0,erase:!0,minSpeed:{erase:80,type:80},maxSpeed:{erase:450,type:450},locale:"detect"};u.init=function(){var e=arguments.length<=0||void 0===arguments[0]?"actor":arguments[0],t=u();return t.addActor(e,{accuracy:1,speed:.8}),t},t["default"]=u,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 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(),k.options.erase&&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(f.bind(this)),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",f()),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 f(){if("stopping"===k.status)return k.status="ready",this;if("playing"!==k.status)return this;var e=k.scenario[k.currentScene];if(null!=e&&j(e.name+":end",e),k.currentScene+1>=k.scenario.length)return k.status="ready",this;var r=k.scenario[++k.currentScene];if("publisher"===r.name){var n=u(r.args),o=n[0],i=n.slice(1);return j.apply(void 0,a(i)),o()}switch(r.actor&&t(r.actor),j(r.name+":start",r),r.name){case"type":p.apply(void 0,a(r.args));break;case"erase":h.apply(void 0,a(r.args));break;case"callback":b.apply(void 0,a(r.args));break;case"wait":x.apply(void 0,a(r.args));break;default:console.debug("No scene handler for "+r.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,c=null,f=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,c,f),b=l||!y;if(v&&b)l=!0,c=null,n.displayValue=i+m["default"].inject(r.substr(0,r.length-1),d),s--,f=s;else{l=!1;var x=t.charAt(++s);y&&(x=g["default"].randomCharNear(x,a),null==c&&(c=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(),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,c=0;return d["default"].isNumber(t)&&(t>0?l=t:c=o.length+t),function f(){return s===c?e():(n.displayValue=m["default"].inject(o.substr(0,--s),i),setTimeout(f,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(e){var t=arguments;return d["default"].isArray(k.events[e])&&!function(){var r=[].slice.call(t,1);r.unshift(e);var n=(k.events[e]||[]).concat(k.events["*"]||[]);n.forEach(function(e){e.apply(void 0,a(r))})}(),this}var w=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];if(w=c["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),c=n(l),f=r(1),d=n(f),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 ***! | ||
@@ -10,6 +10,6 @@ \*****************************/ | ||
| \******************************/ | ||
| function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t["default"]={toArray:function(e){return[].slice.call(e)},merge:function(e){for(var t=[].slice.call(arguments,1),r=0,n=t.length;n>r;r++){var a=t[r];for(var u in a)a.hasOwnProperty(u)&&(e[u]=a[u])}return e},random:function(e,t){return Math.floor(Math.random()*(t-e+1))+e},randomFloat:function(e,t){return Math.random()*(t-e)+e},getPercentageOf:function(e,t,r){return e-e*r+t*r}},e.exports=t["default"]},/*!**********************!*\ | ||
| function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t["default"]={merge:function(e){for(var t=[].slice.call(arguments,1),r=0,n=t.length;n>r;r++){var a=t[r];for(var u in a)a.hasOwnProperty(u)&&(e[u]=a[u])}return e},random:function(e,t){return Math.floor(Math.random()*(t-e+1))+e},randomFloat:function(e,t){return Math.random()*(t-e)+e},getPercentageOf:function(e,t,r){return e-e*r+t*r}},e.exports=t["default"]},/*!**********************!*\ | ||
| !*** ./src/actor.js ***! | ||
| \**********************/ | ||
| function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var a=r(1),u=n(a),o=r(2),i=n(o),s="undefined"!=typeof window&&window.document,l={speed:.6,accuracy:.6};t["default"]=function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],r=arguments.length<=2||void 0===arguments[2]?null:arguments[2],n="",a=void 0;if(u["default"].isNumber(t)&&(t={speed:t,accuracy:t}),t=i["default"].merge({},l,t),s&&(null==r&&(r="#"+e),u["default"].isString(r))){var o=r,f=s.querySelector(o);if(null==f)throw new Error("no matches for "+e+"'s selector: "+o);a=f,r=function(e){a.innerHTML=e}}return u["default"].isFunction(r)||(r=console.log.bind(console)),Object.defineProperties({$element:a,getTypingSpeed:function(e,r){var n=i["default"].randomFloat(t.speed,1);return i["default"].getPercentageOf(r,e,n)},shouldBeMistaken:function(e,r){var n=arguments.length<=2||void 0===arguments[2]?null:arguments[2],a=arguments.length<=3||void 0===arguments[3]?null:arguments[3],o=10*t.accuracy;if(o>=8)return!1;if(e.length<=o)return!1;if(e.length===r.length)return!1;if(u["default"].isNumber(n)){var s=e.length-n,l=o>=6?10-o:4;if(s>=l)return!1}if(u["default"].isNumber(a)){var s=e.length-a,f=2*Math.max(o,2);if(f>=s)return!1}return i["default"].randomFloat(0,.8)>t.accuracy}},{displayValue:{get:function(){return n},set:function(e){n=e,r(e)},configurable:!0,enumerable:!0},name:{get:function(){return e},configurable:!0,enumerable:!0}})},e.exports=t["default"]},/*!*****************************!*\ | ||
| function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}Object.defineProperty(t,"__esModule",{value:!0});var a=r(1),u=n(a),o=r(2),i=n(o),s="undefined"!=typeof window&&window.document,l={speed:.6,accuracy:.6};t["default"]=function(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],r=arguments.length<=2||void 0===arguments[2]?null:arguments[2],n="",a=void 0;if(u["default"].isNumber(t)&&(t={speed:t,accuracy:t}),t=i["default"].merge({},l,t),s&&(null==r&&(r="#"+e),u["default"].isString(r))){var o=r,c=s.querySelector(o);if(null==c)throw new Error("no matches for "+e+"'s selector: "+o);a=c,r=function(e){a.innerHTML=e}}return u["default"].isFunction(r)||(r=console.log.bind(console)),Object.defineProperties({$element:a,getTypingSpeed:function(e,r){var n=i["default"].randomFloat(t.speed,1);return i["default"].getPercentageOf(r,e,n)},shouldBeMistaken:function(e,r){var n=arguments.length<=2||void 0===arguments[2]?null:arguments[2],a=arguments.length<=3||void 0===arguments[3]?null:arguments[3],o=10*t.accuracy;if(o>=8)return!1;if(e.length<=o)return!1;if(e.length===r.length)return!1;if(u["default"].isNumber(n)){var s=e.length-n,l=o>=6?10-o:4;if(s>=l)return!1}if(u["default"].isNumber(a)){var s=e.length-a,c=2*Math.max(o,2);if(c>=s)return!1}return i["default"].randomFloat(0,.8)>t.accuracy}},{displayValue:{get:function(){return n},set:function(e){n=e,r(e)},configurable:!0,enumerable:!0},name:{get:function(){return e},configurable:!0,enumerable:!0}})},e.exports=t["default"]},/*!*****************************!*\ | ||
| !*** ./src/helpers/html.js ***! | ||
@@ -20,3 +20,3 @@ \*****************************/ | ||
| \*********************************/ | ||
| function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function a(e){for(var t={},r=0,n=e.length,a=void 0;n>r;r++){a=e[r];for(var u=0,o=a.length;o>u;u++)t[a[u]]={x:u,y:r}}return t}Object.defineProperty(t,"__esModule",{value:!0});var u=r(1),o=n(u),i=r(2),s=n(i),l=r(6),f=n(l),c="en";for(var d in f["default"])if(f["default"].hasOwnProperty(d)){var p=f["default"][d];f["default"][d]={list:p,mapped:a(p)}}t["default"]={defaultLocale:c,supports:function(e){return o["default"].isObject(f["default"][e])},randomCharNear:function(e,t){if(!this.supports(t))throw new Error('locale "'+t+'" is not supported');var r=f["default"][t].mapped,n=1,a=[],u=/[A-Z]/.test(e);e=e.toLowerCase();var o=r[e]||[],i=void 0;for(var l in r)r.hasOwnProperty(l)&&l!==e&&(i=r[l],Math.abs(o.x-i.x)<=n&&Math.abs(o.y-i.y)<=n&&a.push(l));var c=a.length>0?a[s["default"].random(0,a.length-1)]:this.randomChar(t);return u&&(c=c.toUpperCase()),c},randomChar:function(e){if(!this.supports(e))throw new Error('locale "'+e+'" is not supported');var t=f["default"][e].list.join("");return t.charAt(s["default"].random(0,t.length-1))}},e.exports=t["default"]},/*!****************************!*\ | ||
| function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function a(e){for(var t={},r=0,n=e.length,a=void 0;n>r;r++){a=e[r];for(var u=0,o=a.length;o>u;u++)t[a[u]]={x:u,y:r}}return t}Object.defineProperty(t,"__esModule",{value:!0});var u=r(1),o=n(u),i=r(2),s=n(i),l=r(6),c=n(l),f="en";for(var d in c["default"])if(c["default"].hasOwnProperty(d)){var p=c["default"][d];c["default"][d]={list:p,mapped:a(p)}}t["default"]={defaultLocale:f,supports:function(e){return o["default"].isObject(c["default"][e])},randomCharNear:function(e,t){if(!this.supports(t))throw new Error('locale "'+t+'" is not supported');var r=c["default"][t].mapped,n=1,a=[],u=/[A-Z]/.test(e);e=e.toLowerCase();var o=r[e]||[],i=void 0;for(var l in r)r.hasOwnProperty(l)&&l!==e&&(i=r[l],Math.abs(o.x-i.x)<=n&&Math.abs(o.y-i.y)<=n&&a.push(l));var f=a.length>0?a[s["default"].random(0,a.length-1)]:this.randomChar(t);return u&&(f=f.toUpperCase()),f},randomChar:function(e){if(!this.supports(e))throw new Error('locale "'+e+'" is not supported');var t=c["default"][e].list.join("");return t.charAt(s["default"].random(0,t.length-1))}},e.exports=t["default"]},/*!****************************!*\ | ||
| !*** ./src/keyboards.json ***! | ||
@@ -23,0 +23,0 @@ \****************************/ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///theater.min.js","webpack:///webpack/bootstrap 6515beb02c8afd2826b7","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","theaterJS","addActor","actorName","options","arguments","undefined","callback","a","_actor2","props","casting","name","setCurrentActor","onStage","getCurrentActor","addScene","_this","scenes","_helpersUtils2","toArray","forEach","scene","_helpersType2","isString","partials","split","charAt","shift","erase","actor","speech","join","replace","sceneObj","args","isFunction","isNumber","s","isObject","unshift","playNextScene","bind","scenario","push","autoplay","play","status","replay","done","currentScene","stop","publish","nextScene","typeAction","apply","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","speed","nbCharactersToErase","delay","subscribe","events","eventName","trim","_arguments","slice","callbacks","concat","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","ar","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\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 _this = this;\n\t\n\t var scenes = _helpersUtils2['default'].toArray(arguments);\n\t\n\t scenes.forEach(function (scene) {\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 if (props.options.erase) {\n\t addScene({ name: 'erase', actor: actorName });\n\t }\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 addScene(sceneObj);\n\t } else if (_helpersType2['default'].isFunction(scene)) {\n\t addScene({ name: 'callback', args: [scene] });\n\t } else if (_helpersType2['default'].isNumber(scene)) {\n\t if (scene > 0) {\n\t addScene({ name: 'wait', args: [scene] });\n\t } else {\n\t addScene({ name: 'erase', args: [scene] });\n\t }\n\t } else if (_helpersType2['default'].isArray(scene)) {\n\t scene.forEach(function (s) {\n\t addScene(s);\n\t });\n\t } else 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(playNextScene.bind(_this));\n\t props.scenario.push(scene);\n\t }\n\t });\n\t\n\t if (props.options.autoplay) play();\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 var currentScene = props.scenario[props.currentScene];\n\t\n\t if (currentScene != null) publish(currentScene.name + ':end', currentScene);\n\t\n\t if (props.currentScene + 1 >= props.scenario.length) {\n\t props.status = 'ready';\n\t return this;\n\t }\n\t\n\t var nextScene = props.scenario[++props.currentScene];\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 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(eventName) {\n\t var _arguments = arguments;\n\t\n\t if (_helpersType2['default'].isArray(props.events[eventName])) {\n\t (function () {\n\t var args = [].slice.call(_arguments, 1);\n\t args.unshift(eventName);\n\t\n\t var callbacks = (props.events[eventName] || []).concat(props.events['*'] || []);\n\t callbacks.forEach(function (callback) {\n\t callback.apply(undefined, _toConsumableArray(args));\n\t });\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 toArray: function toArray(ar) {\n\t return [].slice.call(ar);\n\t },\n\t\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 6515beb02c8afd2826b7\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 () {\n let scenes = utils.toArray(arguments)\n\n scenes.forEach(scene => {\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 if (props.options.erase) {\n addScene({ name: 'erase', actor: actorName })\n }\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 addScene(sceneObj)\n } else if (type.isFunction(scene)) {\n addScene({ name: 'callback', args: [scene] })\n } else if (type.isNumber(scene)) {\n if (scene > 0) {\n addScene({ name: 'wait', args: [scene] })\n } else {\n addScene({ name: 'erase', args: [scene] })\n }\n } else if (type.isArray(scene)) {\n scene.forEach(function (s) { addScene(s) })\n } else if (type.isObject(scene)) {\n if (!type.isArray(scene.args)) {\n scene.args = []\n }\n\n scene.args.unshift(playNextScene.bind(this))\n props.scenario.push(scene)\n }\n })\n\n if (props.options.autoplay) play()\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 let currentScene = props.scenario[props.currentScene]\n\n if (currentScene != null) publish(`${currentScene.name}:end`, currentScene)\n\n if (props.currentScene + 1 >= props.scenario.length) {\n props.status = 'ready'\n return this\n }\n\n let nextScene = props.scenario[++props.currentScene]\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 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 (eventName) {\n if (type.isArray(props.events[eventName])) {\n let args = [].slice.call(arguments, 1)\n args.unshift(eventName)\n\n let callbacks = (props.events[eventName] || []).concat(props.events['*'] || [])\n callbacks.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 toArray (ar) {\n return [].slice.call(ar)\n },\n\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 b3768062e16d793b9c26","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","erase","actor","speech","join","replace","sceneObj","args","isFunction","isNumber","isObject","unshift","playNextScene","bind","sequence","push","_len","scenes","_key","concat","prototype","apply","scenario","autoplay","play","status","replay","done","currentScene","stop","publish","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","speed","nbCharactersToErase","delay","subscribe","events","eventName","trim","_arguments","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 if (props.options.erase) {\n\t addSceneToSequence({ name: 'erase', actor: actorName });\n\t }\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(playNextScene.bind(this));\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 var currentScene = props.scenario[props.currentScene];\n\t\n\t if (currentScene != null) publish(currentScene.name + ':end', currentScene);\n\t\n\t if (props.currentScene + 1 >= props.scenario.length) {\n\t props.status = 'ready';\n\t return this;\n\t }\n\t\n\t var nextScene = props.scenario[++props.currentScene];\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 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(eventName) {\n\t var _arguments = arguments;\n\t\n\t if (_helpersType2['default'].isArray(props.events[eventName])) {\n\t (function () {\n\t var args = [].slice.call(_arguments, 1);\n\t args.unshift(eventName);\n\t\n\t var callbacks = (props.events[eventName] || []).concat(props.events['*'] || []);\n\t callbacks.forEach(function (callback) {\n\t callback.apply(undefined, _toConsumableArray(args));\n\t });\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 b3768062e16d793b9c26\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 if (props.options.erase) {\n addSceneToSequence({ name: 'erase', actor: actorName })\n }\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(playNextScene.bind(this))\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 let currentScene = props.scenario[props.currentScene]\n\n if (currentScene != null) publish(`${currentScene.name}:end`, currentScene)\n\n if (props.currentScene + 1 >= props.scenario.length) {\n props.status = 'ready'\n return this\n }\n\n let nextScene = props.scenario[++props.currentScene]\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 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 (eventName) {\n if (type.isArray(props.events[eventName])) {\n let args = [].slice.call(arguments, 1)\n args.unshift(eventName)\n\n let callbacks = (props.events[eventName] || []).concat(props.events['*'] || [])\n callbacks.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":""} |
+1
-1
| { | ||
| "name": "theaterjs", | ||
| "version": "2.0.2", | ||
| "version": "2.1.0", | ||
| "description": "Typing effect mimicking human behavior.", | ||
@@ -5,0 +5,0 @@ "scripts": { |
+11
-2
@@ -15,2 +15,4 @@ # TheaterJS | ||
| *If you're not particularly interested in managing multiple actors and the several features TheaterJS has to offer (e.g mistakes, variable speed, callbacks, html support, and so on), have a look at this [fiddle](https://jsfiddle.net/p1e9La6w/). It's a minimalist version that supports play/stop, it has a lot of comments so you understand what's going on under the hood. It might well be enough for you usage :)* | ||
| ## Installation | ||
@@ -111,3 +113,3 @@ | ||
| "minSpeed": 80, | ||
| "maxSpeed": 80 | ||
| "maxSpeed": 450 | ||
| } | ||
@@ -351,4 +353,7 @@ ``` | ||
| Note: listen to all event by using the '*' shortcut: `theater.on('*', callback)`. | ||
| A couple of things to note: | ||
| * Listen to all event by using the '*' shortcut: `theater.on('*', callback)`. | ||
| * An event is emitted when a sequence starts (`sequence:start`) and ends (`sequence:end`), e.g `theater.addScene('vader:Luke.', 'vader:I am your father.')` is one sequence. | ||
| ## Localized Keyboards | ||
@@ -372,2 +377,6 @@ | ||
| ### 2.1.0 - 2016-03-15 | ||
| * emit an event when a sequence starts and ends | ||
| ### 2.0.2 - 2016-03-13 | ||
@@ -374,0 +383,0 @@ |
| export default { | ||
| toArray (ar) { | ||
| return [].slice.call(ar) | ||
| }, | ||
| merge (dst) { | ||
@@ -7,0 +3,0 @@ let objs = [].slice.call(arguments, 1) |
+36
-16
@@ -67,6 +67,10 @@ import actor from './actor' | ||
| function addScene () { | ||
| let scenes = utils.toArray(arguments) | ||
| function addScene (...scenes) { | ||
| const sequence = [] | ||
| scenes.forEach(scene => { | ||
| function addSceneToSequence (scene) { | ||
| if (type.isArray(scene)) { | ||
| scene.forEach(function (s) { addSceneToSequence(s) }) | ||
| } | ||
| if (type.isString(scene)) { | ||
@@ -80,3 +84,3 @@ let partials = scene.split(':') | ||
| if (props.options.erase) { | ||
| addScene({ name: 'erase', actor: actorName }) | ||
| addSceneToSequence({ name: 'erase', actor: actorName }) | ||
| } | ||
@@ -92,14 +96,18 @@ } | ||
| addScene(sceneObj) | ||
| } else if (type.isFunction(scene)) { | ||
| addScene({ name: 'callback', args: [scene] }) | ||
| } else if (type.isNumber(scene)) { | ||
| addSceneToSequence(sceneObj) | ||
| } | ||
| if (type.isFunction(scene)) { | ||
| addSceneToSequence({ name: 'callback', args: [scene] }) | ||
| } | ||
| if (type.isNumber(scene)) { | ||
| if (scene > 0) { | ||
| addScene({ name: 'wait', args: [scene] }) | ||
| addSceneToSequence({ name: 'wait', args: [scene] }) | ||
| } else { | ||
| addScene({ name: 'erase', args: [scene] }) | ||
| addSceneToSequence({ name: 'erase', args: [scene] }) | ||
| } | ||
| } else if (type.isArray(scene)) { | ||
| scene.forEach(function (s) { addScene(s) }) | ||
| } else if (type.isObject(scene)) { | ||
| } | ||
| if (type.isObject(scene)) { | ||
| if (!type.isArray(scene.args)) { | ||
@@ -110,8 +118,13 @@ scene.args = [] | ||
| scene.args.unshift(playNextScene.bind(this)) | ||
| props.scenario.push(scene) | ||
| sequence.push(scene) | ||
| } | ||
| }) | ||
| } | ||
| if (props.options.autoplay) play() | ||
| 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 | ||
@@ -168,2 +181,9 @@ } | ||
| if (nextScene.name === 'publisher') { | ||
| const [done, ...args] = nextScene.args | ||
| publish(...args) | ||
| return done() | ||
| } | ||
| if (nextScene.actor) { | ||
@@ -170,0 +190,0 @@ setCurrentActor(nextScene.actor) |
129295
2.75%1300
2.04%396
2.33%