From ee151f19d9f7b48c9bf18c89164bd95cc5deedb7 Mon Sep 17 00:00:00 2001 From: Alex MacArthur Date: Wed, 5 Feb 2020 21:13:42 -0600 Subject: [PATCH] Allow children to fully render before initializing. --- README.md | 95 +++++++++++++++++++++++++++++++++++-- dist/typeit-react.es.min.js | 6 +-- dist/typeit-react.min.js | 4 +- package-lock.json | 2 +- package.json | 4 +- src/index.tsx | 67 ++++++++++++++++++++------ types/index.d.ts | 3 +- 7 files changed, 154 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 3dc14a7..8e2c493 100644 --- a/README.md +++ b/README.md @@ -25,17 +25,42 @@ import TypeIt from "typeit-react"; export default () => { return (
- This will be typed in a `span` element! + + This will be typed in a `span` element! +
); }; ``` -Note: This approach will cause the string to first be rendered in the markup and _then_ picked up by TypeIt, which might be desired if you're using it with a statically rendered application (ex: GatsbyJS). However, it may also cause a brief flash of text when the page loads. For an alternative way to define strings, see below. +### A More Complex Example + +The component will allow its children to fully render, and then type whatever HTML is generated. So, in addition to simple strings, you can nest HTML and components like below. + +```javascript +import TypeIt from "typeit-react"; + +// This could be any component that generates HTML. +const SuperStrong = ({children}) => { + return ( + {children} + ) +} + +export default () => { + return ( +
+ + Weak text. Super strong text. + +
+ ); +}; +``` ### Customizing Your Options -To tweak the animation to your liking, pass an object as the `options` prop. All options supported by TypeIt can be used here. Using this prop, you can also set strings without passing them as children. To view all options, see [TypeIt's documentation](https://typeitjs.com/docs#options). +To tweak the animation to your liking, pass an object as the `options` prop. All options supported by the core TypeIt library can be used here. Using this prop, you can also set strings without passing them as children. See [TypeIt's documentation](https://typeitjs.com/docs#options) for more details on what's available. ```javascript import TypeIt from "typeit-react"; @@ -55,7 +80,7 @@ export default () => { }; ``` -### Choose Your Own Element +### Choosing Your Own Element Out of the box, a `span` element is used to contain the typing animation. To choose your own element, use the `element` prop. @@ -71,6 +96,68 @@ export default () => { }; ``` +### Fine-Tuning the Instance w/ Companion Methods + +TypeIt comes with a set of [special methods](https://typeitjs.com/docs#instance-methods) that let you fine-tune an animation down to the smallest detail. To leverage them here, pass a function as the `onBeforeInit` prop, which will give you access to the instance you can modify with these methods, and then return back to the component before the animation is initialized. + +```javascript +import TypeIt from "typeit-react"; + + { + instance + .type("Hi, I'm Alxe") + .pause(750) + .delete(2) + .pause(500) + .type("ex!"); + + // Remember to return it! + return instance; + }} +/> +``` + +### Accessing the Instance After Initalization + +Similarly, the `getAfterInit` prop allows you to access the instance _after_ it's been kicked off, so you'll be able to leverage methods like `.freeze()`, `.unfreeze()`, and `.is()`. Read more about those [here](https://typeitjs.com/docs#non-chainable-instance-methods). + +```javascript +export default () => { + const [buttonText, setButtonText] = useState("Freeze"); + const [instance, setInstance] = useState(null); + + const toggleFreeze = () => { + if(instance.is('frozen')) { + instance.unfreeze(); + setButtonText('Freeze'); + return; + } + + instance.freeze(); + setButtonText('Unfreeze'); + } + + return ( +
+ + + { + setInstance(instance); + return instance; + }} + > + This will just keep on going. + +
+ ); +} +``` + ## Need Help? If you're working with a custom implementation of TypeIt and would like some help, I'm available for hire. [Get in touch!](https://macarthur.me/contact) diff --git a/dist/typeit-react.es.min.js b/dist/typeit-react.es.min.js index d0a29ef..c874cb0 100644 --- a/dist/typeit-react.es.min.js +++ b/dist/typeit-react.es.min.js @@ -2,12 +2,12 @@ * * TypeIt - React * Author: Alex MacArthur (https://macarthur.me) - * Version: v0.0.1 + * Version: v0.0.2 * License: GPL-2.0 * URL: undefined * */ -import{createElement as t,useRef as e,useEffect as n}from"react"; +import{createElement as t,useRef as e,useEffect as n,useState as i}from"react"; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use @@ -21,4 +21,4 @@ MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. -***************************************************************************** */var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&void 0!==arguments[0]?arguments[0]:[],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.insert=function(e,n){t.waiting.splice(e,0,n)},this.add=function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return Array.isArray(t[0])?(e.waiting=e.waiting.concat(t),e):(e.waiting[n?"unshift":"push"](t),e)},this.delete=function(e){return t.waiting.splice(e,1),t},this.reset=function(){return t.waiting=t.executed.concat(t.waiting),t.executed=[],t},this.executed=[],this.waiting=n,!n.length&&i&&this.add(i)}var u=function(t){return document.createElement(t)};function a(t,e){return Math.abs(Math.random()*(t+e-(t-e))+(t-e))}function c(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=u("style");n.id=e,n.appendChild(document.createTextNode(t)),document.head.appendChild(n)}function l(t){return t.map((function(t){return t.replace(/<\!--.*?-->/g,"")}))}var f=function(t){return["textarea","input"].indexOf(t.tagName.toLowerCase())>-1},h=function(t){return Array.isArray(t)?t:[t]},p=function(t){return[].slice.call(t)},d=function(t,e){var n=t.nextSibling;return!!n&&!n.isEqualNode(e)},v=function(t,e){var n=e;if(f(t))t.value="".concat(t.value).concat(n);else{var i=p(t.childNodes).filter((function(t){return t.classList&&t.classList.contains("ti-cursor")}));if(i=i.length?i[0]:null,"object"==r(e)&&!(e instanceof HTMLElement)){var o=e.ancestorTree.slice(0).reverse().join(" "),s=p(t.querySelectorAll("".concat(o))),a=(s=s.filter((function(t){return!i||!i.isEqualNode(t)}))).length>0?s[s.length-1]:null;if(a&&function(t,e){if(!t)return!1;for(var n=!1,i=[],r=t;!n;)i.push(d(r,e)),(r=r.parentNode)&&r.hasAttribute&&!r.hasAttribute("data-typeit-id")||(n=!0);return!i.some((function(t){return t}))}(a,i))t=a,n=e.content;else if(n=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=u(t);return e.forEach((function(t){i.setAttribute(t.name,t.value)})),i.innerHTML=n,i}(e.ancestorTree[0],e.attributes,e.content),e.ancestorTree.length>1){var c=p(t.querySelectorAll(e.ancestorTree[1]));t=c[c.length-1]}}n="object"==r(n)?n:document.createTextNode(n),t.insertBefore(n,i&&t.hasAttribute("data-typeit-id")?i:null)}},y=function(t){var e=[];return e.concat.apply(e,t)},m=function(t){var e=document.implementation.createHTMLDocument("");return e.body.innerHTML=t,e.body},g=function(t){return p(t.childNodes).map((function(t){return 3===t.nodeType?t.nodeValue.split(""):t}))},b=function(t,e,n){return{ancestorTree:e,attributes:(i=t,p(i.attributes).map((function(t){return{name:t.name,value:t.nodeValue}}))),content:n};var i},w=function(t,e){var n=b(t,e,""),i=g(t).map((function(n,i){return Array.isArray(n)?n.map((function(n,i){return b(t,e,n)})):n}));return i.unshift(n),y(i)},S=function(t){return t instanceof HTMLElement&&"BR"!==t.tagName},q=function t(e){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=e.map((function(t){if(S(t)){if(!n)return p(t.childNodes);for(var e=t.parentNode,i=[t.tagName];["BODY","HTML"].indexOf(e.tagName)<0;)i.push(e.tagName),e=e.parentNode;return w(t,i)}return t}));return(i=y(i)).some((function(t){return S(t)}))?t(i,n):i};function A(t){var e=m(t),n=g(e);return q(n)}function N(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e?A(t):t.split("")}var T=function(t,e){e?t.value="":t.querySelector(".ti-cursor")&&(t.innerHTML="")},x=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=!Array.isArray(t),r=t.length;return(t=i?new Array(t).fill(0):t).map((function(t,o){if(i)return e;var s=[e,t];return n&&(0===o&&s.push({isFirst:!0}),o+1===r&&s.push({isLast:!0})),s}))},L=function(t){t.parentNode.removeChild(t)},O=function(t){return 3!==t.nodeType&&"BR"!==t.tagName&&!t.firstChild},E=function(t){return t.some((function(t){return O(t)}))},D=function(t){for(var e=p(t.querySelectorAll("*")),n=E(e);e.length&&n;){var i=!1;e.forEach((function(t){O(t)&&(L(t),i=!0)})),i&&(e=p(t.querySelectorAll("*"))),n=E(e)}return e},$=function(t){return Array.isArray(t)||(t=[t/2,t/2]),{before:t[0],after:t[1],total:t[0]+t[1]}};function P(t,e,n){var i=(e=null!==e?e:t/3)/2;return n?[a(t,t/2),a(e,i)]:[t,e]}function M(){var t=this,e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=n.typeIt,a=n.element,d=n.id,y=n.options,g=n.queue,b=void 0===g?[]:g,w=n.isAReset,S=void 0!==w&&w,O=function(){var e=p(t.$e.childNodes).filter((function(t){return!t.isEqualNode(R)}));return q(e,!1)},E=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=e.opts.nextStringDelay;e.queue.insert(t,[e.pause,i.before]),e.queue.insert(t+n+1,[e.pause,i.after])},j=function(){!z&&t.opts.cursor&&(c("@keyframes blink-".concat(d," { 0% {opacity: 0} 49% {opacity: 0} 50% {opacity: 1} }[data-typeit-id='").concat(d,"'] .ti-cursor { animation: blink-").concat(d," ").concat(t.opts.cursorSpeed/1e3,"s infinite; }"),d),(R=u("span")).innerHTML=m(t.opts.cursorChar).innerHTML,R.className="ti-cursor",R.setAttribute("style","display:inline;position:relative;font:inherit;color:inherit;line-height:inherit;"),t.$e.appendChild(R))};this.wait=function(t,e){this.timeouts.push(setTimeout(t,e))};var C=function(){t.opts.strings.forEach((function(e,n){var i=N(e,t.opts.html);t.queue.add(x(i,t.type,!0));var r=t.queue.waiting.length;if(n+1!==t.opts.strings.length){if(t.opts.breakLines)return t.queue.add([t.type,u("BR")]),void E(r);t.queue.add(x(i,t.delete)),E(r,e.length)}}))},H=function(e){t.queue.reset().delete(0).add([t.pause,e.before],!0);for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n,i){t.wait((function(){return n()}),e||t.opts.nextStringDelay.total)}))},this.reset=function(){return this.queue.reset(),new M({typeIt:i,element:this.$e,id:d,options:this.opts,queue:this.queue.waiting,isAReset:!0})},this.init=function(){var t=this;if(!this.status.started){if(j(),!this.opts.waitUntilVisible)return this.status.started=!0,this.fire();new IntersectionObserver((function(e,n){e.forEach((function(e){e.isIntersecting&&(t.fire(),n.unobserve(t.$e))}))}),{threshold:1}).observe(this.$e)}},this.fire=function(){for(var t=this,e=this,n=this.queue.waiting.slice(),r=Promise.resolve(),o=function(t){var o=n[t],s=[o,e.queue,i];r=r.then((function(){return new Promise((function(t,n){var i,r;if(e.status.frozen)return n();e.pace=P(e.opts.speed,e.opts.deleteSpeed,e.opts.lifeLike),o[2]&&o[2].isFirst&&(i=e.opts).beforeString.apply(i,s),(r=e.opts).beforeStep.apply(r,s),o[0].call(e,o[1],o[2]).then((function(){var n,i,r=e.queue.waiting.shift();return o[2]&&o[2].isPhantom?t():(o[2]&&o[2].isLast&&(n=e.opts).afterString.apply(n,s),(i=e.opts).afterStep.apply(i,s),e.queue.executed.push(r),t())}))}))}))},s=0;s0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n){t.wait((function(){var i=O();return i.length&&L(i[i.length-1]),D(t.$e),e&&i.length-1>0?t.delete(!0).then((function(){return n()})):n()}),t.pace[1])}))},this.setOptions=function(t){var e=this;return new Promise((function(n){return e.opts=Object.assign({},e.opts,t),n()}))};var R=null,z=f(a);this.status={started:!1,complete:!1,frozen:!1,destroyed:!1},this.$e=a,this.timeouts=[],this.opts=Object.assign({},o,y),this.opts.html=!z&&this.opts.html,this.opts.nextStringDelay=$(this.opts.nextStringDelay),this.opts.loopDelay=$(this.opts.loopDelay),this.queue=new s(b,[this.pause,this.opts.startDelay]),this.$e.setAttribute("data-typeit-id",d),c("[data-typeit-id]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}"),T(a,z);var I=h(this.opts.strings);I=k(I),this.opts.strings=l(I),this.opts.strings.length&&!S&&C()}function j(t,e){var n,i=this,r=this;this.instances=(n=t,"string"==typeof n?n=document.querySelectorAll(n):n.forEach||(n=[n]),p(n)).map((function(t){return new M({typeIt:i,element:t,id:Math.random().toString(36).substring(2,15),options:e,queue:[],isAReset:!1})}));var o=function(t){i.instances.forEach((function(e){t.call(i,e)}))},s=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;o((function(i){var o="string"!=typeof t,s=o?t:i[t],u=x(n,[s,o?r:e]);i.queue.add(u)}))};this.is=function(t){return e=this.instances,n=t,!0,!!e.length&&!e.some((function(t){return!0!==t.status[n]}));var e,n},this.freeze=function(){o((function(t){t.status.frozen=!0}))},this.unfreeze=function(){o((function(t){t.status.frozen&&(t.status.frozen=!1,t.fire())}))},this.type=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return o((function(e){var n=N(t,e.opts.html);e.queue.add(x(n,e.type,!0))})),this},this.delete=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("delete",null===t,null===t?1:t),this},this.pause=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("pause",t),this},this.break=function(){return s("type",u("BR")),this},this.options=function(t){return s("setOptions",t),this},this.exec=function(t){return s(t),this},this.destroy=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.instances=this.instances.map((function(e){if(e.timeouts.forEach((function(t){clearTimeout(t)})),e.timeouts=[],t){var n=e.isInput?null:e.$e.querySelector(".ti-cursor");n&&e.$e.removeChild(n)}return e.status.destroyed=!0,e}))},this.empty=function(){return s("empty"),this},this.reset=function(){return this.destroy(),this.instances=this.instances.map((function(t){return t.reset()})),this},this.go=function(){return o((function(t){t.init()})),this}}var C=e,H=n,k=function(e){var n=C(null),r=e.options,o=e.element,s=e.children,u=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r0&&void 0!==arguments[0]?arguments[0]:[],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.insert=function(e,n){t.waiting.splice(e,0,n)},this.add=function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return Array.isArray(t[0])?(e.waiting=e.waiting.concat(t),e):(e.waiting[n?"unshift":"push"](t),e)},this.delete=function(e){return t.waiting.splice(e,1),t},this.reset=function(){return t.waiting=t.executed.concat(t.waiting),t.executed=[],t},this.executed=[],this.waiting=n,!n.length&&i&&this.add(i)}var a=function(t){return document.createElement(t)};function c(t,e){return Math.abs(Math.random()*(t+e-(t-e))+(t-e))}function l(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=a("style");n.id=e,n.appendChild(document.createTextNode(t)),document.head.appendChild(n)}function f(t){return t.map((function(t){return t.replace(/<\!--.*?-->/g,"")}))}var h=function(t){return["textarea","input"].indexOf(t.tagName.toLowerCase())>-1},p=function(t){return Array.isArray(t)?t:[t]},d=function(t){return[].slice.call(t)},v=function(t,e){var n=t.nextSibling;return!!n&&!n.isEqualNode(e)},y=function(t,e){var n=e;if(h(t))t.value="".concat(t.value).concat(n);else{var i=d(t.childNodes).filter((function(t){return t.classList&&t.classList.contains("ti-cursor")}));if(i=i.length?i[0]:null,"object"==o(e)&&!(e instanceof HTMLElement)){var r=e.ancestorTree.slice(0).reverse().join(" "),s=d(t.querySelectorAll("".concat(r))),u=(s=s.filter((function(t){return!i||!i.isEqualNode(t)}))).length>0?s[s.length-1]:null;if(u&&function(t,e){if(!t)return!1;for(var n=!1,i=[],r=t;!n;)i.push(v(r,e)),(r=r.parentNode)&&r.hasAttribute&&!r.hasAttribute("data-typeit-id")||(n=!0);return!i.some((function(t){return t}))}(u,i))t=u,n=e.content;else if(n=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=a(t);return e.forEach((function(t){i.setAttribute(t.name,t.value)})),i.innerHTML=n,i}(e.ancestorTree[0],e.attributes,e.content),e.ancestorTree.length>1){var c=d(t.querySelectorAll(e.ancestorTree[1]));t=c[c.length-1]}}n="object"==o(n)?n:document.createTextNode(n),t.insertBefore(n,i&&t.hasAttribute("data-typeit-id")?i:null)}},g=function(t){var e=[];return e.concat.apply(e,t)},m=function(t){var e=document.implementation.createHTMLDocument("");return e.body.innerHTML=t,e.body},b=function(t){return d(t.childNodes).map((function(t){return 3===t.nodeType?t.nodeValue.split(""):t}))},w=function(t,e,n){return{ancestorTree:e,attributes:(i=t,d(i.attributes).map((function(t){return{name:t.name,value:t.nodeValue}}))),content:n};var i},S=function(t,e){var n=w(t,e,""),i=b(t).map((function(n,i){return Array.isArray(n)?n.map((function(n,i){return w(t,e,n)})):n}));return i.unshift(n),g(i)},q=function(t){return t instanceof HTMLElement&&"BR"!==t.tagName},A=function t(e){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=e.map((function(t){if(q(t)){if(!n)return d(t.childNodes);for(var e=t.parentNode,i=[t.tagName];["BODY","HTML"].indexOf(e.tagName)<0;)i.push(e.tagName),e=e.parentNode;return S(t,i)}return t}));return(i=g(i)).some((function(t){return q(t)}))?t(i,n):i};function T(t){var e=m(t),n=b(e);return A(n)}function N(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e?T(t):t.split("")}var L=function(t,e){e?t.value="":t.querySelector(".ti-cursor")&&(t.innerHTML="")},x=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=!Array.isArray(t),r=t.length;return(t=i?new Array(t).fill(0):t).map((function(t,o){if(i)return e;var s=[e,t];return n&&(0===o&&s.push({isFirst:!0}),o+1===r&&s.push({isLast:!0})),s}))},O=function(t){t.parentNode.removeChild(t)},E=function(t){return 3!==t.nodeType&&"BR"!==t.tagName&&!t.firstChild},D=function(t){return t.some((function(t){return E(t)}))},$=function(t){for(var e=d(t.querySelectorAll("*")),n=D(e);e.length&&n;){var i=!1;e.forEach((function(t){E(t)&&(O(t),i=!0)})),i&&(e=d(t.querySelectorAll("*"))),n=D(e)}return e},M=function(t){return Array.isArray(t)||(t=[t/2,t/2]),{before:t[0],after:t[1],total:t[0]+t[1]}};function P(t,e,n){var i=(e=null!==e?e:t/3)/2;return n?[c(t,t/2),c(e,i)]:[t,e]}function I(){var t=this,e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=n.typeIt,r=n.element,c=n.id,v=n.options,g=n.queue,b=void 0===g?[]:g,w=n.isAReset,S=void 0!==w&&w,q=function(){var e=d(t.$e.childNodes).filter((function(t){return!t.isEqualNode(k)}));return A(e,!1)},E=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=e.opts.nextStringDelay;e.queue.insert(t,[e.pause,i.before]),e.queue.insert(t+n+1,[e.pause,i.after])},D=function(){!B&&t.opts.cursor&&(l("@keyframes blink-".concat(c," { 0% {opacity: 0} 49% {opacity: 0} 50% {opacity: 1} }[data-typeit-id='").concat(c,"'] .ti-cursor { animation: blink-").concat(c," ").concat(t.opts.cursorSpeed/1e3,"s infinite; }"),c),(k=a("span")).innerHTML=m(t.opts.cursorChar).innerHTML,k.className="ti-cursor",k.setAttribute("style","display:inline;position:relative;font:inherit;color:inherit;line-height:inherit;"),t.$e.appendChild(k))};this.wait=function(t,e){this.timeouts.push(setTimeout(t,e))};var j=function(){t.opts.strings.forEach((function(e,n){var i=N(e,t.opts.html);t.queue.add(x(i,t.type,!0));var r=t.queue.waiting.length;if(n+1!==t.opts.strings.length){if(t.opts.breakLines)return t.queue.add([t.type,a("BR")]),void E(r);t.queue.add(x(i,t.delete)),E(r,e.length)}}))},H=function(e){t.queue.reset().delete(0).add([t.pause,e.before],!0);for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n,i){t.wait((function(){return n()}),e||t.opts.nextStringDelay.total)}))},this.reset=function(){return this.queue.reset(),new I({typeIt:i,element:this.$e,id:c,options:this.opts,queue:this.queue.waiting,isAReset:!0})},this.init=function(){var t=this;if(!this.status.started){if(D(),!this.opts.waitUntilVisible)return this.status.started=!0,this.fire();new IntersectionObserver((function(e,n){e.forEach((function(e){e.isIntersecting&&(t.fire(),n.unobserve(t.$e))}))}),{threshold:1}).observe(this.$e)}},this.fire=function(){for(var t=this,e=this,n=this.queue.waiting.slice(),r=Promise.resolve(),o=function(t){var o=n[t],s=[o,e.queue,i];r=r.then((function(){return new Promise((function(t,n){var i,r;if(e.status.frozen)return n();e.pace=P(e.opts.speed,e.opts.deleteSpeed,e.opts.lifeLike),o[2]&&o[2].isFirst&&(i=e.opts).beforeString.apply(i,s),(r=e.opts).beforeStep.apply(r,s),o[0].call(e,o[1],o[2]).then((function(){var n,i,r=e.queue.waiting.shift();return o[2]&&o[2].isPhantom?t():(o[2]&&o[2].isLast&&(n=e.opts).afterString.apply(n,s),(i=e.opts).afterStep.apply(i,s),e.queue.executed.push(r),t())}))}))}))},s=0;s0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n){t.wait((function(){var i=q();return i.length&&O(i[i.length-1]),$(t.$e),e&&i.length-1>0?t.delete(!0).then((function(){return n()})):n()}),t.pace[1])}))},this.setOptions=function(t){var e=this;return new Promise((function(n){return e.opts=Object.assign({},e.opts,t),n()}))};var k=null,B=h(r);this.status={started:!1,complete:!1,frozen:!1,destroyed:!1},this.$e=r,this.timeouts=[],this.opts=Object.assign({},s,v),this.opts.html=!B&&this.opts.html,this.opts.nextStringDelay=M(this.opts.nextStringDelay),this.opts.loopDelay=M(this.opts.loopDelay),this.queue=new u(b,[this.pause,this.opts.startDelay]),this.$e.setAttribute("data-typeit-id",c),l("[data-typeit-id]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}"),L(r,B);var R=p(this.opts.strings);R=C(R),this.opts.strings=f(R),this.opts.strings.length&&!S&&j()}function j(t,e){var n,i=this,r=this;this.instances=(n=t,"string"==typeof n?n=document.querySelectorAll(n):n.forEach||(n=[n]),d(n)).map((function(t){return new I({typeIt:i,element:t,id:Math.random().toString(36).substring(2,15),options:e,queue:[],isAReset:!1})}));var o=function(t){i.instances.forEach((function(e){t.call(i,e)}))},s=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;o((function(i){var o="string"!=typeof t,s=o?t:i[t],u=x(n,[s,o?r:e]);i.queue.add(u)}))};this.is=function(t){return e=this.instances,n=t,!0,!!e.length&&!e.some((function(t){return!0!==t.status[n]}));var e,n},this.freeze=function(){o((function(t){t.status.frozen=!0}))},this.unfreeze=function(){o((function(t){t.status.frozen&&(t.status.frozen=!1,t.fire())}))},this.type=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return o((function(e){var n=N(t,e.opts.html);e.queue.add(x(n,e.type,!0))})),this},this.delete=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("delete",null===t,null===t?1:t),this},this.pause=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("pause",t),this},this.break=function(){return s("type",a("BR")),this},this.options=function(t){return s("setOptions",t),this},this.exec=function(t){return s(t),this},this.destroy=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.instances=this.instances.map((function(e){if(e.timeouts.forEach((function(t){clearTimeout(t)})),e.timeouts=[],t){var n=e.isInput?null:e.$e.querySelector(".ti-cursor");n&&e.$e.removeChild(n)}return e.status.destroyed=!0,e}))},this.empty=function(){return s("empty"),this},this.reset=function(){return this.destroy(),this.instances=this.instances.map((function(t){return t.reset()})),this},this.go=function(){return o((function(t){t.init()})),this}}var H=e,C=n,k=i,B=function(e){var n=k(!0),i=n[0],o=n[1],s=H(null),u=e.options,a=e.element,c=e.children,l=e.getBeforeInit,f=e.getAfterInit,h=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r (https://macarthur.me) - * Version: v0.0.1 + * Version: v0.0.2 * License: GPL-2.0 * URL: undefined * @@ -21,4 +21,4 @@ See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. - ***************************************************************************** */var e=function(){return(e=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&void 0!==arguments[0]?arguments[0]:[],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.insert=function(e,n){t.waiting.splice(e,0,n)},this.add=function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return Array.isArray(t[0])?(e.waiting=e.waiting.concat(t),e):(e.waiting[n?"unshift":"push"](t),e)},this.delete=function(e){return t.waiting.splice(e,1),t},this.reset=function(){return t.waiting=t.executed.concat(t.waiting),t.executed=[],t},this.executed=[],this.waiting=n,!n.length&&i&&this.add(i)}var o=function(t){return document.createElement(t)};function u(t,e){return Math.abs(Math.random()*(t+e-(t-e))+(t-e))}function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=o("style");n.id=e,n.appendChild(document.createTextNode(t)),document.head.appendChild(n)}function a(t){return t.map((function(t){return t.replace(/<\!--.*?-->/g,"")}))}var c=function(t){return["textarea","input"].indexOf(t.tagName.toLowerCase())>-1},l=function(t){return Array.isArray(t)?t:[t]},f=function(t){return[].slice.call(t)},h=function(t,e){var n=t.nextSibling;return!!n&&!n.isEqualNode(e)},p=function(t,e){var i=e;if(c(t))t.value="".concat(t.value).concat(i);else{var r=f(t.childNodes).filter((function(t){return t.classList&&t.classList.contains("ti-cursor")}));if(r=r.length?r[0]:null,"object"==n(e)&&!(e instanceof HTMLElement)){var u=e.ancestorTree.slice(0).reverse().join(" "),s=f(t.querySelectorAll("".concat(u))),a=(s=s.filter((function(t){return!r||!r.isEqualNode(t)}))).length>0?s[s.length-1]:null;if(a&&function(t,e){if(!t)return!1;for(var n=!1,i=[],r=t;!n;)i.push(h(r,e)),(r=r.parentNode)&&r.hasAttribute&&!r.hasAttribute("data-typeit-id")||(n=!0);return!i.some((function(t){return t}))}(a,r))t=a,i=e.content;else if(i=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=o(t);return e.forEach((function(t){i.setAttribute(t.name,t.value)})),i.innerHTML=n,i}(e.ancestorTree[0],e.attributes,e.content),e.ancestorTree.length>1){var l=f(t.querySelectorAll(e.ancestorTree[1]));t=l[l.length-1]}}i="object"==n(i)?i:document.createTextNode(i),t.insertBefore(i,r&&t.hasAttribute("data-typeit-id")?r:null)}},d=function(t){var e=[];return e.concat.apply(e,t)},v=function(t){var e=document.implementation.createHTMLDocument("");return e.body.innerHTML=t,e.body},y=function(t){return f(t.childNodes).map((function(t){return 3===t.nodeType?t.nodeValue.split(""):t}))},m=function(t,e,n){return{ancestorTree:e,attributes:(i=t,f(i.attributes).map((function(t){return{name:t.name,value:t.nodeValue}}))),content:n};var i},g=function(t,e){var n=m(t,e,""),i=y(t).map((function(n,i){return Array.isArray(n)?n.map((function(n,i){return m(t,e,n)})):n}));return i.unshift(n),d(i)},b=function(t){return t instanceof HTMLElement&&"BR"!==t.tagName},w=function t(e){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=e.map((function(t){if(b(t)){if(!n)return f(t.childNodes);for(var e=t.parentNode,i=[t.tagName];["BODY","HTML"].indexOf(e.tagName)<0;)i.push(e.tagName),e=e.parentNode;return g(t,i)}return t}));return(i=d(i)).some((function(t){return b(t)}))?t(i,n):i};function S(t){var e=v(t),n=y(e);return w(n)}function q(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e?S(t):t.split("")}var A=function(t,e){e?t.value="":t.querySelector(".ti-cursor")&&(t.innerHTML="")},T=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=!Array.isArray(t),r=t.length;return(t=i?new Array(t).fill(0):t).map((function(t,o){if(i)return e;var u=[e,t];return n&&(0===o&&u.push({isFirst:!0}),o+1===r&&u.push({isLast:!0})),u}))},N=function(t){t.parentNode.removeChild(t)},x=function(t){return 3!==t.nodeType&&"BR"!==t.tagName&&!t.firstChild},L=function(t){return t.some((function(t){return x(t)}))},O=function(t){for(var e=f(t.querySelectorAll("*")),n=L(e);e.length&&n;){var i=!1;e.forEach((function(t){x(t)&&(N(t),i=!0)})),i&&(e=f(t.querySelectorAll("*"))),n=L(e)}return e},E=function(t){return Array.isArray(t)||(t=[t/2,t/2]),{before:t[0],after:t[1],total:t[0]+t[1]}};function D(t,e,n){var i=(e=null!==e?e:t/3)/2;return n?[u(t,t/2),u(e,i)]:[t,e]}function $(){var t=this,e=this,u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},h=u.typeIt,d=u.element,y=u.id,m=u.options,g=u.queue,b=void 0===g?[]:g,x=u.isAReset,L=void 0!==x&&x,P=function(){var e=f(t.$e.childNodes).filter((function(t){return!t.isEqualNode(R)}));return w(e,!1)},M=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=e.opts.nextStringDelay;e.queue.insert(t,[e.pause,i.before]),e.queue.insert(t+n+1,[e.pause,i.after])},j=function(){!I&&t.opts.cursor&&(s("@keyframes blink-".concat(y," { 0% {opacity: 0} 49% {opacity: 0} 50% {opacity: 1} }[data-typeit-id='").concat(y,"'] .ti-cursor { animation: blink-").concat(y," ").concat(t.opts.cursorSpeed/1e3,"s infinite; }"),y),(R=o("span")).innerHTML=v(t.opts.cursorChar).innerHTML,R.className="ti-cursor",R.setAttribute("style","display:inline;position:relative;font:inherit;color:inherit;line-height:inherit;"),t.$e.appendChild(R))};this.wait=function(t,e){this.timeouts.push(setTimeout(t,e))};var C=function(){t.opts.strings.forEach((function(e,n){var i=q(e,t.opts.html);t.queue.add(T(i,t.type,!0));var r=t.queue.waiting.length;if(n+1!==t.opts.strings.length){if(t.opts.breakLines)return t.queue.add([t.type,o("BR")]),void M(r);t.queue.add(T(i,t.delete)),M(r,e.length)}}))},H=function(e){t.queue.reset().delete(0).add([t.pause,e.before],!0);for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n,i){t.wait((function(){return n()}),e||t.opts.nextStringDelay.total)}))},this.reset=function(){return this.queue.reset(),new $({typeIt:h,element:this.$e,id:y,options:this.opts,queue:this.queue.waiting,isAReset:!0})},this.init=function(){var t=this;if(!this.status.started){if(j(),!this.opts.waitUntilVisible)return this.status.started=!0,this.fire();new IntersectionObserver((function(e,n){e.forEach((function(e){e.isIntersecting&&(t.fire(),n.unobserve(t.$e))}))}),{threshold:1}).observe(this.$e)}},this.fire=function(){for(var t=this,e=this,n=this.queue.waiting.slice(),i=Promise.resolve(),r=function(t){var r=n[t],o=[r,e.queue,h];i=i.then((function(){return new Promise((function(t,n){var i,u;if(e.status.frozen)return n();e.pace=D(e.opts.speed,e.opts.deleteSpeed,e.opts.lifeLike),r[2]&&r[2].isFirst&&(i=e.opts).beforeString.apply(i,o),(u=e.opts).beforeStep.apply(u,o),r[0].call(e,r[1],r[2]).then((function(){var n,i,u=e.queue.waiting.shift();return r[2]&&r[2].isPhantom?t():(r[2]&&r[2].isLast&&(n=e.opts).afterString.apply(n,o),(i=e.opts).afterStep.apply(i,o),e.queue.executed.push(u),t())}))}))}))},o=0;o0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n){t.wait((function(){var i=P();return i.length&&N(i[i.length-1]),O(t.$e),e&&i.length-1>0?t.delete(!0).then((function(){return n()})):n()}),t.pace[1])}))},this.setOptions=function(t){var e=this;return new Promise((function(n){return e.opts=Object.assign({},e.opts,t),n()}))};var R=null,I=c(d);this.status={started:!1,complete:!1,frozen:!1,destroyed:!1},this.$e=d,this.timeouts=[],this.opts=Object.assign({},i,m),this.opts.html=!I&&this.opts.html,this.opts.nextStringDelay=E(this.opts.nextStringDelay),this.opts.loopDelay=E(this.opts.loopDelay),this.queue=new r(b,[this.pause,this.opts.startDelay]),this.$e.setAttribute("data-typeit-id",y),s("[data-typeit-id]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}"),A(d,I);var z=l(this.opts.strings);z=k(z),this.opts.strings=a(z),this.opts.strings.length&&!L&&C()}function P(t,e){var n,i=this,r=this;this.instances=(n=t,"string"==typeof n?n=document.querySelectorAll(n):n.forEach||(n=[n]),f(n)).map((function(t){return new $({typeIt:i,element:t,id:Math.random().toString(36).substring(2,15),options:e,queue:[],isAReset:!1})}));var u=function(t){i.instances.forEach((function(e){t.call(i,e)}))},s=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;u((function(i){var o="string"!=typeof t,u=o?t:i[t],s=T(n,[u,o?r:e]);i.queue.add(s)}))};this.is=function(t){return e=this.instances,n=t,!0,!!e.length&&!e.some((function(t){return!0!==t.status[n]}));var e,n},this.freeze=function(){u((function(t){t.status.frozen=!0}))},this.unfreeze=function(){u((function(t){t.status.frozen&&(t.status.frozen=!1,t.fire())}))},this.type=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return u((function(e){var n=q(t,e.opts.html);e.queue.add(T(n,e.type,!0))})),this},this.delete=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("delete",null===t,null===t?1:t),this},this.pause=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("pause",t),this},this.break=function(){return s("type",o("BR")),this},this.options=function(t){return s("setOptions",t),this},this.exec=function(t){return s(t),this},this.destroy=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.instances=this.instances.map((function(e){if(e.timeouts.forEach((function(t){clearTimeout(t)})),e.timeouts=[],t){var n=e.isInput?null:e.$e.querySelector(".ti-cursor");n&&e.$e.removeChild(n)}return e.status.destroyed=!0,e}))},this.empty=function(){return s("empty"),this},this.reset=function(){return this.destroy(),this.instances=this.instances.map((function(t){return t.reset()})),this},this.go=function(){return u((function(t){t.init()})),this}}var M=t.useRef,j=t.useEffect,C=function(n){var i=M(null),r=n.options,o=n.element,u=n.children,s=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r0&&void 0!==arguments[0]?arguments[0]:[],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.insert=function(e,n){t.waiting.splice(e,0,n)},this.add=function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return Array.isArray(t[0])?(e.waiting=e.waiting.concat(t),e):(e.waiting[n?"unshift":"push"](t),e)},this.delete=function(e){return t.waiting.splice(e,1),t},this.reset=function(){return t.waiting=t.executed.concat(t.waiting),t.executed=[],t},this.executed=[],this.waiting=n,!n.length&&i&&this.add(i)}var o=function(t){return document.createElement(t)};function u(t,e){return Math.abs(Math.random()*(t+e-(t-e))+(t-e))}function s(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=o("style");n.id=e,n.appendChild(document.createTextNode(t)),document.head.appendChild(n)}function a(t){return t.map((function(t){return t.replace(/<\!--.*?-->/g,"")}))}var c=function(t){return["textarea","input"].indexOf(t.tagName.toLowerCase())>-1},f=function(t){return Array.isArray(t)?t:[t]},l=function(t){return[].slice.call(t)},h=function(t,e){var n=t.nextSibling;return!!n&&!n.isEqualNode(e)},p=function(t,e){var i=e;if(c(t))t.value="".concat(t.value).concat(i);else{var r=l(t.childNodes).filter((function(t){return t.classList&&t.classList.contains("ti-cursor")}));if(r=r.length?r[0]:null,"object"==n(e)&&!(e instanceof HTMLElement)){var u=e.ancestorTree.slice(0).reverse().join(" "),s=l(t.querySelectorAll("".concat(u))),a=(s=s.filter((function(t){return!r||!r.isEqualNode(t)}))).length>0?s[s.length-1]:null;if(a&&function(t,e){if(!t)return!1;for(var n=!1,i=[],r=t;!n;)i.push(h(r,e)),(r=r.parentNode)&&r.hasAttribute&&!r.hasAttribute("data-typeit-id")||(n=!0);return!i.some((function(t){return t}))}(a,r))t=a,i=e.content;else if(i=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=o(t);return e.forEach((function(t){i.setAttribute(t.name,t.value)})),i.innerHTML=n,i}(e.ancestorTree[0],e.attributes,e.content),e.ancestorTree.length>1){var f=l(t.querySelectorAll(e.ancestorTree[1]));t=f[f.length-1]}}i="object"==n(i)?i:document.createTextNode(i),t.insertBefore(i,r&&t.hasAttribute("data-typeit-id")?r:null)}},d=function(t){var e=[];return e.concat.apply(e,t)},v=function(t){var e=document.implementation.createHTMLDocument("");return e.body.innerHTML=t,e.body},y=function(t){return l(t.childNodes).map((function(t){return 3===t.nodeType?t.nodeValue.split(""):t}))},g=function(t,e,n){return{ancestorTree:e,attributes:(i=t,l(i.attributes).map((function(t){return{name:t.name,value:t.nodeValue}}))),content:n};var i},m=function(t,e){var n=g(t,e,""),i=y(t).map((function(n,i){return Array.isArray(n)?n.map((function(n,i){return g(t,e,n)})):n}));return i.unshift(n),d(i)},b=function(t){return t instanceof HTMLElement&&"BR"!==t.tagName},w=function t(e){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=e.map((function(t){if(b(t)){if(!n)return l(t.childNodes);for(var e=t.parentNode,i=[t.tagName];["BODY","HTML"].indexOf(e.tagName)<0;)i.push(e.tagName),e=e.parentNode;return m(t,i)}return t}));return(i=d(i)).some((function(t){return b(t)}))?t(i,n):i};function S(t){var e=v(t),n=y(e);return w(n)}function q(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e?S(t):t.split("")}var A=function(t,e){e?t.value="":t.querySelector(".ti-cursor")&&(t.innerHTML="")},T=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],i=!Array.isArray(t),r=t.length;return(t=i?new Array(t).fill(0):t).map((function(t,o){if(i)return e;var u=[e,t];return n&&(0===o&&u.push({isFirst:!0}),o+1===r&&u.push({isLast:!0})),u}))},N=function(t){t.parentNode.removeChild(t)},x=function(t){return 3!==t.nodeType&&"BR"!==t.tagName&&!t.firstChild},L=function(t){return t.some((function(t){return x(t)}))},E=function(t){for(var e=l(t.querySelectorAll("*")),n=L(e);e.length&&n;){var i=!1;e.forEach((function(t){x(t)&&(N(t),i=!0)})),i&&(e=l(t.querySelectorAll("*"))),n=L(e)}return e},O=function(t){return Array.isArray(t)||(t=[t/2,t/2]),{before:t[0],after:t[1],total:t[0]+t[1]}};function D(t,e,n){var i=(e=null!==e?e:t/3)/2;return n?[u(t,t/2),u(e,i)]:[t,e]}function $(){var t=this,e=this,u=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},h=u.typeIt,d=u.element,y=u.id,g=u.options,m=u.queue,b=void 0===m?[]:m,x=u.isAReset,L=void 0!==x&&x,M=function(){var e=l(t.$e.childNodes).filter((function(t){return!t.isEqualNode(k)}));return w(e,!1)},P=function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,i=e.opts.nextStringDelay;e.queue.insert(t,[e.pause,i.before]),e.queue.insert(t+n+1,[e.pause,i.after])},I=function(){!B&&t.opts.cursor&&(s("@keyframes blink-".concat(y," { 0% {opacity: 0} 49% {opacity: 0} 50% {opacity: 1} }[data-typeit-id='").concat(y,"'] .ti-cursor { animation: blink-").concat(y," ").concat(t.opts.cursorSpeed/1e3,"s infinite; }"),y),(k=o("span")).innerHTML=v(t.opts.cursorChar).innerHTML,k.className="ti-cursor",k.setAttribute("style","display:inline;position:relative;font:inherit;color:inherit;line-height:inherit;"),t.$e.appendChild(k))};this.wait=function(t,e){this.timeouts.push(setTimeout(t,e))};var j=function(){t.opts.strings.forEach((function(e,n){var i=q(e,t.opts.html);t.queue.add(T(i,t.type,!0));var r=t.queue.waiting.length;if(n+1!==t.opts.strings.length){if(t.opts.breakLines)return t.queue.add([t.type,o("BR")]),void P(r);t.queue.add(T(i,t.delete)),P(r,e.length)}}))},H=function(e){t.queue.reset().delete(0).add([t.pause,e.before],!0);for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n,i){t.wait((function(){return n()}),e||t.opts.nextStringDelay.total)}))},this.reset=function(){return this.queue.reset(),new $({typeIt:h,element:this.$e,id:y,options:this.opts,queue:this.queue.waiting,isAReset:!0})},this.init=function(){var t=this;if(!this.status.started){if(I(),!this.opts.waitUntilVisible)return this.status.started=!0,this.fire();new IntersectionObserver((function(e,n){e.forEach((function(e){e.isIntersecting&&(t.fire(),n.unobserve(t.$e))}))}),{threshold:1}).observe(this.$e)}},this.fire=function(){for(var t=this,e=this,n=this.queue.waiting.slice(),i=Promise.resolve(),r=function(t){var r=n[t],o=[r,e.queue,h];i=i.then((function(){return new Promise((function(t,n){var i,u;if(e.status.frozen)return n();e.pace=D(e.opts.speed,e.opts.deleteSpeed,e.opts.lifeLike),r[2]&&r[2].isFirst&&(i=e.opts).beforeString.apply(i,o),(u=e.opts).beforeStep.apply(u,o),r[0].call(e,r[1],r[2]).then((function(){var n,i,u=e.queue.waiting.shift();return r[2]&&r[2].isPhantom?t():(r[2]&&r[2].isLast&&(n=e.opts).afterString.apply(n,o),(i=e.opts).afterStep.apply(i,o),e.queue.executed.push(u),t())}))}))}))},o=0;o0&&void 0!==arguments[0]&&arguments[0];return new Promise((function(n){t.wait((function(){var i=M();return i.length&&N(i[i.length-1]),E(t.$e),e&&i.length-1>0?t.delete(!0).then((function(){return n()})):n()}),t.pace[1])}))},this.setOptions=function(t){var e=this;return new Promise((function(n){return e.opts=Object.assign({},e.opts,t),n()}))};var k=null,B=c(d);this.status={started:!1,complete:!1,frozen:!1,destroyed:!1},this.$e=d,this.timeouts=[],this.opts=Object.assign({},i,g),this.opts.html=!B&&this.opts.html,this.opts.nextStringDelay=O(this.opts.nextStringDelay),this.opts.loopDelay=O(this.opts.loopDelay),this.queue=new r(b,[this.pause,this.opts.startDelay]),this.$e.setAttribute("data-typeit-id",y),s("[data-typeit-id]:before {content: '.'; display: inline-block; width: 0; visibility: hidden;}"),A(d,B);var R=f(this.opts.strings);R=C(R),this.opts.strings=a(R),this.opts.strings.length&&!L&&j()}function M(t,e){var n,i=this,r=this;this.instances=(n=t,"string"==typeof n?n=document.querySelectorAll(n):n.forEach||(n=[n]),l(n)).map((function(t){return new $({typeIt:i,element:t,id:Math.random().toString(36).substring(2,15),options:e,queue:[],isAReset:!1})}));var u=function(t){i.instances.forEach((function(e){t.call(i,e)}))},s=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;u((function(i){var o="string"!=typeof t,u=o?t:i[t],s=T(n,[u,o?r:e]);i.queue.add(s)}))};this.is=function(t){return e=this.instances,n=t,!0,!!e.length&&!e.some((function(t){return!0!==t.status[n]}));var e,n},this.freeze=function(){u((function(t){t.status.frozen=!0}))},this.unfreeze=function(){u((function(t){t.status.frozen&&(t.status.frozen=!1,t.fire())}))},this.type=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return u((function(e){var n=q(t,e.opts.html);e.queue.add(T(n,e.type,!0))})),this},this.delete=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("delete",null===t,null===t?1:t),this},this.pause=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s("pause",t),this},this.break=function(){return s("type",o("BR")),this},this.options=function(t){return s("setOptions",t),this},this.exec=function(t){return s(t),this},this.destroy=function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.instances=this.instances.map((function(e){if(e.timeouts.forEach((function(t){clearTimeout(t)})),e.timeouts=[],t){var n=e.isInput?null:e.$e.querySelector(".ti-cursor");n&&e.$e.removeChild(n)}return e.status.destroyed=!0,e}))},this.empty=function(){return s("empty"),this},this.reset=function(){return this.destroy(),this.instances=this.instances.map((function(t){return t.reset()})),this},this.go=function(){return u((function(t){t.init()})),this}}var P=t.useRef,I=t.useEffect,j=t.useState,H=function(n){var i=j(!0),r=i[0],o=i[1],u=P(null),s=n.options,a=n.element,c=n.children,f=n.getBeforeInit,l=n.getAfterInit,h=function(t,e){var n={};for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&e.indexOf(i)<0&&(n[i]=t[i]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(i=Object.getOwnPropertySymbols(t);r | string +} export interface TypeItProps { element?: string, - options?: object, - children?: React.ReactNode -} + options?: TypeItOptions, + children?: React.ReactNode, + getBeforeInit?: any, + getAfterInit?: any +} const defaultProps: TypeItProps = { element: 'span', - options: {} + options: {}, + getBeforeInit: (instance: object) => instance, + getAfterInit: (instance: object) => instance } const TypeIt: React.FunctionComponent = (props: TypeItProps) => { - const ref = useRef(null); - const {options, element, children, ...remainingProps} = props; + const [shouldRenderChildren, setShouldRenderChildren] = useState(true); + const ref = useRef(null); + const {options, element, children, getBeforeInit, getAfterInit, ...remainingProps} = props; const DynamicElement = element; + /** + * After the component mounts (and any children are rendered), + * we can safely set the strings of the instance using the rendered HTML + * from those optionally-defined children. Otherwise, we'll just use the strings + * defined via the options prop. + */ + useEffect(() => { + if(children) { + options.strings = ref.current.innerHTML; + } + + setShouldRenderChildren(false); + }, []); + + /** + * Once options (and strings) have been defined, we can hide any children we might + * have rendered to make room for the TypeIt animation. On cleanup, destroy + * that instance. + */ useEffect(() => { - const instance = (new TypeItCore(ref.current, { + if(shouldRenderChildren) { + return; + } + + let i = (new TypeItCore(ref.current, { ...options - })).go(); + })); + + i = getBeforeInit(i); + i.go(); + i = getAfterInit(i); return () => { - instance.destroy(); + // @ts-ignore + i.destroy(); } - }, []); + }, [shouldRenderChildren]); return ( - - {children} - +
+ + {shouldRenderChildren && children} + +
) } diff --git a/types/index.d.ts b/types/index.d.ts index f489157..7b0714c 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,5 +1,6 @@ declare namespace JSX { interface IntrinsicElements { - DynamicElement: any + DynamicElement: any, + ref: HTMLElement | null } }