typed.js 1.1.7 → 2.0.1-3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2016 Matt Boldt
3
+ Copyright (c) 2023 Matt Boldt
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,282 +1,337 @@
1
- <img src="/logo-cropped.png" width="450px" title="Typed.js" />
2
- ========
1
+ [![Build Status](https://travis-ci.org/mattboldt/typed.js.svg?branch=typed-2.0)](https://travis-ci.org/mattboldt/typed.js)
2
+ [![Code Climate](https://codeclimate.com/github/mattboldt/typed.js/badges/gpa.svg)](https://codeclimate.com/github/mattboldt/typed.js)
3
+ [![GitHub release](https://img.shields.io/github/release/mattboldt/typed.js.svg)]()
4
+ [![npm](https://img.shields.io/npm/dt/typed.js.svg)](https://img.shields.io/npm/dt/typed.js.svg)
5
+ [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/mattboldt/typed.js/master/LICENSE.txt)
3
6
 
4
- [View the live demo](http://www.mattboldt.com/demos/typed-js/) | [Go to my site, mattboldt.com](http://www.mattboldt.com)
7
+ <img src="https://raw.githubusercontent.com/mattboldt/typed.js/master/logo-cropped.png" width="450px" title="Typed.js" />
5
8
 
6
- Typed.js is a library that types. Enter in any string, and watch it type at the speed you've set, backspace what it's typed, and begin a new sentence for however many strings you've set.
9
+ ### [Live Demo](http://www.mattboldt.com/demos/typed-js/) | [View All Demos](http://mattboldt.github.io/typed.js/) | [View Full Docs](http://mattboldt.github.io/typed.js/docs) | [mattboldt.com](http://www.mattboldt.com)
7
10
 
8
- Looking for some custom use cases for Typed.js? [Check out the wiki](https://github.com/mattboldt/typed.js/wiki)
11
+ Typed.js is a library that types. Enter in any string, and watch it type at the speed you've set, backspace what it's typed, and begin a new sentence for however many strings you've set.
9
12
 
10
13
  ---
11
14
 
12
- Installation
13
- ------------
15
+ ## Installation
16
+
17
+ For use with a build tool like [Vite](https://vitejs.dev/), install with NPM or Yarn.
18
+
19
+ #### NPM
20
+
21
+ ```
22
+ npm install typed.js
23
+ ```
24
+
25
+ #### Yarn
26
+
27
+ ```
28
+ yarn add typed.js
29
+ ```
30
+
31
+ #### CDN
32
+
33
+ For use directly in the browser via `<script>` tag:
34
+
35
+ ```html
36
+ <script src="https://cdn.jsdelivr.net/npm/typed.js@2.0.13.1/dist/typed.umd.js"></script>
37
+ ```
38
+
39
+ #### Setup
40
+
14
41
  This is really all you need to get going.
15
42
 
16
- ~~~ javascript
17
- <script src="typed.js"></script>
18
- <script>
19
- document.addEventListener("DOMContentLoaded", function(){
20
- Typed.new(".element", {
21
- strings: ["First sentence.", "Second sentence."],
22
- typeSpeed: 0
23
- });
24
- });
25
- </script>
26
- ...
43
+ ```javascript
44
+ // Can also be included with a regular script tag
45
+ import Typed from 'typed.js';
27
46
 
28
- <span class="element"></span>
29
- ~~~
47
+ var options = {
48
+ strings: ['<i>First</i> sentence.', '&amp; a second sentence.'],
49
+ typeSpeed: 40,
50
+ };
30
51
 
31
- Or you can use jQuery:
52
+ var typed = new Typed('.element', options);
53
+ ```
32
54
 
33
- ~~~ javascript
34
- <script src="jquery.js"></script>
35
- <script src="typed.js"></script>
36
- <script>
37
- $(function(){
38
- $(".element").typed({
39
- strings: ["First sentence.", "Second sentence."],
40
- typeSpeed: 0
41
- });
42
- });
43
- </script>
44
- ...
55
+ ### Use with ReactJS
45
56
 
46
- <span class="element"></span>
47
- ~~~
57
+ Hook-based function component: https://jsfiddle.net/mattboldt/60h9an7y/
48
58
 
49
- ### Install with Bower
59
+ Class component: https://jsfiddle.net/mattboldt/ovat9jmp/
50
60
 
51
- ~~~
52
- bower install typed.js
53
- ~~~
61
+ ### Use with Vue.js
54
62
 
55
- Want the animated blinking cursor? Add this CSS.
63
+ Check out the Vue.js component: https://github.com/Orlandster/vue-typed-js
56
64
 
57
- ~~~ scss
58
- .typed-cursor{
59
- opacity: 1;
60
- -webkit-animation: blink 0.7s infinite;
61
- -moz-animation: blink 0.7s infinite;
62
- animation: blink 0.7s infinite;
63
- }
64
- @keyframes blink{
65
- 0% { opacity:1; }
66
- 50% { opacity:0; }
67
- 100% { opacity:1; }
68
- }
69
- @-webkit-keyframes blink{
70
- 0% { opacity:1; }
71
- 50% { opacity:0; }
72
- 100% { opacity:1; }
73
- }
74
- @-moz-keyframes blink{
75
- 0% { opacity:1; }
76
- 50% { opacity:0; }
77
- 100% { opacity:1; }
78
- }
79
- ~~~
65
+ ### Use it as WebComponent
80
66
 
81
- CSS when using the `fadeOut` option
67
+ Check out the WebComponent: https://github.com/Orlandster/wc-typed-js
82
68
 
83
- ~~~ scss
84
- .typed-fade-out{
85
- opacity: 0;
86
- animation: 0;
87
- transition: opacity .25s;
88
- }
89
- ~~~
69
+ ## Wonderful sites that have used (or are using) Typed.js
70
+
71
+ https://github.com/features/package-registry
90
72
 
91
- Wonderful sites using Typed.js
92
- ---
93
73
  https://slack.com/
94
74
 
95
75
  https://envato.com/
96
76
 
77
+ https://gorails.com/
78
+
97
79
  https://productmap.co/
98
80
 
99
81
  https://www.typed.com/
100
82
 
101
- https://git.market/
102
-
103
- http://allison.house/404
83
+ https://apeiron.io
104
84
 
105
- http://www.maxcdn.com/
85
+ https://git.market/
106
86
 
107
87
  https://commando.io/
108
88
 
109
89
  http://testdouble.com/agency.html
110
90
 
111
- http://www.stephanemartinw.com/
112
-
113
- http://www.trelab.fi/en/
91
+ https://www.capitalfactory.com/
114
92
 
115
- http://jessejohnson.github.io/
93
+ http://www.maxcdn.com/
116
94
 
95
+ https://www.powerauth.com/
117
96
 
118
97
  ---
119
98
 
120
- ### HTML tags
121
-
122
- By default the content type is set to `html`, so you're good to go. Want to type out the html regularly? Set it to `text`.
123
-
124
- ~~~ javascript
125
- Typed.new(".element", {
126
- strings: ["Typed.js is an <strong>Awesome</strong> library."],
127
- contentType: 'html' // or 'text'
128
- });
129
- ~~~
130
-
131
99
  ### Strings from static HTML (SEO Friendly)
100
+
132
101
  Rather than using the `strings` array to insert strings, you can place an HTML `div` on the page and read from it.
133
102
  This allows bots and search engines, as well as users with JavaScript disabled, to see your text on the page.
134
103
 
135
- ~~~ javascript
104
+ ```javascript
136
105
  <script>
137
- document.addEventListener('DOMContentLoaded', function(){
138
- Typed.new('#typed', {
139
- stringsElement: document.getElementById('typed-strings')
140
- });
141
- });
106
+ var typed = new Typed('#typed', {
107
+ stringsElement: '#typed-strings'
108
+ });
142
109
  </script>
143
- ~~~
144
- You must wrap each string in the `typed-strings` div with a `<p>`
145
- ~~~ html
110
+ ```
111
+
112
+ ```html
146
113
  <div id="typed-strings">
147
- <p>Typed.js is an <strong>Awesome</strong> library.</p>
148
- <p>It <em>types</em> out sentences.</p>
114
+ <p>Typed.js is a <strong>JavaScript</strong> library.</p>
115
+ <p>It <em>types</em> out sentences.</p>
149
116
  </div>
150
117
  <span id="typed"></span>
151
- ~~~
152
-
153
- ### Line Breaks
154
-
155
- #### `contentType: 'html'`
156
-
157
- ~~~ javascript
158
- Typed.new(".typed", { strings: ["Sentence with <br>line break."] });
159
- ~~~
160
-
161
- #### `contentType: 'text'`
162
-
163
- Use `white-space: pre` in your typed text element, and then `\n` when typing out the strings. Example:
164
-
165
- ~~~ html
166
-
167
- <span id="typed" style="white-space:pre"></span>
168
-
169
- ...
170
-
171
- Typed.new(".element", { strings: ["Sentence with a\nline break."] });
172
-
173
- ~~~
118
+ ```
174
119
 
175
120
  ### Type Pausing
176
121
 
177
122
  You can pause in the middle of a string for a given amount of time by including an escape character.
178
123
 
179
- ~~~ javascript
180
- Typed.new(".element", {
181
- // Waits 1000ms after typing "First"
182
- strings: ["First ^1000 sentence.", "Second sentence."]
183
- });
184
- ~~~
185
-
186
-
187
- Customization
188
- ----
189
-
190
- ~~~ javascript
191
- Typed.new(".element", {
192
- strings: ["First sentence.", "Second sentence."],
193
- // Optionally use an HTML element to grab strings from (must wrap each string in a <p>)
194
- stringsElement: null,
195
- // typing speed
196
- typeSpeed: 0,
197
- // time before typing starts
198
- startDelay: 0,
199
- // backspacing speed
200
- backSpeed: 0,
201
- // shuffle the strings
202
- shuffle: false,
203
- // time before backspacing
204
- backDelay: 500,
205
- // Fade out instead of backspace (must use CSS class)
206
- fadeOut: false,
207
- fadeOutClass: 'typed-fade-out',
208
- fadeOutDelay: 500, // milliseconds
209
- // loop
210
- loop: false,
211
- // null = infinite
212
- loopCount: null,
213
- // show cursor
214
- showCursor: true,
215
- // character for cursor
216
- cursorChar: "|",
217
- // attribute to type (null == text)
218
- attr: null,
219
- // either html or text
220
- contentType: 'html',
221
- // call when done callback function
222
- callback: function() {},
223
- // starting callback function before each string
224
- preStringTyped: function() {},
225
- //callback for every typed string
226
- onStringTyped: function() {},
227
- // callback for reset
228
- resetCallback: function() {}
124
+ ```javascript
125
+ var typed = new Typed('.element', {
126
+ // Waits 1000ms after typing "First"
127
+ strings: ['First ^1000 sentence.', 'Second sentence.'],
229
128
  });
230
- ~~~
129
+ ```
231
130
 
131
+ ### Smart Backspacing
232
132
 
233
- ### Get Super Custom
133
+ In the following example, this would only backspace the words after "This is a"
234
134
 
235
- Want to get really custom? On my site and in the Typed.js demo I have the code type out two words, and then backspace only those two, then continue where it left off. This is done in an `if` statement in the `backspace()` function. Here's what it looks like.
236
-
237
- ~~~ javascript
238
- ...
239
- , backspace: function(curString, curStrPos){
240
- ...
241
-
242
- setTimeout(function() {
135
+ ```javascript
136
+ var typed = new Typed('.element', {
137
+ strings: ['This is a JavaScript library', 'This is an ES6 module'],
138
+ smartBackspace: true, // Default value
139
+ });
140
+ ```
243
141
 
244
- // check string array position
245
- // on the first string, only delete one word
246
- // the stopNum actually represents the amount of chars to
247
- // keep in the current string. In my case it's 3.
248
- if (self.arrayPos == 1){
249
- self.stopNum = 3;
250
- }
251
- //every other time, delete the whole typed string
252
- else{
253
- self.stopNum = 0;
254
- }
255
- ...
256
- ~~~
142
+ ### Bulk Typing
257
143
 
258
- This checks if the `arrayPos` is `1`, which would be the second string you entered. If so, it sets `stopNum` to `3` instead of `0`, which tells it to stop when there are 3 characters left. For now you'll have to create custom `if` statements for each specific case you want. I may automate this somehow in the future.
144
+ The following example would emulate how a terminal acts when typing a command and seeing its result.
259
145
 
146
+ ```javascript
147
+ var typed = new Typed('.element', {
148
+ strings: ['git push --force ^1000\n `pushed to origin with option force`'],
149
+ });
150
+ ```
260
151
 
261
- ## Development
152
+ ### CSS
262
153
 
263
- `npm install`
154
+ CSS animations are built upon initialization in JavaScript. But, you can customize them at your will! These classes are:
264
155
 
265
- Then, once you've made your edits:
156
+ ```css
157
+ /* Cursor */
158
+ .typed-cursor {
159
+ }
266
160
 
267
- `gulp`
161
+ /* If fade out option is set */
162
+ .typed-fade-out {
163
+ }
164
+ ```
165
+
166
+ ## Customization
167
+
168
+ ```javascript
169
+ var typed = new Typed('.element', {
170
+ /**
171
+ * @property {array} strings strings to be typed
172
+ * @property {string} stringsElement ID of element containing string children
173
+ */
174
+ strings: [
175
+ 'These are the default values...',
176
+ 'You know what you should do?',
177
+ 'Use your own!',
178
+ 'Have a great day!',
179
+ ],
180
+ stringsElement: null,
181
+
182
+ /**
183
+ * @property {number} typeSpeed type speed in milliseconds
184
+ */
185
+ typeSpeed: 0,
186
+
187
+ /**
188
+ * @property {number} startDelay time before typing starts in milliseconds
189
+ */
190
+ startDelay: 0,
191
+
192
+ /**
193
+ * @property {number} backSpeed backspacing speed in milliseconds
194
+ */
195
+ backSpeed: 0,
196
+
197
+ /**
198
+ * @property {boolean} smartBackspace only backspace what doesn't match the previous string
199
+ */
200
+ smartBackspace: true,
201
+
202
+ /**
203
+ * @property {boolean} shuffle shuffle the strings
204
+ */
205
+ shuffle: false,
206
+
207
+ /**
208
+ * @property {number} backDelay time before backspacing in milliseconds
209
+ */
210
+ backDelay: 700,
211
+
212
+ /**
213
+ * @property {boolean} fadeOut Fade out instead of backspace
214
+ * @property {string} fadeOutClass css class for fade animation
215
+ * @property {boolean} fadeOutDelay Fade out delay in milliseconds
216
+ */
217
+ fadeOut: false,
218
+ fadeOutClass: 'typed-fade-out',
219
+ fadeOutDelay: 500,
220
+
221
+ /**
222
+ * @property {boolean} loop loop strings
223
+ * @property {number} loopCount amount of loops
224
+ */
225
+ loop: false,
226
+ loopCount: Infinity,
227
+
228
+ /**
229
+ * @property {boolean} showCursor show cursor
230
+ * @property {string} cursorChar character for cursor
231
+ * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML <head>
232
+ */
233
+ showCursor: true,
234
+ cursorChar: '|',
235
+ autoInsertCss: true,
236
+
237
+ /**
238
+ * @property {string} attr attribute for typing
239
+ * Ex: input placeholder, value, or just HTML text
240
+ */
241
+ attr: null,
242
+
243
+ /**
244
+ * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input
245
+ */
246
+ bindInputFocusEvents: false,
247
+
248
+ /**
249
+ * @property {string} contentType 'html' or 'null' for plaintext
250
+ */
251
+ contentType: 'html',
252
+
253
+ /**
254
+ * Before it begins typing
255
+ * @param {Typed} self
256
+ */
257
+ onBegin: (self) => {},
258
+
259
+ /**
260
+ * All typing is complete
261
+ * @param {Typed} self
262
+ */
263
+ onComplete: (self) => {},
264
+
265
+ /**
266
+ * Before each string is typed
267
+ * @param {number} arrayPos
268
+ * @param {Typed} self
269
+ */
270
+ preStringTyped: (arrayPos, self) => {},
271
+
272
+ /**
273
+ * After each string is typed
274
+ * @param {number} arrayPos
275
+ * @param {Typed} self
276
+ */
277
+ onStringTyped: (arrayPos, self) => {},
278
+
279
+ /**
280
+ * During looping, after last string is typed
281
+ * @param {Typed} self
282
+ */
283
+ onLastStringBackspaced: (self) => {},
284
+
285
+ /**
286
+ * Typing has been stopped
287
+ * @param {number} arrayPos
288
+ * @param {Typed} self
289
+ */
290
+ onTypingPaused: (arrayPos, self) => {},
291
+
292
+ /**
293
+ * Typing has been started after being stopped
294
+ * @param {number} arrayPos
295
+ * @param {Typed} self
296
+ */
297
+ onTypingResumed: (arrayPos, self) => {},
298
+
299
+ /**
300
+ * After reset
301
+ * @param {Typed} self
302
+ */
303
+ onReset: (self) => {},
304
+
305
+ /**
306
+ * After stop
307
+ * @param {number} arrayPos
308
+ * @param {Typed} self
309
+ */
310
+ onStop: (arrayPos, self) => {},
311
+
312
+ /**
313
+ * After start
314
+ * @param {number} arrayPos
315
+ * @param {Typed} self
316
+ */
317
+ onStart: (arrayPos, self) => {},
318
+
319
+ /**
320
+ * After destroy
321
+ * @param {Typed} self
322
+ */
323
+ onDestroy: (self) => {},
324
+ });
325
+ ```
268
326
 
269
- This will create a minified version in `/dist`
327
+ ## Contributing
270
328
 
271
- or simply use `gulp watch` for automatic change detection
329
+ ### [View Contribution Guidelines](./.github/CONTRIBUTING.md)
272
330
 
273
- end
274
- ---
331
+ ## end
275
332
 
276
- Thanks for checking this out. If you have any questions, I'll be on [Twitter](http://www.twitter.com/atmattb).
333
+ Thanks for checking this out. If you have any questions, I'll be on [Twitter](https://twitter.com/atmattb).
277
334
 
278
335
  If you're using this, let me know! I'd love to see it.
279
336
 
280
337
  It would also be great if you mentioned me or my website somewhere. [www.mattboldt.com](http://www.mattboldt.com)
281
-
282
-
package/dist/typed.cjs ADDED
@@ -0,0 +1,2 @@
1
+ function t(){return t=Object.assign?Object.assign.bind():function(t){for(var s=1;s<arguments.length;s++){var e=arguments[s];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])}return t},t.apply(this,arguments)}var s={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,smartBackspace:!0,shuffle:!1,backDelay:700,fadeOut:!1,fadeOutClass:"typed-fade-out",fadeOutDelay:500,loop:!1,loopCount:Infinity,showCursor:!0,cursorChar:"|",autoInsertCss:!0,attr:null,bindInputFocusEvents:!1,contentType:"html",onBegin:function(t){},onComplete:function(t){},preStringTyped:function(t,s){},onStringTyped:function(t,s){},onLastStringBackspaced:function(t){},onTypingPaused:function(t,s){},onTypingResumed:function(t,s){},onReset:function(t){},onStop:function(t,s){},onStart:function(t,s){},onDestroy:function(t){}},e=new(/*#__PURE__*/function(){function e(){}var n=e.prototype;return n.load=function(e,n,i){if(e.el="string"==typeof i?document.querySelector(i):i,e.options=t({},s,n),e.isInput="input"===e.el.tagName.toLowerCase(),e.attr=e.options.attr,e.bindInputFocusEvents=e.options.bindInputFocusEvents,e.showCursor=!e.isInput&&e.options.showCursor,e.cursorChar=e.options.cursorChar,e.cursorBlinking=!0,e.elContent=e.attr?e.el.getAttribute(e.attr):e.el.textContent,e.contentType=e.options.contentType,e.typeSpeed=e.options.typeSpeed,e.startDelay=e.options.startDelay,e.backSpeed=e.options.backSpeed,e.smartBackspace=e.options.smartBackspace,e.backDelay=e.options.backDelay,e.fadeOut=e.options.fadeOut,e.fadeOutClass=e.options.fadeOutClass,e.fadeOutDelay=e.options.fadeOutDelay,e.isPaused=!1,e.strings=e.options.strings.map(function(t){return t.trim()}),e.stringsElement="string"==typeof e.options.stringsElement?document.querySelector(e.options.stringsElement):e.options.stringsElement,e.stringsElement){e.strings=[],e.stringsElement.style.cssText="clip: rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px;";var r=Array.prototype.slice.apply(e.stringsElement.children),o=r.length;if(o)for(var a=0;a<o;a+=1)e.strings.push(r[a].innerHTML.trim())}for(var u in e.strPos=0,e.arrayPos=0,e.stopNum=0,e.loop=e.options.loop,e.loopCount=e.options.loopCount,e.curLoop=0,e.shuffle=e.options.shuffle,e.sequence=[],e.pause={status:!1,typewrite:!0,curString:"",curStrPos:0},e.typingComplete=!1,e.strings)e.sequence[u]=u;e.currentElContent=this.getCurrentElContent(e),e.autoInsertCss=e.options.autoInsertCss,this.appendAnimationCss(e)},n.getCurrentElContent=function(t){return t.attr?t.el.getAttribute(t.attr):t.isInput?t.el.value:"html"===t.contentType?t.el.innerHTML:t.el.textContent},n.appendAnimationCss=function(t){var s="data-typed-js-css";if(t.autoInsertCss&&(t.showCursor||t.fadeOut)&&!document.querySelector("["+s+"]")){var e=document.createElement("style");e.type="text/css",e.setAttribute(s,!0);var n="";t.showCursor&&(n+="\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n "),t.fadeOut&&(n+="\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n "),0!==e.length&&(e.innerHTML=n,document.body.appendChild(e))}},e}()),n=new(/*#__PURE__*/function(){function t(){}var s=t.prototype;return s.typeHtmlChars=function(t,s,e){if("html"!==e.contentType)return s;var n=t.substr(s).charAt(0);if("<"===n||"&"===n){var i;for(i="<"===n?">":";";t.substr(s+1).charAt(0)!==i&&!(1+ ++s>t.length););s++}return s},s.backSpaceHtmlChars=function(t,s,e){if("html"!==e.contentType)return s;var n=t.substr(s).charAt(0);if(">"===n||";"===n){var i;for(i=">"===n?"<":"&";t.substr(s-1).charAt(0)!==i&&!(--s<0););s--}return s},t}());module.exports=/*#__PURE__*/function(){function t(t,s){e.load(this,s,t),this.begin()}var s=t.prototype;return s.toggle=function(){this.pause.status?this.start():this.stop()},s.stop=function(){this.typingComplete||this.pause.status||(this.toggleBlinking(!0),this.pause.status=!0,this.options.onStop(this.arrayPos,this))},s.start=function(){this.typingComplete||this.pause.status&&(this.pause.status=!1,this.pause.typewrite?this.typewrite(this.pause.curString,this.pause.curStrPos):this.backspace(this.pause.curString,this.pause.curStrPos),this.options.onStart(this.arrayPos,this))},s.destroy=function(){this.reset(!1),this.options.onDestroy(this)},s.reset=function(t){void 0===t&&(t=!0),clearInterval(this.timeout),this.replaceText(""),this.cursor&&this.cursor.parentNode&&(this.cursor.parentNode.removeChild(this.cursor),this.cursor=null),this.strPos=0,this.arrayPos=0,this.curLoop=0,t&&(this.insertCursor(),this.options.onReset(this),this.begin())},s.begin=function(){var t=this;this.options.onBegin(this),this.typingComplete=!1,this.shuffleStringsIfNeeded(this),this.insertCursor(),this.bindInputFocusEvents&&this.bindFocusEvents(),this.timeout=setTimeout(function(){t.currentElContent&&0!==t.currentElContent.length?t.backspace(t.currentElContent,t.currentElContent.length):t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos)},this.startDelay)},s.typewrite=function(t,s){var e=this;this.fadeOut&&this.el.classList.contains(this.fadeOutClass)&&(this.el.classList.remove(this.fadeOutClass),this.cursor&&this.cursor.classList.remove(this.fadeOutClass));var i=this.humanizer(this.typeSpeed),r=1;!0!==this.pause.status?this.timeout=setTimeout(function(){s=n.typeHtmlChars(t,s,e);var i=0,o=t.substr(s);if("^"===o.charAt(0)&&/^\^\d+/.test(o)){var a=1;a+=(o=/\d+/.exec(o)[0]).length,i=parseInt(o),e.temporaryPause=!0,e.options.onTypingPaused(e.arrayPos,e),t=t.substring(0,s)+t.substring(s+a),e.toggleBlinking(!0)}if("`"===o.charAt(0)){for(;"`"!==t.substr(s+r).charAt(0)&&(r++,!(s+r>t.length)););var u=t.substring(0,s),p=t.substring(u.length+1,s+r),c=t.substring(s+r+1);t=u+p+c,r--}e.timeout=setTimeout(function(){e.toggleBlinking(!1),s>=t.length?e.doneTyping(t,s):e.keepTyping(t,s,r),e.temporaryPause&&(e.temporaryPause=!1,e.options.onTypingResumed(e.arrayPos,e))},i)},i):this.setPauseStatus(t,s,!0)},s.keepTyping=function(t,s,e){0===s&&(this.toggleBlinking(!1),this.options.preStringTyped(this.arrayPos,this));var n=t.substr(0,s+=e);this.replaceText(n),this.typewrite(t,s)},s.doneTyping=function(t,s){var e=this;this.options.onStringTyped(this.arrayPos,this),this.toggleBlinking(!0),this.arrayPos===this.strings.length-1&&(this.complete(),!1===this.loop||this.curLoop===this.loopCount)||(this.timeout=setTimeout(function(){e.backspace(t,s)},this.backDelay))},s.backspace=function(t,s){var e=this;if(!0!==this.pause.status){if(this.fadeOut)return this.initFadeOut();this.toggleBlinking(!1);var i=this.humanizer(this.backSpeed);this.timeout=setTimeout(function(){s=n.backSpaceHtmlChars(t,s,e);var i=t.substr(0,s);if(e.replaceText(i),e.smartBackspace){var r=e.strings[e.arrayPos+1];e.stopNum=r&&i===r.substr(0,s)?s:0}s>e.stopNum?(s--,e.backspace(t,s)):s<=e.stopNum&&(e.arrayPos++,e.arrayPos===e.strings.length?(e.arrayPos=0,e.options.onLastStringBackspaced(),e.shuffleStringsIfNeeded(),e.begin()):e.typewrite(e.strings[e.sequence[e.arrayPos]],s))},i)}else this.setPauseStatus(t,s,!1)},s.complete=function(){this.options.onComplete(this),this.loop?this.curLoop++:this.typingComplete=!0},s.setPauseStatus=function(t,s,e){this.pause.typewrite=e,this.pause.curString=t,this.pause.curStrPos=s},s.toggleBlinking=function(t){this.cursor&&(this.pause.status||this.cursorBlinking!==t&&(this.cursorBlinking=t,t?this.cursor.classList.add("typed-cursor--blink"):this.cursor.classList.remove("typed-cursor--blink")))},s.humanizer=function(t){return Math.round(Math.random()*t/2)+t},s.shuffleStringsIfNeeded=function(){this.shuffle&&(this.sequence=this.sequence.sort(function(){return Math.random()-.5}))},s.initFadeOut=function(){var t=this;return this.el.className+=" "+this.fadeOutClass,this.cursor&&(this.cursor.className+=" "+this.fadeOutClass),setTimeout(function(){t.arrayPos++,t.replaceText(""),t.strings.length>t.arrayPos?t.typewrite(t.strings[t.sequence[t.arrayPos]],0):(t.typewrite(t.strings[0],0),t.arrayPos=0)},this.fadeOutDelay)},s.replaceText=function(t){this.attr?this.el.setAttribute(this.attr,t):this.isInput?this.el.value=t:"html"===this.contentType?this.el.innerHTML=t:this.el.textContent=t},s.bindFocusEvents=function(){var t=this;this.isInput&&(this.el.addEventListener("focus",function(s){t.stop()}),this.el.addEventListener("blur",function(s){t.el.value&&0!==t.el.value.length||t.start()}))},s.insertCursor=function(){this.showCursor&&(this.cursor||(this.cursor=document.createElement("span"),this.cursor.className="typed-cursor",this.cursor.setAttribute("aria-hidden",!0),this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)))},t}();
2
+ //# sourceMappingURL=typed.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed.cjs","sources":["../src/defaults.js","../src/initializer.js","../src/html-parser.js","../src/typed.js"],"sourcesContent":["/**\n * Defaults & options\n * @returns {object} Typed defaults & options\n * @public\n */\n\nconst defaults = {\n /**\n * @property {array} strings strings to be typed\n * @property {string} stringsElement ID of element containing string children\n */\n strings: [\n 'These are the default values...',\n 'You know what you should do?',\n 'Use your own!',\n 'Have a great day!',\n ],\n stringsElement: null,\n\n /**\n * @property {number} typeSpeed type speed in milliseconds\n */\n typeSpeed: 0,\n\n /**\n * @property {number} startDelay time before typing starts in milliseconds\n */\n startDelay: 0,\n\n /**\n * @property {number} backSpeed backspacing speed in milliseconds\n */\n backSpeed: 0,\n\n /**\n * @property {boolean} smartBackspace only backspace what doesn't match the previous string\n */\n smartBackspace: true,\n\n /**\n * @property {boolean} shuffle shuffle the strings\n */\n shuffle: false,\n\n /**\n * @property {number} backDelay time before backspacing in milliseconds\n */\n backDelay: 700,\n\n /**\n * @property {boolean} fadeOut Fade out instead of backspace\n * @property {string} fadeOutClass css class for fade animation\n * @property {boolean} fadeOutDelay Fade out delay in milliseconds\n */\n fadeOut: false,\n fadeOutClass: 'typed-fade-out',\n fadeOutDelay: 500,\n\n /**\n * @property {boolean} loop loop strings\n * @property {number} loopCount amount of loops\n */\n loop: false,\n loopCount: Infinity,\n\n /**\n * @property {boolean} showCursor show cursor\n * @property {string} cursorChar character for cursor\n * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML <head>\n */\n showCursor: true,\n cursorChar: '|',\n autoInsertCss: true,\n\n /**\n * @property {string} attr attribute for typing\n * Ex: input placeholder, value, or just HTML text\n */\n attr: null,\n\n /**\n * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input\n */\n bindInputFocusEvents: false,\n\n /**\n * @property {string} contentType 'html' or 'null' for plaintext\n */\n contentType: 'html',\n\n /**\n * Before it begins typing\n * @param {Typed} self\n */\n onBegin: (self) => {},\n\n /**\n * All typing is complete\n * @param {Typed} self\n */\n onComplete: (self) => {},\n\n /**\n * Before each string is typed\n * @param {number} arrayPos\n * @param {Typed} self\n */\n preStringTyped: (arrayPos, self) => {},\n\n /**\n * After each string is typed\n * @param {number} arrayPos\n * @param {Typed} self\n */\n onStringTyped: (arrayPos, self) => {},\n\n /**\n * During looping, after last string is typed\n * @param {Typed} self\n */\n onLastStringBackspaced: (self) => {},\n\n /**\n * Typing has been stopped\n * @param {number} arrayPos\n * @param {Typed} self\n */\n onTypingPaused: (arrayPos, self) => {},\n\n /**\n * Typing has been started after being stopped\n * @param {number} arrayPos\n * @param {Typed} self\n */\n onTypingResumed: (arrayPos, self) => {},\n\n /**\n * After reset\n * @param {Typed} self\n */\n onReset: (self) => {},\n\n /**\n * After stop\n * @param {number} arrayPos\n * @param {Typed} self\n */\n onStop: (arrayPos, self) => {},\n\n /**\n * After start\n * @param {number} arrayPos\n * @param {Typed} self\n */\n onStart: (arrayPos, self) => {},\n\n /**\n * After destroy\n * @param {Typed} self\n */\n onDestroy: (self) => {},\n};\n\nexport default defaults;\n","import defaults from './defaults.js';\n/**\n * Initialize the Typed object\n */\n\nexport default class Initializer {\n /**\n * Load up defaults & options on the Typed instance\n * @param {Typed} self instance of Typed\n * @param {object} options options object\n * @param {string} elementId HTML element ID _OR_ instance of HTML element\n * @private\n */\n\n load(self, options, elementId) {\n // chosen element to manipulate text\n if (typeof elementId === 'string') {\n self.el = document.querySelector(elementId);\n } else {\n self.el = elementId;\n }\n\n self.options = { ...defaults, ...options };\n\n // attribute to type into\n self.isInput = self.el.tagName.toLowerCase() === 'input';\n self.attr = self.options.attr;\n self.bindInputFocusEvents = self.options.bindInputFocusEvents;\n\n // show cursor\n self.showCursor = self.isInput ? false : self.options.showCursor;\n\n // custom cursor\n self.cursorChar = self.options.cursorChar;\n\n // Is the cursor blinking\n self.cursorBlinking = true;\n\n // text content of element\n self.elContent = self.attr\n ? self.el.getAttribute(self.attr)\n : self.el.textContent;\n\n // html or plain text\n self.contentType = self.options.contentType;\n\n // typing speed\n self.typeSpeed = self.options.typeSpeed;\n\n // add a delay before typing starts\n self.startDelay = self.options.startDelay;\n\n // backspacing speed\n self.backSpeed = self.options.backSpeed;\n\n // only backspace what doesn't match the previous string\n self.smartBackspace = self.options.smartBackspace;\n\n // amount of time to wait before backspacing\n self.backDelay = self.options.backDelay;\n\n // Fade out instead of backspace\n self.fadeOut = self.options.fadeOut;\n self.fadeOutClass = self.options.fadeOutClass;\n self.fadeOutDelay = self.options.fadeOutDelay;\n\n // variable to check whether typing is currently paused\n self.isPaused = false;\n\n // input strings of text\n self.strings = self.options.strings.map((s) => s.trim());\n\n // div containing strings\n if (typeof self.options.stringsElement === 'string') {\n self.stringsElement = document.querySelector(self.options.stringsElement);\n } else {\n self.stringsElement = self.options.stringsElement;\n }\n\n if (self.stringsElement) {\n self.strings = [];\n self.stringsElement.style.cssText =\n 'clip: rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px;';\n\n const strings = Array.prototype.slice.apply(self.stringsElement.children);\n const stringsLength = strings.length;\n\n if (stringsLength) {\n for (let i = 0; i < stringsLength; i += 1) {\n const stringEl = strings[i];\n self.strings.push(stringEl.innerHTML.trim());\n }\n }\n }\n\n // character number position of current string\n self.strPos = 0;\n\n // current array position\n self.arrayPos = 0;\n\n // index of string to stop backspacing on\n self.stopNum = 0;\n\n // Looping logic\n self.loop = self.options.loop;\n self.loopCount = self.options.loopCount;\n self.curLoop = 0;\n\n // shuffle the strings\n self.shuffle = self.options.shuffle;\n // the order of strings\n self.sequence = [];\n\n self.pause = {\n status: false,\n typewrite: true,\n curString: '',\n curStrPos: 0,\n };\n\n // When the typing is complete (when not looped)\n self.typingComplete = false;\n\n // Set the order in which the strings are typed\n for (let i in self.strings) {\n self.sequence[i] = i;\n }\n\n // If there is some text in the element\n self.currentElContent = this.getCurrentElContent(self);\n\n self.autoInsertCss = self.options.autoInsertCss;\n\n this.appendAnimationCss(self);\n }\n\n getCurrentElContent(self) {\n let elContent = '';\n if (self.attr) {\n elContent = self.el.getAttribute(self.attr);\n } else if (self.isInput) {\n elContent = self.el.value;\n } else if (self.contentType === 'html') {\n elContent = self.el.innerHTML;\n } else {\n elContent = self.el.textContent;\n }\n return elContent;\n }\n\n appendAnimationCss(self) {\n const cssDataName = 'data-typed-js-css';\n if (!self.autoInsertCss) {\n return;\n }\n if (!self.showCursor && !self.fadeOut) {\n return;\n }\n if (document.querySelector(`[${cssDataName}]`)) {\n return;\n }\n\n let css = document.createElement('style');\n css.type = 'text/css';\n css.setAttribute(cssDataName, true);\n\n let innerCss = '';\n if (self.showCursor) {\n innerCss += `\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n `;\n }\n\n if (self.fadeOut) {\n innerCss += `\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n `;\n }\n if (css.length === 0) {\n return;\n }\n css.innerHTML = innerCss;\n document.body.appendChild(css);\n }\n}\n\nexport let initializer = new Initializer();\n","/**\n * TODO: These methods can probably be combined somehow\n * Parse HTML tags & HTML Characters\n */\n\nexport default class HTMLParser {\n /**\n * Type HTML tags & HTML Characters\n * @param {string} curString Current string\n * @param {number} curStrPos Position in current string\n * @param {Typed} self instance of Typed\n * @returns {number} a new string position\n * @private\n */\n\n typeHtmlChars(curString, curStrPos, self) {\n if (self.contentType !== 'html') return curStrPos;\n const curChar = curString.substr(curStrPos).charAt(0);\n if (curChar === '<' || curChar === '&') {\n let endTag = '';\n if (curChar === '<') {\n endTag = '>';\n } else {\n endTag = ';';\n }\n while (curString.substr(curStrPos + 1).charAt(0) !== endTag) {\n curStrPos++;\n if (curStrPos + 1 > curString.length) {\n break;\n }\n }\n curStrPos++;\n }\n return curStrPos;\n }\n\n /**\n * Backspace HTML tags and HTML Characters\n * @param {string} curString Current string\n * @param {number} curStrPos Position in current string\n * @param {Typed} self instance of Typed\n * @returns {number} a new string position\n * @private\n */\n backSpaceHtmlChars(curString, curStrPos, self) {\n if (self.contentType !== 'html') return curStrPos;\n const curChar = curString.substr(curStrPos).charAt(0);\n if (curChar === '>' || curChar === ';') {\n let endTag = '';\n if (curChar === '>') {\n endTag = '<';\n } else {\n endTag = '&';\n }\n while (curString.substr(curStrPos - 1).charAt(0) !== endTag) {\n curStrPos--;\n if (curStrPos < 0) {\n break;\n }\n }\n curStrPos--;\n }\n return curStrPos;\n }\n}\n\nexport let htmlParser = new HTMLParser();\n","import { initializer } from './initializer.js';\nimport { htmlParser } from './html-parser.js';\n\n/**\n * Welcome to Typed.js!\n * @param {string} elementId HTML element ID _OR_ HTML element\n * @param {object} options options object\n * @returns {object} a new Typed object\n */\nexport default class Typed {\n constructor(elementId, options) {\n // Initialize it up\n initializer.load(this, options, elementId);\n // All systems go!\n this.begin();\n }\n\n /**\n * Toggle start() and stop() of the Typed instance\n * @public\n */\n toggle() {\n this.pause.status ? this.start() : this.stop();\n }\n\n /**\n * Stop typing / backspacing and enable cursor blinking\n * @public\n */\n stop() {\n if (this.typingComplete) return;\n if (this.pause.status) return;\n this.toggleBlinking(true);\n this.pause.status = true;\n this.options.onStop(this.arrayPos, this);\n }\n\n /**\n * Start typing / backspacing after being stopped\n * @public\n */\n start() {\n if (this.typingComplete) return;\n if (!this.pause.status) return;\n this.pause.status = false;\n if (this.pause.typewrite) {\n this.typewrite(this.pause.curString, this.pause.curStrPos);\n } else {\n this.backspace(this.pause.curString, this.pause.curStrPos);\n }\n this.options.onStart(this.arrayPos, this);\n }\n\n /**\n * Destroy this instance of Typed\n * @public\n */\n destroy() {\n this.reset(false);\n this.options.onDestroy(this);\n }\n\n /**\n * Reset Typed and optionally restarts\n * @param {boolean} restart\n * @public\n */\n reset(restart = true) {\n clearInterval(this.timeout);\n this.replaceText('');\n if (this.cursor && this.cursor.parentNode) {\n this.cursor.parentNode.removeChild(this.cursor);\n this.cursor = null;\n }\n this.strPos = 0;\n this.arrayPos = 0;\n this.curLoop = 0;\n if (restart) {\n this.insertCursor();\n this.options.onReset(this);\n this.begin();\n }\n }\n\n /**\n * Begins the typing animation\n * @private\n */\n begin() {\n this.options.onBegin(this);\n this.typingComplete = false;\n this.shuffleStringsIfNeeded(this);\n this.insertCursor();\n if (this.bindInputFocusEvents) this.bindFocusEvents();\n this.timeout = setTimeout(() => {\n // Check if there is some text in the element, if yes start by backspacing the default message\n if (!this.currentElContent || this.currentElContent.length === 0) {\n this.typewrite(this.strings[this.sequence[this.arrayPos]], this.strPos);\n } else {\n // Start typing\n this.backspace(this.currentElContent, this.currentElContent.length);\n }\n }, this.startDelay);\n }\n\n /**\n * Called for each character typed\n * @param {string} curString the current string in the strings array\n * @param {number} curStrPos the current position in the curString\n * @private\n */\n typewrite(curString, curStrPos) {\n if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) {\n this.el.classList.remove(this.fadeOutClass);\n if (this.cursor) this.cursor.classList.remove(this.fadeOutClass);\n }\n\n const humanize = this.humanizer(this.typeSpeed);\n let numChars = 1;\n\n if (this.pause.status === true) {\n this.setPauseStatus(curString, curStrPos, true);\n return;\n }\n\n // contain typing function in a timeout humanize'd delay\n this.timeout = setTimeout(() => {\n // skip over any HTML chars\n curStrPos = htmlParser.typeHtmlChars(curString, curStrPos, this);\n\n let pauseTime = 0;\n let substr = curString.substr(curStrPos);\n // check for an escape character before a pause value\n // format: \\^\\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^\n // single ^ are removed from string\n if (substr.charAt(0) === '^') {\n if (/^\\^\\d+/.test(substr)) {\n let skip = 1; // skip at least 1\n substr = /\\d+/.exec(substr)[0];\n skip += substr.length;\n pauseTime = parseInt(substr);\n this.temporaryPause = true;\n this.options.onTypingPaused(this.arrayPos, this);\n // strip out the escape character and pause value so they're not printed\n curString =\n curString.substring(0, curStrPos) +\n curString.substring(curStrPos + skip);\n this.toggleBlinking(true);\n }\n }\n\n // check for skip characters formatted as\n // \"this is a `string to print NOW` ...\"\n if (substr.charAt(0) === '`') {\n while (curString.substr(curStrPos + numChars).charAt(0) !== '`') {\n numChars++;\n if (curStrPos + numChars > curString.length) break;\n }\n // strip out the escape characters and append all the string in between\n const stringBeforeSkip = curString.substring(0, curStrPos);\n const stringSkipped = curString.substring(\n stringBeforeSkip.length + 1,\n curStrPos + numChars\n );\n const stringAfterSkip = curString.substring(curStrPos + numChars + 1);\n curString = stringBeforeSkip + stringSkipped + stringAfterSkip;\n numChars--;\n }\n\n // timeout for any pause after a character\n this.timeout = setTimeout(() => {\n // Accounts for blinking while paused\n this.toggleBlinking(false);\n\n // We're done with this sentence!\n if (curStrPos >= curString.length) {\n this.doneTyping(curString, curStrPos);\n } else {\n this.keepTyping(curString, curStrPos, numChars);\n }\n // end of character pause\n if (this.temporaryPause) {\n this.temporaryPause = false;\n this.options.onTypingResumed(this.arrayPos, this);\n }\n }, pauseTime);\n\n // humanized value for typing\n }, humanize);\n }\n\n /**\n * Continue to the next string & begin typing\n * @param {string} curString the current string in the strings array\n * @param {number} curStrPos the current position in the curString\n * @private\n */\n keepTyping(curString, curStrPos, numChars) {\n // call before functions if applicable\n if (curStrPos === 0) {\n this.toggleBlinking(false);\n this.options.preStringTyped(this.arrayPos, this);\n }\n // start typing each new char into existing string\n // curString: arg, this.el.html: original text inside element\n curStrPos += numChars;\n const nextString = curString.substr(0, curStrPos);\n this.replaceText(nextString);\n // loop the function\n this.typewrite(curString, curStrPos);\n }\n\n /**\n * We're done typing the current string\n * @param {string} curString the current string in the strings array\n * @param {number} curStrPos the current position in the curString\n * @private\n */\n doneTyping(curString, curStrPos) {\n // fires callback function\n this.options.onStringTyped(this.arrayPos, this);\n this.toggleBlinking(true);\n // is this the final string\n if (this.arrayPos === this.strings.length - 1) {\n // callback that occurs on the last typed string\n this.complete();\n // quit if we wont loop back\n if (this.loop === false || this.curLoop === this.loopCount) {\n return;\n }\n }\n this.timeout = setTimeout(() => {\n this.backspace(curString, curStrPos);\n }, this.backDelay);\n }\n\n /**\n * Backspaces 1 character at a time\n * @param {string} curString the current string in the strings array\n * @param {number} curStrPos the current position in the curString\n * @private\n */\n backspace(curString, curStrPos) {\n if (this.pause.status === true) {\n this.setPauseStatus(curString, curStrPos, false);\n return;\n }\n if (this.fadeOut) return this.initFadeOut();\n\n this.toggleBlinking(false);\n const humanize = this.humanizer(this.backSpeed);\n\n this.timeout = setTimeout(() => {\n curStrPos = htmlParser.backSpaceHtmlChars(curString, curStrPos, this);\n // replace text with base text + typed characters\n const curStringAtPosition = curString.substr(0, curStrPos);\n this.replaceText(curStringAtPosition);\n\n // if smartBack is enabled\n if (this.smartBackspace) {\n // the remaining part of the current string is equal of the same part of the new string\n let nextString = this.strings[this.arrayPos + 1];\n if (\n nextString &&\n curStringAtPosition === nextString.substr(0, curStrPos)\n ) {\n this.stopNum = curStrPos;\n } else {\n this.stopNum = 0;\n }\n }\n\n // if the number (id of character in current string) is\n // less than the stop number, keep going\n if (curStrPos > this.stopNum) {\n // subtract characters one by one\n curStrPos--;\n // loop the function\n this.backspace(curString, curStrPos);\n } else if (curStrPos <= this.stopNum) {\n // if the stop number has been reached, increase\n // array position to next string\n this.arrayPos++;\n // When looping, begin at the beginning after backspace complete\n if (this.arrayPos === this.strings.length) {\n this.arrayPos = 0;\n this.options.onLastStringBackspaced();\n this.shuffleStringsIfNeeded();\n this.begin();\n } else {\n this.typewrite(this.strings[this.sequence[this.arrayPos]], curStrPos);\n }\n }\n // humanized value for typing\n }, humanize);\n }\n\n /**\n * Full animation is complete\n * @private\n */\n complete() {\n this.options.onComplete(this);\n if (this.loop) {\n this.curLoop++;\n } else {\n this.typingComplete = true;\n }\n }\n\n /**\n * Has the typing been stopped\n * @param {string} curString the current string in the strings array\n * @param {number} curStrPos the current position in the curString\n * @param {boolean} isTyping\n * @private\n */\n setPauseStatus(curString, curStrPos, isTyping) {\n this.pause.typewrite = isTyping;\n this.pause.curString = curString;\n this.pause.curStrPos = curStrPos;\n }\n\n /**\n * Toggle the blinking cursor\n * @param {boolean} isBlinking\n * @private\n */\n toggleBlinking(isBlinking) {\n if (!this.cursor) return;\n // if in paused state, don't toggle blinking a 2nd time\n if (this.pause.status) return;\n if (this.cursorBlinking === isBlinking) return;\n this.cursorBlinking = isBlinking;\n if (isBlinking) {\n this.cursor.classList.add('typed-cursor--blink');\n } else {\n this.cursor.classList.remove('typed-cursor--blink');\n }\n }\n\n /**\n * Speed in MS to type\n * @param {number} speed\n * @private\n */\n humanizer(speed) {\n return Math.round((Math.random() * speed) / 2) + speed;\n }\n\n /**\n * Shuffle the sequence of the strings array\n * @private\n */\n shuffleStringsIfNeeded() {\n if (!this.shuffle) return;\n this.sequence = this.sequence.sort(() => Math.random() - 0.5);\n }\n\n /**\n * Adds a CSS class to fade out current string\n * @private\n */\n initFadeOut() {\n this.el.className += ` ${this.fadeOutClass}`;\n if (this.cursor) this.cursor.className += ` ${this.fadeOutClass}`;\n return setTimeout(() => {\n this.arrayPos++;\n this.replaceText('');\n\n // Resets current string if end of loop reached\n if (this.strings.length > this.arrayPos) {\n this.typewrite(this.strings[this.sequence[this.arrayPos]], 0);\n } else {\n this.typewrite(this.strings[0], 0);\n this.arrayPos = 0;\n }\n }, this.fadeOutDelay);\n }\n\n /**\n * Replaces current text in the HTML element\n * depending on element type\n * @param {string} str\n * @private\n */\n replaceText(str) {\n if (this.attr) {\n this.el.setAttribute(this.attr, str);\n } else {\n if (this.isInput) {\n this.el.value = str;\n } else if (this.contentType === 'html') {\n this.el.innerHTML = str;\n } else {\n this.el.textContent = str;\n }\n }\n }\n\n /**\n * If using input elements, bind focus in order to\n * start and stop the animation\n * @private\n */\n bindFocusEvents() {\n if (!this.isInput) return;\n this.el.addEventListener('focus', (e) => {\n this.stop();\n });\n this.el.addEventListener('blur', (e) => {\n if (this.el.value && this.el.value.length !== 0) {\n return;\n }\n this.start();\n });\n }\n\n /**\n * On init, insert the cursor element\n * @private\n */\n insertCursor() {\n if (!this.showCursor) return;\n if (this.cursor) return;\n this.cursor = document.createElement('span');\n this.cursor.className = 'typed-cursor';\n this.cursor.setAttribute('aria-hidden', true);\n this.cursor.innerHTML = this.cursorChar;\n this.el.parentNode &&\n this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling);\n }\n}\n"],"names":["defaults","strings","stringsElement","typeSpeed","startDelay","backSpeed","smartBackspace","shuffle","backDelay","fadeOut","fadeOutClass","fadeOutDelay","loop","loopCount","Infinity","showCursor","cursorChar","autoInsertCss","attr","bindInputFocusEvents","contentType","onBegin","self","onComplete","preStringTyped","arrayPos","onStringTyped","onLastStringBackspaced","onTypingPaused","onTypingResumed","onReset","onStop","onStart","onDestroy","initializer","Initializer","_proto","prototype","load","options","elementId","el","document","querySelector","_extends","isInput","tagName","toLowerCase","cursorBlinking","elContent","getAttribute","textContent","isPaused","map","s","trim","style","cssText","Array","slice","apply","children","stringsLength","length","i","push","innerHTML","strPos","stopNum","curLoop","sequence","pause","status","typewrite","curString","curStrPos","typingComplete","currentElContent","this","getCurrentElContent","appendAnimationCss","value","cssDataName","css","createElement","type","setAttribute","innerCss","body","appendChild","htmlParser","HTMLParser","typeHtmlChars","curChar","substr","charAt","endTag","backSpaceHtmlChars","Typed","begin","toggle","start","stop","toggleBlinking","backspace","destroy","reset","restart","clearInterval","timeout","replaceText","cursor","parentNode","removeChild","insertCursor","_this","shuffleStringsIfNeeded","bindFocusEvents","setTimeout","_this2","classList","contains","remove","humanize","humanizer","numChars","pauseTime","test","skip","exec","parseInt","temporaryPause","substring","stringBeforeSkip","stringSkipped","stringAfterSkip","doneTyping","keepTyping","setPauseStatus","nextString","_this3","complete","_this4","initFadeOut","curStringAtPosition","isTyping","isBlinking","add","speed","Math","round","random","sort","_this5","className","str","_this6","addEventListener","e","insertBefore","nextSibling"],"mappings":"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"}